<?php
namespace App\Controller\Api;
use App\Controller\AbstractFoodsoftController;
use App\Entity\MusteriMenu;
use App\Repository\MusteriMenuRepository;
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route("/api/menu", name="api-menu-")
*/
class MenuController extends AbstractFoodsoftController
{
/**
* @Route("/", name="index")
*/
public function index(Request $request): Response
{
$yil = $request->get('yil', date('Y'));
$ay = $request->get('ay', 2);
$ogun = $request->get('ogun', 1);
$turu = $request->get('turu', 'NORMAL');
/** @var MusteriMenuRepository $rep */
$rep = $this->getdoctrine()->getmanager()->getrepository(MusteriMenu::class);
$rep->setConfig($this->getParameter('foodsoft'));
$menu = $rep->listeal($yil, $ay, $ogun, $turu);
// Uyumsuz yemek kontrolü için kontrol menüsünü al
$ogunler = array_diff([1, 2, 3], [$ogun]);
$menu_kontrol = [];
if ($turu == 'NORMAL') {
$turu = 'MESAİ';
} elseif ($turu == 'MESAİ') {
$turu = 'NORMAL';
}
foreach ($ogunler as $og) {
$ogun_str = ($og == 3 ? 'GECE' : ($og == 2 ? 'AKŞAM' : 'ÖĞLE'));
$menu_kontrol[$ogun_str] = $rep->listeal($yil, $ay, $og, $turu);
}
$grupLimit = $rep->getCariAlternatifLimit();
return $this->json([
'filter' => [
'yil' => $yil,
'ay' => $ay,
'ogun' => $ogun,
'tur' => $turu,
'canEdit' => $rep->canEdit($ay, $yil)
],
'menu' => $menu,
'menu_kontrol' => $menu_kontrol,
'grup_limit' => $grupLimit,
]);
}
/**
* @Route("/save", name="save", methods={"POST", "GET"})
*/
public function menuKaydet(Request $request): Response
{
$data = json_decode($request->getContent(), true);
try {
$filter = $data['filter'];
$data = $data['menu'];
/** @var MusteriMenuRepository $rep */
$rep = $this->getdoctrine()->getmanager()->getrepository(MusteriMenu::class);
$rep->setConfig($this->getParameter('foodsoft'));
if (!$rep->canEdit($filter['ay'], $filter['yil'])) {
return $this->json(['success' => false, 'msg' => 'Bu ayın menüsünü değiştirme yetkiniz yok.'], Response::HTTP_OK);
}
$fark = $rep->saveMenu($data, $filter);
try {
if (count($fark['data']) > 0)
$this->sendEmail($fark['data'], $filter);
} catch (\Exception $e) {
return $this->json(['success' => false, 'msg' => 'Eposta gönderme hatası!<br>' . $e->getMessage()], Response::HTTP_OK);
}
} catch (\Exception $e) {
return $this->json(['success' => false, 'msg' => $e->getMessage()], Response::HTTP_NOT_FOUND);
}
return $this->json(['success' => true, 'msg' => $fark['msg']], Response::HTTP_OK);
}
/**
* @Route("/excel", name="export-excel", methods={"GET"})
*/
public function exportMenu2Excel(Request $request): Response
{
$yil = $request->get('yil', date('Y'));
$ay = $request->get('ay', 2);
$ogun = $request->get('ogun', 1);
$turu = $request->get('turu', 'NORMAL');
/** @var MusteriMenuRepository $rep */
$rep = $this->getdoctrine()->getmanager()->getrepository(MusteriMenu::class);
$rep->setConfig($this->getParameter('foodsoft'));
$menu = $rep->listeal($yil, $ay, $ogun, $turu);
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
$spreadsheet = $reader->load("../var/menu-template.xlsx");
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
$activeSheet = $spreadsheet->getActiveSheet();
// Create a Temporary file in the system
$aylar = [1 => 'OCAK', 'ŞUBAT', 'MART', 'NİSAN', 'MAYIS', 'HAZİRAN', 'TEMMUZ', 'AĞUSTOS', 'EYLÜL', 'EKİM', 'KASIM', 'ARALIK'];
$ogunler = [1 => 'ÖĞLE', 'AKŞAM', 'GECE'];
$fileName = sprintf('%d-%s-%s-%s Menüsü (%s).xlsx', $yil, $aylar[$ay], $ogunler[$ogun], $turu, date('Y-m-d'));
$temp_file = tempnam(sys_get_temp_dir(), $fileName);
// Şablon üzerinde varsayılan alan konumları
$sablon = [
'base' => ['col' => 1, 'row' => 5],
'separator' => ['col' => 2, 'row' => 2],
'<<TARİH>>' => ['col' => 0, 'row' => 0, 'alan' => 'GUN', 'visible' => true],
'<<RECADI>>' => ['col' => 0, 'row' => 1, 'alan' => 'RECADI', 'visible' => false],
'<<ADET>>' => ['col' => 1, 'row' => 1, 'alan' => 'ADET', 'visible' => false],
'<<KALORİ>>' => ['col' => 2, 'row' => 1, 'alan' => 'KALORI', 'visible' => false],
'<<ORAN>>' => ['col' => 3, 'row' => 1, 'alan' => 'ORAN', 'visible' => false],
];
$highestRow = $activeSheet->getHighestRow(); // ex. 10
$highestColumn = $activeSheet->getHighestColumn(); // ex. 'F'
$highestColumnIndex = Coordinate::columnIndexFromString($highestColumn); // ex. 5
// Şablonda işaretlenen alanların konumunu al
foreach ($sablon as $alan => $konum) {
if ($alan[0] != '<') continue;
for ($row = 1; $row <= $highestRow; ++$row) {
for ($col = 0; $col <= $highestColumnIndex; ++$col) {
$cell = $activeSheet->getCellByColumnAndRow($col, $row);
$cellValue = $cell->getValue();
if ($cellValue == '<<ZAMAN>>') {
$cell->setValue(date('d.m.Y H:i'));
} elseif ($cellValue == '<<AY>>') {
$cell->setValue($aylar[$ay]);
} elseif ($cellValue == '<<ÖĞÜN>>') {
$cell->setValue($ogunler[$ogun]);
} elseif ($cellValue == '<<TÜRÜ>>') {
$cell->setValue($turu);
} elseif ($alan == $cellValue) {
$cell->setValue('');
$sablon[$alan]['visible'] = true;
$sablon[$alan]['style'] = $cell->getStyle()->exportArray();
if ($alan == '<<TARİH>>') {
$sablon['base'] = ['col' => $col, 'row' => $row];
// TARİH hücresinde açıklama olarak girilen bilgi varsa bunları al. Format: sayi1, sayi2, sayi3
// sayi1 : Tarih hücresi için birleştirilecek hücre sayısı
// sayi2, sayi3 : Sütun, Satır (günler arasında boş bırakılacak hücre sayısı)
$comment = trim($activeSheet->getCommentByColumnAndRow($col, $row)->getText()->getPlainText());
if (!empty($comment)) {
// Açıklama varsa alıp hücreyi temizle
$comments = $activeSheet->getComments();
if (isset($comments[Coordinate::stringFromColumnIndex($col) . $row])) {
unset($comments[Coordinate::stringFromColumnIndex($col) . $row]);
$activeSheet->setComments($comments);
}
$comment = explode(',', $comment);
$sablon[$alan]['span'] = (int)$comment[0];
if (count($comment) > 1)
$sablon['separator']['col'] = (int)$comment[1];
if (count($comment) > 2)
$sablon['separator']['row'] = (int)$comment[2];
}
}
$sablon[$alan]['col'] = $col - $sablon['base']['col'];
$sablon[$alan]['row'] = $row - $sablon['base']['row'];
$row = $highestRow + 1; // $row döngüsünü durdurmak için
break;
}
}
}
}
// dd($sablon);
// // Menünün başlayacağı konum '***' ile işaretlenmiş olmalı
// $baseCol = 1; // menünün başlayacağı sütun
// $baseRow = 5; // menünün başlayacağı satır
// for ($row = 1; $row <= $highestRow; ++$row) {
// for ($col = 0; $col <= $highestColumnIndex; ++$col) {
// if ('***' == $activeSheet->getCellByColumnAndRow($col, $row)->getValue()) {
// $baseCol = $col;
// $baseRow = $row;
// $row = PHP_INT_MAX;
// break;
// }
// }
// }
// Otomatik satır yüksekliğini iptal et
for ($i = 1; $i <= 100; $i++) {
$activeSheet->getRowDimension($i)->setRowHeight(-1);
}
$activeSheet->setCellValue('A1', $this->getUser()->getCari()->getFirmaAdi());
foreach ($menu as $rowShift => $resultRow) {
$maxSatir = 0; // bu satırdaki günlerden en çok sayıda yemek olanın satır sayısı
foreach ($resultRow as $colShift => $resultGun) {
$row = $sablon['base']['row'];
$col = $sablon['base']['col'] + $colShift * $sablon['separator']['col'];
$cellName = Coordinate::stringFromColumnIndex($col) . $row;
if (!empty($sablon['<<TARİH>>']['span']))
$spreadsheet->getActiveSheet()->mergeCells($cellName . ':' . Coordinate::stringFromColumnIndex($col + $sablon['<<TARİH>>']['span'] - 1) . $row);
/*$style = $activeSheet->getStyle($cellName);
$style->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_WHITE);
$style->getFill()
->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
->getStartColor()->setARGB('FF2196F3');*/
$activeSheet->getStyleByColumnAndRow($col, $row)->applyFromArray($sablon['<<TARİH>>']['style']);
$activeSheet->setCellValueByColumnAndRow($col, $row++, $resultGun[0]['GUN']);
foreach ($resultGun as $resultYemek) {
if (empty($resultYemek['RECADI'])) continue;
foreach ($sablon as $alan => $konum) {
if ($alan[0] != '<' || !$konum['visible']) continue;
if (array_key_exists($konum['alan'], $resultYemek)) {
$cell = $activeSheet->getCellByColumnAndRow($col + $konum['col'], $row);
$cell->getStyle()->applyFromArray($konum['style']);
if ($alan == '<<KALORİ>>')
$cell->setValue(number_format($resultYemek[$konum['alan']], 0, ',', '.'));
else $cell->setValue($resultYemek[$konum['alan']]);
}
if ($row - $sablon['base']['row'] > $maxSatir) {
$maxSatir = $row - $sablon['base']['row'];
}
}
$row++;
//-$col += $sablon['separator']['col'];
}
}
$sablon['base']['row'] += $maxSatir + $sablon['separator']['row'] + 1;
}
$col = 100;
for ($i = 1; $i <= $col; $i++) {
$activeSheet->getColumnDimensionByColumn($i)->setAutoSize(true);
}
// Create the Excel file in the tmp directory of the system
$writer->save($temp_file);
return $this->file($temp_file, $fileName, ResponseHeaderBag::DISPOSITION_INLINE);
/*
$response->headers->set('Content-Type', 'text/vnd.ms-excel; charset=utf-8');
$response->headers->set('Content-Disposition', 'attachment;filename=' . $this->getUser()->getName() . '.xls');
$response->headers->set('Pragma', 'public');
$response->headers->set('Cache-Control', 'maxage=1');
return $response;
*/
}
/**
* @throws TransportExceptionInterface
*/
protected function sendEmail($data, $filter)
{
if ($filter['ogun'] == 1)
$filter['ogun'] = 'ÖĞLE';
elseif ($filter['ogun'] == 2)
$filter['ogun'] = 'AKŞAM';
elseif ($filter['ogun'] == 3)
$filter['ogun'] = 'GECE';
$aylar = [1 => 'OCAK', 'ŞUBAT', 'MART', 'NİSAN', 'MAYIS', 'HAZİRAN', 'TEMMUZ', 'AĞUSTOS', 'EYLÜL', 'EKİM', 'KASIM', 'ARALIK'];
if (array_key_exists($filter['ay'], $aylar))
$filter['ay'] = $aylar[$filter['ay']];
$cari = $this->getUser()->getCari();
$config = $this->getParameter('foodsoft');
$konu = $config['musteri_menu']['eposta_konu'] ?? 'Menü Değişikliği';
$konu = str_replace(['_FIRMA-KODU_', '_FIRMA-ADI_', '_FIRMA-NICK_'], [
$cari->getFirmaKodu(),
$cari->getFirmaAdi(),
$cari->getUnvan2(),
], $konu);
$epostalar = $config['musteri_menu']['eposta'] ?? '';
$email = (new TemplatedEmail())
->subject($konu)
->text('Müşteri menüsünde değişiklik yapıldı!')
// ->html($html); // Eğer Email() sınıfından gönderilecekse
->htmlTemplate('_email/menu-degisiklik.html.twig')
->context(['fark' => $data, 'filter' => $filter]);
if (is_array($epostalar)) {
foreach ($epostalar as $eposta)
$email->addTo($eposta);
} elseif (!empty($epostalar)) $email->to($epostalar);
$this->sendHtmlEmail($email);
}
}