2040 lines
76 KiB
PHP
2040 lines
76 KiB
PHP
<?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,
|
||
]);
|
||
}
|
||
}
|