custom/plugins/MojeBambinoExtensions/src/Controller/Storefront/AranzacjaPdfController.php line 76

Open in your IDE?
  1. <?php
  2. namespace MojeBambino\Extensions\Controller\Storefront;
  3. use Shopware\Core\Framework\Routing\Annotation\RouteScope;
  4. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  5. use Shopware\Storefront\Controller\StorefrontController;
  6. use Symfony\Component\HttpFoundation\Response;
  7. use Symfony\Component\Routing\Annotation\Route;
  8. use Shopware\Core\Checkout\Cart\SalesChannel\CartService;
  9. use Shopware\Core\Content\Product\Cart\ProductLineItemFactory;
  10. use Doctrine\DBAL\Connection;
  11. use Crehler\Arrangements\Service\ArrangementService;
  12. use Shopware\Core\Framework\Context;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  15. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  16. use PhpOffice\PhpSpreadsheet\Style\Border;
  17. use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;
  18. use PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing;
  19. /**
  20.  * @RouteScope(scopes={"storefront"})
  21.  */
  22. class AranzacjaPdfController extends StorefrontController
  23. {
  24.     /**
  25.      * @var ArrangementService
  26.      */
  27.     private $arrangementService;
  28.     private Connection $connection;
  29.     
  30.     /**
  31.      * @var ProductLineItemFactory
  32.      */
  33.     private $productLineItemFactory;
  34.     
  35.     
  36.     public function __construct(ArrangementService $arrangementServiceProductLineItemFactory $productLineItemFactoryConnection $connection){
  37.         $this->arrangementService $arrangementService;
  38.         $this->productLineItemFactory $productLineItemFactory;
  39.         $this->connection $connection;
  40.     }
  41.     
  42.     public function ciach($str,$ile) {
  43.         $str strip_tags($str);
  44.         $body explode(" "$str);
  45.         if (count($body) >$ile) {
  46.             $str $body['0']." ";
  47.             
  48.             for ($n=1$n<$ile$n++) {
  49.                 $str .= $body[$n]." ";
  50.             }
  51.             
  52.             $str .= "...";
  53.         }
  54.         else {
  55.             $str $str;
  56.         }
  57.         return $str;
  58.     }
  59.     /**
  60.      * @Route("/aranzacjapdf", name="frontend.aranzacjapdf", options={"seo"="false"}, methods={"GET"})
  61.      */
  62.     public function example(SalesChannelContext $contextRequest $request): Response
  63.     {
  64.         $idAr $request->get('id'); 
  65.         $kodAr $request->get('kod');
  66.         $co $request->get('co');
  67.         $typ $request->get('typ');
  68.         
  69.         $aranzacja $this->arrangementService->getArrangementById($idAr$context$request);
  70.         
  71.         date_default_timezone_set('Europe/Warsaw');
  72.         $data date("Y-m-d H:i:s");
  73.         $data_plik date("Ymd-His");
  74.         
  75.         $okladka $aranzacja->getCover()->getMedia()->getUrl();
  76.         $produkty $aranzacja->getArrangementProducts();
  77.         $nazwa $aranzacja->getName();
  78.         
  79.         if($co=="xls"){
  80.             define('FORMAT_PLN''_-* #,##0.00\ [$zł-415]_-');
  81.             
  82.             $objPHPExcel = new Spreadsheet();
  83.             
  84.             $objPHPExcel->setActiveSheetIndex(0)
  85.                         ->setCellValue('A1'$kodAr.' '.$nazwa)
  86.                         ->setCellValue('A2''z dnia '.$data);
  87.             $objPHPExcel->getActiveSheet()->mergeCells('A1:G1');
  88.             $objPHPExcel->getActiveSheet()->mergeCells('A2:G2');
  89.             //$objPHPExcel->getActiveSheet()->getStyle("A1:G1")->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
  90.             $objPHPExcel->getActiveSheet()->getStyle("A1:G1")->getAlignment()->setHorizontal('center');
  91.             $objPHPExcel->getActiveSheet()->getStyle("A1:G1")->getBorders()->getTop()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
  92.             $objPHPExcel->getActiveSheet()->getStyle("A1:G1")->getBorders()->getRight()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
  93.             $objPHPExcel->getActiveSheet()->getStyle("A1:G1")->getBorders()->getLeft()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
  94.             $objPHPExcel->getActiveSheet()->getStyle("A1:G1")->getBorders()->getBottom()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
  95.             $objPHPExcel->getActiveSheet()->getStyle("A2:G2")->getAlignment()->setHorizontal('center');
  96.             $objPHPExcel->getActiveSheet()->getStyle("A2:G2")->getBorders()->getTop()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
  97.             $objPHPExcel->getActiveSheet()->getStyle("A2:G2")->getBorders()->getRight()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
  98.             $objPHPExcel->getActiveSheet()->getStyle("A2:G2")->getBorders()->getLeft()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
  99.             $objPHPExcel->getActiveSheet()->getStyle("A2:G2")->getBorders()->getBottom()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
  100.             
  101.             if($okladka!=""){
  102.                 $tmp explode("."$okladka);
  103.                 $ext $tmp[count($tmp)-1];
  104.                 if($ext=="png"){
  105.                     $gdImage imagecreatefrompng($okladka);
  106.                 }
  107.                 else{
  108.                     $gdImage imagecreatefromjpeg($okladka);
  109.                 } 
  110.                 // Add a drawing to the worksheetecho date('H:i:s') . " Add a drawing to the worksheet\n";
  111.                 $objDrawing = new MemoryDrawing();
  112.                 $objDrawing->setName($kodAr);
  113.                 $objDrawing->setDescription($nazwa);
  114.                 $objDrawing->setImageResource($gdImage);
  115.                 if($ext=="png"){
  116.                     $objDrawing->setRenderingFunction(\PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing::RENDERING_PNG);
  117.                     $objDrawing->setMimeType(\PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing::MIMETYPE_PNG);
  118.                 }
  119.                 else{
  120.                     $objDrawing->setRenderingFunction(\PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing::RENDERING_JPEG);
  121.                     $objDrawing->setMimeType(\PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing::MIMETYPE_JPEG);
  122.                 }  
  123.                 $objDrawing->setHeight(300);
  124.                 $objDrawing->setCoordinates('C3');
  125.                 $objDrawing->setWorksheet($objPHPExcel->getActiveSheet());
  126.                 //$objDrawing->setOffsetX(20);
  127.                 $objDrawing->setOffsetY(20);
  128.                 $objPHPExcel->getActiveSheet()->getRowDimension(3)->setRowHeight(260);
  129.                 //$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(15);
  130.                 $objPHPExcel->getActiveSheet()->mergeCells('A3:G3');
  131.                 $objPHPExcel->getActiveSheet()->getStyle("A3:G3")->getBorders()->getTop()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
  132.                 $objPHPExcel->getActiveSheet()->getStyle("A3:G3")->getBorders()->getRight()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
  133.                 $objPHPExcel->getActiveSheet()->getStyle("A3:G3")->getBorders()->getLeft()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
  134.                 $objPHPExcel->getActiveSheet()->getStyle("A3:G3")->getBorders()->getBottom()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
  135.             }  
  136.             
  137.             $wiersz 5;
  138.             $objPHPExcel->setActiveSheetIndex(0)
  139.                         ->setCellValue("A$wiersz""")
  140.                         ->setCellValueExplicit("B$wiersz""Kod"\PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING)
  141.                         ->setCellValue("C$wiersz""Nazwa")
  142.                         ->setCellValue("D$wiersz""Opis")
  143.                         ->setCellValue("E$wiersz""Ilość")
  144.                         ->setCellValue("F$wiersz""Brutto")
  145.                         ->setCellValue("G$wiersz""Suma");
  146.             $objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(25);
  147.             $objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(25);
  148.             $objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(40);
  149.             $objPHPExcel->getActiveSheet()->getColumnDimension('F')->setWidth(15);
  150.             $objPHPExcel->getActiveSheet()->getColumnDimension('G')->setWidth(15);
  151.             $objPHPExcel->getActiveSheet()->getStyle("A$wiersz:G$wiersz")->getAlignment()->setHorizontal('center');
  152.             $objPHPExcel->getActiveSheet()->getStyle("A$wiersz:G$wiersz")->getBorders()->getTop()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
  153.             $objPHPExcel->getActiveSheet()->getStyle("A$wiersz:G$wiersz")->getBorders()->getRight()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
  154.             $objPHPExcel->getActiveSheet()->getStyle("A$wiersz:G$wiersz")->getBorders()->getLeft()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
  155.             $objPHPExcel->getActiveSheet()->getStyle("A$wiersz:G$wiersz")->getBorders()->getBottom()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
  156.             $wiersz++;
  157.             $suma 0;
  158.             foreach($produkty->getElements() as $elem){
  159.                 if($elem->getProduct()->getActive()==1){
  160.                     $media $elem->getProduct()->getCover();
  161.                     $kod $elem->getProduct()->getProductNumber();
  162.                     $nazwa_prd $elem->getProduct()->getName();
  163.                     $ile $elem->getQuantity();
  164.                     $opis $elem->getProduct()->getDescription();
  165.                     $opis html_entity_decode($opisENT_QUOTES'UTF-8');
  166.                     $ceny $elem->getProduct()->getPrice()->getElements();
  167.                     foreach($ceny as $c){
  168.                         $cena $c->getGross();
  169.                     }
  170.                     $objPHPExcel->setActiveSheetIndex(0)
  171.                                 ->setCellValueExplicit("B$wiersz"$kod\PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING)
  172.                                 ->setCellValue("C$wiersz"$nazwa_prd)
  173.                                 ->setCellValue("D$wiersz"strip_tags($opis))
  174.                                 ->setCellValue("E$wiersz"$ile)
  175.                                 ->setCellValue("F$wiersz"$cena)
  176.                                 ->setCellValue("G$wiersz"$ile*$cena);
  177.                     //$objPHPExcel->getActiveSheet()->getRowDimension($wiersz)->setRowHeight(-1);
  178.                     $objPHPExcel->getActiveSheet()->getStyle("F$wiersz")->getNumberFormat()->setFormatCode(FORMAT_PLN);
  179.                     $objPHPExcel->getActiveSheet()->getStyle("G$wiersz")->getNumberFormat()->setFormatCode(FORMAT_PLN);
  180.                     $objPHPExcel->getActiveSheet()->getStyle("B$wiersz")->getAlignment()->setVertical('top');
  181.                     $objPHPExcel->getActiveSheet()->getStyle("C$wiersz")->getAlignment()->setVertical('top');
  182.                     $objPHPExcel->getActiveSheet()->getStyle("D$wiersz")->getAlignment()->setVertical('top');
  183.                     $objPHPExcel->getActiveSheet()->getStyle("E$wiersz")->getAlignment()->setVertical('top');
  184.                     $objPHPExcel->getActiveSheet()->getStyle("F$wiersz")->getAlignment()->setVertical('top');
  185.                     $objPHPExcel->getActiveSheet()->getStyle("G$wiersz")->getAlignment()->setVertical('top');
  186.                     $objPHPExcel->getActiveSheet()->getStyle("C$wiersz")->getAlignment()->setWrapText(true); 
  187.                     $objPHPExcel->getActiveSheet()->getStyle("D$wiersz")->getAlignment()->setWrapText(true);   
  188.                     if($media!=""){
  189.                         $obrazek $media->getMedia()->getUrl();
  190.                         $gdImage imagecreatefromjpeg($obrazek);
  191.                         // Add a drawing to the worksheetecho date('H:i:s') . " Add a drawing to the worksheet\n";
  192.                         $objDrawing = new MemoryDrawing();
  193.                         $objDrawing->setName($kod);
  194.                         $objDrawing->setDescription($kod);
  195.                         $objDrawing->setImageResource($gdImage);
  196.                         $objDrawing->setRenderingFunction(\PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing::RENDERING_JPEG);
  197.                         $objDrawing->setMimeType(\PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing::MIMETYPE_DEFAULT);
  198.                         $objDrawing->setHeight(60);
  199.                         $objDrawing->setCoordinates('A'.$wiersz);
  200.                         $objDrawing->setWorksheet($objPHPExcel->getActiveSheet());
  201.                         $objDrawing->setOffsetX(20);
  202.                         $objDrawing->setOffsetY(20);
  203.                     }   
  204.                     //i jeszcze wysokość i szerokość, aby foty na siebie nie nachodziły
  205.                     $objPHPExcel->getActiveSheet()->getRowDimension($wiersz)->setRowHeight(80);
  206.                     $objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(15);
  207.                     $objPHPExcel->getActiveSheet()->getStyle("A$wiersz")->getAlignment()->setVertical('top');
  208.                     $objPHPExcel->getActiveSheet()->getStyle("A$wiersz")->getAlignment()->setHorizontal('center');
  209.                     $objPHPExcel->getActiveSheet()->getStyle("A$wiersz:G$wiersz")->getAlignment()->setHorizontal('center');
  210.                     $objPHPExcel->getActiveSheet()->getStyle("A$wiersz:G$wiersz")->getBorders()->getTop()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
  211.                     $objPHPExcel->getActiveSheet()->getStyle("A$wiersz:G$wiersz")->getBorders()->getRight()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
  212.                     $objPHPExcel->getActiveSheet()->getStyle("A$wiersz:G$wiersz")->getBorders()->getLeft()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
  213.                     $objPHPExcel->getActiveSheet()->getStyle("A$wiersz:G$wiersz")->getBorders()->getBottom()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
  214.                     $wiersz++;
  215.                     $suma += ($ile $cena);
  216.                 }
  217.             }
  218.             $wiersz++;
  219.             $objPHPExcel->setActiveSheetIndex(0)
  220.                         ->setCellValue("F$wiersz""Łączna wartość")
  221.                         ->setCellValue("G$wiersz"$suma);
  222.             $objPHPExcel->getActiveSheet()->getStyle("G$wiersz")->getNumberFormat()->setFormatCode(FORMAT_PLN);
  223.             $objPHPExcel->getActiveSheet()->getStyle("F$wiersz:G$wiersz")->getBorders()->getTop()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
  224.             $objPHPExcel->getActiveSheet()->getStyle("F$wiersz:G$wiersz")->getBorders()->getRight()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
  225.             $objPHPExcel->getActiveSheet()->getStyle("F$wiersz:G$wiersz")->getBorders()->getLeft()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
  226.             $objPHPExcel->getActiveSheet()->getStyle("F$wiersz:G$wiersz")->getBorders()->getBottom()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
  227.             
  228.             /* foreach($objPHPExcel->getActiveSheet()->getRowDimensions() as $rd) {
  229.                 $rd->setRowHeight(-1);
  230.             } */ 
  231.             
  232.             $objPHPExcel->getActiveSheet()->setTitle("Kalkulacja");
  233.             $objPHPExcel->setActiveSheetIndex(0);
  234.             
  235.             $objWriter = new Xlsx($objPHPExcel);
  236.             
  237.             ob_start();
  238.             $objWriter->save('php://output');
  239.             
  240.             $response = new Response(ob_get_clean());
  241.             
  242.             $response->headers->addCacheControlDirective('no-cache'true);
  243.             $response->headers->addCacheControlDirective('must-revalidate'true);
  244.             $response->headers->set('Content-Type''application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  245.             $response->headers->set('Content-Disposition''attachment;filename="kalkulacja_'.$kodAr.'.xlsx"');
  246.             $response->headers->set('Cache-Control','max-age=0');
  247.             
  248.             return $response;
  249.         }
  250.         else{
  251.             $html "<style>table{width:100%; vertical-align:top; border-collapse:collapse; color:#3f4c58; font-family:Signika; font-size:15px;} 
  252.             td, th{padding:5px 10px; border:1px solid #ddd;} .obrazek{width:150px;} 
  253.             .naglowek{font-weight:bold; margin-bottom:15px;} .naglowek_mail{margin-bottom:5px;} 
  254.             .naglowek_data{font-style:italic;} .right{text-align:right; white-space:nowrap;} .center{text-align:center;}
  255.             .podsumowanie{text-align:right; border-top:3px solid #eeeeee;} .podsumowanie_ost{white-space:nowrap;}</style>";
  256.             $html .= "<table>";
  257.                 $html .= "<tr>";
  258.                     $html .= "<td class='center'>";
  259.                         $html .= "<p class='naglowek'>$kodAr $nazwa</p>";
  260.                         $html .= "<p class='naglowek_data'>$data</p>";
  261.                         $html .= "<p>".($okladka!="" "<img src='$okladka'/>" "")."</p>";
  262.                     $html .= "</td>";
  263.                 $html .= "<tr/>";
  264.             $html .= "</table>";
  265.             $html .= "<pagebreak />";
  266.             $html .= "<table>";
  267.                 $html .= "<tr><th width:15%></th><th width='15%'>Kod</th><th width='15%'>Nazwa</th><th width='30%'>Opis</th><th width='5%'>Szt.</th><th width='10%'>Brutto</th><th width='10%'>Suma</th></tr>";
  268.             
  269.                 $suma 0;
  270.                 foreach($produkty->getElements() as $elem){
  271.                     if($elem->getProduct()->getActive()==1){
  272.                         $media $elem->getProduct()->getCover();
  273.                         $html .= "<tr><td class='center'>";
  274.                         if($media!=""){
  275.                                 $html .= "<img src='".$media->getMedia()->getUrl()."' class='obrazek'/>";
  276.                         }
  277.                         $html .= "</td>";
  278.                         $html .= "<td>".$elem->getProduct()->getProductNumber()."</td><td>".$elem->getProduct()->getName()."</td>";
  279.                         $ile $elem->getQuantity();
  280.                         $opis $elem->getProduct()->getDescription();
  281.                         $opis html_entity_decode($opisENT_QUOTES'UTF-8');
  282.                         $words explode(" "strip_tags($opis));
  283.                         if(count($words)>200){
  284.                             $opis $this->ciach($opis200)."<br/>Więcej informacji na stronie <a href='https://mbpl1.mojebambino.dev' target='_blank'>www.mbpl1.mojebambino.dev</a>";
  285.                         }
  286.                         $html .= "<td>".$opis."</td><td class='right'>$ile</td>";
  287.                         $html .= "<td class='right'>";
  288.                             $ceny $elem->getProduct()->getPrice()->getElements();
  289.                             foreach($ceny as $c){
  290.                                 $cena $c->getGross();
  291.                             }
  292.                             $html .= number_format($cena2","" ")." zł";
  293.                         $html .= "</td><td class='right'>".number_format(($ile $cena), 2","" ")." zł</td></tr>";
  294.                         $suma += ($ile $cena);
  295.                     }
  296.                 }
  297.                 $html .= "<tr><td colspan=6 class='podsumowanie podsumowanie_ost'>Łączna wartość:</td>";
  298.                 $html .= "<td class='podsumowanie podsumowanie_ost'>".number_format($suma2","" ")." zł</td></tr>";
  299.             $html .= "</table>";
  300.             
  301.             $query $this->connection->insert('kalkulacje_arr', ['id' => NULL'kod'=>$kodAr'created_at'=>$data]);
  302.             
  303.             $mpdf = new \Mpdf\Mpdf(['mode' => 'UTF-8''format' => 'A4''orientation' => 'L']);
  304.             // Set a simple Footer including the page number
  305.             $mpdf->setFooter('Strona {PAGENO} z {nbpg}');
  306.             $mpdf->SetDefaultBodyCSS('background'"url('https://mbpl1.mojebambino.dev/images/PAPIER_MB_INSGRAF_PL_poziom.png')");
  307.             $mpdf->SetDefaultBodyCSS('background-image-resize'6);
  308.             //$mpdf->autoPageBreak = false;
  309.             $mpdf->shrink_tables_to_fit 1;
  310.             $mpdf->WriteHTML($html);
  311.             //$mpdf->shrink_tables_to_fit = 0;
  312.             
  313.             $plik 'kalkulacje_arr/'.$kodAr.'_'.$data_plik.'.pdf';
  314.             $mpdf->Output($plik ,'F');
  315.             header("Content-Type: application/pdf");
  316.             header("Content-Disposition: attachment; filename=" $plik);
  317.             readfile($plik);
  318.             unlink($plik);
  319.         }
  320.         //return $this->renderStorefront('@Storefront/storefront/page/example/test_index.html.twig');
  321.         return $response;
  322.     }
  323. }