src\Controller\Api\MenuController.php line 33

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Api;
  3. use App\Controller\AbstractFoodsoftController;
  4. use App\Entity\MusteriMenu;
  5. use App\Repository\MusteriMenuRepository;
  6. use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
  7. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  8. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\HttpFoundation\Response;
  11. use Symfony\Component\HttpFoundation\ResponseHeaderBag;
  12. use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
  13. use Symfony\Component\Mailer\MailerInterface;
  14. use Symfony\Component\Routing\Annotation\Route;
  15. /**
  16.  * @Route("/api/menu", name="api-menu-")
  17.  */
  18. class MenuController extends AbstractFoodsoftController
  19. {
  20.     /**
  21.      * @Route("/", name="index")
  22.      */
  23.     public function index(Request $request): Response
  24.     {
  25.         $yil $request->get('yil'date('Y'));
  26.         $ay $request->get('ay'2);
  27.         $ogun $request->get('ogun'1);
  28.         $turu $request->get('turu''NORMAL');
  29.         /** @var MusteriMenuRepository $rep */
  30.         $rep $this->getdoctrine()->getmanager()->getrepository(MusteriMenu::class);
  31.         $rep->setConfig($this->getParameter('foodsoft'));
  32.         $menu $rep->listeal($yil$ay$ogun$turu);
  33.         // Uyumsuz yemek kontrolü için kontrol menüsünü al
  34.         $ogunler array_diff([123], [$ogun]);
  35.         $menu_kontrol = [];
  36.         if ($turu == 'NORMAL') {
  37.             $turu 'MESAİ';
  38.         } elseif ($turu == 'MESAİ') {
  39.             $turu 'NORMAL';
  40.         }
  41.         foreach ($ogunler as $og) {
  42.             $ogun_str = ($og == 'GECE' : ($og == 'AKŞAM' 'ÖĞLE'));
  43.             $menu_kontrol[$ogun_str] = $rep->listeal($yil$ay$og$turu);
  44.         }
  45.         $grupLimit $rep->getCariAlternatifLimit();
  46.         return $this->json([
  47.             'filter' => [
  48.                 'yil' => $yil,
  49.                 'ay' => $ay,
  50.                 'ogun' => $ogun,
  51.                 'tur' => $turu,
  52.                 'canEdit' => $rep->canEdit($ay$yil)
  53.             ],
  54.             'menu' => $menu,
  55.             'menu_kontrol' => $menu_kontrol,
  56.             'grup_limit' => $grupLimit,
  57.         ]);
  58.     }
  59.     /**
  60.      * @Route("/save", name="save", methods={"POST", "GET"})
  61.      */
  62.     public function menuKaydet(Request $request): Response
  63.     {
  64.         $data json_decode($request->getContent(), true);
  65.         try {
  66.             $filter $data['filter'];
  67.             $data $data['menu'];
  68.             /** @var MusteriMenuRepository $rep */
  69.             $rep $this->getdoctrine()->getmanager()->getrepository(MusteriMenu::class);
  70.             $rep->setConfig($this->getParameter('foodsoft'));
  71.             if (!$rep->canEdit($filter['ay'], $filter['yil'])) {
  72.                 return $this->json(['success' => false'msg' => 'Bu ayın menüsünü değiştirme yetkiniz yok.'], Response::HTTP_OK);
  73.             }
  74.             $fark $rep->saveMenu($data$filter);
  75.             try {
  76.                 if (count($fark['data']) > 0)
  77.                     $this->sendEmail($fark['data'], $filter);
  78.             } catch (\Exception $e) {
  79.                 return $this->json(['success' => false'msg' => 'Eposta gönderme hatası!<br>' $e->getMessage()], Response::HTTP_OK);
  80.             }
  81.         } catch (\Exception $e) {
  82.             return $this->json(['success' => false'msg' => $e->getMessage()], Response::HTTP_NOT_FOUND);
  83.         }
  84.         return $this->json(['success' => true'msg' => $fark['msg']], Response::HTTP_OK);
  85.     }
  86.     /**
  87.      * @Route("/excel", name="export-excel", methods={"GET"})
  88.      */
  89.     public function exportMenu2Excel(Request $request): Response
  90.     {
  91.         $yil $request->get('yil'date('Y'));
  92.         $ay $request->get('ay'2);
  93.         $ogun $request->get('ogun'1);
  94.         $turu $request->get('turu''NORMAL');
  95.         /** @var MusteriMenuRepository $rep */
  96.         $rep $this->getdoctrine()->getmanager()->getrepository(MusteriMenu::class);
  97.         $rep->setConfig($this->getParameter('foodsoft'));
  98.         $menu $rep->listeal($yil$ay$ogun$turu);
  99.         $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
  100.         $spreadsheet $reader->load("../var/menu-template.xlsx");
  101.         $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
  102.         $activeSheet $spreadsheet->getActiveSheet();
  103.         // Create a Temporary file in the system
  104.         $aylar = [=> 'OCAK''ŞUBAT''MART''NİSAN''MAYIS''HAZİRAN''TEMMUZ''AĞUSTOS''EYLÜL''EKİM''KASIM''ARALIK'];
  105.         $ogunler = [=> 'ÖĞLE''AKŞAM''GECE'];
  106.         $fileName sprintf('%d-%s-%s-%s Menüsü (%s).xlsx'$yil$aylar[$ay], $ogunler[$ogun], $turudate('Y-m-d'));
  107.         $temp_file tempnam(sys_get_temp_dir(), $fileName);
  108.         // Şablon üzerinde varsayılan alan konumları
  109.         $sablon = [
  110.             'base' => ['col' => 1'row' => 5],
  111.             'separator' => ['col' => 2'row' => 2],
  112.             '<<TARİH>>' => ['col' => 0'row' => 0'alan' => 'GUN''visible' => true],
  113.             '<<RECADI>>' => ['col' => 0'row' => 1'alan' => 'RECADI''visible' => false],
  114.             '<<ADET>>' => ['col' => 1'row' => 1'alan' => 'ADET''visible' => false],
  115.             '<<KALORİ>>' => ['col' => 2'row' => 1'alan' => 'KALORI''visible' => false],
  116.             '<<ORAN>>' => ['col' => 3'row' => 1'alan' => 'ORAN''visible' => false],
  117.         ];
  118.         $highestRow $activeSheet->getHighestRow(); // ex. 10
  119.         $highestColumn $activeSheet->getHighestColumn(); // ex. 'F'
  120.         $highestColumnIndex Coordinate::columnIndexFromString($highestColumn); // ex. 5
  121.         // Şablonda işaretlenen alanların konumunu al
  122.         foreach ($sablon as $alan => $konum) {
  123.             if ($alan[0] != '<') continue;
  124.             for ($row 1$row <= $highestRow; ++$row) {
  125.                 for ($col 0$col <= $highestColumnIndex; ++$col) {
  126.                     $cell $activeSheet->getCellByColumnAndRow($col$row);
  127.                     $cellValue $cell->getValue();
  128.                     if ($cellValue == '<<ZAMAN>>') {
  129.                         $cell->setValue(date('d.m.Y H:i'));
  130.                     } elseif ($cellValue == '<<AY>>') {
  131.                         $cell->setValue($aylar[$ay]);
  132.                     } elseif ($cellValue == '<<ÖĞÜN>>') {
  133.                         $cell->setValue($ogunler[$ogun]);
  134.                     } elseif ($cellValue == '<<TÜRÜ>>') {
  135.                         $cell->setValue($turu);
  136.                     } elseif ($alan == $cellValue) {
  137.                         $cell->setValue('');
  138.                         $sablon[$alan]['visible'] = true;
  139.                         $sablon[$alan]['style'] = $cell->getStyle()->exportArray();
  140.                         if ($alan == '<<TARİH>>') {
  141.                             $sablon['base'] = ['col' => $col'row' => $row];
  142.                             // TARİH hücresinde açıklama olarak girilen bilgi varsa bunları al. Format: sayi1, sayi2, sayi3
  143.                             // sayi1        : Tarih hücresi için birleştirilecek hücre sayısı
  144.                             // sayi2, sayi3 : Sütun, Satır (günler arasında boş bırakılacak hücre sayısı)
  145.                             $comment trim($activeSheet->getCommentByColumnAndRow($col$row)->getText()->getPlainText());
  146.                             if (!empty($comment)) {
  147.                                 // Açıklama varsa alıp hücreyi temizle
  148.                                 $comments $activeSheet->getComments();
  149.                                 if (isset($comments[Coordinate::stringFromColumnIndex($col) . $row])) {
  150.                                     unset($comments[Coordinate::stringFromColumnIndex($col) . $row]);
  151.                                     $activeSheet->setComments($comments);
  152.                                 }
  153.                                 $comment explode(','$comment);
  154.                                 $sablon[$alan]['span'] = (int)$comment[0];
  155.                                 if (count($comment) > 1)
  156.                                     $sablon['separator']['col'] = (int)$comment[1];
  157.                                 if (count($comment) > 2)
  158.                                     $sablon['separator']['row'] = (int)$comment[2];
  159.                             }
  160.                         }
  161.                         $sablon[$alan]['col'] = $col $sablon['base']['col'];
  162.                         $sablon[$alan]['row'] = $row $sablon['base']['row'];
  163.                         $row $highestRow 1// $row döngüsünü durdurmak için
  164.                         break;
  165.                     }
  166.                 }
  167.             }
  168.         }
  169. //        dd($sablon);
  170. //        // Menünün başlayacağı konum '***' ile işaretlenmiş olmalı
  171. //        $baseCol = 1; // menünün başlayacağı sütun
  172. //        $baseRow = 5; // menünün başlayacağı satır
  173. //        for ($row = 1; $row <= $highestRow; ++$row) {
  174. //            for ($col = 0; $col <= $highestColumnIndex; ++$col) {
  175. //                if ('***' == $activeSheet->getCellByColumnAndRow($col, $row)->getValue()) {
  176. //                    $baseCol = $col;
  177. //                    $baseRow = $row;
  178. //                    $row = PHP_INT_MAX;
  179. //                    break;
  180. //                }
  181. //            }
  182. //        }
  183.         // Otomatik satır yüksekliğini iptal et
  184.         for ($i 1$i <= 100$i++) {
  185.             $activeSheet->getRowDimension($i)->setRowHeight(-1);
  186.         }
  187.         $activeSheet->setCellValue('A1'$this->getUser()->getCari()->getFirmaAdi());
  188.         foreach ($menu as $rowShift => $resultRow) {
  189.             $maxSatir 0// bu satırdaki günlerden en çok sayıda yemek olanın satır sayısı
  190.             foreach ($resultRow as $colShift => $resultGun) {
  191.                 $row $sablon['base']['row'];
  192.                 $col $sablon['base']['col'] + $colShift $sablon['separator']['col'];
  193.                 $cellName Coordinate::stringFromColumnIndex($col) . $row;
  194.                 if (!empty($sablon['<<TARİH>>']['span']))
  195.                     $spreadsheet->getActiveSheet()->mergeCells($cellName ':' Coordinate::stringFromColumnIndex($col $sablon['<<TARİH>>']['span'] - 1) . $row);
  196.                 /*$style = $activeSheet->getStyle($cellName);
  197.                 $style->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_WHITE);
  198.                 $style->getFill()
  199.                     ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
  200.                     ->getStartColor()->setARGB('FF2196F3');*/
  201.                 $activeSheet->getStyleByColumnAndRow($col$row)->applyFromArray($sablon['<<TARİH>>']['style']);
  202.                 $activeSheet->setCellValueByColumnAndRow($col$row++, $resultGun[0]['GUN']);
  203.                 foreach ($resultGun as $resultYemek) {
  204.                     if (empty($resultYemek['RECADI'])) continue;
  205.                     foreach ($sablon as $alan => $konum) {
  206.                         if ($alan[0] != '<' || !$konum['visible']) continue;
  207.                         if (array_key_exists($konum['alan'], $resultYemek)) {
  208.                             $cell $activeSheet->getCellByColumnAndRow($col $konum['col'], $row);
  209.                             $cell->getStyle()->applyFromArray($konum['style']);
  210.                             if ($alan == '<<KALORİ>>')
  211.                                 $cell->setValue(number_format($resultYemek[$konum['alan']], 0',''.'));
  212.                             else $cell->setValue($resultYemek[$konum['alan']]);
  213.                         }
  214.                         if ($row $sablon['base']['row'] > $maxSatir) {
  215.                             $maxSatir $row $sablon['base']['row'];
  216.                         }
  217.                     }
  218.                     $row++;
  219.                     //-$col += $sablon['separator']['col'];
  220.                 }
  221.             }
  222.             $sablon['base']['row'] += $maxSatir $sablon['separator']['row'] + 1;
  223.         }
  224.         $col 100;
  225.         for ($i 1$i <= $col$i++) {
  226.             $activeSheet->getColumnDimensionByColumn($i)->setAutoSize(true);
  227.         }
  228.         // Create the Excel file in the tmp directory of the system
  229.         $writer->save($temp_file);
  230.         return $this->file($temp_file$fileNameResponseHeaderBag::DISPOSITION_INLINE);
  231.         /*
  232.         $response->headers->set('Content-Type', 'text/vnd.ms-excel; charset=utf-8');
  233.         $response->headers->set('Content-Disposition', 'attachment;filename=' . $this->getUser()->getName() . '.xls');
  234.         $response->headers->set('Pragma', 'public');
  235.         $response->headers->set('Cache-Control', 'maxage=1');
  236.         return $response;
  237.         */
  238.     }
  239.     /**
  240.      * @throws TransportExceptionInterface
  241.      */
  242.     protected function sendEmail($data$filter)
  243.     {
  244.         if ($filter['ogun'] == 1)
  245.             $filter['ogun'] = 'ÖĞLE';
  246.         elseif ($filter['ogun'] == 2)
  247.             $filter['ogun'] = 'AKŞAM';
  248.         elseif ($filter['ogun'] == 3)
  249.             $filter['ogun'] = 'GECE';
  250.         $aylar = [=> 'OCAK''ŞUBAT''MART''NİSAN''MAYIS''HAZİRAN''TEMMUZ''AĞUSTOS''EYLÜL''EKİM''KASIM''ARALIK'];
  251.         if (array_key_exists($filter['ay'], $aylar))
  252.             $filter['ay'] = $aylar[$filter['ay']];
  253.         $cari $this->getUser()->getCari();
  254.         $config $this->getParameter('foodsoft');
  255.         $konu $config['musteri_menu']['eposta_konu'] ?? 'Menü Değişikliği';
  256.         $konu str_replace(['_FIRMA-KODU_''_FIRMA-ADI_''_FIRMA-NICK_'], [
  257.             $cari->getFirmaKodu(),
  258.             $cari->getFirmaAdi(),
  259.             $cari->getUnvan2(),
  260.         ], $konu);
  261.         $epostalar $config['musteri_menu']['eposta'] ?? '';
  262.         $email = (new TemplatedEmail())
  263.             ->subject($konu)
  264.             ->text('Müşteri menüsünde değişiklik yapıldı!')
  265. //            ->html($html);  // Eğer Email() sınıfından gönderilecekse
  266.             ->htmlTemplate('_email/menu-degisiklik.html.twig')
  267.             ->context(['fark' => $data'filter' => $filter]);
  268.         if (is_array($epostalar)) {
  269.             foreach ($epostalar as $eposta)
  270.                 $email->addTo($eposta);
  271.         } elseif (!empty($epostalar)) $email->to($epostalar);
  272.         $this->sendHtmlEmail($email);
  273.     }
  274. }