d2d.emegrendeles.hu/app/Http/Controllers/OrderController.php

2040 lines
76 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace App\Http\Controllers;
use App\Enums\OrderFlag;
use App\Enums\OrderStatusEnum;
use App\Exports\ExportOrderInvoiceExcel;
use App\Models\Address;
use App\Models\Attachment;
use App\Models\Order;
use App\Models\OrderArchive;
use App\Models\OrderArchivesItem;
use App\Models\OrderNumber;
use App\Models\Product;
use App\Models\ProductGroup;
use App\Models\ProfitCenter;
use App\Models\Supplier;
use App\Models\SupplierNotifier;
use App\Models\Test;
use App\Repositories\ProductRepository;
use App\Repositories\SupplierRepository;
use App\Services\DeliveryCalendarService;
use App\Services\NextDeliveryDateCalculatorService;
use App\Services\WorkCalendarService;
use App\Services\OrderService;
use App\Services\ProfitCenterService;
use ArrayObject;
use Barryvdh\DomPDF\Facade\Pdf as PDF;
use Carbon\Carbon;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Carbon as ICarbon;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\App;
use Illuminate\View\View;
use Log;
use Maatwebsite\Excel\Facades\Excel;
class OrderController extends Controller
{
protected OrderService $service;
protected bool $testMode = false;
public function __construct(
OrderService $service,
protected DeliveryCalendarService $deliveryCalendarService,
protected NextDeliveryDateCalculatorService $nextDeliveryDateCalculator,
) {
$this->service = $service;
/*
need debugger
$this->logger = Log::build([
'driver' => 'single',
'path' => storage_path('logs/debug.log'),
]);
*/
}
private function convertWeekProductSelectArrayToDays($Order, $indexed = 'weekDayPointer')
{
$orderItemsArray = (array) json_decode($Order->productSelected, true);
$daysArray = [];
foreach ($orderItemsArray as $productIndex => $productArray) {
foreach ($productArray as $dayIndex => $value) {
$daysArray[$dayIndex][$productIndex] = $value;
}
}
if ($indexed == 'weekDayDate') {
$ret = [];
foreach ($daysArray as $dayNum => $dayData) {
$deliveryDate = Carbon::parse($Order->deliveryDate);
// var_export($dayNum-1);
$deliveryDate->addDays($dayNum - 1);
$ret[$deliveryDate->format('Y-m-d')] = $dayData;
}
} else {
$ret = $daysArray;
}
ksort($ret);
return $ret;
}
/**
* Display a listing of the resource.
*/
public function index(): View|Response|JsonResponse
{
// test mode
/*
$productRepo=new ProductRepository();
$productsGroupIds=$productRepo->getSupplierProductGroupsIdFromPriceList(7,'2021-11-19',37);
$ProductGroups=new ProductGroup();
//dd($ProductGroups->allToTreeArray());
dd($ProductGroups->nodesWithParentToTree($productsGroupIds));
*/
/* $productRepo=new ProductRepository();
$products=$productRepo->getSupplierProductFromPriceList(7,'2021-11-19',37);
dd($products);*/
// debug('itt'.__LINE__);
if (\request()->input('t') == 1) {
if (\request()->input('w') == 1) {
$testOrderId = 16497; // heti
$testOrderId = 16467; // heti
$testOrderId = 16507; // heti
// $testOrderId=16512; //heti
} else {
$testOrderId = 12140; // napi
$testOrderId = 16506; // napi
$testOrderId = 16571; // napi
}
/******** create Excel ***********/
return $this->testExcelCreate($testOrderId);
/******** invoiceView test ***********/
return $this->testInvoiceView($testOrderId);
return response()->noContent();
/******** set session order data***********/
return $this->updateSend(\request(), $testOrderId);
return response()->noContent();
echo '<pre>';
$this->updateSend(new Request, $testOrderId);
$testOrderId = 62;
/******** create Excel ***********/
return $this->testExcelCreate($testOrderId);
/******** create Pdf from oder ***********/
return $this->testPdfCreate($testOrderId);
/******** archiveOrder ***********/
return $this->archiveOrder(null, $testOrderId);
/******** Eamil send ***********/
return $this->testSendEmail($testOrderId);
/******** invoiceView test ***********/
return $this->testInvoiceView($testOrderId);
return response()->noContent();
/******** getgumanId ***********/
var_dump($this->getOrderHumanId($testOrderId));
return response()->noContent();
/******** createSupplierOrderNumber ***********/
dd($this->createSupplierOrderNumber(244));
return response()->noContent();
/******** OrderHumanId test data***********/
var_dump($this->getOrderHumanId(null, 1212, 'JANER', '2021-11-18', 'HAN'));
var_dump($this->getOrderHumanId(1));
return response()->noContent();
/******** set session order data***********/
return $this->testGetSessionData();
/******** set session order data***********/
return $this->testSetSessionData();
debug($this->testMode);
$orders = Order::where('profit_center_id', 1)->where('orderStatus', '!=', 'sent')->orderBY('deliveryDate')->get();
if (count($orders->toArray()) > 0) {
dd($orders->toArray());
}
dd('vege itt L:'.__LINE__);
}
if (! \request()->input('force')) {
// dd(auth()->user()->id);
$profitCenterId = auth()->user()->profitCenters()->first()->id;
$orders = Order::with('supplier')->where('profit_center_id', $profitCenterId)->whereNotIn('orderStatus', ['sent', 'confirmed', 'archived'])->orderBY('deliveryDate')->get();
debug($orders);
if (count($orders->toArray()) > 0) {
/* $orders=$orders->sortBy(function($value,$key){
if(!$value->deliveryDate){
return '9999-12-31';
}
return ($value->deliveryDate);
});*/
// dd($orders->toArray());
foreach ($orders as $order) {
$today = Carbon::parse(\Carbon\Carbon::now()->format('Y-m-d'));
$deliveryDate = \Carbon\Carbon::parse($order->deliveryDate);
// $order->a=$today->toString();
// $order->aa=\Carbon\Carbon::parse($order->deliveryDate)->toString();
$order->diffInHours = \Carbon\Carbon::parse($order->deliveryDate)->diffInHours($today);
$order->diffInDays = \Carbon\Carbon::parse($order->deliveryDate)->diffInDays($today);
$order->diffForHumans = \Carbon\Carbon::parse($order->deliveryDate)->diffForHumans($today);
if (! $order->deliveryDate) {
$order->diffWarningLevel = 99;
continue;
}
if ($order->deliveryDate < $today || $order->deliveryDate == $today) {
$order->diffWarningLevel = 0;
continue;
}
if ($order->diffInDays >= 1 && $order->diffInDays <= 3) {
$order->diffWarningLevel = 1;
continue;
}
$order->diffWarningLevel = 98;
}
$orders = $orders->sortBy(['diffWarningLevel', 'deliveryDate']);
// dd($orders->toArray());
return view('modules.order.indexSelect')->with([
'testMode' => $this->testMode,
'orders' => $orders,
]
);
}
// dd(\request()->input('force'));
}
return view('modules.order.indexStepper')->with('testMode', $this->testMode);
}
private function testGetSessionData(): void
{
echo '<pre>';
echo 'testGetSessionData';
echo 'session_status():'.var_export(session_status(), true).PHP_EOL;
echo "var_export(session()->get('orderData'),true):".PHP_EOL.var_export(session()->get('orderData'), true).PHP_EOL;
echo 'var_export(session()->all(),true):'.PHP_EOL.var_export(session()->all(), true).PHP_EOL;
}
private function testSetSessionData(): void
{
echo '<pre>';
echo 'testSetSessionData';
$this->testGetSessionData();
/******** set session order data***********/
$orderDataForSession = [
'productSelected' => [
34 => '2',
116 => '1',
],
'supplierId' => '7',
'contactName' => 'Contact Name',
'note' => 'Note',
'type' => 'daily',
'deliveryDate' => '2021-11-15',
'deliveryAddress' => '12',
];
// print ":"..PHP_EOL;
session()->put('orderData', $orderDataForSession);
session()->save();
echo "var_export(session()->get('orderData'),true):".PHP_EOL.var_export(session()->get('orderData'), true).PHP_EOL;
\response();
/************************/
}
private function testPdfCreate($orderId = null)
{
if (! $orderId) {
$orderId = 1;
}
if (! $Order = Order::find($orderId)) {
return \response()->json(['success' => false], 500);
}
$orderData = $this->getOrderData($Order->id);
$pdf = PDF::loadView('modules.order.invoiceEmail', $orderData);
return $pdf->stream();
$attachmentFile = new Attachment;
$ret = $attachmentFile->addStreamedFile($pdf->output());
// $orderData=$this->getOrderData(null,$Order);
// $ret=$attachmentFile->addStreamedFile(Excel::raw(new ExportOrderInvoiceExcel($orderData), \Maatwebsite\Excel\Excel::XLSX)) ;
// $ret=$attachmentFile->addStreamedFile(Excel::raw(new ExportOrderInvoiceExcel($orderData), \Maatwebsite\Excel\Excel::XLSX)) ;
/*
* XLS formatumot tesztelni
*/
dd($ret);
return $pdf->stream();
}
private function testPdfCreateBlank()
{
\Debugbar::disable();
$HTMLStr = '<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
</head>
<body>
<p >árvíztűrő tükörfúrógép</p>
</body>
</html>';
$HTMLStr = '<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<style>
body{
font-family: DejaVu Sans
}
</style>
</head>
<body>
<p >árvíztűrő tükörfúrógép</p>
</body>
</html>';
// return \response($HTMLStr);
$pdf = PDF::loadHTML($HTMLStr);
// $pdf->loadHTML('<h1>proba</h1>');
return $pdf->stream('probacska.pdf');
}
private function testExcelCreate($orderId = null)
{
$orderData = $this->getOrderData($orderId);
$orderData['feedBackIdLinkParam'] = base64_encode($orderData['feedBackId']);
$orderData['sentTime'] = Carbon::now()->toDateTimeString();
$orderData['noPrintButton'] = true;
// return view('modules.order.excelExport')->with($orderData);
return Excel::download(new ExportOrderInvoiceExcel($orderData), 'invoices'.time().'.xlsx');
// dd($orderData);
return view('modules.order.excelExport')->with($orderData);
dd($orderData['deliveryDate'], formatterDate($orderData['deliveryDate']));
dd(formatterDate($orderData['deliveryDate']));
}
private function testSendEmail($orderId = null)
{
if (! $orderId) {
$orderId = 1;
}
if (! $Order = Order::find($orderId)) {
return \response()->json(['success' => false], 500);
}
$orderData = $this->getOrderData($orderId);
$orderData['feedBackIdLinkParam'] = base64_encode($orderData['feedBackId']);
// \Debugbar::disable();
// return view('modules.order.invoiceEmail')->with($orderData);
$orderData['noPrintButton'] = true;
$HTMLInvoice = view('modules.order.invoice')->with($orderData
)->render();
$profitCenterName = 'Hankook - Delirest Étterem';
$attach = null;
$fileType = 'pdf';
$fileType = 'excel';
$fileName = preg_replace('/[^a-zA-Z0-9\-\._]/', '_', $orderData['humanId']);
if ($fileType == 'pdf') {
$pdf = PDF::loadView('modules.order.invoiceEmail', $orderData);
$fileNameWithExt = $fileName.'.pdf';
$attach = $pdf->output();
} elseif ($fileType == 'excel') {
$fileNameWithExt = $fileName.'.xlsx';
/* $fileExcel=Excel::download(new ExportOrderInvoiceExcel($orderData), $fileNameWithExt);
$attach=$fileExcel->getFile();
*/
$attach = Excel::raw(new ExportOrderInvoiceExcel($orderData), \Maatwebsite\Excel\Excel::XLSX);
}
$send = \Mail::send('email.order', [
'orderHTMLInvoice' => $HTMLInvoice,
'orderData' => $orderData,
'profitCenterName' => $profitCenterName,
], function ($m) use ($orderData, $attach, $fileNameWithExt) {
$m->subject('Delirest - Hankook - '.$orderData['humanId']);
// $m->to('beszerzes@eurest.hu');
$m->to(config('mail.MailToOrderAddress'));
if (config('mail.MailToOrderAddress') != 'city@e98.hu') {
$m->bcc('city@e98.hu');
}
// $m->attach($attach,['as'=>$fileNameWithExt]);
$m->attachData($attach, $fileNameWithExt);
});
debug($send);
return \response('okes');
return $pdf->stream($fileName);
return \response($HTMLInvoice);
}
private function testInvoiceView($orderId = null)
{
if (! $orderId) {
$orderId = 1;
}
if (! $Order = Order::find($orderId)) {
return \response()->json(['success' => false], 500);
}
$orderData = $this->getOrderData($orderId);
// print "<pre>";var_dump($orderData);print "</pre>";
/* $HTMLInvoice=view('modules.order.invoice')->with($orderData
)->render();*/
// $orderData['noPrintButton']=true;
return view('modules.order.invoice')->with($orderData
);
}
private function createSupplier(Request $request)
{
// select('name')->
$profitCenterId = auth()->user()->profitCenters->first()->id;
$accessSupplier = ProfitCenter::with('suppliers')->find($profitCenterId)->suppliers->pluck('id')->toArray();
// $suppliers=Supplier::all()->toArray();
$repo = new SupplierRepository;
$suppliers = $repo->allWithRelations();
$suppliers = array_filter($suppliers, function ($item) use ($accessSupplier) {
if (in_array($item['id'], $accessSupplier)
&& $item['canSeeInOrder'] == 1) {
return true;
}
return false;
});
return view('modules.order.supplier')->with([
'suppliers' => $suppliers,
]);
}
private ?ProfitCenterService $ServiceProfitCenter = null;
private function initProfitCenterService()
{
if (! $this->ServiceProfitCenter) {
$this->ServiceProfitCenter = App::make(ProfitCenterService::class);
}
return $this->ServiceProfitCenter;
}
private function getProfitCenterAddress($ProfitCenter = null)
{
if (! $ProfitCenter) {
$ProfitCenter = $this->initProfitCenterService()->getWithAllRelations(auth()->user()->profitCenters()->first()->id);
}
if ($ProfitCenter['addressEqual']) {
$ProfitCenterAddress = $ProfitCenter['fullAddress'];
} else {
$address = $ProfitCenter['address'][0];
$ProfitCenterAddress = "{$address['postCode']} {$address['city']} {$address['street']}";
}
return $ProfitCenterAddress;
}
private function createParameter(Request $request)
{
// $this->initProfitCenterService();
// kiveheto innen??? vagy nem mert kell a multiaddresshez
if (! $Order = Order::with('supplier')->find($request->get('id'))) {
return false;
}
$supplierNote = null;
if ($Order->supplier->note) {
$supplierNote = $Order->supplier->note;
}
$ProfitCenter = $this->initProfitCenterService()->getWithAllRelations(auth()->user()->profitCenters()->first()->id);
$oneAddress = true;
$ProfitCenterAddress = '';
if ($ProfitCenter['multiAddress']) {
$oneAddress = false;
$ProfitCenterAddress = [];
foreach ($ProfitCenter['address'] as $address) {
$ProfitCenterAddress[] = [
'id' => $address['id'],
'address' => $address['name'].' - '.$address['fullAddress'],
];
}
} else {
$ProfitCenterAddress = $this->getProfitCenterAddress($ProfitCenter);
}
$hasCustomNotificationEmail = false;
$CustomNotificationEmailData = [];
$Supplier = Supplier::with('contactOrderMail')->find($Order->supplier->id);
if (count($Supplier->contactOrderMail->toArray()) > 0) {
$hasCustomNotificationEmail = true;
$CustomNotificationEmailData = $Supplier->contactOrderMail->toArray();
}
$profitCenterId = auth()->user()->profitCenters()->first()->id;
return view('modules.order.parameter')->with([
// 'supplier'=>$ProfitCenter[''],
'oneAddress' => $oneAddress,
'hasCustomNotificationEmail' => $hasCustomNotificationEmail,
'CustomNotificationEmailData' => $CustomNotificationEmailData,
'supplierNote' => $supplierNote,
'profitCenterAddress' => $ProfitCenterAddress,
'supplierId' => $Order->supplier_id,
'profitCenterId' => $profitCenterId,
'deliveryCalendarDataUrl' => route('order.deliveryCalendarData'),
]);
}
public function getDeliveryCalendarData(
Request $request,
DeliveryCalendarService $deliveryCalendarService,
NextDeliveryDateCalculatorService $nextDeliveryCalculator,
WorkCalendarService $workCalendarService,
): JsonResponse {
$supplierId = (int) $request->get('supplierId');
$profitCenterId = (int) $request->get('profitCenterId');
$orderDateTime = Carbon::parse($request->get('orderDateTime', now()));
$supplier = Supplier::find($supplierId);
$pc = ProfitCenter::find($profitCenterId);
if (! $supplier || ! $pc) {
return response()->json(['error' => 'Érvénytelen szállító vagy profitcenter'], 422);
}
/** @var \Illuminate\Support\Collection $calendarEntries */
$calendarEntries = $workCalendarService->getCalendarEntries(
ICarbon::today(),
ICarbon::today()->addDays(90),
);
$holidays = $calendarEntries
->where('type', \App\Enums\WorkDayType::Holiday)
->map(fn ($e) => ['date' => ICarbon::parse($e->date)->toDateString(), 'description' => $e->description])
->values();
$workingDays = $calendarEntries
->where('type', \App\Enums\WorkDayType::WorkingDay)
->map(fn ($e) => ['date' => ICarbon::parse($e->date)->toDateString(), 'description' => $e->description])
->values();
if (! $supplier->hasDeliveryConstraint) {
return response()->json([
'hasDeliveryConstraint' => false,
'availableDates' => [],
'nextDeliveryDate' => null,
'orderCutOffTime' => null,
'deliveryLeadTime' => null,
'holidays' => $holidays,
'workingDays' => $workingDays,
]);
}
$availableDates = $deliveryCalendarService->getAvailableDeliveryDates(
$pc,
$supplier,
ICarbon::today(),
ICarbon::today()->addDays(90),
)->map(fn (Carbon $d) => $d->format('Y-m-d'))->values();
$nextDeliveryDate = $nextDeliveryCalculator->calculate($supplierId, $profitCenterId, ICarbon::parse($orderDateTime));
return response()->json([
'hasDeliveryConstraint' => true,
'availableDates' => $availableDates,
'nextDeliveryDate' => $nextDeliveryDate?->format('Y-m-d'),
'orderCutOffTime' => $supplier->orderCutOffTime,
'deliveryLeadTime' => $supplier->deliveryLeadTime,
'holidays' => $holidays,
'workingDays' => $workingDays,
]);
}
private function createProductSelect(Request $request)
{
if (! $Order = Order::with('supplier', 'profitCenter')->find($request->get('id'))) {
return false;
}
$productRepo = new ProductRepository;
$productsGroupIds = $productRepo->getSupplierProductGroupsIdFromPriceList(
$Order->supplier_id, $Order->deliveryDate);
debug($productsGroupIds);
$productGroupArray = [];
if ($productsGroupIds && count($productsGroupIds) > 0) {
$ProductGroups = new ProductGroup;
$productGroupArray = $ProductGroups->nodesWithParentToTree($productsGroupIds);
}
return view('modules.order.productSelect')->with('productGroup', $productGroupArray);
$ProductGroup = new ProductGroup;
return view('modules.order.productSelect')->with('productGroup', $ProductGroup->allToTreeArray());
}
private function getOrderItemsProductIds(Order $Order)
{
$orderItemsArray = (array) json_decode($Order->productSelected);
return array_keys($orderItemsArray);
}
private function getOrderItemsFromOrderData(?int $orderId = null, ?Order $Order = null)
{
if ($orderId) {
$Order = Order::find($orderId);
}
if (! $Order) {
return null;
}
$items = [];
if ($Order->productSelected) {
$productRepo = new ProductRepository;
$productRepo->setNeedPrice(true);
$productRepo->setDeliveryDate($Order->deliveryDate);
$orderItemsArray = (array) json_decode($Order->productSelected, true);
// $items=$productRepo->getWithRelations(array_keys($orderItemsArray));
$items = $productRepo->getWithRelations($this->getOrderItemsProductIds($Order));
if ($Order->productComment) {
$orderItemsCommentArray = (array) json_decode($Order->productComment);
} else {
$orderItemsCommentArray = [];
}
if ($Order->orderType == 'daily') {
foreach ($items as $key => $product) {
$quantity = $orderItemsArray[$product['id']];
$quantity = str_replace(',', '.', $quantity);
// debug($orderItemsArray[$product['id']],floatval($quantity));
if ($quantity > 0.01 || $quantity < 0.01) {
// $price=$product['last_price'][0]['pivot']['price'];
// $price=$product->price($Order->deliveryDate);
$items[$key]['quantity'] = $quantity;
// $items[$key]['price']=$price;
// $items[$key]['amount']=$quantity*$product['unitMultiplier']* $price;
$items[$key]['amount'] = floatval($quantity) * $product['unitMultiplier'] * $product['price'];
// unset($items[$key]['last_price']);
// debug($product['id']);
// debug($orderItemsCommentArray[$key]);
if (isset($orderItemsCommentArray[$product['id']])) {
$items[$key]['comment'] = $orderItemsCommentArray[$product['id']];
} else {
// $items[$key]['comment'] ='';
}
} else {
unset($items[$key]);
}
}
} elseif ($Order->orderType == 'weekly') {
// print "<pre>";
$weekDayItems = [];
$deliveryDate = Carbon::parse($Order->deliveryDate);
for ($i = 1; $i <= 7; $i++) {
$weekDayItem = [];
$weekDayItem['date'] = formatterDate($deliveryDate);
$weekDayItem['sumPrice'] = 0;
$weekDayItem['items'] = [];
foreach ($items as $key => $product) {
// dd([$orderItemsArray,$product['id'],$orderItemsArray[$product['id']][$i]]);
if (isset($orderItemsArray[$product['id']][$i])) {
// var_export([$key,$product['name']]);
$quantity = $orderItemsArray[$product['id']][$i];
$currentItemData = [
'quantity' => $quantity,
'amount' => floatval($quantity) * $product['unitMultiplier'] * $product['price'],
'name' => $product['name'],
'id' => $product['id'],
];
if (isset($orderItemsCommentArray[$product['id']])) {
$currentItemData['comment'] = $orderItemsCommentArray[$product['id']];
}
$weekDayItem['items'][] = $currentItemData;
$weekDayItem['sumPrice'] += $currentItemData['amount'];
}
}
if (count($weekDayItem['items']) > 0) {
$weekDayItems[$i] = $weekDayItem;
}
$deliveryDate->addDays(1);
}
$products = $items;
$items = [];
foreach ($products as $product) {
$items['products'][$product['id']] = $product;
}
$items['weekDayItems'] = $weekDayItems;
/*
var_export($items['weekDayItems']);
dd($items['weekDayItems']);
dd($items);
*/
}
}
return $items;
}
/*
* @todo: deprecate ki kell vezetni, csak bemutatohoz hasznaltuk
*/
private function getParsedOrderDataFromSession()
{
$orderData = session()->get('orderData');
if (! $orderData) {
$orderData = [
'contactName' => '-',
'note' => '',
'deliveryDate' => '',
'orderIdHuman' => '',
'sumPrice' => 0,
'items' => [],
'productSelected' => [],
'created_by' => Carbon::today(),
];
return $orderData;
}
/*
print "<pre>";
var_dump($orderData);
exit();
*/
$orderData['created_by'] = \Carbon\Carbon::now();
$productRepo = new ProductRepository;
$productRepo->setRelation(
'LastPrice');
// var_dump(array_keys($orderData['productSelected']);
$products = [];
if (isset($orderData['productSelected']) && is_array($orderData['productSelected'])) {
$products = $productRepo->getWithRelations(array_keys($orderData['productSelected']));
$orderData['sumPrice'] = 0;
foreach ($products as $key => $product) {
$quantity = $orderData['productSelected'][$product['id']];
if ($quantity > 0 && ! empty($product['last_price'][0]['pivot']['price'])) {
$price = $product['last_price'][0]['pivot']['price'];
$products[$key]['quantity'] = $quantity;
$products[$key]['price'] = $price;
$products[$key]['amount'] = $quantity * $product['unitMultiplier'] * $price;
$orderData['sumPrice'] += $products[$key]['amount'];
unset($products[$key]['last_price']);
} else {
unset($products[$key]);
}
}
}
/* print "<pre>";
var_dump($products[0]);
print "</pre>";*/
$orderData['items'] = $products;
return $orderData;
}
private function createSupplierOrderNumberOLD(int $orderId): ?array
{
$ret = [];
if ($Order = Order::find($orderId)) {
if ($o = OrderNumber::where('order_id', $orderId)->get()->first()) {
} else {
$o = OrderNumber::create([
'year' => Carbon::createFromDate($Order->deliveryDate)->format('y'),
'supplier_id' => $Order->supplier_id,
'order_id' => $Order->id,
]);
}
$ret = $o->toArray();
} else {
$ret = null;
}
return $ret;
}
private function createSupplierOrderNumber(int $orderId): ?array
{
$ret = [];
if ($Order = Order::find($orderId)) {
// dd($Order->toArray());
if ($o = OrderNumber::where('order_id', $orderId)->get()->first()) {
} else {
$orderYear = Carbon::createFromDate($Order->deliveryDate)->format('y');
$maxSupplierOrderNumber = OrderNumber::where('supplier_id', $Order->supplier_id)
->where('year', $orderYear)
->max('supplier_order_number');
$nextSupplierOrderNumber = $maxSupplierOrderNumber ? ($maxSupplierOrderNumber + 1) : 1;
LOG::info(__FUNCTION__." OrderId: $orderId SupplierId:".$Order->supplier_id." maxSupplierOrderNumber> $maxSupplierOrderNumber nextSupplierOrderNumber>$nextSupplierOrderNumber");
$maxRetry = 5;
while ($maxRetry > 0) {
try {
$o = OrderNumber::create([
'supplier_order_number' => $nextSupplierOrderNumber,
'year' => $orderYear,
'supplier_id' => $Order->supplier_id,
]);
$o->order_id = $orderId;
$o->save();
break;
} catch (\Exception $e) {
LOG::error('Error creating OrderNumber for supplier:'.$Order->supplier_id.' - '.$e->getMessage());
$maxRetry--;
$nextSupplierOrderNumber++;
usleep(rand(400, 600));
}
}
if (! $o) {
LOG::error('Error creating OrderNumber for supplier:'.$Order->supplier_id.' - maxRetry');
throw new \Exception('Error creating OrderNumber for supplier:'.$Order->supplier_id);
return null;
}
}
$ret = $o->toArray();
} else {
$ret = null;
}
return $ret;
}
private function getOrderSumPrice(?int $orderId = null, ?Order $Order = null, ?array $itemsArray = null)
{
if ($orderId) {
$Order = $Order->find($orderId);
}
if ($Order) {
$itemsArray = $this->getOrderItemsFromOrderData(null, $Order);
}
$sumPrice = 0;
if (is_array($itemsArray)) {
foreach ($itemsArray as $item) {
$sumPrice += $item['amount'];
}
}
return $sumPrice;
}
public function getOrderData(?int $orderId = null, ?Order $Order = null): array
{
if (! $orderId) {
$orderId = $Order->id;
}
if (! $Order = Order::with('supplier', 'profitCenter')->find($orderId)) {
return false;
}
$orderData = $Order->toArray();
if ($Order->orderFlag == 'modifier' && $Order->rel_id) {
$orderData['changedItems'] = $this->getChangedItems($Order);
}
if ($Order->orderFlag == 'storno' && $Order->rel_id) {
$originalOrder = OrderArchive::find($Order->rel_id);
if (! $originalOrder) {
$originalOrder = Order::find($Order->rel_id);
}
if ($originalOrder) {
$orderData['originalHumanId'] = $originalOrder->humanId;
}
}
if ($Order->orderType == 'weekly') {
$orderData['items'] = $this->getOrderItemsFromOrderData(null, $Order);
if (is_array($orderData['items']['weekDayItems'])) {
$orderData['sumPrice'] = 0;
foreach ($orderData['items']['weekDayItems'] as $weekDayItem) {
$orderData['sumPrice'] += $weekDayItem['sumPrice'];
}
}
} else {
$orderData['items'] = $this->getOrderItemsFromOrderData(null, $Order);
$orderData['sumPrice'] = $this->getOrderSumPrice(null, null, $orderData['items']);
}
// dd($orderData);
return $orderData;
}
private function getChangedItems(Order $order): array
{
$originalOrder = OrderArchive::with('items')->find($order->rel_id);
if (! $originalOrder) {
return [];
}
$currentItems = (array) json_decode($order->productSelected, true);
$originalItems = [];
$productDataMap = [];
foreach ($originalOrder->items as $item) {
// Find current product_id by supplierProductNumber and supplier_id
$product = Product::where('supplierProductNumber', $item->supplierProductNumber)
->where('supplier_id', $item->supplier_id)
->first();
$pId = $product ? $product->id : null;
if ($pId) {
$originalItems[$pId] = $item->quantity;
$productDataMap[$pId] = [
'name' => $item->name,
'article_number' => $item->supplierProductNumber,
];
} else {
// If product not found in current products table, use a unique key but it might not match currentItems
// However, if it's not in currentItems, it will be treated as removed.
$tempKey = 'old_' . $item->id;
$originalItems[$tempKey] = $item->quantity;
$productDataMap[$tempKey] = [
'name' => $item->name,
'article_number' => $item->supplierProductNumber,
];
}
}
$changedItems = [];
$allProductIds = array_unique(array_merge(array_keys($currentItems), array_keys($originalItems)));
foreach ($allProductIds as $productId) {
$currentQty = $currentItems[$productId] ?? 0;
$originalQty = $originalItems[$productId] ?? 0;
if ($currentQty != $originalQty) {
if (isset($productDataMap[$productId])) {
$name = $productDataMap[$productId]['name'];
$articleNumber = $productDataMap[$productId]['article_number'];
} else {
$product = Product::find($productId);
$name = $product ? $product->name : 'Ismeretlen termék';
$articleNumber = $product ? $product->supplierProductNumber : '-';
}
// Handle weekly order structure (array of days)
if (is_array($currentQty) || is_array($originalQty)) {
for ($day = 1; $day <= 7; $day++) {
$cQty = is_array($currentQty) ? ($currentQty[$day] ?? 0) : 0;
$oQty = is_array($originalQty) ? ($originalQty[$day] ?? 0) : 0;
if ($cQty != $oQty) {
$changedItems[] = [
'name' => $name,
'article_number' => $articleNumber,
'old_qty' => $oQty,
'new_qty' => $cQty,
'day' => $day,
];
}
}
} else {
$changedItems[] = [
'name' => $name,
'article_number' => $articleNumber,
'old_qty' => $originalQty,
'new_qty' => $currentQty,
];
}
}
}
return $changedItems;
}
private function getOrderStatus(int $orderId)
{
if ($Order = Order::find($orderId)) {
return $Order->orderStatus;
}
return false;
}
private function updateStatus(int $orderId, string $status): bool
{
if ($Order = Order::find($orderId)) {
$Order->orderStatus = $status;
$Order->save();
return true;
}
return false;
}
private function updateStatusFromRequest(): bool
{
if (\request()->input('id')) {
if ($Order = Order::find(\request())) {
if (\request()->input('type') &&
in_array(\request()->input('type'), OrderStatusEnum::getValues())
) {
return $this->updateStatus(\request()->input('id'),
\request()->input('type'));
}
}
}
return false;
}
private function createInvoice(Request $request)
{
// $orderData=$this->getParsedOrderDataFromSession();
// $orderData['humanId']=$this->getOrderHumanId($orderData['id']);
// debug($request->all());
$orderData = [];
if ($request->input('id')) {
$orderData = $this->getOrderData($request->input('id'));
}
return view('modules.order.invoice', $orderData);
}
private function createSend(Request $request)
{
$orderData = [];
if ($request->input('id')) {
$orderData = $this->getOrderData($request->input('id'));
}
return view('modules.order.send', $orderData);
}
/**
* Show the form for creating a new resource.
*/
public function create(Request $request): View|Response|JsonResponse
{
$functionName = 'create'.ucfirst($request->input('type'));
if (method_exists($this, $functionName)) {
if ($request->input('id')) {
$orderStatus = $this->getOrderStatus($request->input('id'));
if ($orderStatus && $orderStatus !== 'archived') {
$this->updateStatusFromRequest();
} else {
return \response()->json([], 400);
}
}
$result = call_user_func([$this, $functionName], $request);
if ($result === false) {
return \response()->json([], 400);
}
return $result;
}
return \response()->json([], 400);
}
private function getOrderHumanId(?int $orderId = null,
?int $orderNum = null,
?string $supplierShortName = null,
?string $deliveryDate = null,
?string $profitCenterName = null,
?string $orderType = null,
?string $orderPostfix = null
): string {
$year = '';
$orderTypeSign = [
'weekly' => 'H',
'weeklyDay' => 'H',
];
if ($orderId) {
$supplierShortName = '';
$profitCenterName = '';
$deliveryDate = '';
if ($Order = Order::find($orderId)) {
if ($Order->orderNumber) {
$orderNum = $Order->orderNumber->supplier_order_number;
$year = $Order->orderNumber->year;
} else {
$deliveryDate = $Order->deliveryDate;
}
$supplierShortName = $Order->supplier->nameId;
if ($Order->profitCenter) {
$profitCenterName = $Order->profitCenter->hooreycaId;
}
$orderType = $Order->orderType;
if ($Order->orderType == 'weekly') {
$orderPostfix = $orderTypeSign[$Order->orderType];
} elseif (! is_null($Order->parent_id)) {
/*
* ez csak akkor lehet igaz ha közvetlen heti rendeléshez kapcsolodik
* ha heti rendelés napjanak modositoja akkor mashogy kell kezelni!!!
*/
$orderPostfix = $orderTypeSign['weeklyDay'];
}
}
}
if ($deliveryDate) {
$year = substr($deliveryDate, 2, 2);
}
$humanId = "$supplierShortName/$profitCenterName/$year/"; // 'JANER/HANKOK/21/'
if ($orderNum) {
$humanId .= \Str::padLeft($orderNum, 4, '0'); // 'JANER/HANKOK/21/'.sprintf('%04d',$orderNum);
}
if ($orderType) {
if (isset($orderTypeSign[$orderType])) {
$orderPostfix = $orderTypeSign[$orderType];
}
}
if (strlen($orderPostfix) > 0) {
$humanId .= $orderPostfix;
}
return $humanId;
}
private function createOrder($supplierId, $parent_id = null, $orderType = null): Order
{
$Supplier = Supplier::find($supplierId);
$Order = new Order;
// debug(auth()->user()->profitCenters()->first()->id);
$Order->profit_center_id = auth()->user()->profitCenters()->first()->id;
$Order->supplier()->associate($Supplier);
$Order->orderStatus = OrderStatusEnum::supplierSelect;
if ($parent_id) {
$Order->parent_id = $parent_id;
}
if ($orderType) {
$Order->orderType = $orderType;
}
$Order->save();
return $Order;
}
private function storeSupplierSelect($request)
{
if (! $request->get('supplierId')) {
return \response()->json('need Supplier', 400);
}
/*
$Supplier=Supplier::find($request->get('supplierId'));
$Order=new Order();
//debug(auth()->user()->profitCenters()->first()->id);
$Order->profit_center_id=auth()->user()->profitCenters()->first()->id;
$Order->supplier()->associate($Supplier);
$Order->orderStatus=OrderStatusEnum::supplierSelect;
$Order->save();
*/
$Order = $this->createOrder($request->get('supplierId'));
$orderData = $Order->toArray();
return \response()->json(['success' => true, 'data' => $orderData]);
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request): Response|JsonResponse
{
debug($request->get('storeType'));
if (strlen($request->input('storeType')) < 1) {
return \response()->json([], 400);
}
$functionName = 'store'.ucfirst($request->input('storeType'));
if (method_exists($this, $functionName)) {
return call_user_func([$this, $functionName], $request);
}
return \response()->json([], 400);
}
/**
* Display the specified resource.
*/
public function show(int $OrderId): Response|JsonResponse
{
return response()->noContent();
}
/**
* Show the form for editing the specified resource.
*/
public function edit(int $OrderId): View
{
$orderData = [];
if ($Order = Order::find($OrderId)) {
$orderData = $Order->toArray();
}
$orderData['supplierId'] = $orderData['supplier_id'];
if (! $orderData['productSelected']) {
$orderData['productSelected'] = [];
} else {
// debug($orderData['productSelected']);
$orderData['productSelected'] = json_decode($orderData['productSelected']);
}
if (! $orderData['productComment']) {
$orderData['productComment'] = [];
} else {
// debug($orderData['productSelected']);
$orderData['productComment'] = json_decode($orderData['productComment']);
}
unset($orderData['supplier_id']);
$orderData['supplierName'] = $Order->supplier->name;
return view('modules.order.indexStepper')->with([
'testMode' => $this->testMode,
'orderData' => $orderData,
]);
}
private function updateParameter(Request $request, int $orderId): JsonResponse
{
$ret = new ArrayObject;
$ret['success'] = false;
$acceptedIndex = [
'contactName',
'note',
'orderType',
'deliveryDate',
'deliveryAddressId',
'customNotificationEmail',
];
$orderData = $request->all($acceptedIndex);
$Order = Order::find($orderId);
// $orderData->de
if (! $orderData['deliveryAddressId']) {
$orderData['deliveryAddressId'] = null;
$deliveryAddress = $this->getProfitCenterAddress();
if (! $Order->deliveryAddress || $Order->dedeliveryAddress != $deliveryAddress) {
$orderData['deliveryAddress'] = $deliveryAddress;
}
} else {
if ($Order['deliveryAddressId'] !== $orderData['deliveryAddressId']) {
$addressData = Address::find($orderData['deliveryAddressId']);
$orderData['deliveryAddress'] = $addressData->fullAddress;
$orderData['deliveryAddressName'] = $addressData->name;
}
}
if (! $orderData['customNotificationEmail']) {
$orderData['customNotificationEmail'] = null;
} else {
if ($orderData['customNotificationEmail'] == '') {
$orderData['customNotificationEmail'] = null;
}
}
$diffDay = Carbon::parse($orderData['deliveryDate'])->diffInDays(Carbon::now(), false);
if ($diffDay > 0) {
return \response()->json([
'success' => false,
'errors' => ['Nem megfelelő dátum'],
], 500);
}
// var_export($Order->toArray());
$Order->fill($orderData);
// var_export($Order->toArray());die();
$Order->orderStatus = OrderStatusEnum::parameter;
$Order->save();
$ret['orderData'] = $Order->toArray();
$ret['success'] = true;
return \response()->json($ret);
}
private function updateProductSelect(Request $request, int $orderId): JsonResponse
{
$acceptedIndex = [
'productSelected',
'productComment',
'supplierId',
'contactName',
'note',
'orderType',
'deliveryDate',
'deliveryAddress',
];
$orderData = $request->all($acceptedIndex);
debug($orderData);
// session()->forget('orderData');
session()->put('orderData', $orderData);
session()->save();
$Order = Order::find($orderId);
if (isset($orderData['productSelected']) && is_array($orderData['productSelected'])) {
$Order->productSelected = json_encode($orderData['productSelected']);
} else {
$Order->productSelected = null;
}
if (isset($orderData['productComment']) && is_array($orderData['productComment'])) {
$Order->productComment = json_encode($orderData['productComment']);
} else {
$Order->productComment = null;
}
$Order->orderStatus = OrderStatusEnum::productSelect;
$Order->save();
// sleep(2);
return \response()->json(['success' => true, 'data' => $orderData]);
}
private function storeAttachedFile(): void {}
private function OrderStorno(Order $OrderOriginal): Order
{
if (true) {
$OrderStorno = $OrderOriginal->replicate([
'archive_id',
'productSelected',
'humanId',
'supplierOrderNumber',
'feedBackId',
'confirmed',
'created_by',
'updated_by',
'deleted_by',
'deleted_at',
])->fill([
'sentTime' => Carbon::now(),
'orderFlag' => OrderFlag::storno,
'rel_id' => $OrderOriginal->id,
'sumPrice' => (0 - $OrderOriginal->sumPrice),
'orderStatus' => OrderStatusEnum::sent,
]);
$productSelected = [];
foreach (json_decode($OrderOriginal->productSelected) as $index => $item) {
$productSelected[$index] = 0 - $item;
}
$OrderStorno->productSelected = json_encode($productSelected);
$OrderStorno->save();
$OrderStorno = $this->createOrderIds($OrderStorno);
} else {
$OrderStorno = Order::find(16515);
$OrderStorno->sentTime = Carbon::now();
$OrderStorno = $this->createOrderIds($OrderStorno);
$OrderStorno->save();
}
return $OrderStorno;
/*
* ha kell itt lehet ay OrderOriginalra raragasztani a rel_id hogy meglegyen hol lett stornozva
*/
// dd($OrderOriginal->toArray(),$OrderStorno->toArray());
}
private function modifierOrder($Order): OrderArchive
{
// create new storno order
// archive storno order
$originalArchiveOrder = OrderArchive::find($Order->rel_id);
$originalOrder = Order::where('humanId', $originalArchiveOrder->humanId)->first();
/*
* create storno Order
*/
$OrderStorno = $this->OrderStorno($originalOrder);
$orderStornoArchive = $this->archiveOrder($OrderStorno);
$orderStornoArchive->rel_id = $originalArchiveOrder->id;
$orderStornoArchive->save();
return $orderStornoArchive;
dd($Order->toArray());
}
private function archiveOrder(?Order $Order = null, ?int $orderId = null, ?int $parentId = null): OrderArchive|false
{
debug('archivalas indul');
/* print "\n*****************************\n";
var_dump('archivalas indul');*/
if (! $Order) {
debug('Nincs order');
// var_dump('Nincs order');
if (! $Order = Order::find($orderId)) {
return false;
}
}
// var_dump($Order->toArray());
if ($Order->orderStatus !== OrderStatusEnum::sent) {
// var_dump('nem jo status');
debug('nem jo status');
return false;
}
if ($Order->orderFlag == 'modifier') {
$this->modifierOrder($Order);
}
debug('archivalunk');
// var_dump('**uj archiv nyitasa kezdet');
$debugArray = [];
// array_unshift($debugArray,$Order->toArray());
$orderData = $this->getOrderData($Order->id);
array_unshift($debugArray, $orderData);
// dd('tova'.__LINE__,$Order->toArray(),$orderData);
/**
* uj archiv nyitasa
*/
$OrderArchive = new OrderArchive;
$exclude = ['id'];
// Kizárjuk az Eloquent által betöltött relációkat is, hogy azok ne kerüljenek be az archív táblába.
// A getRelations() camelCase kulcsokat ad vissza (pl. 'profitCenter'), de a toArray() snake_case-re
// konvertálja őket (pl. 'profit_center'), ezért mindkét formátumot kizárjuk.
$relationKeys = array_keys($Order->getRelations());
$relationSnakeKeys = array_map(fn ($k) => \Illuminate\Support\Str::snake($k), $relationKeys);
$exclude = array_merge($exclude, $relationKeys, $relationSnakeKeys);
$prefixed = ['created_by', 'updated_by', 'deleted_by', 'created_by', 'updated_by', 'deleted_by'];
foreach ($Order->toArray() as $k => $v) {
if (! in_array($k, $exclude)) {
if (in_array($k, $prefixed)) {
$k = 'original_'.$k;
}
$OrderArchive->$k = $v;
}
}
$OrderArchive->profit_center_name = $orderData['profit_center']['name'];
$OrderArchive->supplier_name = $orderData['supplier']['name'];
$OrderArchive->supplier_emailAttachmentType = $orderData['supplier']['emailAttachmentType'];
if ($parentId) {
$OrderArchive->parent_id = $parentId;
}
$OrderArchive->save();
if ($Order->orderFlag == 'modifier') {
$originalArchiveOrder = OrderArchive::find($Order->rel_id);
$originalArchiveOrderId = $originalArchiveOrder->id;
$originalArchiveOrder->orderFlag = OrderFlag::modified;
$originalArchiveOrder->rel_id = $OrderArchive->id;
$originalArchiveOrder->save();
}
array_unshift($debugArray, $OrderArchive->toArray());
// dd($orderData);
// var_dump('**csatolmany mentes kezdet');
/**
* csatolmany elmentese
*/
$fileType = $orderData['supplier']['emailAttachmentType'];
if ($fileType !== 'nincs') {
$fileName = preg_replace('/[^a-zA-Z0-9\-\._]/', '_', $orderData['humanId']);
if ($fileType == 'pdf') {
$pdf = PDF::loadView('modules.order.invoiceEmail', $orderData);
$fileNameWithExt = $fileName.'.pdf';
$attach = $pdf->output();
} elseif ($fileType == 'excel') {
$attach = Excel::raw(new ExportOrderInvoiceExcel($orderData), \Maatwebsite\Excel\Excel::XLSX);
$fileNameWithExt = $fileName.'.xlsx';
}
// file eltarolasa
$attachmentFile = new Attachment;
$attachmentFile->addStreamedFile($attach, $fileNameWithExt);
// fajl csatolasa
$attachmentFile->attachable()->associate($OrderArchive);
$attachmentFile->save();
array_unshift($debugArray, $attachmentFile->toArray());
}
// var_dump('**tetelek mentes kezdet');
if ($Order->orderType !== 'weekly') {
/**
* tetelek elmentese
*/
array_unshift($debugArray, $orderData['items']);
$exclude = ['id', 'created_at', 'updated_at', 'deleted_at', 'created_by', 'updated_by', 'deleted_by',
];
$exclude = array_merge($exclude, Product::getRelationshipsNames(true, 'snake_case'));
foreach ($orderData['items'] as $orderItem) {
$OrderArchiveItem = new OrderArchivesItem;
foreach ($orderItem as $k => $v) {
if (! in_array($k, $exclude)) {
if (! is_array($v)) {
$OrderArchiveItem->$k = $v;
}
}
}
$OrderArchiveItem->order_archive_id = $OrderArchive->id;
$OrderArchiveItem->supplier_name = $orderItem['supplier']['name'];
if (isset($orderItem['producer'])) {
$OrderArchiveItem->producer_name = $orderItem['producer']['name'];
}
if (isset($orderItem['product_group'])) {
$OrderArchiveItem->product_group_name = $orderItem['product_group']['name'];
}
$OrderArchiveItem->price = $orderItem['price'];
$OrderArchiveItem->quantity = $orderItem['quantity'];
$OrderArchiveItem->amount = $orderItem['amount'];
$OrderArchiveItem->save();
}
// array_unshift($debugArray,$OrderArchiveItem->toArray());
}
// dd($debugArray);
return $OrderArchive;
}
private function createOrderIds($Order = null, $orderId = null, $parentId = null): Order|false
{
if (! $Order) {
$Order = Order::find($orderId);
}
if (! is_null($Order->supplierOrderNumber)) {
return $Order;
}
$supplierOrderID = $this->createSupplierOrderNumber($Order->id);
// debug($supplierOrderID);
$Order->supplierOrderNumber = $supplierOrderID['supplier_order_number'];
$Order->humanId = $this->getOrderHumanId($Order->id);
$Order->feedBackId = (string) \Str::orderedUuid();
if ($parentId) {
$Order->parentId = $parentId;
}
$Order->save();
return $Order;
}
private function createWeekDayOrders(Order $Order, $status = 'send')
{
// $orderData=$this->getOrderData($Order->id);
$orderData = [];
$needCopyFromOriginalOrderPointers = [
'contactName',
'note',
'deliveryAddressId',
'deliveryAddressName',
'deliveryAddress',
'customNotificationEmail',
'productComment',
];
$productDaysArray = $this->convertWeekProductSelectArrayToDays($Order, 'weekDayDate');
foreach ($productDaysArray as $dayDate => $dayData) {
// check if exist
$dayOrder = Order::where('parent_id', $Order->id)->where('deliveryDate', $dayDate)->get();
if (count($dayOrder) > 0) {
continue;
}
// create day Order
$dayOrder = $this->createOrder($Order->supplier_id, $Order->id);
foreach ($needCopyFromOriginalOrderPointers as $pointer) {
$dayOrder->setAttribute($pointer, $Order->getAttribute($pointer));
}
$dayOrder->deliveryDate = $dayDate;
$dayOrder->productSelected = json_encode($dayData);
$dayOrder->save();
$orderData = $this->getOrderData(null, $dayOrder);
$dayOrder->sumPrice = $orderData['sumPrice'];
$dayOrder = $this->createOrderIds($dayOrder);
$dayOrder->orderStatus = $status;
$dayOrder->save();
}
}
private function makeEmailAttachment($orderData, $fileType): array
{
$ret = [];
$fileName = preg_replace('/[^a-zA-Z0-9\-\._]/', '_', $orderData['humanId']);
if ($fileType == 'pdf') {
$pdf = PDF::loadView('modules.order.invoiceEmail', $orderData);
$ret = [
'fileNameWithExt' => $fileName.'.pdf',
'attach' => $pdf->output(),
];
} elseif ($fileType == 'excel') {
/* $fileExcel=Excel::download(new ExportOrderInvoiceExcel($orderData), $fileNameWithExt);
$attach=$fileExcel->getFile();
*/
/*
$fileNameWithExt=$fileName.'.xlsx';
$attach=Excel::raw(new ExportOrderInvoiceExcel($orderData), \Maatwebsite\Excel\Excel::XLSX);
*/
$ret = [
'fileNameWithExt' => $fileName.'.xlsx',
'attach' => Excel::raw(new ExportOrderInvoiceExcel($orderData), \Maatwebsite\Excel\Excel::XLSX),
];
}
return $ret;
}
public function getEmailAttachment($orderData, $fileType): array
{
$ret = [];
$ret[] = $this->makeEmailAttachment($orderData, $fileType);
if ($orderData['orderType'] == 'weekly') {
foreach (Order::find($orderData['id'])->children->toArray() as $dayOrder) {
$dayOrderData = $this->getOrderData($dayOrder['id']);
if (is_null($dayOrderData['sentTime'])) {
$dayOrderData['sentTime'] = Carbon::now()->toDateTimeString();
}
$ret[] = $this->makeEmailAttachment($dayOrderData, $fileType);
}
}
return $ret;
}
private function updateSend(Request $request, int $orderId): JsonResponse
{
if (! $Order = Order::with('supplier', 'profitCenter')->find($orderId)) {
return \response()->json(['success' => false], 500);
}
$supplier = $Order->supplier;
$pc = $Order->profitCenter;
$deliveryDate = ICarbon::parse($Order->deliveryDate)->startOfDay();
// Szállítói korlátozás esetén a tényleges küldés pillanatában is ellenőrizzük,
// hogy a kiválasztott szállítási dátum még mindig megfelel-e az üzleti szabályoknak.
// (Piszkozat újranyitása vagy időközbeni override miatt időközben érvénytelenné válhatott.)
// Kettős ellenőrzés: isDeliveryDay (sablon/override) + calculate (cut-off, lead time).
if ($supplier && $pc && $supplier->hasDeliveryConstraint) {
$nextAvailable = $this->nextDeliveryDateCalculator
->calculate($supplier->id, $pc->id, ICarbon::now());
$isInvalid = ! $this->deliveryCalendarService->isDeliveryDay($pc, $supplier, $deliveryDate)
|| ($nextAvailable && $deliveryDate->lt($nextAvailable->copy()->startOfDay()));
if ($isInvalid) {
return \response()->json([
'success' => false,
'errorCode' => 'INVALID_DELIVERY_DATE',
'errors' => ['A kiválasztott szállítási dátum már nem megfelelő ['.$Order->deliveryDate.']'],
'suggestedDeliveryDate' => $nextAvailable?->format('Y-m-d'),
], 422);
}
}
/*
sleep(3);
return \response()->json([
'success' => true,
'retHTML'=>'$HTMLInvoice'
]);
return \response()->json([
'success' => false,
'errors' => ['Nem megfelelő dátum [' . $Order->deliveryDate . ']']
], 500);
*/
$Order = $this->createOrderIds($Order);
$orderData = $this->getOrderData($Order->id);
$Order->sumPrice = $orderData['sumPrice']; // nem a legszebb, de ott mar kiszamolasra kerult.
/*
* heti esetén legyártani a napikat!!!
*/
if ($Order->orderType == 'weekly') {
$this->createWeekDayOrders($Order);
}
/*
* update order
*/
$Order->orderStatus = OrderStatusEnum::send;
$Order->save();
$orderData['feedBackIdLinkParam'] = base64_encode($orderData['feedBackId']);
$orderData['sentTime'] = Carbon::now()->toDateTimeString();
$orderData['noPrintButton'] = true;
$HTMLInvoice = view('modules.order.invoice')->with($orderData
)->render();
if ($Order->orderFlag == OrderFlag::modifier) {
// parent_id ha van akkor heti napjanak modositasa
// dd($orderData,formatterDate(Carbon::parse($orderData['deliveryDate'])->startOfWeek()),formatterDate(Carbon::parse($orderData['deliveryDate'])->endOfWeek()));
// dd($orderData,$Order->toArray());
}
$attach = null;
$fileNameWithExt = 'blank.txt';
$fileType = 'pdf';
$fileType = 'excel';
$fileType = $orderData['supplier']['emailAttachmentType'];
// return \response()->json(['success'=>true],201);
if (true) {
$attachments = $this->getEmailAttachment($orderData, $fileType);
\Mail::send('email.order', [
'orderHTMLInvoice' => $HTMLInvoice,
'orderData' => $orderData,
], function ($m) use ($orderData, $fileType, $attachments) {
$subject = 'Delirest - '.$orderData['profit_center']['name'].' - '.$orderData['humanId'];
if ($orderData['orderFlag'] == OrderFlag::modifier) {
$subject .= ' MÓDOSÍTÁS';
}
$m->subject($subject);
if ($orderData['customNotificationEmail'] && $orderData['customNotificationEmail'] != 'NULL') {
$m->to($orderData['customNotificationEmail']);
}
if (config('app.stage', 'DEV') == 'PROD') {
$m->to($orderData['supplier']['orderEmail']);
if ($orderData['supplier']['orderEmail2']) {
$m->to($orderData['supplier']['orderEmail2']);
}
} else {
$m->to(config('mail.MailToOrderAddress'));
}
if (config('mail.MailToOrderAddress') != 'city99@e98.hu') {
$m->bcc('city@e98.hu');
}
// $m->attach($attach,['as'=>$fileNameWithExt]);
if ($fileType !== 'none') {
if (is_array($attachments) && count($attachments) > 0) {
foreach ($attachments as $attachData) {
$m->attachData($attachData['attach'], $attachData['fileNameWithExt']);
}
}
}
/* debug mail logging
$this->logger->info(__FUNCTION__.':'.__LINE__." ---------------------");
try {
$symfonyMessage = $m->getSymfonyMessage();
$debugInfo = [
'to' => collect($symfonyMessage->getTo())->map(fn($addr) => $addr->toString())->toArray(),
'cc' => collect($symfonyMessage->getCc())->map(fn($addr) => $addr->toString())->toArray(),
'bcc' => collect($symfonyMessage->getBcc())->map(fn($addr) => $addr->toString())->toArray(),
];
$this->logger->info("FINAL MAIL RECIPIENTS for Order: " . $orderData['humanId'], $debugInfo);
} catch (\Exception $e) {
$this->logger->error("Debug hiba a címzettek lekérdezésekor: " . $e->getMessage());
}
*/
});
}
$Order->sentTime = $orderData['sentTime'];
$Order->orderStatus = OrderStatusEnum::sent;
$Order->save();
/*
* @todo:eredei archivra modified flaget tenni, rel_id-t beallitani
* @todo:uj archivra rel_id-t beallitani
*/
if ($OrderArchived = $this->archiveOrder($Order)) {
$Order->orderStatus = OrderStatusEnum::archived;
$Order->save();
$SupplierNotifier = new SupplierNotifier;
$SupplierNotifier->makeNotificationsForOrderArchive($OrderArchived->id);
}
if ($Order->orderType == 'weekly') {
foreach (Order::find($orderData['id'])->children as $dayOrder) {
$dayOrder->orderStatus = OrderStatusEnum::sent;
$dayOrder->sentTime = $orderData['sentTime'];
$dayOrder->save();
if ($this->archiveOrder($dayOrder, null, $OrderArchived->id)) {
$dayOrder->orderStatus = OrderStatusEnum::archived;
$dayOrder->save();
} else {
// dd('Archive Error!!!!');
}
}
}
return \response()->json(['success' => true, 'retHTML' => $HTMLInvoice]);
var_dump('updateSend End '.__LINE__);
dd($orderData);
return \response()->json(['success' => true], 201);
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, int $orderId): JsonResponse
{
debug($request->get('updateType'));
if (strlen($request->input('updateType')) < 1) {
return \response()->json([], 400);
}
$functionName = 'update'.ucfirst($request->input('updateType'));
if (method_exists($this, $functionName)) {
return call_user_func_array([$this, $functionName], [$request, $orderId]);
}
return \response()->json([], 400);
}
/**
* Remove the specified resource from storage.
*/
public function destroy(int $OrderId): Response|JsonResponse
{
if ($Order = Order::find($OrderId)) {
if ($Order->delete()) {
return \response()->json(['success' => true]);
}
}
return \response()->json([
'success' => false,
'errors' => ['deleted error'],
], 500);
}
public function getDataTableContent(): JsonResponse
{
$groupId = null;
$searchStr = null;
$profitCenterId = auth()->user()->profitCenters()->first()->id;
if (\request()->get('supplierId')) {
$supplierId = \request()->get('supplierId');
} else {
return \response()->json(['data' => []]);
}
if (\request()->get('deliveryDate')) {
$deliveryDate = \request()->get('deliveryDate');
} else {
$deliveryDate = Carbon::now()->format('Y-m-d');
}
$special = [];
$special['withFavorites'] = true;
if (\request()->get('searchStr')) {
$searchStr = \request()->get('searchStr');
if (substr($searchStr, 0, 2) == '**') {
$special['type'] = str_replace('*', '', $searchStr);
$special['profitCenterId'] = $profitCenterId;
if (\request()->get('orderId')) {
$special['orderId'] = (int) \request()->get('orderId');
}
$searchStr = null;
}
} else {
if (\request()->get('groupId')) {
$groupId = \request()->get('groupId');
}
}
if (\request()->get('krel')) {
if (request()->get('krel') === 'true') {
$special['krel'] = 1;
}
}
debug(\request()->all());
$productRepo = new ProductRepository;
$productRepo->setRelation(
'ProductGroup', 'Supplier', 'Producer', 'PriceList', 'LastPrice', 'picture', 'specification');
// $products=$productRepo->getByGroupId($groupId,true);
$products = $productRepo->getSupplierProductFromPriceList($supplierId, $profitCenterId, $deliveryDate, $groupId, $searchStr, $special);
// debug($products[1]);
$ret = ['data' => []];
// dd($products);
foreach ($products as $product) {
// dd(count($product['price_list']));
// if(count($product['price_list'])>0){
if ($product['price_list_price']) {
$data = [];
$data['id'] = $product['id'];
$data['name'] = $product['name'];
$data['packing'] = $product['packing'];
$data['unitValue'] = $product['unitValue'];
$data['productUnit'] = $product['productUnit'];
$data['sellerUnit'] = $product['sellerUnit'];
$data['unitMultiplier'] = $product['unitMultiplier'];
$data['amountUnit'] = $product['amountUnit'];
$data['note'] = ($product['note'] ? $product['note'] : '');
// $product['product_group']['name'];
// $data['price']=$product['last_price'][0]['pivot']['price'];
$data['price'] = $product['price_list_price']['price'];
$data['hooreycaId'] = $product['hooreycaId'];
$data['office'] = '';
$data['extn'] = '';
$data['favorites'] = $product['favorites'];
if ($product['krel'] == 1) {
$product['krel'] = '*';
} else {
$product['krel'] = '';
}
$data['krel'] = $product['krel'];
$data['stock_status'] = $product['stock_status'];
$data['picture'] = false;
if ($product['picture']) {
// $data['aa_picture']=$product['picture'];
$data['picture'] = $product['picture']['PublicUrl'].DIRECTORY_SEPARATOR.$product['picture']['filename'];
}
$data['specification'] = false;
if ($product['specification']) {
// $data['aa_specification']=$product['specification'];
$data['specification'] = $product['specification']['PublicUrl'].DIRECTORY_SEPARATOR.$product['specification']['filename'];
}
$ret['data'][] = $data;
} else {
}
}
return \response()->json($ret);
return \response()->file('exapmle2.json');
}
public function checkReadyToSend(Request $request, int $orderId): JsonResponse
{
$readyToSend = true;
$why = [];
$suggestedDeliveryDate = null;
// A DB-ből töltjük be az aktuális rendelési adatokat a session nem megbízható,
// mert piszkozatnál eltérhet a mentett állapottól.
$Order = Order::with('supplier', 'profitCenter')->find($orderId);
if (! $Order) {
return \response()->json(['success' => false, 'readyToSend' => false, 'why' => ['notFound'], 'suggestedDeliveryDate' => null]);
}
// supplierId ellenőrzés a DB-ből
if (! $Order->supplier_id || $Order->supplier_id < 1) {
$why[] = 'supplierId';
$readyToSend = false;
}
// productSelected (items) ellenőrzés a DB-ből
$productSelected = is_array($Order->productSelected)
? $Order->productSelected
: json_decode($Order->productSelected, true);
$hasItems = is_array($productSelected) && count(array_filter($productSelected, fn ($q) => (int) $q > 0)) > 0;
if (! $hasItems) {
$why[] = 'items';
$readyToSend = false;
}
// UX-réteg: a send nézet betöltésekor jelezzük, ha a kiválasztott szállítási dátum
// időközben (pl. piszkozatból visszatöltve) érvénytelenné vált a szállítói korlátozások miatt.
// Az ellenőrzés két feltételt vizsgál:
// 1. isDeliveryDay: az adott nap egyáltalán szállítási nap-e (sablon, override, ünnepnap)
// 2. A dátum nem korábbi-e a legközelebbi rendelhető napnál (cut-off és lead time figyelembevételével)
if (! empty($Order->deliveryDate)) {
$supplier = $Order->supplier;
$pc = $Order->profitCenter;
$deliveryDate = ICarbon::parse($Order->deliveryDate)->startOfDay();
if ($supplier && $pc && $supplier->hasDeliveryConstraint) {
$nextAvailable = $this->nextDeliveryDateCalculator
->calculate($supplier->id, $pc->id, ICarbon::now());
$isDeliveryDay = $this->deliveryCalendarService->isDeliveryDay($pc, $supplier, $deliveryDate->copy());
$isEarlierThanNext = $nextAvailable && $deliveryDate->copy()->startOfDay()->lt($nextAvailable->copy()->startOfDay());
$isInvalid = ! $isDeliveryDay || $isEarlierThanNext;
\Illuminate\Support\Facades\Log::info('checkReadyToSend deliveryDate check', [
'orderId' => $orderId,
'deliveryDate' => $deliveryDate->toDateString(),
'nextAvailable' => $nextAvailable?->toDateString(),
'isDeliveryDay' => $isDeliveryDay,
'isEarlierThanNext' => $isEarlierThanNext,
'isInvalid' => $isInvalid,
]);
if ($isInvalid) {
$why[] = 'deliveryDate';
$readyToSend = false;
$suggestedDeliveryDate = $nextAvailable?->format('Y-m-d');
}
}
}
// Az orderData-t a sessionből adjuk vissza a frontend kompatibilitás érdekében,
// de a validációk már a DB adatain alapulnak.
$orderData = $this->getParsedOrderDataFromSession();
return \response()->json([
'success' => true,
'readyToSend' => $readyToSend,
'orderData' => $orderData,
'why' => $why,
'suggestedDeliveryDate' => $suggestedDeliveryDate,
]);
}
}