src/Controller/InvoiceController.php line 42

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Component\HttpFoundation\Response;
  4. use Symfony\Component\HttpFoundation\JsonResponse;
  5. use Symfony\Component\HttpFoundation\RedirectResponse;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  8. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  9. use \MongoDB\Client as MongoDBClient;
  10. use App\Entity\ImporterCSV;
  11. use App\Entity\ManebiCSV;
  12. use App\Entity\InvoiceSearch\InvoiceSearchEngine;
  13. use App\Entity\InvoiceSearch\Criterion\OrderIdCriterion;
  14. use App\Entity\InvoiceSearch\Criterion\InvoiceIdCriterion;
  15. use App\Entity\InvoiceSearch\Criterion\DateCriterion;
  16. use App\Entity\InvoiceSearch\Criterion\TypeCriterion;
  17. use App\Entity\InvoiceSearch\Criterion\ShopCriterion;
  18. use App\Entity\InvoiceSearch\Criterion\IdImportazioneCriterion;
  19. use App\Entity\Profis\ManebiProfisXML;
  20. use App\Entity\FatturaElettronica\ManebiFatturaElettronica;
  21. use App\Entity\ManebiStats;
  22. use App\Entity\OrderProduct;
  23. use Dompdf\Dompdf;
  24. /**
  25.  * 
  26.  */
  27. class InvoiceController extends AdminController
  28. {
  29.     public $importKey 'Numero Fattura';
  30.     public $session NULL;
  31.     /**
  32.      * 
  33.      */
  34.     public function manage(Request $requestManebiStats $statsSessionInterface $session)
  35.     {
  36.         $this->init($session);
  37.         if($request->attributes->get('_route') == 'admin_main'){
  38.             return new RedirectResponse($this->get('router')->generate('invoices_main'));
  39.         }
  40.         $filters = ['fatture-ids' => [], 'order-ids' => [], 'date-from' => '''date-to' => '''type' => ''];
  41.         $filter_params = [];
  42.         $export false;
  43.         if($request->getMethod() == 'POST')
  44.         {
  45.             $filter_params['filter'] = $request->request->has('filter') ? $request->request->get('filter') : NULL;
  46.             $filter_params['filter-fatture-ids']  = $request->request->has('filter-fatture-ids') ? $request->request->get('filter-fatture-ids') : NULL;
  47.             $filter_params['filter-orders-ids']  = $request->request->has('filter-orders-ids') ? $request->request->get('filter-orders-ids') : NULL;
  48.             $filter_params['filter-date-from'] = $request->request->has('filter-date-from') ? $request->request->get('filter-date-from') : NULL;
  49.             $filter_params['filter-date-to'] = $request->request->has('filter-date-to') ? $request->request->get('filter-date-to') : NULL;
  50.             $filter_params['filter-type'] = $request->request->has('filter-type') ? $request->request->get('filter-type') : NULL;
  51.             $filter_params['filter-id-log-imports']  = $request->request->has('filter-id-log-imports') ? $request->request->get('filter-id-log-imports') : NULL;
  52.         }else{
  53.             $filter_params['filter'] = $request->query->has('filter') ? $request->query->get('filter') : NULL;
  54.             $filter_params['filter-fatture-ids']  = $request->query->has('filter-fatture-ids') ? $request->query->get('filter-fatture-ids') : NULL;
  55.             $filter_params['filter-orders-ids']  = $request->query->has('filter-orders-ids') ? $request->query->get('filter-orders-ids') : NULL;
  56.             $filter_params['filter-date-from'] = $request->query->has('filter-date-from') ? $request->query->get('filter-date-from') : NULL;
  57.             $filter_params['filter-date-to'] = $request->query->has('filter-date-to') ? $request->query->get('filter-date-to') : NULL;
  58.             $filter_params['filter-type'] = $request->query->has('filter-type') ? $request->query->get('filter-type') : NULL;
  59.             $filter_params['filter-id-log-imports']  = $request->query->has('filter-id-log-imports') ? $request->query->get('filter-id-log-imports') : NULL;
  60.         }
  61.         if($filter_params['filter'])
  62.         {
  63.             $invoiceSearchEngine = new InvoiceSearchEngine($this->getDoctrine()->getManager()->getConnection());
  64.             // Filter By Shop
  65.             if($this->session->has('id_shop'))
  66.             {
  67.                 $this->id_shop = (int) $this->session->get('id_shop');
  68.                 $shopIdCriterion = new ShopCriterion('shop-id');
  69.                 $shopIdCriterion->setId($this->id_shop);
  70.                 $invoiceSearchEngine->addCriterion($shopIdCriterion);
  71.             }
  72.             // Filter by ids
  73.             if($filter_params['filter-fatture-ids'])
  74.             {
  75.                 $invoiceIdCriterion = new InvoiceIDCriterion('invoice-ids');
  76.                 $_filtersIds $filter_params['filter-fatture-ids'];
  77.                 
  78.                 if(!empty($_filtersIds))
  79.                 {
  80.                     foreach($_filtersIds as $tag)
  81.                     {
  82.                         $filters['fatture-ids'][] = $tag['tag'];
  83.                     }
  84.                 }
  85.                 $invoiceIdCriterion->setIDs($filters['fatture-ids']);
  86.                 $invoiceSearchEngine->addCriterion($invoiceIdCriterion);
  87.             }
  88.             // Filter by ids
  89.             if($filter_params['filter-orders-ids'])
  90.             {
  91.                 $orderIdCriterion = new OrderIDCriterion('order-ids');
  92.                 $_filtersIds $filter_params['filter-orders-ids'];
  93.                 
  94.                 if(!empty($_filtersIds))
  95.                 {
  96.                     foreach($_filtersIds as $tag)
  97.                     {
  98.                         $filters['order-ids'][] = $tag['tag'];
  99.                     }
  100.                 }
  101.                 $orderIdCriterion->setIDs($filters['order-ids']);
  102.                 $invoiceSearchEngine->addCriterion($orderIdCriterion);
  103.             }
  104.             // Filter by Date From
  105.             if($filter_params['filter-date-from'])
  106.             {
  107.                 $dateFrom $filter_params['filter-date-from'];
  108.                 if($dateFrom != ''){
  109.                     $invoiceDateFromCriterion = new DateCriterion('date-from');
  110.                     $invoiceDateFromCriterion->greaterOrEqualTo($dateFrom);
  111.                     $invoiceSearchEngine->addCriterion($invoiceDateFromCriterion);
  112.                 }
  113.                 
  114.             }
  115.             if($filter_params['filter-date-to'])
  116.             {
  117.                 $dateTo $filter_params['filter-date-to'];
  118.                 if($dateTo != ''){
  119.                     $invoiceDateToCriterion = new DateCriterion('date-to');
  120.                     $invoiceDateToCriterion->lessOrEqualTo($dateTo);
  121.                     $invoiceSearchEngine->addCriterion($invoiceDateToCriterion);
  122.                 }
  123.             }
  124.             if($filter_params['filter-type'])
  125.             {
  126.                 $type $filter_params['filter-type'];
  127.                 if($type != ''){
  128.                     $invoiceTypeCriterion = new TypeCriterion('type');
  129.                     $invoiceTypeCriterion->setValue($type);
  130.                     $invoiceSearchEngine->addCriterion($invoiceTypeCriterion);
  131.                 }
  132.             }
  133.             if($filter_params['filter-id-log-imports'])
  134.             {
  135.                 $idImportazione trim($filter_params['filter-id-log-imports']);
  136.                 if($idImportazione != '')
  137.                 {
  138.                     $IdImportazioneCriterion = new IdImportazioneCriterion('id-log-imports');
  139.                     $IdImportazioneCriterion->setValue($idImportazione);
  140.                     $invoiceSearchEngine->addCriterion($IdImportazioneCriterion);
  141.                 }
  142.             }
  143.             if($invoiceSearchEngine->search())
  144.             {
  145.                 $results $invoiceSearchEngine->getResults();
  146.                 foreach($results as &$result)
  147.                 {
  148.                     $result['Prodotti'] = $this->getProdottiByOrder($result['Order']);
  149.                 }
  150.                 if($request->request->has('exportProfis'))
  151.                 {
  152.                     $type $type == 'invoices' 'fatture' $type;
  153.                     
  154.                     $response = new Response($this->exportProfisXML($type$results));
  155.                     $response->headers->set('Content-Type''text/xml');
  156.                     return $response;
  157.                 }
  158.                 if($request->request->has('exportFatturaElettronica'))
  159.                 {
  160.                     $type $type == 'invoices' 'fatture' $type;
  161.                     
  162.                     // Recupera i dettagli della Fattura/Nota credito
  163.                     foreach($results as &$result)
  164.                     {
  165.                         $result['conversion_rate'] = $this->getConversionRate('EUR''GBP'$result['Created at']);
  166.                         $result['tax_rate'] = $this->getTaxRateByCountry($result['Shipping Country']);
  167.                         $result = \App\Pdf\ManebiPdf::getPdfVariables($result, [], $this->getDoctrine()->getManager()->getConnection());
  168.                     }
  169.                     $response = new Response($this->exportFatturaElettronica($type$results));
  170.                     $response->headers->set('Content-Type''application/octect-stream');
  171.                     return $response;
  172.                 }
  173.                 if($request->request->has('exportCSV') || $request->request->has('exportCSVDetails'))
  174.                 {   
  175.                     foreach($results as &$result)
  176.                     {
  177.                         $result['conversion_rate'] = $this->getConversionRate('EUR''GBP'$result['Created at']);
  178.                         $result['tax_rate'] = $this->getTaxRateByCountry($result['Shipping Country']);
  179.                         $result = \App\Pdf\ManebiPdf::getPdfVariables($result, [], $this->getDoctrine()->getManager()->getConnection());
  180.                     }
  181.                     if($request->request->has('exportCSV'))
  182.                     {
  183.                         $response = new Response($this->exportCSV($type$results));
  184.                     }
  185.                         
  186.                     if($request->request->has('exportCSVDetails'))
  187.                     {
  188.                         $response = new Response($this->exportCSVDetails($type$results));
  189.                     }
  190.                     return $response;
  191.                 }
  192.                 /*if($request->request->has('getPdf'))
  193.                 {
  194.                     $type = $type == 'invoices' ? 'fatture' : $type;
  195.                     
  196.                     $response = new Response($this->getPdf($type, $results));
  197.                     $response->headers->set('Content-Type', 'text/xml');
  198.                     return $response;
  199.                 }*/
  200.                 return new JsonResponse(['status' => 'OK''data' => $results]);
  201.             }else{
  202.                 return new JsonResponse(['status' => 'ERROR''message' => 'Cannot search']);
  203.             }
  204.         }
  205.         $params = [];
  206.         $params['ordiniSenzaIncassiERimborsi'] = $stats->getOrdiniSenzaIncassiERimborsi();
  207.         $params['shop'] = $this->getShop();
  208.         $params['id_shop'] = $this->session->get('id_shop');
  209.         return $this->render('invoices.html.twig'$params);
  210.     }
  211.     /**
  212.      * Get Invoice Data (Use Search Engine in order to search the target invoice)
  213.      */
  214.     public function getInvoice(Request $requestSessionInterface $sessionstring $invoiceId$getPdf false)
  215.     {
  216.         $this->init($session);
  217.         $invoiceId '#'.$invoiceId;
  218.         $invoiceSearchEngine = new InvoiceSearchEngine($this->getDoctrine()->getManager()->getConnection());
  219.         $orderIdCriterion = new OrderIDCriterion('order-ids');
  220.         $orderIdCriterion->setIDs([$invoiceId]);
  221.         $invoiceSearchEngine->addCriterion($orderIdCriterion);
  222.         if($invoiceSearchEngine->search())
  223.         {
  224.             $results $invoiceSearchEngine->getResults();
  225.         }
  226.         if($getPdf && !empty($results))
  227.         {
  228.             $result $results[0];
  229.             $result['conversion_rate'] = $this->getConversionRate('EUR''GBP'$result['Created at']);
  230.             $result['tax_rate'] = $this->getTaxRateByCountry($result['Shipping Country']);
  231.             //Recupera i prodotti
  232.             $prodotti $this->getProdottiByOrder($result['Order']);
  233.             $result['Prodotti'] = $prodotti;
  234.             
  235.             $result = \App\Pdf\ManebiPdf::getPdfVariables($result, [], $this->getDoctrine()->getManager()->getConnection());
  236.             //dump($result);
  237.             //die('test');
  238.             if($request->query->has('proforma_return'))
  239.             {
  240.                 $domPdf $this->getPdf('proforma_return'$this->session->get('id_shop'), ['order' => $result'prodotti' => $prodotti]);
  241.             }else {
  242.                 $domPdf $this->getPdf('fattura'$this->session->get('id_shop'), ['order' => $result'prodotti' => $prodotti]);
  243.             }
  244.             
  245.             return new Response($domPdf->output(), 200,
  246.                                         [
  247.                                             'Content-Type' => 'application/pdf',
  248.                                             'Content-Disposition' => 'attachment; filename="'.'MANEBI-'.(!$request->query->has('proforma_return') ? 'INVOICE' 'RETURN').' ' . (!$request->query->has('proforma_return') ? $result['Numero Fattura'] : (str_replace('#','',$result['Order']) .'-'.$result['Shipping Country'])) . '.pdf'.'"'
  249.                                         ]);
  250.         }
  251.         return new JsonResponse(['status' => 'OK''data' => $results]);
  252.     }
  253.     /**
  254.      * Import Invoices
  255.      */
  256.     public function shopify_import(Request $requestImporterCSV $importerCSVSessionInterface $session)
  257.     {
  258.         $this->init($session);
  259.         $params = ['stats' => [], 'load_results' => []];
  260.         $importerCSV->setDB($this->getDoctrine()->getManager());
  261.         $importerCSV->setShopId($this->session->get('id_shop'));
  262.         if($request->getMethod() == 'POST')
  263.         {
  264.             if(isset($_FILES['file-shopify-csv']) && !empty($_FILES['file-shopify-csv']))
  265.             {
  266.                 if($_FILES['file-shopify-csv']['error'] == UPLOAD_ERR_OK)
  267.                 {
  268.                     $filename date('Ymd_His').'-shopify';
  269.                     copy($_FILES['file-shopify-csv']['tmp_name'], dirname(__FILE__) . '/../../temp/import_ordini/'.$filename.'.csv');
  270.                     $result $importerCSV->getFileFromShopify($_FILES['file-shopify-csv']['tmp_name']);
  271.                     $output '';
  272.                     $csv = [];
  273.                     //var_dump(\reset($result['rows']));
  274.                     //$csv[] = array_keys((\reset($result['rows']))[0]);
  275.                     $outputHeader = [];
  276.                     $outputHeader[] = '"Ordini Letti",' . (count($result['processed_rows']) + count($result['orders_skipped']));
  277.                     $outputHeader[] = '"Ordini Processati",' count($result['processed_rows']);
  278.                     $outputHeader[] = '"Ordini Esistenti",' count($result['orders_skipped']) . ', '.implode(' - '$result['orders_skipped']);
  279.                     $outputHeader[] = '"Ordini Antecedenti Ultimo Ordine",' count($result['orders_old']) . ', '.implode(' - '$result['orders_old']);
  280.                     $outputHeader[] = '"Ordini Aliquota diversa:",' count($result['different_vat']) . ', '.implode(' - '$result['different_vat']);
  281.                     $outputHeader[] = '';
  282.                     $outputHeader[] = '';
  283.                     foreach($result['processed_rows'] as $order)
  284.                     {
  285.                         foreach($order as $order_line)
  286.                         {
  287.                             $csv[] = $order_line
  288.                         }
  289.                     }
  290.                     
  291.                     if(count($result['processed_rows']) > 0)
  292.                     {
  293.                         $output $this->array2csv($csv',''"''\\');
  294.                     }
  295.                     
  296.                     $output implode("\n"$outputHeader) . $output;
  297.                     //file_put_contents('/tmp', $output, );
  298.                     file_put_contents(dirname(__FILE__) . '/../../temp/import_ordini/'.$filename.'-output.csv'$output);
  299.                     header('Content-Type: text/csv; charset=UTF-8');
  300.                     header('Content-Description: Manebi - File Transfer CSV Profis');
  301.                     header('Content-Disposition: attachment; filename="' $this->getShop()->getName() . ' - Import from Shopify - ' date('Ymd_Hi') . '.csv"');
  302.                     header('Content-Transfer-Encoding: binary');
  303.                     header('Expires: 0');
  304.                     header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
  305.                     
  306.                     die($output);
  307.                 }
  308.             }
  309.             if($request->query->get('loadInvoices') == 1)
  310.             {
  311.                 $params['load_results'] = $importerCSV->loadInvoices();
  312.                 // 2021-07-26 - Antonio@Tembo: reset Exports for imported file
  313.                 $params['reset_export_results'] = $importerCSV->resetExport();
  314.             }
  315.         }
  316.     }
  317.     /**
  318.      * Import Invoices
  319.      */
  320.     public function import(Request $requestImporterCSV $importerCSVSessionInterface $session)
  321.     {
  322.         $this->init($session);
  323.         $params = ['stats' => [], 'load_results' => []];
  324.         $importerCSV->setDB($this->getDoctrine()->getManager());
  325.         $importerCSV->setShopId($this->session->get('id_shop'));
  326.         if($request->getMethod() == 'POST')
  327.         {
  328.             if(isset($_FILES['file-csv']) && !empty($_FILES['file-csv']))
  329.             {
  330.                 if($_FILES['file-csv']['error'] == UPLOAD_ERR_OK)
  331.                 {
  332.                     $result $importerCSV->importFileInDb($_FILES['file-csv']['tmp_name'], 'tmp_csv_ordini');
  333.                     if($result)
  334.                     {
  335.                         $params['stats'] = $importerCSV->getImportStats('ordini');
  336.                         $params['check_vat_errors'] = $this->checkVatErrors();
  337.                         $params['has_vat_errors'] = false;
  338.                         if(!empty($params['check_vat_errors'])) {
  339.                             foreach($params['check_vat_errors'] as $err)
  340.                             {
  341.                                 if($err['IsError'] <> "OK")
  342.                                 {
  343.                                     $params['has_vat_errors'] = true;
  344.                                     break;
  345.                                 }
  346.                             }
  347.                         }
  348.                     }
  349.                 }
  350.             }
  351.             if($request->query->get('loadInvoices') == 1)
  352.             {
  353.                 $params['load_results'] = $importerCSV->loadInvoices();
  354.                 // 2021-07-26 - Antonio@Tembo: reset Exports for imported file
  355.                 $params['reset_export_results'] = $importerCSV->resetExport();
  356.             }
  357.         }
  358.         $params['checkNumerazioneFatture'] = $this->checkNumerazioneFatture($this->session->get('id_shop'), date('Y'));
  359.         $params['shop'] = $this->getShop();
  360.         $params['id_shop'] = $this->session->get('id_shop');
  361.         $params['importazioni'] = $importerCSV->getImportazioni('invoices');
  362.         return $this->render('invoices.import.html.twig'$params);
  363.     }
  364.     /**
  365.      * 
  366.      */
  367.     public function delete(Request $requestSessionInterface $sessionstring $invoiceId
  368.     {
  369.         $this->init($session);
  370.         $conn $this->getDoctrine()->getManager()->getConnection();
  371.         $idOrder = (int) $invoiceId;
  372.         if($idOrder == 0)
  373.         {
  374.             $id_log_imports = (int) ($request->request->has('id_log_imports') ? $request->request->get('id_log_imports') : NULL);
  375.             if($id_log_imports 0)
  376.             {
  377.                 $conn->prepare('START TRANSACTION')->execute();
  378.                 $conn->prepare('DELETE FROM `ordini_prodotti` WHERE `Order` IN (SELECT `Order` FROM `ordini` WHERE `id_log_imports` = '.(int) $id_log_imports.')')->execute();
  379.                 $conn->prepare('DELETE FROM `ordini` WHERE `id_log_imports` = '.(int) $id_log_imports)->execute();
  380.                 $conn->prepare('UPDATE `log_imports` SET `date_delete` = "' date('Y-m-d H:i:s') . '" WHERE `id` = '.(int) $id_log_imports)->execute();
  381.                 $conn->prepare('COMMIT')->execute();
  382.                 return new JsonResponse(['status' => 'OK']);
  383.             }
  384.             return new JsonResponse(['status' => 'ERROR''message' => 'Importazione non valida']);
  385.         }else
  386.         {
  387.             $Order '#' $idOrder;
  388.             $conn->prepare('START TRANSACTION')->execute();
  389.             
  390.             // Rimuovi i prodotti
  391.             $stmt $conn->prepare('DELETE FROM `ordini_prodotti` WHERE `Order` = "' $Order '"');
  392.             $res $stmt->execute();
  393.             // Rimuovi l'ordine
  394.             $stmt $conn->prepare('DELETEFROM  `ordini` WHERE `Order` = "' $Order '"');
  395.             $res $stmt->execute();
  396.             $conn->prepare('COMMIT')->execute();
  397.             if($res)
  398.             {
  399.                 return new JsonResponse(['status' => 'OK']);   
  400.             }
  401.         }
  402.         
  403.         return new JsonResponse(['status' => 'ERROR''message' => 'Ordine non valido']);
  404.     }
  405.     /**
  406.      * Export for PROFIS
  407.      */
  408.     protected function exportProfisXML($type$results)
  409.     {
  410.         $profis = new ManebiProfisXML();
  411.         $profis->setDB($this->getDoctrine()->getManager())
  412.             ->setIdShop($this->session->get('id_shop'))
  413.             ->setType($type)
  414.             ->generate($results);
  415.         
  416.         header('Content-Type: text/xml; charset=UTF-8');
  417.         header('Content-Description: Manebi - File Transfer XML Profis');
  418.         header('Content-Disposition: attachment; filename="MANEBI - INVOICES - '.date('Ymd_Hi').'.xml"');
  419.         header('Content-Transfer-Encoding: binary');
  420.         header('Expires: 0');
  421.         header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
  422.         return $profis->getXML(true);
  423.     }
  424.     /**
  425.      * Export Fattura Elettronica
  426.      */
  427.     protected function exportFatturaElettronica($type$results)
  428.     {
  429.         $fatturaElettronica = new ManebiFatturaElettronica();
  430.         $fatturaElettronica->setDB($this->getDoctrine()->getManager())
  431.             ->setIdShop($this->session->get('id_shop'))
  432.             ->setType($type)
  433.             ->generate($results);
  434.         
  435.         die();
  436.         header('Content-Type: application/octect-stream');
  437.         header('Content-Description: Manebi - File Transfer XML Profis');
  438.         header('Content-Disposition: attachment; filename="MANEBI - FATTURA ELETTRONICA - '.date('Ymd_Hi').'.xml"');
  439.         header('Content-Transfer-Encoding: binary');
  440.         header('Expires: 0');
  441.         header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
  442.         return $fatturaElettronica->getFiles(true);
  443.     }
  444.     /**
  445.      * Export for PROFIS
  446.      */
  447.     protected function exportCSV($type$results)
  448.     {
  449.         $csv = new ManebiCSV();
  450.         $csv->setType($type)->generateOrders($results);
  451.         
  452.         header('Content-Type: text/csv; charset=UTF-8');
  453.         header('Content-Description: Manebi - File Transfer CSV Profis');
  454.         header('Content-Disposition: attachment; filename="' $this->getShop()->getName() . ' - ' $type ' - ' date('Ymd_Hi') . '.csv"');
  455.         header('Content-Transfer-Encoding: binary');
  456.         header('Expires: 0');
  457.         header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
  458.         return $csv->getCSV(true);
  459.     }
  460.      /**
  461.      * Export for PROFIS
  462.      */
  463.     protected function exportCSVDetails($type$results)
  464.     {
  465.         $csv = new ManebiCSV();
  466.         $csv->setType($type)->generateOrdersDetails($results);
  467.         
  468.         header('Content-Type: text/csv; charset=UTF-8');
  469.         header('Content-Description: Manebi - File Transfer CSV Profis');
  470.         header('Content-Disposition: attachment; filename="' $this->getShop()->getName() . ' - ' $type ' Details - ' date('Ymd_Hi') . '.csv"');
  471.         header('Content-Transfer-Encoding: binary');
  472.         header('Expires: 0');
  473.         header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
  474.         return $csv->getCSV(true);
  475.     }
  476.     /**
  477.      * 
  478.      */
  479.     public function getProdottiByOrder($OrderID)
  480.     {
  481.         $conn $this->getDoctrine()->getManager()->getConnection();
  482.         $stmt $conn->prepare('SELECT * 
  483.                                 FROM ordini_prodotti WHERE `Order` = "'.$OrderID.'"');
  484.         if($stmt->execute())
  485.         {
  486.             $products $stmt->fetchAll();
  487.             if(!empty($products))
  488.             {
  489.                 foreach($products as $key => &$product)
  490.                 { 
  491.                     $_code substr($product['SKU'], 05);
  492.                     $stmt $conn->prepare('SELECT `HSCode`,`CountryOfOrigin`,`EU_ExtraEU`,`Weight` FROM `codici_doganali` WHERE  `Codice` = "'.$_code.'"');
  493.                     $stmt->execute();
  494.                     $result $stmt->fetch();
  495.                     $product['HSCode'] = $result $result['HSCode'] : '';
  496.                     $product['CountryOfOrigin'] = $result $result['CountryOfOrigin'] : '';
  497.                     $product['EU_ExtraEU'] = $result $result['EU_ExtraEU'] : '';
  498.                     $product['Weight'] = $result ? (float) $result['Weight'] * (float) $product['Quantity'] : '';
  499.                     $_name explode(' - '$product['Name']);
  500.                     
  501.                     if(isset($_name[1])) {
  502.                         $product['Category'] = $_name[0];
  503.                         $product['Articolo'] = $_name[1];
  504.                     }else{
  505.                         $product['Category'] = '';
  506.                         $product['Articolo'] = $_name[0];
  507.                     }
  508.                     if(isset($_name[2]))
  509.                     {
  510.                         $product['CleanName'] = $_name[2];
  511.                     }
  512.                     if(isset($_name[3]))
  513.                     {
  514.                         $product['Size'] = (int) $_name[3];
  515.                     }else
  516.                     {
  517.                         $product['Size'] = '';
  518.                     }
  519.                 }
  520.                 return $products;
  521.             }
  522.         }
  523.         return [];
  524.     }
  525.     /**
  526.      * Genera il PDF di una singola fattura
  527.      */
  528.     protected function getPdf($type$id_shop$result)
  529.     {
  530.         $options = new \Dompdf\Options(); 
  531.         $options->setIsRemoteEnabled(true);
  532.         $dompdf = new \Dompdf\Dompdf($options);
  533.         $dompdf->setPaper('A4''vertical');
  534.         // Recupera il giusto template dalla data dell'ordine
  535.         $createdDate substr($result['order']['Created at'], 010);
  536.         
  537.         $templateVersion '';
  538.         
  539.         if($createdDate >= '2025-03-12')
  540.         {
  541.             $templateVersion '2025-03-12';
  542.         }elseif($createdDate >= '2025-02-01')
  543.         {
  544.             $templateVersion '2025-02-01';
  545.         }
  546.         if($type == "proforma_return")
  547.             $htmlPDF $this->renderView('pdf/'.$templateVersion.'/pdf_proforma_return_' $id_shop '.html.twig'$result);
  548.         else 
  549.             $htmlPDF $this->renderView('pdf/'.$templateVersion.'/pdf_invoice_' $id_shop '.html.twig'$result);
  550.         
  551.         $dompdf->load_html($htmlPDF);
  552.         $dompdf->render();
  553.         
  554.         return $dompdf;
  555.     }
  556.     /**
  557.      * 
  558.      */
  559.     public function checkNumerazioneFatture($idShop$anno)
  560.     {
  561.         $errors = [];
  562.         $conn $this->getDoctrine()->getManager()->getConnection();
  563.         $stmt $conn->prepare('SELECT `Order`, `Numero Fattura`, `Created at` 
  564.                                 FROM `ordini` WHERE `Shop` = ' . (int) $idShop ' AND `Numero Fattura` <> "" AND YEAR(`Created at`) = '.$anno.
  565.                                 ORDER BY CONVERT(REPLACE(`Numero Fattura`,"B",""), UNSIGNED INT) ASC, DATE(`Created at`) ASC');
  566.         $stmt->execute();
  567.         $fatture $stmt->fetchAll();
  568.         $_currentFattura 0;
  569.         $_currentFatturaData '';
  570.         foreach($fatture as $index => $f)
  571.         {
  572.             $fatturaNum = (int) str_replace('B'''$f['Numero Fattura']);
  573.             
  574.             if($index == 0)
  575.             {
  576.                 $_currentOrder $f['Order'];
  577.                 $_currentFattura $fatturaNum;
  578.                 $_currentFatturaData $f['Created at'];
  579.                 continue;
  580.             }
  581.             if($fatturaNum $_currentFattura != 1)
  582.             {
  583.                 $errors = [
  584.                             'ultima_fattura_ok' => $_currentFattura
  585.                             'ultima_fattura_ok_data' => $_currentFatturaData
  586.                             'ultimo_ordine_ok' => $_currentOrder,
  587.                             'error_fattura' => $fatturaNum,
  588.                             'error_fattura_data' => $f['Created at'],
  589.                             'error_order' => $f['Order'],
  590.                         ];
  591.                 break;
  592.             }
  593.             $_currentOrder $f['Order'];
  594.             $_currentFattura $fatturaNum;
  595.             $_currentFatturaData $f['Created at'];
  596.         }
  597.         return $errors;
  598.     }
  599.     /**
  600.      * 
  601.      */
  602.     public function getConversionRate($fromCurr$toCurr$date)
  603.     {
  604.         $conn $this->getDoctrine()->getManager()->getConnection();
  605.         $statement $conn->prepare('SELECT rate FROM `conversion_rates` WHERE `currency_from` = "'.$fromCurr.'" AND `currency_to` = "'.$toCurr.'" AND `date` = DATE("'.$date.'")');
  606.         if($statement->execute())
  607.         {
  608.             return $statement->fetch();
  609.         }
  610.         return NULL;
  611.     }
  612.     /**
  613.      * 
  614.      */
  615.     public function getTaxRateByCountry($iso_code)
  616.     {
  617.         $conn $this->getDoctrine()->getManager()->getConnection();
  618.         $statement $conn->prepare('SELECT `rate` FROM `paesi` WHERE iso_code = "'.$iso_code.'" ');
  619.         $statement->execute();
  620.         return $statement->fetch();
  621.     }
  622.     /**
  623.      * Controlla se ci sono errori nella VAT dei paesi europei,
  624.      * confrontando il Vat rate di Shopify con i rate che abbiamo noi.
  625.      */
  626.     public function checkVatErrors()
  627.     {
  628.         $conn $this->getDoctrine()->getManager()->getConnection();
  629.         $statement $conn->prepare('SELECT Y.`Order`, 
  630.         Y.`Country`, 
  631.         Y.`Shipping Country`, 
  632.         Y.`Shipping Province`, 
  633.         Y.`Shopify Country Rate`, 
  634.         Y.`Manebi Country Rate`, 
  635.         Y.`OrderVatRate`,
  636.         IFNULL(Y.`Province Tax Rate`,"") as "Province Tax Rate",
  637.         CASE
  638.             WHEN (Y.`OrderVatRate` > 0 AND Y.`Province Tax Rate` IS NULL) THEN "ERROR-PROVINCETAXRATE-NULL"
  639.           WHEN (Y.`OrderVatRate` IS NULL AND Y.`Province Tax Rate` > 0)  THEN "ERROR-ORDERVATRATE-NULL"
  640.            WHEN (Y.`OrderVatRate` <> Y.`Province Tax Rate`) THEN "ERROR-ORDERVATRATE-DIFF-PROVINCETAXRATE"
  641.          ELSE "OK"
  642.         END as "IsError"
  643.         FROM (SELECT `Order`, `Shipping Country`, `Shipping Province`, `Tax 1 Name`, 
  644.                             p.name as "Country", 
  645.                                                 REGEXP_SUBSTR(`Tax 1 Name`,"[0-9\.]+") as "Shopify Country Rate", 
  646.                                                 CONVERT(ROUND(p.rate,2),VARCHAR(10)) as "Manebi Country Rate",
  647.                                                 `OrderVatRate`,
  648.                                                 prov.rate as "Province Tax Rate"
  649.                                                 FROM tmp_csv_ordini X
  650.                                                 join paesi p ON X.`Shipping Country` = p.`iso_code`
  651.                                                 left join province prov ON (X.`Shipping Country` = prov.`iso_code_paese` AND X.`Shipping Province` = prov.iso_code) 
  652.                                                 ) Y
  653.         WHERE ROUND(Y.`Shopify Country Rate`,2) <> Y.`Manebi Country Rate`;');
  654.                                    
  655.         $statement->execute();
  656.         return $statement->fetchAll();
  657.     }
  658. }