<?php
namespace MojeBambino\Extensions\Controller\Storefront;
use Shopware\Core\Framework\Routing\Annotation\RouteScope;
use Shopware\Core\System\SalesChannel\SalesChannelContext;
use Shopware\Storefront\Controller\StorefrontController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Shopware\Core\Checkout\Cart\SalesChannel\CartService;
use Shopware\Core\Content\Product\Cart\ProductLineItemFactory;
use Doctrine\DBAL\Connection;
use Crehler\Arrangements\Service\ArrangementService;
use Shopware\Core\Framework\Context;
use Symfony\Component\HttpFoundation\Request;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;
use PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing;
/**
* @RouteScope(scopes={"storefront"})
*/
class AranzacjaPdfController extends StorefrontController
{
/**
* @var ArrangementService
*/
private $arrangementService;
private Connection $connection;
/**
* @var ProductLineItemFactory
*/
private $productLineItemFactory;
public function __construct(ArrangementService $arrangementService, ProductLineItemFactory $productLineItemFactory, Connection $connection){
$this->arrangementService = $arrangementService;
$this->productLineItemFactory = $productLineItemFactory;
$this->connection = $connection;
}
public function ciach($str,$ile) {
$str = strip_tags($str);
$body = explode(" ", $str);
if (count($body) >$ile) {
$str = $body['0']." ";
for ($n=1; $n<$ile; $n++) {
$str .= $body[$n]." ";
}
$str .= "...";
}
else {
$str = $str;
}
return $str;
}
/**
* @Route("/aranzacjapdf", name="frontend.aranzacjapdf", options={"seo"="false"}, methods={"GET"})
*/
public function example(SalesChannelContext $context, Request $request): Response
{
$idAr = $request->get('id');
$kodAr = $request->get('kod');
$co = $request->get('co');
$typ = $request->get('typ');
$aranzacja = $this->arrangementService->getArrangementById($idAr, $context, $request);
date_default_timezone_set('Europe/Warsaw');
$data = date("Y-m-d H:i:s");
$data_plik = date("Ymd-His");
$okladka = $aranzacja->getCover()->getMedia()->getUrl();
$produkty = $aranzacja->getArrangementProducts();
$nazwa = $aranzacja->getName();
if($co=="xls"){
define('FORMAT_PLN', '_-* #,##0.00\ [$zł-415]_-');
$objPHPExcel = new Spreadsheet();
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue('A1', $kodAr.' '.$nazwa)
->setCellValue('A2', 'z dnia '.$data);
$objPHPExcel->getActiveSheet()->mergeCells('A1:G1');
$objPHPExcel->getActiveSheet()->mergeCells('A2:G2');
//$objPHPExcel->getActiveSheet()->getStyle("A1:G1")->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
$objPHPExcel->getActiveSheet()->getStyle("A1:G1")->getAlignment()->setHorizontal('center');
$objPHPExcel->getActiveSheet()->getStyle("A1:G1")->getBorders()->getTop()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
$objPHPExcel->getActiveSheet()->getStyle("A1:G1")->getBorders()->getRight()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
$objPHPExcel->getActiveSheet()->getStyle("A1:G1")->getBorders()->getLeft()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
$objPHPExcel->getActiveSheet()->getStyle("A1:G1")->getBorders()->getBottom()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
$objPHPExcel->getActiveSheet()->getStyle("A2:G2")->getAlignment()->setHorizontal('center');
$objPHPExcel->getActiveSheet()->getStyle("A2:G2")->getBorders()->getTop()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
$objPHPExcel->getActiveSheet()->getStyle("A2:G2")->getBorders()->getRight()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
$objPHPExcel->getActiveSheet()->getStyle("A2:G2")->getBorders()->getLeft()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
$objPHPExcel->getActiveSheet()->getStyle("A2:G2")->getBorders()->getBottom()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
if($okladka!=""){
$tmp = explode(".", $okladka);
$ext = $tmp[count($tmp)-1];
if($ext=="png"){
$gdImage = imagecreatefrompng($okladka);
}
else{
$gdImage = imagecreatefromjpeg($okladka);
}
// Add a drawing to the worksheetecho date('H:i:s') . " Add a drawing to the worksheet\n";
$objDrawing = new MemoryDrawing();
$objDrawing->setName($kodAr);
$objDrawing->setDescription($nazwa);
$objDrawing->setImageResource($gdImage);
if($ext=="png"){
$objDrawing->setRenderingFunction(\PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing::RENDERING_PNG);
$objDrawing->setMimeType(\PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing::MIMETYPE_PNG);
}
else{
$objDrawing->setRenderingFunction(\PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing::RENDERING_JPEG);
$objDrawing->setMimeType(\PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing::MIMETYPE_JPEG);
}
$objDrawing->setHeight(300);
$objDrawing->setCoordinates('C3');
$objDrawing->setWorksheet($objPHPExcel->getActiveSheet());
//$objDrawing->setOffsetX(20);
$objDrawing->setOffsetY(20);
$objPHPExcel->getActiveSheet()->getRowDimension(3)->setRowHeight(260);
//$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(15);
$objPHPExcel->getActiveSheet()->mergeCells('A3:G3');
$objPHPExcel->getActiveSheet()->getStyle("A3:G3")->getBorders()->getTop()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
$objPHPExcel->getActiveSheet()->getStyle("A3:G3")->getBorders()->getRight()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
$objPHPExcel->getActiveSheet()->getStyle("A3:G3")->getBorders()->getLeft()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
$objPHPExcel->getActiveSheet()->getStyle("A3:G3")->getBorders()->getBottom()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
}
$wiersz = 5;
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue("A$wiersz", "")
->setCellValueExplicit("B$wiersz", "Kod", \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING)
->setCellValue("C$wiersz", "Nazwa")
->setCellValue("D$wiersz", "Opis")
->setCellValue("E$wiersz", "Ilość")
->setCellValue("F$wiersz", "Brutto")
->setCellValue("G$wiersz", "Suma");
$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(25);
$objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(25);
$objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(40);
$objPHPExcel->getActiveSheet()->getColumnDimension('F')->setWidth(15);
$objPHPExcel->getActiveSheet()->getColumnDimension('G')->setWidth(15);
$objPHPExcel->getActiveSheet()->getStyle("A$wiersz:G$wiersz")->getAlignment()->setHorizontal('center');
$objPHPExcel->getActiveSheet()->getStyle("A$wiersz:G$wiersz")->getBorders()->getTop()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
$objPHPExcel->getActiveSheet()->getStyle("A$wiersz:G$wiersz")->getBorders()->getRight()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
$objPHPExcel->getActiveSheet()->getStyle("A$wiersz:G$wiersz")->getBorders()->getLeft()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
$objPHPExcel->getActiveSheet()->getStyle("A$wiersz:G$wiersz")->getBorders()->getBottom()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
$wiersz++;
$suma = 0;
foreach($produkty->getElements() as $elem){
if($elem->getProduct()->getActive()==1){
$media = $elem->getProduct()->getCover();
$kod = $elem->getProduct()->getProductNumber();
$nazwa_prd = $elem->getProduct()->getName();
$ile = $elem->getQuantity();
$opis = $elem->getProduct()->getDescription();
$opis = html_entity_decode($opis, ENT_QUOTES, 'UTF-8');
$ceny = $elem->getProduct()->getPrice()->getElements();
foreach($ceny as $c){
$cena = $c->getGross();
}
$objPHPExcel->setActiveSheetIndex(0)
->setCellValueExplicit("B$wiersz", $kod, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING)
->setCellValue("C$wiersz", $nazwa_prd)
->setCellValue("D$wiersz", strip_tags($opis))
->setCellValue("E$wiersz", $ile)
->setCellValue("F$wiersz", $cena)
->setCellValue("G$wiersz", $ile*$cena);
//$objPHPExcel->getActiveSheet()->getRowDimension($wiersz)->setRowHeight(-1);
$objPHPExcel->getActiveSheet()->getStyle("F$wiersz")->getNumberFormat()->setFormatCode(FORMAT_PLN);
$objPHPExcel->getActiveSheet()->getStyle("G$wiersz")->getNumberFormat()->setFormatCode(FORMAT_PLN);
$objPHPExcel->getActiveSheet()->getStyle("B$wiersz")->getAlignment()->setVertical('top');
$objPHPExcel->getActiveSheet()->getStyle("C$wiersz")->getAlignment()->setVertical('top');
$objPHPExcel->getActiveSheet()->getStyle("D$wiersz")->getAlignment()->setVertical('top');
$objPHPExcel->getActiveSheet()->getStyle("E$wiersz")->getAlignment()->setVertical('top');
$objPHPExcel->getActiveSheet()->getStyle("F$wiersz")->getAlignment()->setVertical('top');
$objPHPExcel->getActiveSheet()->getStyle("G$wiersz")->getAlignment()->setVertical('top');
$objPHPExcel->getActiveSheet()->getStyle("C$wiersz")->getAlignment()->setWrapText(true);
$objPHPExcel->getActiveSheet()->getStyle("D$wiersz")->getAlignment()->setWrapText(true);
if($media!=""){
$obrazek = $media->getMedia()->getUrl();
$gdImage = imagecreatefromjpeg($obrazek);
// Add a drawing to the worksheetecho date('H:i:s') . " Add a drawing to the worksheet\n";
$objDrawing = new MemoryDrawing();
$objDrawing->setName($kod);
$objDrawing->setDescription($kod);
$objDrawing->setImageResource($gdImage);
$objDrawing->setRenderingFunction(\PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing::RENDERING_JPEG);
$objDrawing->setMimeType(\PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing::MIMETYPE_DEFAULT);
$objDrawing->setHeight(60);
$objDrawing->setCoordinates('A'.$wiersz);
$objDrawing->setWorksheet($objPHPExcel->getActiveSheet());
$objDrawing->setOffsetX(20);
$objDrawing->setOffsetY(20);
}
//i jeszcze wysokość i szerokość, aby foty na siebie nie nachodziły
$objPHPExcel->getActiveSheet()->getRowDimension($wiersz)->setRowHeight(80);
$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(15);
$objPHPExcel->getActiveSheet()->getStyle("A$wiersz")->getAlignment()->setVertical('top');
$objPHPExcel->getActiveSheet()->getStyle("A$wiersz")->getAlignment()->setHorizontal('center');
$objPHPExcel->getActiveSheet()->getStyle("A$wiersz:G$wiersz")->getAlignment()->setHorizontal('center');
$objPHPExcel->getActiveSheet()->getStyle("A$wiersz:G$wiersz")->getBorders()->getTop()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
$objPHPExcel->getActiveSheet()->getStyle("A$wiersz:G$wiersz")->getBorders()->getRight()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
$objPHPExcel->getActiveSheet()->getStyle("A$wiersz:G$wiersz")->getBorders()->getLeft()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
$objPHPExcel->getActiveSheet()->getStyle("A$wiersz:G$wiersz")->getBorders()->getBottom()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
$wiersz++;
$suma += ($ile * $cena);
}
}
$wiersz++;
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue("F$wiersz", "Łączna wartość")
->setCellValue("G$wiersz", $suma);
$objPHPExcel->getActiveSheet()->getStyle("G$wiersz")->getNumberFormat()->setFormatCode(FORMAT_PLN);
$objPHPExcel->getActiveSheet()->getStyle("F$wiersz:G$wiersz")->getBorders()->getTop()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
$objPHPExcel->getActiveSheet()->getStyle("F$wiersz:G$wiersz")->getBorders()->getRight()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
$objPHPExcel->getActiveSheet()->getStyle("F$wiersz:G$wiersz")->getBorders()->getLeft()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
$objPHPExcel->getActiveSheet()->getStyle("F$wiersz:G$wiersz")->getBorders()->getBottom()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
/* foreach($objPHPExcel->getActiveSheet()->getRowDimensions() as $rd) {
$rd->setRowHeight(-1);
} */
$objPHPExcel->getActiveSheet()->setTitle("Kalkulacja");
$objPHPExcel->setActiveSheetIndex(0);
$objWriter = new Xlsx($objPHPExcel);
ob_start();
$objWriter->save('php://output');
$response = new Response(ob_get_clean());
$response->headers->addCacheControlDirective('no-cache', true);
$response->headers->addCacheControlDirective('must-revalidate', true);
$response->headers->set('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
$response->headers->set('Content-Disposition', 'attachment;filename="kalkulacja_'.$kodAr.'.xlsx"');
$response->headers->set('Cache-Control','max-age=0');
return $response;
}
else{
$html = "<style>table{width:100%; vertical-align:top; border-collapse:collapse; color:#3f4c58; font-family:Signika; font-size:15px;}
td, th{padding:5px 10px; border:1px solid #ddd;} .obrazek{width:150px;}
.naglowek{font-weight:bold; margin-bottom:15px;} .naglowek_mail{margin-bottom:5px;}
.naglowek_data{font-style:italic;} .right{text-align:right; white-space:nowrap;} .center{text-align:center;}
.podsumowanie{text-align:right; border-top:3px solid #eeeeee;} .podsumowanie_ost{white-space:nowrap;}</style>";
$html .= "<table>";
$html .= "<tr>";
$html .= "<td class='center'>";
$html .= "<p class='naglowek'>$kodAr $nazwa</p>";
$html .= "<p class='naglowek_data'>$data</p>";
$html .= "<p>".($okladka!="" ? "<img src='$okladka'/>" : "")."</p>";
$html .= "</td>";
$html .= "<tr/>";
$html .= "</table>";
$html .= "<pagebreak />";
$html .= "<table>";
$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>";
$suma = 0;
foreach($produkty->getElements() as $elem){
if($elem->getProduct()->getActive()==1){
$media = $elem->getProduct()->getCover();
$html .= "<tr><td class='center'>";
if($media!=""){
$html .= "<img src='".$media->getMedia()->getUrl()."' class='obrazek'/>";
}
$html .= "</td>";
$html .= "<td>".$elem->getProduct()->getProductNumber()."</td><td>".$elem->getProduct()->getName()."</td>";
$ile = $elem->getQuantity();
$opis = $elem->getProduct()->getDescription();
$opis = html_entity_decode($opis, ENT_QUOTES, 'UTF-8');
$words = explode(" ", strip_tags($opis));
if(count($words)>200){
$opis = $this->ciach($opis, 200)."<br/>Więcej informacji na stronie <a href='https://mbpl1.mojebambino.dev' target='_blank'>www.mbpl1.mojebambino.dev</a>";
}
$html .= "<td>".$opis."</td><td class='right'>$ile</td>";
$html .= "<td class='right'>";
$ceny = $elem->getProduct()->getPrice()->getElements();
foreach($ceny as $c){
$cena = $c->getGross();
}
$html .= number_format($cena, 2, ",", " ")." zł";
$html .= "</td><td class='right'>".number_format(($ile * $cena), 2, ",", " ")." zł</td></tr>";
$suma += ($ile * $cena);
}
}
$html .= "<tr><td colspan=6 class='podsumowanie podsumowanie_ost'>Łączna wartość:</td>";
$html .= "<td class='podsumowanie podsumowanie_ost'>".number_format($suma, 2, ",", " ")." zł</td></tr>";
$html .= "</table>";
$query = $this->connection->insert('kalkulacje_arr', ['id' => NULL, 'kod'=>$kodAr, 'created_at'=>$data]);
$mpdf = new \Mpdf\Mpdf(['mode' => 'UTF-8', 'format' => 'A4', 'orientation' => 'L']);
// Set a simple Footer including the page number
$mpdf->setFooter('Strona {PAGENO} z {nbpg}');
$mpdf->SetDefaultBodyCSS('background', "url('https://mbpl1.mojebambino.dev/images/PAPIER_MB_INSGRAF_PL_poziom.png')");
$mpdf->SetDefaultBodyCSS('background-image-resize', 6);
//$mpdf->autoPageBreak = false;
$mpdf->shrink_tables_to_fit = 1;
$mpdf->WriteHTML($html);
//$mpdf->shrink_tables_to_fit = 0;
$plik = 'kalkulacje_arr/'.$kodAr.'_'.$data_plik.'.pdf';
$mpdf->Output($plik ,'F');
header("Content-Type: application/pdf");
header("Content-Disposition: attachment; filename=" . $plik);
readfile($plik);
unlink($plik);
}
//return $this->renderStorefront('@Storefront/storefront/page/example/test_index.html.twig');
return $response;
}
}