<?php
namespace App\Controller;
use App\Entity\Products;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;
use App\Entity\Settings;
use Exception;
use App\Entity\PointsSettings;
use App\Entity\GeneralValuesSettings;
class MainController extends AbstractController
{
#[Route('/', name: 'app_main')]
public function index(): Response
{
return new Response("Hello world");
}
#[Route('/table/UpdatePrice', name: 'app_updatePrice')]
public function updatePrice(ManagerRegistry $doctrine, Request $request): Response
{
if ($content = $request->getContent()) {
$jsonBody = json_decode($content, true);
}
$entityManager = $doctrine->getManager();
$item = $doctrine->getRepository(Products::class)->findOneBy(['id'=>$jsonBody['id']]);
$item->setPrice($jsonBody['price']);
$entityManager->flush();
return new JsonResponse(['success'=>true]);
}
#[Route('/table', name: 'app_table')]
public function table(ManagerRegistry $doctrine): Response
{
$productsArray = [];
// gathering settings from db
$isOriginal_value = $doctrine->getRepository(GeneralValuesSettings::class)->findOneBy(['setting'=>'is_original'])->getValue();
$jest_wypiaskowana_value = $doctrine->getRepository(GeneralValuesSettings::class)->findOneBy(['setting'=>'jest_wypiaskowana'])->getValue();
$item_condition_new = $doctrine->getRepository(GeneralValuesSettings::class)->findOneBy(['setting'=>'item_condition_new'])->getValue();
$item_condition_new_defects = $doctrine->getRepository(GeneralValuesSettings::class)->findOneBy(['setting'=>'item_condition_new_defects'])->getValue();
// gathering products from db
$db = $doctrine->getRepository(Products::class)->findAll();
$points_settings = $doctrine->getRepository(Settings::class)->findAllIndexed();
// dd($points_settings['A1']['value']);
foreach($db as $item){
// setting default values
$defectList = "";
$sumaPunktow = 0;
$basePrice = $item->getEurocode()->getBasePrice();
$manufacturerTier = $item->getManufacturer()->getTier();
$manufacturerPriceChange = $manufacturerTier->getPriceChange();
$manufacturerPriceChangeOperation = preg_replace('/[0-9]+/', '', $manufacturerPriceChange);
$manufacturerPriceChangeNumber = (float) str_replace(['-', '+'], '', $manufacturerPriceChange);
$manufacturerPriceChangeCalc = (($manufacturerPriceChangeNumber/100)*($basePrice/1));
// state of product
// new - new
// new with defects - new_defects
// used - used
if($item->getState() == "new"){
$stateValue = (($item_condition_new/100)*($basePrice/1));
} elseif($item->getState() == "new_defects"){
$stateValue = (($item_condition_new_defects/100)*($basePrice/1));
} else {
$stateValue = 0;
}
if($item->getIsOriginal() == true){
$isOriginalCalc = 0;
} else {
$isOriginalCalc = (($isOriginal_value/100)*($basePrice/1));
}
if($item->getJestWypiaskowana() == 1){
$jestWypiaskowanaValue = (($jest_wypiaskowana_value/100)*($basePrice/1));
} else {
$jestWypiaskowanaValue = 0;
}
if(!empty($item->getDamages())){
foreach($item->getDamages() as $defects){
$defectPlace = array_key_first($defects);
$sumaPunktow += $defects[$defectPlace]*$points_settings[$defectPlace]['value'];
$defectList = $defectList . " " . $defectPlace . ": " . $defects[$defectPlace];
}
}
$discount = $doctrine->getRepository(PointsSettings::class)->findOneBySomeField($sumaPunktow);
if($discount === NULL){
$discount = 0;
} else {
$discount = $discount->getDiscount();
}
// main calc function
if($item->getIsOriginal() == false){
// only if item is not original
if($manufacturerPriceChangeOperation == "+"){
$calc = $basePrice-($basePrice*$discount) - $jestWypiaskowanaValue - $isOriginalCalc + $stateValue + $manufacturerPriceChangeCalc;
} else {
$calc = $basePrice-($basePrice*$discount) - $jestWypiaskowanaValue - $isOriginalCalc + $stateValue - $manufacturerPriceChangeCalc;
}
} else {
$calc = $basePrice-($basePrice*$discount) - $jestWypiaskowanaValue - $isOriginalCalc + $stateValue;
}
$productsArray[] = array(
'ID'=>$item->getId(),
'sku'=>$item->getSku(),
'manufacturer'=>$item->getManufacturer()->getName(),
'ManufacturerPenalty'=>$manufacturerPriceChangeOperation.$manufacturerPriceChangeNumber,
'manufacturerTier'=>$manufacturerTier->getName(),
'points'=>$sumaPunktow,
'pointsValue'=>($basePrice*$discount),
'eurocode'=>$item->getEurocode(),
'state'=>$item->getState(),
'isOriginal'=>$item->getIsOriginal(),
'isOriginalValue'=>$isOriginalCalc,
'jestWypiaskowana'=>$item->getJestWypiaskowana(),
'jestWypiaskowanaValue'=>$jestWypiaskowanaValue,
'basePrice'=>$basePrice,
'buyPrice'=>$item->getBuyPrice(),
'currentPrice'=>$item->getPrice(),
'calculated_price'=>$calc,
'defectsList'=>$defectList
);
}
return $this->render('main/index.html.twig', [
'products' => $productsArray,
]);
}
}