src/Controller/PriceListController.php line 116

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\HttpFoundation\Response;
  5. use Symfony\Component\HttpFoundation\JsonResponse;
  6. use Symfony\Component\HttpFoundation\RequestStack;
  7. use Symfony\Component\Routing\Annotation\Route;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use Doctrine\Persistence\ManagerRegistry;
  10. use App\Entity\PriceList;
  11. use App\Entity\Price;
  12. use App\Entity\Product;
  13. use App\Entity\ProductArca;
  14. use App\Entity\ProductPS;
  15. use Psr\Log\LoggerInterface;
  16. use App\AppUtils\PrezziDaAggiornare;
  17. #[Route('/pricelist')]
  18. class PriceListController extends AbstractController
  19. {
  20.     private $request;
  21.     private $session;
  22.     private $em;
  23.     private $logger;
  24.     public function __construct(RequestStack $rSManagerRegistry $doctrineLoggerInterface $logger){
  25.         $this->request=$rS->getCurrentRequest();
  26.         $this->session=$rS->getSession();
  27.         $this->em=$doctrine->getManager();
  28.         $this->logger=$logger;
  29.     }
  30.     #[Route('/'name'price_list_index')]
  31.     public function index($optParams=null): Response
  32.     {
  33.         //nel caso i parametri opzionali non siano già stati passati nella chiamata del metodo, provo a ricavarli dalla request POST
  34.         if ($optParams == null){
  35.             $optParams=[]; //arrayvuoto
  36.             $optParams['tipoUscita'] = $this->request->get('tipoUscita');
  37.             $this->logger->info("tipoUscita: {$optParams['tipoUscita']} letto dal POST");
  38.         } else {}
  39.         $output=[]; //contenitore per uscite della response
  40.         if ( isset($optParams) && is_array($optParams) ){
  41.             $possibiliTipiUscita=['json','array','template'];
  42.             //controllo se il tipoUscita è definito ed è appartenente ai tipi permessi
  43.             if ( isset($optParams['tipoUscita']) && is_string($optParams['tipoUscita']) && in_array($optParams['tipoUscita'],$possibiliTipiUscita) ){
  44.                 $tipoUscita $optParams['tipoUscita'];
  45.             } else {
  46.                 $output['warning']="tipoUscita definito {$optParams['tipoUscita']} , ma non valido";
  47.                 $tipoUscita 'json';
  48.             }
  49.         }
  50.         else {
  51.             $tipoUscita 'json';
  52.         }
  53.         $esplosoListino=[]; //contenitore per l'esplosione del listino
  54.         //prelevo tutti i prodotti
  55.         $prodotti=$this->em->getRepository(Product::class)->findAll();
  56.         $numeroProdotti count($prodotti);
  57.         //ciclo sui prodotti
  58.         for ($j=0;$j<$numeroProdotti;$j++){
  59.             $productArca $prodotti[$j]->getProductArca();
  60.             //prelevo i prezzi corrispondenti ancora validi, se ce n'è più di uno arriva giù un array e quindi devo gestire l'eccezione
  61.             $prezziProdotto $prodotti[$j]->getLastPrice();
  62.             //se siamo nel caso in cui c'è più di un prezzo valido per il singolo prodotto
  63.             if ($prezziProdotto != null && is_array($prezziProdotto)){
  64.                 $esplosoListino[$productArca->getCdAr()]=[
  65.                     'product' => $prodotti[$j],
  66.                     'productArca' => $productArca,
  67.                     'price' => $prezziProdotto,
  68.                     'price_multiple' => true,
  69.                 ];
  70.             } else if ($prezziProdotto != null){ //caso in cui il prezzo è uno solo
  71.                 $esplosoListino[$productArca->getCdAr()]=[
  72.                     'product' => $prodotti[$j],
  73.                     'productArca' => $productArca,
  74.                     'price' => $prezziProdotto,
  75.                     'price_multiple' => false,
  76.                 ];
  77.             }
  78.             else {
  79.                 //caso in cui manca il prezzo
  80.                 $esplosoListino[$productArca->getCdAr()]=[
  81.                     'product' => $prodotti[$j],
  82.                     'productArca' => $productArca,
  83.                     'price' => null,
  84.                     'price_multiple' => false,
  85.                 ];
  86.             }
  87.         }
  88.         ksort($esplosoListino); //ordina alfabeticamente per chiavi (cdar)
  89.         $output['message']="listini prezzi correnti per prodotto";
  90.         //$output['priceList']=$priceList;
  91.         $output['priceListExpanded']=$esplosoListino;
  92.         switch($tipoUscita){
  93.             case 'template' :
  94.                 return $this->render('price_list/expanded.html.twig',$output);
  95.                 break;
  96.             case 'queryPS' :
  97.                 return $this->render('price_list/queryPS.html.twig',$output);
  98.                 break;
  99.             default : //lo uso per tipo uscita json, dato che lo uso come fallback
  100.                 $jresponse = new JsonResponse ($output);
  101.                 $jresponse->setStatusCode(Response::HTTP_OK);
  102.                 return $jresponse;
  103.                 break;
  104.         }
  105.         if ($tipoUscita == 'json'){
  106.             
  107.         } else {}
  108.     }
  109.     #[Route('/materassi'name'price_list_materassi')]
  110.     public function price_list_materassi(): Response
  111.     {
  112.         return $this->render('price_list/index.html.twig', [
  113.             'controller_name' => 'PriceListController',
  114.         ]);
  115.     }
  116.     #[Route('/expand'name'price_list_expand')]
  117.     public function expand($optParams=null): Response
  118.     {
  119.         //legge dalla request l'id del price list da espandere e controlla sia un valore valido
  120.         $idPriceList $this->request->query->get('id');
  121.         //nel caso i parametri opzionali non siano già stati passati nella chiamata del metodo, provo a ricavarli dalla request POST
  122.         if ($optParams == null){
  123.             $optParams=[]; //arrayvuoto
  124.             $optParams['tipoUscita'] = $this->request->get('tipoUscita');
  125.             $this->logger->info("tipoUscita: {$optParams['tipoUscita']} letto dal POST");
  126.         } else {}
  127.         $output=[]; //contenitore per uscite della response
  128.         if ( isset($optParams) && is_array($optParams) ){
  129.             $possibiliTipiUscita=['json','array','template','queryPS'];
  130.             //controllo se il tipoUscita è definito ed è appartenente ai tipi permessi
  131.             if ( isset($optParams['tipoUscita']) && is_string($optParams['tipoUscita']) && in_array($optParams['tipoUscita'],$possibiliTipiUscita) ){
  132.                 $tipoUscita $optParams['tipoUscita'];
  133.             } else {
  134.                 $output['warning']="tipoUscita definito {$optParams['tipoUscita']} , ma non valido";
  135.                 $tipoUscita 'json';
  136.             }
  137.         }
  138.         else {
  139.             $tipoUscita 'json';
  140.         }
  141.         $esplosoListino=[]; //contenitore per l'esplosione del listino
  142.         if ( $idPriceList != null && ((int) $idPriceList 0) ){}
  143.         else{
  144.             $output['error']='missing or wrong id in request';
  145.             $jresponse = new JsonResponse ($output);
  146.             $jresponse->setStatusCode(Response::HTTP_BAD_REQUEST);
  147.             return $jresponse;
  148.         }
  149.         //legge dal database il record price list e controlla che esista
  150.         $priceList $this->em->getRepository(PriceList::class)->find($idPriceList);
  151.         if ($priceList != null){}
  152.         else {
  153.             $output['error']='missing id in price list database';
  154.             $jresponse = new JsonResponse ($output);
  155.             $jresponse->setStatusCode(Response::HTTP_NOT_FOUND);
  156.             return $jresponse;
  157.         }
  158.         //parto con l'espansione
  159.         $prezzi $priceList->getPrice(); //ottiene gli oggetti price correlati
  160.         $numeroPrezzi count($prezzi);
  161.         //ciclo sui prezzi
  162.         for ($i=0;$i<$numeroPrezzi;$i++){
  163.             $prodotti $prezzi[$i]->getProducts(); //ottiene gli oggetti product correlati
  164.             $numeroProdotti count($prodotti);
  165.             //ciclo sui prodotti abbinati ai prezzi
  166.             for ($j=0;$j<$numeroProdotti;$j++){
  167.                 $prodArca $prodotti[$j]->getProductArca(); //contiene il prodotto arca corrispondente
  168.                 $prodPS $prodotti[$j]->getProductPS(); //contiene il prodotto prestashop corrispondente
  169.                 if ($prodPS != null){
  170.                     if ($prodPS->getIdProductAttribute() != null ){
  171.                         $parentProdPS $this->em->getRepository(ProductPS::class)->findParent();
  172.                     } else {
  173.                         $parentProdPS null;
  174.                     }
  175.                 }
  176.                 $esplosoListino[$prodArca->getCdar()]=[
  177.                     'product' => $prodotti[$j],
  178.                     'productArca' => $prodArca,
  179.                     'productPS' => $productPS,
  180.                     'price' => $prezzi[$i],
  181.                 ];
  182.             }
  183.         }
  184.         //
  185.         ksort($esplosoListino); //ordina alfabeticamente per chiavi (cdar)
  186.         $output['message']="expand results price_list id:{$idPriceList}";
  187.         $output['priceList']=$priceList;
  188.         $output['priceListExpanded']=$esplosoListino;
  189.         switch($tipoUscita){
  190.             case 'template' :
  191.                 return $this->render('price_list/expanded.html.twig',$output);
  192.                 break;
  193.             case 'queryPS':
  194.                 return $this->render('price_list/queryPS.html.twig',$output);
  195.                 break;
  196.             default : //lo uso per tipo uscita json, dato che lo uso come fallback
  197.                 $jresponse = new JsonResponse ($output);
  198.                 $jresponse->setStatusCode(Response::HTTP_OK);
  199.                 return $jresponse;
  200.                 break;
  201.         }
  202.         if ($tipoUscita == 'json'){
  203.             
  204.         } else {}
  205.     }
  206.     /**
  207.      * Per stampare le query di update necessarie
  208.      */
  209.     #[Route('/queryPS'name'price_list_queryPS')]
  210.     public function queryPS($optParams=null): Response
  211.     {
  212.         //legge dalla request l'id del price list da espandere e controlla sia un valore valido
  213.         $idPriceList $this->request->query->get('id');
  214.         //nel caso i parametri opzionali non siano già stati passati nella chiamata del metodo, provo a ricavarli dalla request POST
  215.         /*if ($optParams == null){
  216.             $optParams=[]; //arrayvuoto
  217.             $optParams['tipoUscita'] = $this->request->get('tipoUscita');
  218.             $this->logger->info("tipoUscita: {$optParams['tipoUscita']} letto dal POST");
  219.         } else {}
  220.         $output=[]; //contenitore per uscite della response
  221.         if ( isset($optParams) && is_array($optParams) ){
  222.             $possibiliTipiUscita=['json','array','template','queryPS'];
  223.             //controllo se il tipoUscita è definito ed è appartenente ai tipi permessi
  224.             if ( isset($optParams['tipoUscita']) && is_string($optParams['tipoUscita']) && in_array($optParams['tipoUscita'],$possibiliTipiUscita) ){
  225.                 $tipoUscita = $optParams['tipoUscita'];
  226.             } else {
  227.                 $output['warning']="tipoUscita definito {$optParams['tipoUscita']} , ma non valido";
  228.                 $tipoUscita = 'json';
  229.             }
  230.         }
  231.         else {
  232.             $tipoUscita = 'json';
  233.         }*/
  234.         $esplosoListino=[]; //contenitore per l'esplosione del listino
  235.         if ( $idPriceList != null && ((int) $idPriceList 0) ){}
  236.         else{
  237.             $output['error']='missing or wrong id in request';
  238.             $jresponse = new JsonResponse ($output);
  239.             $jresponse->setStatusCode(Response::HTTP_BAD_REQUEST);
  240.             return $jresponse;
  241.         }
  242.         //legge dal database il record price list e controlla che esista
  243.         $priceList $this->em->getRepository(PriceList::class)->find($idPriceList);
  244.         if ($priceList != null){}
  245.         else {
  246.             $output['error']='missing id in price list database';
  247.             $jresponse = new JsonResponse ($output);
  248.             $jresponse->setStatusCode(Response::HTTP_NOT_FOUND);
  249.             return $jresponse;
  250.         }
  251.         //parto con l'espansione
  252.         $prezzi $priceList->getPrice(); //ottiene gli oggetti price correlati
  253.         $numeroPrezzi count($prezzi);
  254.         //PRIMO ciclo sui prezzi, per preparare una lista dei prodotti prestashop BASE (senza variazioni) che hanno subito aggiornamento prezzo
  255.         $parentsAggiornati = []; // contenitore per i parents (prodotti prestashop base) soggetti ad aggiornamento
  256.         $childrenAggiornati = []; // contenitore per i parents (prodotti prestashop base) soggetti ad aggiornamento
  257.         for ($i=0;$i<$numeroPrezzi;$i++){
  258.             $prodotti $prezzi[$i]->getProducts(); //ottiene gli oggetti product correlati
  259.             $numeroProdotti count($prodotti);
  260.             //ciclo sui prodotti abbinati ai prezzi
  261.             for ($j=0;$j<$numeroProdotti;$j++){
  262.                 $prodArca $prodotti[$j]->getProductArca(); //contiene il prodotto arca corrispondente
  263.                 $prodottiPS $prodotti[$j]->getProductPS(); //contiene i prodotti prestashop corrispondente
  264.                 $numPPS count ($prodottiPS);
  265.                 //ciclo sui prodotti prestashop abbianti al prodotto in questione (potrebbero essere più cloni, per svariati motivi)
  266.                 for ($h=0$h<$numPPS$h++){
  267.                     if ($prodottiPS[$h] != null){ //nel caso sia stato rintracciato
  268.                         //nel caso in cui siamo in presenza di un prodotto variation che ha un parent
  269.                         if ($prodottiPS[$h]->getIdProductAttribute() != null ){ //prelevo il parent
  270.                             //in questo primo ciclo non faccio nulla
  271.                         } else { //caso in cui il prodotto non ha parent e quindi è un prodotto base, lo inserisco nell'apposito contenitore
  272.                             $prezzoPerUpdate=$prezzi[$i]->getAmount();
  273.                             $parentsAggiornati[$prodottiPS[$h]]=[
  274.                                 'product' => $prodotti[$j],
  275.                                 'productArca' => $prodArca,
  276.                                 'productPS' => $prodottiPS[$h],
  277.                                 'price' => $prezzi[$i],
  278.                                 'prezzoPerUpdate' => $prezzoPerUpdate,
  279.                             ];
  280.                         }
  281.                     } else {
  282.                         continue;
  283.                     }
  284.                 }
  285.             }
  286.         }
  287.         //FINE PRIMO Ciclo sui prezzi e inizio del secondo
  288.         for ($i=0;$i<$numeroPrezzi;$i++){
  289.             $prodotti $prezzi[$i]->getProducts(); //ottiene gli oggetti product correlati
  290.             $numeroProdotti count($prodotti);
  291.             //ciclo sui prodotti abbinati ai prezzi
  292.             for ($j=0;$j<$numeroProdotti;$j++){
  293.                 $prodArca $prodotti[$j]->getProductArca(); //contiene il prodotto arca corrispondente
  294.                 $prodottiPS $prodotti[$j]->getProductPS(); //contiene i prodotti prestashop corrispondenti
  295.                 $numPPS count ($prodottiPS);
  296.                 //ciclo sui prodotti prestashop abbianti al prodotto in questione (potrebbero essere più cloni, per svariati motivi)
  297.                 for ($h=0$h<$numPPS$h++){
  298.                     if ($prodottiPS[$h] != null){ //nel caso sia stato rintracciato
  299.                         //nel caso in cui siamo in presenza di un prodotto variation che ha un parent
  300.                         $idpa=$prodottiPS[$h]->getIdProductAttribute();
  301.                         if ( $idpa != null ){
  302.                             //tento di prelevare il parent prima dall'array $parentsAggiornati perché se è stato aggiornato il suo prezzo a database può averne ancora uno vecchio
  303.                             //inoltre è più celere
  304.                             $idParentPerRicerca=$prodottiPS[$h]->getIdProduct();
  305.                             //se c'è il parent aggiornato, uso il prezzo per la differenza
  306.                             if ( isset($parentsAggiornati[$idParentPerRicerca]) ){
  307.                                 $prezzoParent $parentsAggiornati[$idParentPerRicerca]['prezzoPerUpdate'];
  308.                             } else { //se non c'è lo prelevo dal database
  309.                                 $parentProdPS $this->em->getRepository(ProductPS::class)->findParent($idParentPerRicerca);
  310.                                 $prezzoParent $parentProdPS->getLastPrice();
  311.                             }
  312.                             //calcolo la differenza tra il child ed il proprio parent
  313.                             $prezzoPerUpdate $prezzi[$i]->getAmount() - $prezzoParent;
  314.                             $childrenAggiornati[]=[
  315.                                 'product' => $prodotti[$j],
  316.                                 'productArca' => $prodArca,
  317.                                 'productPS' => $prodottiPS[$h],
  318.                                 'price' => $prezzi[$i],
  319.                                 'prezzoPerUpdate' => $prezzoPerUpdate,
  320.                             ];
  321.                         } else { //caso in cui il prodotto non ha parent, non faccio nulla perché è stato sicuramente già inserito in update nel primo ciclo
  322.                             //$prezzoPerUpdate = $prezzi[$i]->getAmount();
  323.                         }
  324.                     } else {
  325.                         continue;
  326.                     }
  327.                 }
  328.                 /*
  329.                 $esplosoListino[$prodArca->getCdar()]=[
  330.                     'product' => $prodotti[$j],
  331.                     'productArca' => $prodArca,
  332.                     'productPS' => $productPS,
  333.                     'price' => $prezzi[$i],
  334.                     'prezzoPerUpdate' => $prezzoPerUpdate,
  335.                 ];*/
  336.             }
  337.         }
  338.         $output = [
  339.             'parentsAggiornati' => $parentsAggiornati,
  340.             'childrenAggiornati' => $childrenAggiornati,
  341.         ];
  342.         return $this->render('price_list/queryPS.html.twig',$output);
  343.         //
  344.         /*ksort($esplosoListino); //ordina alfabeticamente per chiavi (cdar)
  345.         $output['message']="expand results price_list id:{$idPriceList}";
  346.         $output['priceList']=$priceList;
  347.         $output['priceListExpanded']=$esplosoListino;
  348.         switch($tipoUscita){
  349.             case 'template' :
  350.                 return $this->render('price_list/expanded.html.twig',$output);
  351.                 break;
  352.             case 'queryPS':
  353.                 return $this->render('price_list/queryPS.html.twig',$output);
  354.                 break;
  355.             default : //lo uso per tipo uscita json, dato che lo uso come fallback
  356.                 $jresponse = new JsonResponse ($output);
  357.                 $jresponse->setStatusCode(Response::HTTP_OK);
  358.                 return $jresponse;
  359.                 break;
  360.         }
  361.         if ($tipoUscita == 'json'){
  362.             
  363.         } else {}*/
  364.     }
  365.     #[Route('/update'name'price_list_update')]
  366.     public function aggiornaPrezzi(){
  367.         //legge dalla request l'id del price list da espandere e controlla sia un valore valido
  368.         /*$idPriceList = $this->request->query->get('id');
  369.         if ( is_int($idPriceList) && $idPriceList>0 ){
  370.             $priceList = $this->em->getRepository(PriceList::class)->find($idPriceList);
  371.             if ($priceList != null){}
  372.             else {
  373.                 $output = "listino corrispondente a {$idPriceList} non impostato";
  374.                 $jresponse = new JsonResponse($output);
  375.                 $jresponse->setStatusCode(Response::HTTP_NOT_FOUND);
  376.                 return $jresponse;
  377.             }
  378.         } else {
  379.             $output = "id listino : {$idPriceList} non corretto";
  380.             $jresponse = new JsonResponse($output);
  381.             $jresponse->setStatusCode(Response::HTTP_BAD_REQUEST);
  382.             return $jresponse;
  383.         }*/
  384.         $dtnow = new \DateTime();
  385.         $newPriceList = new PriceList();
  386.         $newPriceList->setCreated($dtnow);
  387.         $newPriceList->setUpdated($dtnow);
  388.         $newPriceList->setStart($dtnow);
  389.         $this->em->persist($newPriceList);
  390.         //importo i dati da aggiornare
  391.         $PDA_raw = new PrezziDaAggiornare();
  392.         $PDA $PDA_raw->prodotti//array di prodotti [ ['Cd_AR' => 'WMSFTCNF-BSN-10','price' => '1988',], ... ]
  393.         $iMax=count($PDA);
  394.         $esito_iterazioni=[]; //contenitore per uscite
  395.         for ($i=0;$i<$iMax;$i++){
  396.             //per comodità assegno il valori
  397.             $Cd_AR $PDA[$i]['Cd_AR'];
  398.             $price $PDA[$i]['price'];
  399.             //rintraccio il ProductArca mediante cd_ar, controllo se non esiste segno l'errore e tralascio l'iterazione
  400.             $prodArca $this->em->getRepository(ProductArca::class)->findByCdar($Cd_AR);
  401.             $this->logger->info('prodArca '.json_encode(get_object_vars($prodArca)));
  402.             if ($prodArca != null ){
  403.             }
  404.             else {
  405.                 $esito_iterazioni[$i]="prodotto arca corrispondente a Cd_AR: {$Cd_AR} non rintracciato";
  406.                 continue;
  407.             }
  408.             //estrapolo il prodotto corrispondente, controllo se non esiste segno l'errore e tralascio l'iterazione
  409.             $prod $prodArca->getProduct();
  410.             if ($prod != null){}
  411.             else {
  412.                 $esito_iterazioni[$i]="prodotto corrispondente a Cd_AR: {$Cd_AR} e idProductArca: {$prodArca->getId()} non rintracciato";
  413.                 continue;
  414.             }
  415.             //estrapolo il prezzo attuale
  416.             $prezzoPrecedente $prod->getLastPrice();
  417.             if ($prezzoPrecedente != null){
  418.                 if (is_array($prezzoPrecedente)){
  419.                     $esito_iterazioni[$i]="PROBLEMA: Trovato più di un prezzo precedente ancora valido per il prodotto corrispondente Cd_AR: {$Cd_AR} e idProductArca: {$prodArca->getId()}";
  420.                     continue;
  421.                 } else{}
  422.             }
  423.             else {
  424.                 $esito_iterazioni[$i]="Prezzo precedente prodotto corrispondente Cd_AR: {$Cd_AR} e idProductArca: {$prodArca->getId()} non rintracciato";
  425.                 continue;
  426.             }
  427.             //verifico che l'id price list precedente fosse abbinato
  428.             /*$abbinamentiPriceList = $prezzoPrecedente->getPriceLists();
  429.             $abbinamentoPresente = false;
  430.             foreach($abbinamentiPriceList as $apl){
  431.                 //se trovo l'abbinamento, ritorno la variabile a true e stoppo il ciclo
  432.                 if ($apl->getId() == $idPriceList){
  433.                     $abbinamentoPresente = true;
  434.                     break;
  435.                 } else {}
  436.             }
  437.             //se il prezzo non è abbinato al listino che devo aggiornare, torno un errore e passo all'iterazione successiva
  438.             if ($abbinamentoPresente){} else {
  439.                 $esito_iterazioni[$i]="A database non risultano corrispondenze tra price di Cd_AR: {$Cd_AR} e listino id: {$idPriceList}... verificare";
  440.                 continue;
  441.             }*/
  442.             //effettuo la variazione vera e propria
  443.             $esito_iterazioni[$i]="Cd_AR: {$Cd_AR} Prezzo precedente: {$prezzoPrecedente->getAmount()} Nuovo Prezzo: {$price}";
  444.             //chiudo il prezzo precedente
  445.             $prezzoPrecedente->setEnd($dtnow);
  446.             //creo un nuovo prezzo
  447.             $prezzoAttuale = new Price();
  448.             $prezzoAttuale->setAmount($price);
  449.             $prezzoAttuale->addProduct($prod);
  450.             $prezzoAttuale->setCreated($dtnow);
  451.             $prezzoAttuale->setUpdated($dtnow);
  452.             $prezzoAttuale->setStart($dtnow);
  453.             $prezzoAttuale->addPriceList($newPriceList);
  454.             $this->em->persist($prezzoAttuale);
  455.         }
  456.         //SALVO LE MODIFICHE A DATABASE
  457.         $this->em->flush();//DISATTIVATA PER DEBUG
  458.         $jresponse = new JsonResponse ($esito_iterazioni);
  459.         $jresponse->setStatusCode(Response::HTTP_OK);
  460.         return $jresponse;
  461.     }
  462. #[Route('/new'name'price_list_new')]
  463.     public function creaListinoPrezzi(){
  464.         $jsonResponse = new JsonResponse();
  465.         $output=[];
  466.         //
  467.         $dtnow = new \DateTime(); //tempo attuale
  468.         $newPriceList = new PriceList();
  469.         $newPriceList->setCreated($dtnow);
  470.         $newPriceList->setUpdated($dtnow);
  471.         //legge dalla request gli input json decodificandoli in array associativo
  472.         $requestJson_dec json_decode($this->request->getContent(),true);
  473.         if ( isset($requestJson_dec['prices']) && is_array($requestJson_dec['prices']) && count($requestJson_dec['prices'])>){
  474.             $arrPrezzi $requestJson_dec['prices'];
  475.             $numPrezzi count($arrPrezzi);
  476.             //controllo data di inizio applicazione listino
  477.             if ( isset($requestJson_dec['start']) && is_string($requestJson_dec['start']) ){
  478.                 //controllo se la stringa passata è davvero una data
  479.                 $dataInizio date_create_from_format('Y-m-d H:i:s',$requestJson_dec['start']);
  480.                 if ( $dataInizio instanceOf \DateTime ){
  481.                     $newPriceList->setStart($dataInizio);
  482.                 } else {
  483.                     $jsonResponse->setStatusCode(400);
  484.                     $jsonResponse->setContent("start: data di inizio non valida");
  485.                     return $jsonResponse;
  486.                 }
  487.                 if ( isset($requestJson_dec['end']) && is_string($requestJson_dec['end']) ){
  488.                     //controllo se la stringa passata è davvero una data
  489.                     $dataFine date_create_from_format('Y-m-d H:i:s',$requestJson_dec['end']);
  490.                     if ( $dataFine instanceOf \DateTime ){
  491.                         $newPriceList->setEnd($dataFine);
  492.                     } else {
  493.                         $dataFine null;
  494.                         $jsonResponse->setStatusCode(400);
  495.                         $jsonResponse->setContent("end: data di fine non valida");
  496.                         return $jsonResponse;
  497.                     }
  498.                 } else {
  499.                     $newPriceList->setEnd(null);
  500.                 }
  501.             } else {
  502.                 $jsonResponse->setStatusCode(400);
  503.                 $jsonResponse->setContent("start: data di inizio uso listino prezzi mancante");
  504.                 return $jsonResponse;
  505.             }
  506.             //validazione dei parametri in ingresso effettuata, posso proseguire e intanto persisto il listino nuovo
  507.             $this->em->persist($newPriceList);
  508.         } else {
  509.             $jsonResponse->setStatusCode(400);
  510.             $jsonResponse->setContent("prices: array dei prezzi mancante o vuoto");
  511.             return $jsonResponse;
  512.         }
  513.         //ciclo effettivo sui prezzi
  514.         for ($i=0;$i<$numPrezzi;$i++){
  515.             if ( isset($arrPrezzi[$i]['Cd_AR']) && is_string($arrPrezzi[$i]['Cd_AR']) && isset($arrPrezzi[$i]['price']) && is_int($arrPrezzi[$i]['price']) ){
  516.                 $productArca $this->em->getRepository(ProductArca::class)->findOneBy([
  517.                     'cdar' => $arrPrezzi[$i]['Cd_AR'],
  518.                 ]);
  519.                 if ($productArca != null){
  520.                     $product $productArca->getProduct();
  521.                 } 
  522.                 else {
  523.                     $output["scarto {$i}"] = $arrPrezzi[$i];
  524.                     continue; //interrompo l'iterazione corrente e passo alla successiva
  525.                 }
  526.             }
  527.             else {
  528.                 $output["scarto {$i}"] = $arrPrezzi[$i];
  529.                 continue; //interrompo l'iterazione corrente e passo alla successiva
  530.             }
  531.             $newPrice = new Price();
  532.             $newPrice->setAmount($arrPrezzi[$i]['price']);
  533.             $newPrice->setCreated($dtnow);
  534.             $newPrice->setUpdated($dtnow);
  535.             $newPrice->setStart($dataInizio);
  536.             if (isset($dataFine) && $dataFine != null){
  537.                 $newPrice->setEnd($dataFine);
  538.             } else {
  539.                 $newPrice->setEnd(null);
  540.             }
  541.             $newPrice->addProduct($product);
  542.             $newPrice->addPriceList($newPriceList);
  543.             $this->em->persist($newPrice);
  544.             $output["Aggiungo {$i}"]="Aggiunto {$arrPrezzi[$i]['Cd_AR']}, prezzo: {$arrPrezzi[$i]['price']}";
  545.         }
  546.         //salvo in database
  547.         $this->em->flush();
  548.         $jsonResponse->setStatusCode(200);
  549.         $jsonResponse->setContent(json_encode($output));
  550.         return $jsonResponse;   
  551.     }
  552. //FINE CONTROLLER