diff --git a/app/Filament/Pages/DataSendToSap.php b/app/Filament/Pages/DataSendToSap.php new file mode 100644 index 000000000..06f420a26 --- /dev/null +++ b/app/Filament/Pages/DataSendToSap.php @@ -0,0 +1,350 @@ + 'setScannedQuantity']; + + + + public function setScannedQuantity($quantity) + { + // Set the scanned_quantity value in the Filament page/form + $this->scanned_quantity = $quantity; + $this->form->fill([ + 'scanned_quantity' => $quantity, + 'production_order' => $this->pOrder, + 'plant_id' => $this->pId, + ]); + } + + public function form(Form $form): Form + { + return $form + ->statePath('data') + ->schema([ + Select::make('plant_id') + ->options(Plant::pluck('name', 'id')) + ->label('Plant') + ->reactive() + ->required() + ->afterStateUpdated(function ($state, $set, callable $get) { + $plantId = $get('plant_id'); + if (!$plantId) { + $set('pqPlantError', 'Please select a plant first.'); + $set('production_order', null); + $set('scanned_quantity', null); + return; + } + else { + $this->pId = $plantId; + $set('production_order', null); + $set('scanned_quantity', null); + $set('validationError', null); + $set('pqPlantError', null); + } + }) + ->hint(fn ($get) => $get('pqPlantError') ? $get('pqPlantError') : null) + ->hintColor('danger'), + + TextInput::make('production_order') + ->required() + ->reactive() + ->afterStateUpdated(function ($state, $set, callable $get) { + $productionOrder = $get('production_order'); + + if (!$productionOrder) { + $set('pqproducError', 'Please provide production order.'); + $set('scanned_quantity', null); + $this->dispatch('refreshed', $this->pId, $this->pOrder); + + return; + } + else { + $this->pOrder = null; + $this->dispatch('refreshed', $this->pId, $this->pOrder); + $set('scanned_quantity', null); + $set('validationError', null); + $set('pqproducError', null); + } + }) + ->hint(fn ($get) => $get('pqproducError') ? $get('pqproducError') : null) + ->hintColor('danger') + ->extraAttributes([ + 'wire:keydown.enter' => 'processValues($event.target.value)', + ]), + + TextInput::make('scanned_quantity') + ->reactive() // Make it reactive to update when changed + ->afterStateUpdated(function ($state, $set, $get) { + $this->scanned_quantity = $state; + }) + ->readOnly() + ->required(), + + // Add your custom action button here + Actions::make([ + Action::make('send_to_sap') + ->label('Send Data to SAP') + ->action(function ($set, $get) { + $year = date('y'); // '25' for 2025 + $month = date('m'); // '05' for May + $plantId = $get('plant_id'); + $code = Plant::where('id', $plantId)->value('code'); + $finalBatch = $year . $month . $code; + $transHeadLogId = $this->transHeadLog; //'3256'; + $lineItemCnt = '1'; //1 hard code + $sapOrder = $get('production_order'); + $itemCode = $this->pItem; + $quantity = (string)$get('scanned_quantity'); + $UOM = $this->pUom; + $batchNumber = $finalBatch; + $locationName = ''; + $lamiCdate = $get('lami_cdate'); + $serialNumbers = $this->sNums; + + // dd($batchNumber); + + $currentDateTime = date('j/n/Y h:i:s A'); + + $header = [ + 'Trans_Head_Log_Id' => $transHeadLogId, //'3256', + 'Line_Item_Count' => $lineItemCnt, //'1', + 'SAP_Order_Number' => $sapOrder, //'12345678' + 'Item_Code' => $itemCode, //'6458795' + ]; + // $serialNumbers = ['12024090000142', '12024090000142', '12024090000142']; + $Receipt = [ + // 'Receipt' => [ + [ + 'Quantity' => $quantity, //'1', + 'UOM' => $UOM, + 'Batch_Number' => $batchNumber, + 'Location_Name' => $locationName, + 'LAMI_Cdate' => $currentDateTime, //'9/9/2024 10:48:37 AM', + 'Serial_Number' => array_map(function ($serial) { + return ['Serial_Number' => $serial]; + }, $serialNumbers) + ] + // ] + ]; + + + $payload = [ + // ...$header, + 'Receipt' => $Receipt + ]; + // dd($payload); + +// $header = [ +// 'Trans_Head_Log_Id' => '3256', +// 'Line_Item_Count' => '1', +// 'SAP_Order_Number' => '12345678', +// 'Item_Code' => '6458795' +// ]; +// $serialNumbers = ['12024090000142']; +// $Receipt = [ +// // 'Receipt' => [ +// [ +// 'Quantity' => '1', +// 'UOM' => 'EA', +// 'Batch_Number' => '', +// 'Location_Name' => '', +// 'LAMI_Cdate' => '9/9/2024 10:48:37 AM', +// 'Serial_Number' => array_map(function ($serial) { +// return ['Serial_Number' => $serial]; +// }, $serialNumbers) +// ] +// // ] +// ]; + + +// $payload = [ +// // ...$header, +// 'Receipt' => $Receipt +// ]; + // dd($payload); + try { + // $response = Http::withHeaders([ + // 'Content-Type' => 'application/json', + // 'Trans_Head_Log_Id' => '3256',//$transHeadLogId, + // 'Line_Item_Count' => '1', // $lineItemCnt, + // 'SAP_Order_Number' => '12345678', //$sapOrder, + // 'Item_Code' => '6458795', //$itemCode, + // ]) + $response = Http::withHeaders([ + 'Content-Type' => 'application/json', + 'Trans_Head_Log_Id' => $transHeadLogId, + 'Line_Item_Count' => $lineItemCnt, + 'SAP_Order_Number' => $sapOrder, + 'Item_Code' => $itemCode, + ]) + + ->withBasicAuth( + env('SAP_API_USERNAME'), + env('SAP_API_PASSWORD') + ) + ->withBody(json_encode($payload), 'application/json') + ->post(env('SAP_API_URL'), $payload); + + $messageCode = $response->headers()['messagecode'][0] ?? null; + + if ($messageCode && str_starts_with($messageCode, 'ERROR')) { + + $cleanError = str_replace('ERROR:|', '', $messageCode); + + // Update rows where plant_id and production_order match + QualityValidation::where('plant_id', $get('plant_id')) + ->where('production_order', $get('production_order')) + ->update([ + 'sap_msg_status' => 'ERROR', + 'sap_msg_description' => $cleanError, + ]); + + Notification::make() + ->title('SAP Error') + ->body($cleanError) + ->danger() + ->send(); + $this->dispatch('loadItems', $this->pId, $this->pOrder); + } + else + { + $messageCode = $response->headers()['messagecode'][0] ?? null; + $sapSuccessMsg = str_replace('SUCCESS:|', '', $messageCode); + + QualityValidation::where('plant_id', $get('plant_id')) + ->where('production_order', $get('production_order')) + ->update([ + 'sap_msg_status' => 'SUCCESS', + 'sap_msg_description' => $sapSuccessMsg, + ]); + + Notification::make() + ->title('SAP Success') + ->body($sapSuccessMsg) + ->success() + ->send(); + $this->dispatch('loadItems', $this->pId, $this->pOrder); + } + } catch (\Exception $e) { + Notification::make() + ->title('Exception') + ->body('Error sending data to SAP: ' . $e->getMessage()) + ->danger() + ->send(); + } + }) + ->color('success') + ->outlined() + ->hidden(fn (callable $get) => (!$get('scanned_quantity'))) //!$get('plant_id') && !$get('production_order') && + ->extraAttributes(['class' => 'align-to-input']), + ]), + ]) + ->columns(4); + } + + public function processValues($value) + { + + $this->pOrder = $value; + + + // $this->pUom = QualityValidation::where('plant_id',$this->pId) + // ->where('production_order',$this->pOrder) + // ->latest() + // ->first() + // ->value('uom'); + + // $this->transHeadLog = QualityValidation::where('plant_id',$this->pId) + // ->where('production_order',$this->pOrder) + // ->latest() + // ->value('id'); + + $latestValidation = QualityValidation::where('plant_id', $this->pId) + ->where('production_order', $this->pOrder) + ->latest() + ->first(); + + if (!$latestValidation) { + Notification::make() + ->title('Invalid Production Order') + ->body('No data found for the selected plant and production order.') + ->danger() + ->send(); + + $this->dispatch('refreshed', $this->pId, $this->pOrder); + return; + } + + $this->pUom = $latestValidation->uom; + $this->transHeadLog = $latestValidation->id; + + $this->sNums = []; + + if(!$this->pUom) + { + Notification::make() + ->title('UOM Not Found') + ->body('UOM not found for the production order') + ->icon('heroicon-o-x-circle') // optional, to force red/error-style icon + ->danger() + ->send(); + $this->dispatch('refreshed', $this->pId, $this->pOrder); + + } + else + { + $this->pItem = Item::where('id', StickerMaster::where('id', QualityValidation::where('plant_id',$this->pId)->where('production_order',$this->pOrder)->latest()->first()->sticker_master_id)->value('item_id'))->value('code'); + + $this->sNums = QualityValidation::where('plant_id', $this->pId) + ->where('production_order', $this->pOrder) + ->pluck('serial_number') + ->toArray(); + + //dd($this-> pItem); + + $this->dispatch('loadItems', $this->pId, $this->pOrder); + } + } + public static function canAccess(): bool + { + return Auth::check() && Auth::user()->can('view quality data send to sap'); + } + + public static function getNavigationLabel(): string + { + return 'Quality Data'; + } +}