getCancelFormAction(), ]; } protected function getRedirectUrl(): string { return $this->getResource()::getUrl('create'); } // public function processInvoice($invoiceNumber) // { // $invoiceNumber = trim($invoiceNumber); // $fileName = $invoiceNumber . '.txt'; // $this->showCapacitorInput = false; // $user = Filament::auth()->user(); // $operatorName = $user->name; // $plantId = $this->form->getState()['plant_id']; // $this->plantId = $plantId; // $plant = Plant::find($plantId); // if ($plant) // { // $plantCode = $plant->code; // } // else // { // $plantCode = null; // } // //..GET SERIAL INVOICE API // // $content = SmbService::readTextFile($fileName); // // if ($content == '') { // // Notification::make() // // ->title('File Not Found') // // ->body("Unable to locate file: {$fileName}") // // ->danger() // // ->send(); // // return; // // } // // $lines = preg_split("/\r\n|\n|\r/", trim($content)); // // $insertData = []; // // $missingItemCodes = []; // // $InvalidLenSno = []; // // $InvalidSno = []; // // $InvalidLenItem = []; // // $InvalidItem = []; // // foreach ($lines as $line) // // { // // $line = trim($line); // // if ($line == '') { // // continue; // // } // // $parts = array_map('trim', explode(',', $line)); // // if (count($parts) != 2) { // // Notification::make() // // ->title("Invalid data found inside the file.") // // ->danger() // // ->seconds(1) // // ->send(); // // return; // // } // // [$itemCode, $serialNumber] = $parts; // // $sticker = StickerMaster::where('plant_id', $plantId) // // ->whereHas('item', function ($query) use ($itemCode, $plantId) { // // $query->where('plant_id', $plantId) // // ->where('code', $itemCode); // // }) // // ->first(); // // if (Str::length($itemCode) < 6) // // { // // $InvalidLenItem [] = $itemCode; // // continue; // // } // // else if(!is_numeric($itemCode)){ // // $InvalidItem [] = $itemCode; // // continue; // // } // // if (Str::length($serialNumber) < 9) // // { // // $InvalidLenSno [] = $serialNumber; // // continue; // // } // // else if(!ctype_alnum($serialNumber)){ // // $InvalidSno [] = $serialNumber; // // continue; // // } // // if (!$sticker) { // // $missingItemCodes[] = $itemCode; // // continue; // // } // // $insertData[] = [ // // 'plant_id' => $plantId, // // 'sticker_master_id' => $sticker->id, // // 'invoice_number' => $invoiceNumber, // // 'serial_number' => $serialNumber, // // 'created_at' => now(), // // 'operator_id' => $operatorName, // // 'updated_at' => now(), // // ]; // // } // if (!empty($InvalidLenItem)) // { // $count = count($InvalidLenItem); // if ($count <= 10) { // $body = 'Item Code should contain minimum 6 digits: ' . implode(', ', $InvalidLenItem); // } else { // $body = "{$count} item codes contain minimum 6 digits."; // } // Notification::make() // ->title("Invalid Item Code.") // ->body("$body") // ->danger() // ->seconds(1) // ->send(); // return; // } // else if (!empty($InvalidItem)) // { // $count = count($InvalidItem); // if ($count <= 10) { // $body = 'Item code must be in numeric values: ' . implode(', ', $InvalidSno); // } else { // $body = "{$count} item codes must be in numeric values."; // } // Notification::make() // ->title("Invalid Item Code.") // ->body("$body") // ->danger() // ->seconds(1) // ->send(); // return; // } // else if (!empty($InvalidLenSno)) // { // $count = count($InvalidLenSno); // if ($count <= 10) { // $body = 'Serial number should be minimum 9 digits: ' . implode(', ', $InvalidLenSno); // } else { // $body = "{$count} serial number should be minimum 9 digits."; // } // Notification::make() // ->title("Invalid Serial Number.") // ->body("$body") // ->danger() // ->seconds(1) // ->send(); // return; // } // else if (!empty($InvalidSno)) // { // $count = count($InvalidSno); // if ($count <= 10) { // $body = 'Serial number should be conatin alpha numeric values: ' . implode(', ', $InvalidSno); // } else { // $body = "{$count} serial number should be conatin alpha numeric values."; // } // Notification::make() // ->title("Invalid Serial Number.") // ->body("$body") // ->danger() // ->seconds(1) // ->send(); // return; // } // else if (!empty($missingItemCodes)) // { // $count = count($missingItemCodes); // if ($count <= 10) { // $body = 'Item codes not found in sticker master: ' . implode(', ', $missingItemCodes); // } else { // $body = "{$count} item codes not found in sticker master table."; // } // Notification::make() // ->title("Unknown Item Code.") // ->body("$body") // ->danger() // ->seconds(1) // ->send(); // return; // } // if (!empty($insertData)) { // SerialValidation::insert($insertData); // } // else{ // Notification::make() // ->title("Insert Failed.") // ->body("Data insertion failed") // ->danger() // ->seconds(1) // ->send(); // return; // } // //.. // $updateStatus = $this->form->getState()['update_invoice'] ?? null; // $this->invoiceNumber = trim($this->form->getState()['invoice_number']) ?? $invoiceNumber; // $invoiceType = null; // //$this->invoiceNumber = $this->invoiceNumber ?? $invoiceNumber; // $invoiceExist = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->exists(); // if (!$invoiceExist) { // Notification::make() // ->title("New invoice detected.") // ->info() // ->seconds(1) // ->send(); // $this->dispatch('playNotificationSound'); // $this->form->fill([ // 'plant_id' => $plantId, // 'invoice_number' => $invoiceNumber, // 'serial_number' => null, // 'total_quantity' => 0, // 'scanned_quantity'=> 0, // ]); // $this->dispatch('refreshEmptyInvoice', invoiceNumber: $invoiceNumber, plantId: $plantId); // } // else // { // $totQuan = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count(); // $scanSQuan = SerialValidation::where('invoice_number', $invoiceNumber)->where('scanned_status', 'Scanned')->where('plant_id', $plantId)->count(); // $totMQuan = SerialValidation::where('invoice_number', $invoiceNumber)->whereNotNull('quantity')->where('plant_id', $plantId)->count(); //->where('quantity', '!=', '') // $scanMQuan = SerialValidation::where('invoice_number', $invoiceNumber)->whereNotNull('serial_number')->where('serial_number', '!=', '')->where('plant_id', $plantId)->count(); // if ($totMQuan > 0) // { // $this->form->fill([ // 'plant_id' => $plantId, // 'invoice_number' => $invoiceNumber, // 'serial_number' => null, // 'total_quantity' => $totQuan, // 'scanned_quantity'=> $scanMQuan, // ]); // if ($totQuan == $scanMQuan) // { // Notification::make() // ->title("Completed: Material Invoice") // ->body("Material invoice '$invoiceNumber' completed the scanning process.
Scan the next 'Material Invoice' to proceed!") // ->warning() // ->seconds(3) // ->send(); // $this->dispatch('playNotificationSound'); // $filename = $invoiceNumber . '.xlsx'; // $directory = 'uploads/temp'; // $disk = Storage::disk('local'); // $filePath = $directory . '/' . $filename; // //$fullPath = null; // if ($disk->exists($filePath)) { // //$fullPath = $disk->path($filePath); // $disk->delete($filePath); // } // $this->dispatch('refreshCompletedInvoice', invoiceNumber: $invoiceNumber, plantId: $plantId, isSerial: false); // } // else // { // Notification::make() // ->title("Start the scanning process!") // ->info() // ->seconds(1) // ->send(); // $this->dispatch('playNotificationSound'); // // $hasRecords = InvoiceValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->first()->stickerMasterRelation->material_type ?? null; // // $this->dispatch( (!empty($hasRecords) && $hasRecords) ? 'refreshMaterialInvoiceData' : 'refreshInvoiceData', invoiceNumber: $invoiceNumber, plantId: $plantId); //$this->invoiceNumber // $this->dispatch('refreshMaterialInvoiceData', invoiceNumber: $invoiceNumber, plantId: $plantId); // if ($updateStatus == '1') // { // //'Material invoice update in progress...'; // $filename = $invoiceNumber . '.xlsx'; // $directory = 'uploads/temp'; // $disk = Storage::disk('local'); // $filePath = $directory . '/' . $filename; // $fullPath = $disk->path($filePath); // if ($fullPath && file_exists($fullPath)) // { // // Now you can read/process the file here // $rows = Excel::toArray(null, $fullPath)[0]; // if ((count($rows) - 1) <= 0) // { // Notification::make() // ->title('Records Not Found') // ->body("Import the valid updated 'Material Invoice' file to proceed..!") // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } // return; // } // $invalidMatCodes = []; // $materialCodes = []; // $missingQuantities = []; // $invalidMatQuan = []; // $hasQuanTypIds = []; // $validRowsFound = false; // foreach ($rows as $index => $row) // { // if ($index == 0) continue; // Skip header // $materialCode = trim($row[0]); // $materialQuantity = trim($row[1]); // if (empty($materialCode) && empty($materialQuantity)) { // continue; // } // if (!empty($materialCode)) { // if (Str::length($materialCode) < 6 || !ctype_alnum($materialCode)) // { // $invalidMatCodes[] = $materialCode; // } // else // { // if (empty($materialQuantity)) { // $missingQuantities[] = $materialCode; // } // else if (!is_numeric($materialQuantity)) // { // $invalidMatQuan[] = $materialCode; // } // else if ($materialQuantity == 0) // { // $invalidMatQuan[] = $materialCode; // } // else // { // $materialCodes[] = $materialCode; // $validRowsFound = true; // } // } // } // else // { // continue; // } // } // $uniqueInvalidCodes = array_unique($invalidMatCodes); // if (!empty($uniqueInvalidCodes)) { // Notification::make() // ->title('Invalid: Item Codes') // ->body('The following item codes should contain minimum 6 digit alpha numeric values:
' . implode(', ', $uniqueInvalidCodes)) // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // return; // } // $uniqueMissingQuanCodes = array_unique($missingQuantities); // if (!empty($uniqueMissingQuanCodes)) { // Notification::make() // ->title('Missing Material Quantity') // ->body("The following item codes doesn't have valid material quantity:
" . implode(', ', $uniqueMissingQuanCodes)) // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // return; // } // $uniqueInvalidMatQuan = array_unique($invalidMatQuan); // if (!empty($uniqueInvalidMatQuan)) { // Notification::make() // ->title('Invalid Material Quantity') // ->body("The following item codes doesn't have valid material quantity:
" . implode(', ', $uniqueInvalidMatQuan)) // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // return; // } // if (!$validRowsFound) { // Notification::make() // ->title('Invalid Material Invoice') // ->danger() // This makes the notification red to indicate an error // ->body('Uploaded Excel sheet is empty or
contains no valid data.') // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } // return; // } // $uniqueCodes = array_unique($materialCodes); // //itemNotFound // $matchedItems = StickerMaster::with('item') // ->whereHas('item', function ($query) use ($uniqueCodes) { // $query->whereIn('code', $uniqueCodes); // }) // ->get(); // $matchedCodes = $matchedItems->pluck('item.code')->toArray(); // $missingCodes = array_diff($uniqueCodes, $matchedCodes); // if (!empty($missingCodes)) // { // $missingCount = count($missingCodes); // $message = $missingCount > 10 ? "'$missingCount' item codes are not found in database." : 'The following item codes are not found in database:
' . implode(', ', $missingCodes); // Notification::make() // ->title('Unknown: Item Codes') // ->body($message) // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // return; // } // //plantNotFound // $matchedItems = StickerMaster::with('item') // ->whereHas('item', function ($query) use ($uniqueCodes, $plantId) { // $query->whereIn('code', $uniqueCodes)->where('plant_id', $plantId); // }) // ->get(); // $matchedCodes = $matchedItems->pluck('item.code')->toArray(); // $missingCodes = array_diff($uniqueCodes, $matchedCodes); // if (!empty($missingCodes)) // { // $missingCount = count($missingCodes); // $message = $missingCount > 10 ? "'$missingCount' item codes are not found in database for choosed plant." : 'The following item codes are not found in database for choosed plant:
' . implode(', ', $missingCodes); // Notification::make() // ->title('Unknown: Item Codes') // ->body($message) // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // return; // } // $invalidCodes = $matchedItems // ->filter(fn ($sticker) => empty($sticker->material_type)) //filter invalid // ->pluck('item.code') // ->toArray(); // if (!empty($invalidCodes)) // { // $missingCount = count($invalidCodes); // $message = $missingCount > 10 ? "'$missingCount' Serial Invoice item codes found." : "'Serial Invoice' item codes found:
" . implode(', ', $invalidCodes); // Notification::make() // ->title('Invalid: Item Codes') // ->body($message) // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // return; // } // $nonNumericQtyCodes = []; // $zeroQtyCodes = []; // $notDivisibleCodes = []; // $hasQuanTyp = false; // foreach ($matchedItems as $sticker) // { // $code = $sticker->item->code; // $materialType = $sticker->material_type; // if ($materialType == 2) // { // $bundleQty = $sticker->bundle_quantity ?? 0; // $totalExcelQty = 0; // foreach ($rows as $index => $row) // { // if ($index == 0) continue; // Skip header // $excelCode = trim($row[0]); // $excelMatQty = trim($row[1]); // if (empty($excelCode) || empty($excelMatQty)) { // continue; // } // if ($excelCode == $code && is_numeric($excelMatQty)) { // $totalExcelQty += $excelMatQty; // Sum up the quantities // } // } // if ($totalExcelQty == 0) { // $zeroQtyCodes[] = $code; // } else if (!is_numeric($totalExcelQty)) { // $nonNumericQtyCodes[] = $code; // Here you may want to check divisibility condition too // } else if ($bundleQty != 0 && $totalExcelQty % $bundleQty != 0) { // $notDivisibleCodes[] = $code; // } // } // else if ($materialType == 3) // { // $hasQuanTyp = true; // $hasQuanTypIds[] = $sticker->id; // } // } // $showValidationNotification = function(array $codes, string $message) { // if (count($codes) == 0) return; // $uniqueCodes = array_unique($codes); // $codeList = implode(', ', $uniqueCodes); // Notification::make() // ->title('Invalid Bundle Quantity') // ->body("$message
$codeList") // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // }; // $showValidationNotification($nonNumericQtyCodes, "The following item codes contains invalid bundle quantity:"); // $showValidationNotification($zeroQtyCodes, "The following item codes quantity should be greater than '0':"); // $showValidationNotification($notDivisibleCodes, "The following item codes quantity is not divisible by bundle quantity."); // if ($nonNumericQtyCodes || $zeroQtyCodes || $notDivisibleCodes) { // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // return; // } // else // { // $oldQuan = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count(); // $newQuan = -1; // $inserted = 0; // foreach ($matchedItems as $sticker) // { // if ($newQuan == -1 && !$hasQuanTyp) // { // SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->where(function($query) { // $query->whereNull('serial_number')->orWhere('serial_number', ''); // }) // ->forceDelete(); //->delete(); // $newQuan = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count(); // } // else if ($newQuan == -1 && $hasQuanTyp) // { // SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->where(function($query) { // $query->whereNull('serial_number')->orWhere('serial_number', ''); // })->whereNotIn('sticker_master_id', $hasQuanTypIds) // ->forceDelete(); //->delete(); // $newQuan = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count(); // } // $code = $sticker->item->code; // $materialType = $sticker->material_type; // // $sticker = StickerMaster::where('plant_id', $plantId)->whereHas('item', function ($query) use ($code) { $query->where('plant_id', $this->plantId)->where('code', $code); })->first(); // if ($materialType == 1) // { // $totalExcelQty = 0; // foreach ($rows as $index => $row) // { // if ($index == 0) continue; // Skip header // $excelCode = trim($row[0]); // $excelMatQty = trim($row[1]); // if (empty($excelCode) || empty($excelMatQty)) { // continue; // } // if ($excelCode == $code && is_numeric($excelMatQty)) { // $totalExcelQty += $excelMatQty; // Sum up the quantities // } // } // $existQty = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->where('sticker_master_id', $sticker->id)->count(); // if ($existQty < $totalExcelQty) // { // $newQty = $totalExcelQty - $existQty; // for ($i = 0; $i < $newQty; $i++) // { // if ($sticker) { // SerialValidation::create([ // 'sticker_master_id' => $sticker->id, // 'plant_id' => $plantId, // 'invoice_number' => $invoiceNumber, // 'quantity' => 1, // 'operator_id'=> $operatorName, // ]); // $inserted++; // } // } // } // } // else if ($materialType == 2) // { // $bundleQty = $sticker->bundle_quantity; // $totalExcelQty = 0; // foreach ($rows as $index => $row) // { // if ($index == 0) continue; // Skip header // $excelCode = trim($row[0]); // $excelMatQty = trim($row[1]); // if (empty($excelCode) || empty($excelMatQty)) { // continue; // } // if ($excelCode == $code && is_numeric($excelMatQty)) { // $totalExcelQty += $excelMatQty; // Sum up the quantities // } // } // $existQty = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->where('sticker_master_id', $sticker->id)->count(); // //for ($i = 0; $i < ($totalExcelQty/$bundleQty); $i++) // $newTotQty = $totalExcelQty/$bundleQty; // if ($existQty < $newTotQty) // { // $newQty = $newTotQty - $existQty; // for ($i = 0; $i < $newQty; $i++) // { // if ($sticker) { // SerialValidation::create([ // 'sticker_master_id' => $sticker->id, // 'plant_id' => $plantId, // 'invoice_number' => $invoiceNumber, // 'quantity' => $bundleQty, // 'operator_id'=> $operatorName, // ]); // $inserted++; // } // } // } // } // else if ($materialType == 3) // { // $totalExcelQty = 0; // foreach ($rows as $index => $row) // { // if ($index == 0) continue; // Skip header // $excelCode = trim($row[0]); // $excelMatQty = trim($row[1]); // if (empty($excelCode) || empty($excelMatQty)) { // continue; // } // if ($excelCode == $code && is_numeric($excelMatQty)) { // $totalExcelQty += $excelMatQty; // } // } // $existEmpRecQty = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->where(function($query) { // $query->whereNull('serial_number')->orWhere('serial_number', ''); // })->where('sticker_master_id', $sticker->id)->first(); // $existEmpQty = $existEmpRecQty ? $existEmpRecQty->quantity : 0; // $existComQty = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->where(function($query) { // $query->whereNotNull('serial_number')->where('serial_number', '!=', ''); // }) // ->where('sticker_master_id', $sticker->id) // ->sum(column: 'quantity'); // $existComQty = $existComQty ? $existComQty : 0; // // 8 = 3 + 5 // 8 = 5 + 3 // 8 = 0 + 8 // 8 = 8 + 0 // // 8 = 3 + 5 // 8 = 5 + 3 // 8 = 0 + 8 // 8 = 8 + 0 // // 0 = 0 + 0 // $existQty = $existEmpQty + $existComQty; // // 8 <= 11 // 8 <= 8 // 8 <= 11 // 8 <= 9 // // 8 <= 7 // 8 <= 7 // 8 <= 7 // 8 <= 7 // // 0 <= 5 // if ($existQty <= $totalExcelQty) // { // // 6 = 11 - 5 // 5 = 8 - 3 // 3 = 11 - 8 // 9 = 9 - 0 // // 5 = 5 - 0 // $newInsQty = $totalExcelQty - $existComQty; // // 3 > 0 // 5 > 0 // 0 > 0 // 8 > 0 // // 0 > 0 // if ($existEmpQty > 0) // update // { // // 3 = 6 // 5 = 5 // 0 = 3 // 8 = 9 // // 0 = 5 // if ($existEmpQty == $newInsQty) { continue; } // // $existEmpRecQty->delete(); // $existEmpRecQty->update([ // 'quantity' => $newInsQty, // 'operator_id'=> $operatorName, // 'updated_at' => now(), // ]); // $newQuan--; // $inserted++; // } // else if ($newInsQty > 0) // if ($sticker) // create // { // SerialValidation::create([ // 'sticker_master_id' => $sticker->id, // 'plant_id' => $plantId, // 'invoice_number' => $invoiceNumber, // 'quantity' => $newInsQty, // 'operator_id'=> $operatorName, // ]); // $inserted++; // } // } // // 8 > 7 // 8 > 7 // 8 > 7 // 8 > 7 // else // { // // 2 = 7 - 5 // 4 = 7 - 3 // -1 = 7 - 8 // 7 = 7 - 0 // $newInsQty = $totalExcelQty - $existComQty; // // 3 > 0 // 5 > 0 // 0 > 0 // 8 > 0 // if ($existEmpQty > 0) // update // { // // 3 = 2 // 5 = 4 // 0 = -1 // 8 = 7 // if ($existEmpQty == $newInsQty) { continue; } // // $existEmpRecQty->delete(); // $existEmpRecQty->update([ // 'quantity' => $newInsQty, // 'operator_id'=> $operatorName, // 'updated_at' => now(), // ]); // $newQuan--; // $inserted++; // } // else if ($newInsQty > 0) // create // { // SerialValidation::create([ // 'sticker_master_id' => $sticker->id, // 'plant_id' => $plantId, // 'invoice_number' => $invoiceNumber, // 'quantity' => $newInsQty, // 'operator_id'=> $operatorName, // ]); // $inserted++; // } // } // } // } // if ($inserted > 0 || $oldQuan != $newQuan) // { // Notification::make() // ->title("Material invoice successfully updatad.") // ->success() // ->seconds(1) // ->send(); // Notification::make() // ->title("Start the scanning process!") // ->body("'$inserted' new material invoice records were inserted.") // ->info() // // ->success() // ->seconds(1) // ->send(); // $this->dispatch('playNotificationSound'); // // Update total quantity in the form // $totalQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count(); // $scannedQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->whereNotNull('serial_number')->where('serial_number', '!=', '')->where('plant_id', $plantId)->count(); // $this->form->fill([ // 'plant_id' => $plantId, // 'invoice_number' => $invoiceNumber, // 'serial_number' => null, // 'total_quantity' => $totalQuantity, // 'scanned_quantity'=> $scannedQuantity, // ]); // if ($totalQuantity == $scannedQuantity) // { // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } // $this->dispatch('refreshCompletedInvoice', invoiceNumber: $invoiceNumber, plantId: $plantId, isSerial: false); // } // else // { // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // $this->dispatch('refreshMaterialInvoiceData', invoiceNumber: $invoiceNumber, plantId: $plantId); // } // } // else // { // Notification::make() // ->title("Update Failed: Material Invoice") // ->body("No new records were inserted for Material Invoice : '$invoiceNumber'.") // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // $totalQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count(); // $scannedQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->whereNotNull('serial_number')->where('serial_number', '!=', '')->where('plant_id', $plantId)->count(); // $this->form->fill([ // 'plant_id' => $plantId, // 'invoice_number' => $invoiceNumber, // 'serial_number' => null, // 'total_quantity' => $totalQuantity, // 'scanned_quantity'=> $scannedQuantity, // ]); // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // $this->dispatch('refreshEmptyInvoice', invoiceNumber: $invoiceNumber, plantId: $plantId); // return; // } // } // } // else // { // Notification::make() // ->title('Updated Invoice Not Found') // ->body("Import the updated 'Material Invoice' file to proceed..!") // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // $this->form->fill([ // 'plant_id' => $plantId, // 'invoice_number' => $invoiceNumber, // 'serial_number' => null, // 'total_quantity' => 0, // 'scanned_quantity'=> 0, // ]); // $this->dispatch('refreshEmptyInvoice', invoiceNumber: $invoiceNumber, plantId: $plantId); // return; // } // } // } // return; // } // else // { // $this->form->fill([ // 'plant_id' => $plantId, // 'invoice_number' => $invoiceNumber, // 'serial_number' => null, // 'total_quantity' => $totQuan, // 'scanned_quantity'=> $scanSQuan, // ]); // //$hasRecords = InvoiceValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->first()->stickerMasterRelation->material_type ?? null; // // $this->dispatch('refreshInvoiceData', invoiceNumber: $invoiceNumber, plantId: $plantId); // if ($totQuan == $scanSQuan) // { // Notification::make() // ->title("Completed: Serial Invoice") // ->body("Serial invoice '$invoiceNumber' completed the scanning process.
Scan the next 'Serial Invoice' to proceed.!") // ->warning() // ->seconds(3) // ->send(); // $this->dispatch('playNotificationSound'); // $filename = $invoiceNumber . '.xlsx'; // $directory = 'uploads/temp'; // $disk = Storage::disk('local'); // $filePath = $directory . '/' . $filename; // //$fullPath = null; // if ($disk->exists($filePath)) { // //$fullPath = $disk->path($filePath); // $disk->delete($filePath); // } // $this->dispatch('playNotificationSound'); // $this->dispatch('refreshCompletedInvoice', invoiceNumber: $invoiceNumber, plantId: $plantId, isSerial: true); // } // else // { // Notification::make() // ->title("Start the scanning process!") // ->info() // ->seconds(1) // ->send(); // $this->dispatch('playNotificationSound'); // $this->dispatch('refreshInvoiceData', invoiceNumber: $invoiceNumber, plantId: $plantId); // if ($updateStatus == '1') // { // $filename = $invoiceNumber . '.xlsx'; // $directory = 'uploads/temp'; // $disk = Storage::disk('local'); // $filePath = $directory . '/' . $filename; // $fullPath = $disk->path($filePath); // // Check if file exists //$disk->exists($filePath) // if ($fullPath && file_exists($fullPath)) // { // // /home/iot-dev/projects/pds/storage/app/private/uploads/temp/3RA0018735.xlsx // // 'Serial invoice update in progress...' // // Now you can read/process the file here // $rows = Excel::toArray(null, $fullPath)[0]; // if ((count($rows) - 1) <= 0) // { // Notification::make() // ->title('Records Not Found') // ->body("Import the valid updated 'Serial Invoice' file to proceed..!") // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } // return; // } // $invalidMatCodes = []; // $materialCodes = []; // $missingSerials = []; // $invalidSerCodes = []; // $duplicateSerials = []; // $serialNumbers = []; // $validRowsFound = false; // foreach ($rows as $index => $row) // { // if ($index == 0) continue; // Skip header // $materialCode = trim($row[0]); // $serialNumber = trim($row[1]); // if (empty($materialCode) && empty($serialNumber)) // { // continue; // } // if (!empty($materialCode)) // { // if (Str::length($materialCode) < 6 || !ctype_alnum($materialCode)) // { // $invalidMatCodes[] = $materialCode; // continue; // } // else // { // if (empty($serialNumber)) { // $missingSerials[] = $materialCode; // } // else if (Str::length($serialNumber) < 9 || !ctype_alnum($serialNumber)) // { // $invalidSerCodes[] = $serialNumber; // } // else // { // if (in_array($serialNumber, $serialNumbers)) // { // $duplicateSerials[] = $serialNumber; // } // else // { // $serialNumbers[] = $serialNumber; // $materialCodes[] = $materialCode; // $validRowsFound = true; // } // } // } // } // else // { // continue; // } // } // $uniqueInvalidCodes = array_unique($invalidMatCodes); // if (!empty($uniqueInvalidCodes)) { // Notification::make() // ->title('Invalid: Item Codes') // ->body('The following item codes should contain minimum 6 digit alpha numeric values:
' . implode(', ', $uniqueInvalidCodes)) // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // return; // } // $uniqueMissingSerials = array_unique($missingSerials); // if (!empty($uniqueMissingSerials)) { // Notification::make() // ->title('Missing Serial Numbers') // ->body("The following item codes doesn't have valid serial number:
" . implode(', ', $uniqueMissingSerials)) // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // return; // } // $uniqueInvalidSerCodes = array_unique($invalidSerCodes); // if (!empty($uniqueInvalidSerCodes)) { // Notification::make() // ->title('Invalid Serial Numbers') // ->body('The following serial numbers should contain minimum 9 digit alpha numeric values:
' . implode(', ', $uniqueInvalidSerCodes)) // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // return; // } // $uniqueDupSerCodes = array_unique($duplicateSerials); // if (!empty($uniqueDupSerCodes)) { // Notification::make() // ->title('Duplicate Serial Numbers') // ->body('The following serial numbers are already exist in invoice excel:
' . implode(', ', $uniqueDupSerCodes)) // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // return; // } // if (!$validRowsFound) { // Notification::make() // ->title('Invalid Serial Invoice') // ->danger() // This makes the notification red to indicate an error // ->body('Uploaded excel sheet is empty or
contains no valid data.') // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } // return; // } // $uniqueCodes = array_unique($materialCodes); // //itemNotFound // $matchedItems = StickerMaster::with('item') // ->whereHas('item', function ($query) use ($uniqueCodes) { // $query->whereIn('code', $uniqueCodes); // }) // ->get(); // $matchedCodes = $matchedItems->pluck('item.code')->toArray(); // $missingCodes = array_diff($uniqueCodes, $matchedCodes); // if (!empty($missingCodes)) // { // $missingCount = count($missingCodes); // $message = $missingCount > 10 ? "'$missingCount' item codes are not found in database." : 'The following item codes are not found in database:
' . implode(', ', $missingCodes); //->where('plant_id', $plantId) // Notification::make() // ->title('Unknown: Item Codes') // ->body($message) // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // return; // } // //plantNotFound // $matchedItems = StickerMaster::with('item') // ->whereHas('item', function ($query) use ($uniqueCodes, $plantId) { // $query->whereIn('code', $uniqueCodes)->where('plant_id', $plantId); // }) // ->get(); // $matchedCodes = $matchedItems->pluck('item.code')->toArray(); // $missingCodes = array_diff($uniqueCodes, $matchedCodes); // if (!empty($missingCodes)) // { // $missingCount = count($missingCodes); // $message = $missingCount > 10 ? "'$missingCount' item codes are not found in database for choosed plant." : 'The following item codes are not found in database for choosed plant:
' . implode(', ', $missingCodes); // Notification::make() // ->title('Unknown: Item Codes') // ->body($message) // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // return; // } // $invalidCodes = $matchedItems // ->filter(fn ($sticker) => !empty($sticker->material_type)) //filter invalid // ->pluck('item.code') // ->toArray(); // if (!empty($invalidCodes)) // { // $missingCount = count($invalidCodes); // $message = $missingCount > 10 ? "'$missingCount' Material Invoice item codes found." : "'Material Invoice' item codes found:
" . implode(', ', $invalidCodes); // Notification::make() // ->title('Invalid: Item Codes') // ->body($message) // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // return; // } // $missPackCodes = $matchedItems // ->filter(fn ($sticker) => empty($sticker->tube_sticker_motor) && empty($sticker->pack_slip_motor) && empty($sticker->tube_sticker_pump) && empty($sticker->pack_slip_pump) && empty($sticker->tube_sticker_pumpset) && empty($sticker->pack_slip_pumpset) && empty($sticker->panel_box_code)) //filter invalid // ->pluck('item.code') // ->toArray(); // if (!empty($missPackCodes)) // { // $missingCount = count($missPackCodes); // $message = $missingCount > 10 ? "'$missingCount' item codes doesn't have valid package type to proceed!" : "The following 'Item Code' doesn't have valid package type:
" . implode(', ', $missPackCodes); // Notification::make() // ->title('Invalid: Item Codes') // ->body($message) // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // return; // } // $oldQuan = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count(); // $newQuan = 0; // $inserted = 0; // foreach ($rows as $index => $row) // { // if ($index == 0) // Skip header; // { // SerialValidation::where('invoice_number', $invoiceNumber) // ->where(function($query) { // $query->whereNull('motor_scanned_status')->orWhere('motor_scanned_status', ''); // }) // ->where(function($query) { // $query->whereNull('pump_scanned_status')->orWhere('pump_scanned_status', ''); // }) // ->where(function($query) { // $query->whereNull('capacitor_scanned_status')->orWhere('capacitor_scanned_status', ''); // }) // ->where(function($query) { // $query->whereNull('scanned_status_set')->orWhere('scanned_status_set', ''); // }) // ->where(function($query) { // $query->whereNull('scanned_status')->orWhere('scanned_status', ''); // }) // ->forceDelete(); //->delete(); // $newQuan = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count(); // continue; // } // $materialCode = trim($row[0]); // $serialNumber = trim($row[1]); // if (empty($materialCode) || empty($serialNumber)) { // continue; // } // $sNoExist = SerialValidation::where('serial_number', $serialNumber)->where('plant_id', $plantId)->exists(); //->pluck('serial_number') // if ($sNoExist) { continue; } // $sticker = StickerMaster::where('plant_id', $plantId)->whereHas('item', function ($query) use ($materialCode) { // $query->where('plant_id', $this->plantId)->where('code', $materialCode); //Check if item.code matches Excel's materialCode // })->first(); // if ($sticker) { // SerialValidation::create([ // 'sticker_master_id' => $sticker->id, // 'plant_id' => $plantId, // 'invoice_number' => $invoiceNumber, // 'serial_number' => $serialNumber, // 'operator_id'=> $operatorName, // ]); // $inserted++; // } // } // if ($inserted > 0 || $oldQuan != $newQuan) // { // Notification::make() // ->title("Serial invoice successfully updated.") // ->success() // ->seconds(1) // ->send(); // Notification::make() // ->title("Start the scanning process!") // ->body("'$inserted' new serial invoice records were inserted.") // ->info() // // ->success() // ->seconds(1) // ->send(); // $this->dispatch('playNotificationSound'); // // Update total quantity in the form // $totalQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count(); // $scannedQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->where('scanned_status', 'Scanned')->where('plant_id', $plantId)->count(); // $this->form->fill([ // 'plant_id' => $plantId, // 'invoice_number' => $invoiceNumber, // 'serial_number' => null, // 'total_quantity' => $totalQuantity, // 'scanned_quantity'=> $scannedQuantity, // ]); // if ($totalQuantity == $scannedQuantity) // { // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } // $this->dispatch('refreshCompletedInvoice', invoiceNumber: $invoiceNumber, plantId: $plantId, isSerial: true); // } // else // { // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // // $hasRecords = InvoiceValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->first()->stickerMasterRelation->material_type ?? null; // // $this->dispatch( (!empty($hasRecords) && $hasRecords) ? 'refreshMaterialInvoiceData' : 'refreshInvoiceData', invoiceNumber: $invoiceNumber, plantId: $plantId); //$this->invoiceNumber // $this->dispatch('refreshInvoiceData', invoiceNumber: $invoiceNumber, plantId: $plantId); // } // } // else // { // Notification::make() // ->title("Update Failed: Serial Invoice") // ->body("No new records were inserted for Serial Invoice : '$invoiceNumber'.") // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // $totalQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count(); // $scannedQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->where('scanned_status', 'Scanned')->where('plant_id', $plantId)->count(); // $this->form->fill([ // 'plant_id' => $plantId, // 'invoice_number' => $invoiceNumber, // 'serial_number' => null, // 'total_quantity' => $totalQuantity, // 'scanned_quantity'=> $scannedQuantity, // ]); // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // $this->dispatch('refreshEmptyInvoice', invoiceNumber: $invoiceNumber, plantId: $plantId); // return; // } // } // else // { // Notification::make() // ->title('Updated Invoice Not Found') // ->body("Import the updated 'Serial Invoice' file to proceed..!") // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // $this->form->fill([ // 'plant_id' => $plantId, // 'invoice_number' => $invoiceNumber, // 'serial_number' => null, // 'total_quantity' => 0, // 'scanned_quantity'=> 0, // ]); // $this->dispatch('refreshEmptyInvoice', invoiceNumber: $invoiceNumber, plantId: $plantId); // return; // } // } // } // return; // } // } // $filename = $invoiceNumber . '.xlsx'; // $directory = 'uploads/temp'; // $disk = Storage::disk('local'); // $filePath = $directory . '/' . $filename; // $fullPath = null; //$fullPath = $disk->path($filePath); // // Check if file exists // if ($disk->exists($filePath)) { // $fullPath = $disk->path($filePath); // //$fullPath = session('uploaded_invoice_path'); // // Notification::make() // // ->title('File exists.') // // ->success() // // ->seconds(3) // // ->send(); // } else { // Notification::make() // ->title('Invoice Not Found') // ->body("Import the scanned 'Invoice' file to proceed..!") // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // $this->form->fill([ // 'plant_id' => $plantId, // 'invoice_number' => $invoiceNumber, // 'serial_number' => null, // 'total_quantity' => 0, // 'scanned_quantity'=> 0, // ]); // $this->dispatch('refreshEmptyInvoice', invoiceNumber: $invoiceNumber, plantId: $plantId); // return; // } // if (!file_exists($fullPath)) // { // Notification::make() // ->title('Invoice file doesn\'t exist.') // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // return; // } // // Extract filename without extension (e.g., "3RA0018732") // $uploadedFilename = pathinfo($fullPath, PATHINFO_FILENAME); // // Compare with invoice number // if ($uploadedFilename != $invoiceNumber) { // Notification::make() // ->title("Uploaded file name does not match the invoice number.") // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // return; // } // if ($fullPath && file_exists($fullPath)) // { // // Now you can read/process the file here // $rows = Excel::toArray(null, $fullPath)[0]; // // $collection = Excel::toCollection(null, $fullPath); // // $rows = $collection[0]->toArray(); // // $collection = Excel::toCollection(new ExcelImport, $fullPath); // // // Convert the collection to an array // // $rows = $collection->toArray(); // // $excelImport = new ExcelImport(); // // // Import the Excel file // // Excel::import($excelImport, $fullPath); // // // Get the rows // // $rows = $excelImport->getRows(); // if ((count($rows) - 1) <= 0) // { // Notification::make() // ->title('Records Not Found') // ->body("Import the valid 'Invoice' file to proceed..!") // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } // return; // } // foreach ($rows as $index => $row) // { // if ($index == 0) continue; // $materialCode = trim($row[0]); // if (!empty($materialCode)) { // if (Str::length($materialCode) < 6) // { // continue; // } // else // { // $sticker = StickerMaster::where('plant_id', $plantId)->whereHas('item', function ($query) use ($materialCode) { // $query->where('plant_id', $this->plantId)->where('code', $materialCode); //Check if item.code matches Excel's materialCode // }); // if ($sticker->exists()) // { // if ($sticker->first()->material_type && !empty($sticker->first()->material_type)) // { // $invoiceType = "M"; // break; // } // else // { // $invoiceType = "S"; // break; // } // } // else // { // continue; // } // } // } // else // { // continue; // } // } // if ($invoiceType == 'M') // { // $invalidMatCodes = []; // $materialCodes = []; // $missingQuantities = []; // $invalidMatQuan = []; // $validRowsFound = false; // foreach ($rows as $index => $row) // { // if ($index == 0) continue; // Skip header // $materialCode = trim($row[0]); // $materialQuantity = trim($row[1]); // if (empty($materialCode) && empty($materialQuantity)) { // continue; // } // if (!empty($materialCode)) { // if (Str::length($materialCode) < 6 || !ctype_alnum($materialCode)) // { // $invalidMatCodes[] = $materialCode; // } // else // { // if (empty($materialQuantity)) { // $missingQuantities[] = $materialCode; // } // else if (!is_numeric($materialQuantity)) // { // $invalidMatQuan[] = $materialCode; // } // else if ($materialQuantity == 0) // { // $invalidMatQuan[] = $materialCode; // } // else // { // $materialCodes[] = $materialCode; // $validRowsFound = true; // } // } // } // else // { // continue; // } // } // $uniqueInvalidCodes = array_unique($invalidMatCodes); // if (!empty($uniqueInvalidCodes)) { // Notification::make() // ->title('Invalid: Item Codes') // ->body('The following item codes should contain minimum 6 digit alpha numeric values:
' . implode(', ', $uniqueInvalidCodes)) // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // return; // } // $uniqueMissingQuanCodes = array_unique($missingQuantities); // if (!empty($uniqueMissingQuanCodes)) { // Notification::make() // ->title('Missing Material Quantity') // ->body("The following item codes doesn't have valid material quantity:
" . implode(', ', $uniqueMissingQuanCodes)) // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // return; // } // $uniqueInvalidMatQuan = array_unique($invalidMatQuan); // if (!empty($uniqueInvalidMatQuan)) { // Notification::make() // ->title('Invalid Material Quantity') // ->body("The following item codes doesn't have valid material quantity:
" . implode(', ', $uniqueInvalidMatQuan)) // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // return; // } // if (!$validRowsFound) { // Notification::make() // ->title('Invalid Material Invoice') // ->danger() // This makes the notification red to indicate an error // ->body('Uploaded Excel sheet is empty or
contains no valid data.') // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } // return; // } // $uniqueCodes = array_unique($materialCodes); // //itemNotFound // $matchedItems = StickerMaster::with('item') // ->whereHas('item', function ($query) use ($uniqueCodes) { // $query->whereIn('code', $uniqueCodes); // }) // ->get(); // $matchedCodes = $matchedItems->pluck('item.code')->toArray(); // $missingCodes = array_diff($uniqueCodes, $matchedCodes); // if (!empty($missingCodes)) // { // $missingCount = count($missingCodes); // $message = $missingCount > 10 ? "'$missingCount' item codes are not found in database." : 'The following item codes are not found in database:
' . implode(', ', $missingCodes); // Notification::make() // ->title('Unknown: Item Codes') // ->body($message) // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // return; // } // //plantNotFound // $matchedItems = StickerMaster::with('item') // ->whereHas('item', function ($query) use ($uniqueCodes, $plantId) { // $query->whereIn('code', $uniqueCodes)->where('plant_id', $plantId); // }) // ->get(); // $matchedCodes = $matchedItems->pluck('item.code')->toArray(); // $missingCodes = array_diff($uniqueCodes, $matchedCodes); // if (!empty($missingCodes)) // { // $missingCount = count($missingCodes); // $message = $missingCount > 10 ? "'$missingCount' item codes are not found in database for choosed plant." : 'The following item codes are not found in database for choosed plant:
' . implode(', ', $missingCodes); // Notification::make() // ->title('Unknown: Item Codes') // ->body($message) // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // return; // } // $invalidCodes = $matchedItems // ->filter(fn ($sticker) => empty($sticker->material_type)) //filter invalid // ->pluck('item.code') // ->toArray(); // if (!empty($invalidCodes)) // { // $missingCount = count($invalidCodes); // $message = $missingCount > 10 ? "'$missingCount' Serial Invoice item codes found." : "'Serial Invoice' item codes found:
" . implode(', ', $invalidCodes); // Notification::make() // ->title('Invalid: Item Codes') // ->body($message) // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // return; // } // $nonNumericQtyCodes = []; // $zeroQtyCodes = []; // $notDivisibleCodes = []; // foreach ($matchedItems as $sticker) // { // $code = $sticker->item->code; // $materialType = $sticker->material_type; // if ($materialType == 2) // { // $bundleQty = $sticker->bundle_quantity ?? 0; // $totalExcelQty = 0; // foreach ($rows as $index => $row) // { // if ($index == 0) continue; // Skip header // $excelCode = trim($row[0]); // $excelMatQty = trim($row[1]); // if (empty($excelCode) || empty($excelMatQty)) { // continue; // } // if ($excelCode == $code && is_numeric($excelMatQty)) { // $totalExcelQty += $excelMatQty; // Sum up the quantities // } // } // if ($totalExcelQty == 0) { // $zeroQtyCodes[] = $code; // } else if (!is_numeric($totalExcelQty)) { // $nonNumericQtyCodes[] = $code; // Here you may want to check divisibility condition too // } else if ($bundleQty != 0 && $totalExcelQty % $bundleQty != 0) { // $notDivisibleCodes[] = $code; // } // } // } // $showValidationNotification = function(array $codes, string $message) { // if (count($codes) == 0) return; // $uniqueCodes = array_unique($codes); // $codeList = implode(', ', $uniqueCodes); // Notification::make() // ->title('Invalid Bundle Quantity') // ->body("$message
$codeList") // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // }; // $showValidationNotification($nonNumericQtyCodes, "The following item codes contains invalid bundle quantity:"); // $showValidationNotification($zeroQtyCodes, "The following item codes quantity should be greater than '0':"); // $showValidationNotification($notDivisibleCodes, "The following item codes quantity is not divisible by bundle quantity."); // if ($nonNumericQtyCodes || $zeroQtyCodes || $notDivisibleCodes) { // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // return; // } // else // { // $inserted = 0; // foreach ($matchedItems as $sticker) // { // $code = $sticker->item->code; // $materialType = $sticker->material_type; // // $sticker = StickerMaster::where('plant_id', $plantId)->whereHas('item', function ($query) use ($code) { $query->where('plant_id', $this->plantId)->where('code', $code); })->first(); // if ($materialType == 1) // { // $totalExcelQty = 0; // foreach ($rows as $index => $row) // { // if ($index == 0) continue; // Skip header // $excelCode = trim($row[0]); // $excelMatQty = trim($row[1]); // if (empty($excelCode) || empty($excelMatQty)) { // continue; // } // if ($excelCode == $code && is_numeric($excelMatQty)) { // $totalExcelQty += $excelMatQty; // Sum up the quantities // } // } // for ($i = 0; $i < $totalExcelQty; $i++) // { // if ($sticker) { // SerialValidation::create([ // 'sticker_master_id' => $sticker->id, // 'plant_id' => $plantId, // 'invoice_number' => $invoiceNumber, // 'quantity' => 1, // 'operator_id'=> $operatorName, // ]); // $inserted++; // } // } // } // else if ($materialType == 2) // { // $bundleQty = $sticker->bundle_quantity; // $totalExcelQty = 0; // foreach ($rows as $index => $row) // { // if ($index == 0) continue; // Skip header // $excelCode = trim($row[0]); // $excelMatQty = trim($row[1]); // if (empty($excelCode) || empty($excelMatQty)) { // continue; // } // if ($excelCode == $code && is_numeric($excelMatQty)) { // $totalExcelQty += $excelMatQty; // Sum up the quantities // } // } // for ($i = 0; $i < ($totalExcelQty/$bundleQty); $i++) // { // if ($sticker) { // SerialValidation::create([ // 'sticker_master_id' => $sticker->id, // 'plant_id' => $plantId, // 'invoice_number' => $invoiceNumber, // 'quantity' => $bundleQty, // 'operator_id'=> $operatorName, // ]); // $inserted++; // } // } // } // else if ($materialType == 3) // { // $totalExcelQty = 0; // foreach ($rows as $index => $row) // { // if ($index == 0) continue; // Skip header // $excelCode = trim($row[0]); // $excelMatQty = trim($row[1]); // if (empty($excelCode) || empty($excelMatQty)) { // continue; // } // if ($excelCode == $code && is_numeric($excelMatQty)) { // $totalExcelQty += $excelMatQty; // Sum up the quantities // } // } // if ($sticker) { // SerialValidation::create([ // 'sticker_master_id' => $sticker->id, // 'plant_id' => $plantId, // 'invoice_number' => $invoiceNumber, // 'quantity' => $totalExcelQty, // 'operator_id'=> $operatorName, // ]); // $inserted++; // } // } // } // if ($inserted > 0) // { // Notification::make() // ->title("Start the scanning process!") // ->body("'$inserted' material invoice records were inserted.") // ->info() // // ->success() // ->seconds(1) // ->send(); // // Update total quantity in the form // $totalQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count(); // $scannedQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->whereNotNull('serial_number')->where('serial_number', '!=', '')->where('plant_id', $plantId)->count(); // $this->form->fill([ // 'plant_id' => $plantId, // 'invoice_number' => $invoiceNumber, // 'serial_number' => null, // 'total_quantity' => $totalQuantity, // 'scanned_quantity'=> $scannedQuantity, // ]); // if ($totalQuantity == $scannedQuantity) // { // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } // $this->dispatch('refreshCompletedInvoice', invoiceNumber: $invoiceNumber, plantId: $plantId, isSerial: false); // } // else // { // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // // $hasRecords = InvoiceValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->first()->stickerMasterRelation->material_type ?? null; // // $this->dispatch( (!empty($hasRecords) && $hasRecords) ? 'refreshMaterialInvoiceData' : 'refreshInvoiceData', invoiceNumber: $invoiceNumber, plantId: $plantId); //$this->invoiceNumber // $this->dispatch('refreshMaterialInvoiceData', invoiceNumber: $invoiceNumber, plantId: $plantId); // } // } // else // { // Notification::make() // ->title("Import Failed: Material Invoice") // ->body("No new records were inserted for Material Invoice: '$invoiceNumber'.") // ->danger() // ->seconds(3) // ->send(); // $totalQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count(); // $scannedQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->whereNotNull('serial_number')->where('serial_number', '!=', '')->where('plant_id', $plantId)->count(); // $this->form->fill([ // 'plant_id' => $plantId, // 'invoice_number' => $invoiceNumber, // 'serial_number' => null, // 'total_quantity' => $totalQuantity, // 'scanned_quantity'=> $scannedQuantity, // ]); // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // $this->dispatch('refreshEmptyInvoice', invoiceNumber: $invoiceNumber, plantId: $plantId); // return; // } // } // } // else if ($invoiceType == 'S') // { // $invalidMatCodes = []; // $materialCodes = []; // $missingSerials = []; // $invalidSerCodes = []; // $duplicateSerials = []; // $serialNumbers = []; // $validRowsFound = false; // foreach ($rows as $index => $row) // { // if ($index == 0) continue; // Skip header // $materialCode = trim($row[0]); // $serialNumber = trim($row[1]); // if (empty($materialCode) && empty($serialNumber)) { // continue; // } // if (!empty($materialCode)) { // if (Str::length($materialCode) < 6 || !ctype_alnum($materialCode)) // { // $invalidMatCodes[] = $materialCode; // continue; // } // else // { // if (empty($serialNumber)) { // $missingSerials[] = $materialCode; // } // else if (Str::length($serialNumber) < 9 || !ctype_alnum($serialNumber)) // { // $invalidSerCodes[] = $serialNumber; // } // else // { // if (in_array($serialNumber, $serialNumbers)) { // $duplicateSerials[] = $serialNumber; // } else { // $serialNumbers[] = $serialNumber; // $materialCodes[] = $materialCode; // $validRowsFound = true; // } // } // } // } // else // { // continue; // } // } // $uniqueInvalidCodes = array_unique($invalidMatCodes); // if (!empty($uniqueInvalidCodes)) { // Notification::make() // ->title('Invalid: Item Codes') // ->body('The following item codes should contain minimum 6 digit alpha numeric values:
' . implode(', ', $uniqueInvalidCodes)) // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // return; // } // $uniqueMissingSerials = array_unique($missingSerials); // if (!empty($uniqueMissingSerials)) { // Notification::make() // ->title('Missing Serial Numbers') // ->body("The following item codes doesn't have valid serial number:
" . implode(', ', $uniqueMissingSerials)) // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // return; // } // $uniqueInvalidSerCodes = array_unique($invalidSerCodes); // if (!empty($uniqueInvalidSerCodes)) { // Notification::make() // ->title('Invalid Serial Numbers') // ->body('The following serial numbers should contain minimum 9 digit alpha numeric values:
' . implode(', ', $uniqueInvalidSerCodes)) // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // return; // } // $uniqueDupSerCodes = array_unique($duplicateSerials); // if (!empty($uniqueDupSerCodes)) { // Notification::make() // ->title('Duplicate Serial Numbers') // ->body('The following serial numbers are already exist in invoice excel:
' . implode(', ', $uniqueDupSerCodes)) // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // return; // } // if (!$validRowsFound) { // Notification::make() // ->title('Invalid Serial Invoice') // ->danger() // This makes the notification red to indicate an error // ->body('Uploaded excel sheet is empty or
contains no valid data.') // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } // return; // } // $uniqueCodes = array_unique($materialCodes); // //itemNotFound // $matchedItems = StickerMaster::with('item') // ->whereHas('item', function ($query) use ($uniqueCodes) { // $query->whereIn('code', $uniqueCodes); // }) // ->get(); // // // Get all codes that exist in the database for the given plant_id // // $existingCodes = StickerMaster::where('plant_id', $plantId) // // ->whereHas('item', function ($query) use ($uniqueCodes) { // // $query->whereIn('code', $uniqueCodes); // // }) // // ->with('item') // Eager load for performance // // ->get() // // ->pluck('item.code') // // ->toArray(); // $matchedCodes = $matchedItems->pluck('item.code')->toArray(); // $missingCodes = array_diff($uniqueCodes, $matchedCodes); // if (!empty($missingCodes)) // { // $missingCount = count($missingCodes); // $message = $missingCount > 10 ? "'$missingCount' item codes are not found in database." : 'The following item codes are not found in database:
' . implode(', ', $missingCodes); // Notification::make() // ->title('Unknown: Item Codes') // ->body($message) // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // return; // } // //plantNotFound // $matchedItems = StickerMaster::with('item') // ->whereHas('item', function ($query) use ($uniqueCodes, $plantId) { // $query->whereIn('code', $uniqueCodes)->where('plant_id', $plantId); // }) // ->get(); // $matchedCodes = $matchedItems->pluck('item.code')->toArray(); // $missingCodes = array_diff($uniqueCodes, $matchedCodes); // if (!empty($missingCodes)) // { // $missingCount = count($missingCodes); // $message = $missingCount > 10 ? "'$missingCount' item codes are not found in database for choosed plant." : 'The following item codes are not found in database for choosed plant:
' . implode(', ', $missingCodes); // Notification::make() // ->title('Unknown: Item Codes') // ->body($message) // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // return; // } // $invalidCodes = $matchedItems // ->filter(fn ($sticker) => !empty($sticker->material_type)) //filter invalid // ->pluck('item.code') // ->toArray(); // if (!empty($invalidCodes)) // { // $missingCount = count($invalidCodes); // $message = $missingCount > 10 ? "'$missingCount' Material Invoice item codes found." : "'Material Invoice' item codes found:
" . implode(', ', $invalidCodes); // Notification::make() // ->title('Invalid: Item Codes') // ->body($message) // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // return; // } // // $missPackCodes = $matchedItems // // ->filter(fn ($sticker) => empty($sticker->tube_sticker_motor) && empty($sticker->pack_slip_motor) && empty($sticker->tube_sticker_pump) && empty($sticker->pack_slip_pump) && empty($sticker->tube_sticker_pumpset) && empty($sticker->pack_slip_pumpset) && empty($sticker->panel_box_code)) // // ->pluck('item.code') // // ->toArray(); // $missPackCodes = $matchedItems // ->filter(fn ($sticker) => empty($sticker->pack_slip_motor) && empty($sticker->pack_slip_pump) && empty($sticker->pack_slip_pumpset) && empty($sticker->panel_box_code)) // ->pluck('item.code') // ->toArray(); // if (!empty($missPackCodes)) // { // $missingCount = count($missPackCodes); // $message = $missingCount > 10 ? "'$missingCount' item codes doesn't have valid package type to proceed!" : "The following 'Item Code' doesn't have valid package type:
" . implode(', ', $missPackCodes); // Notification::make() // ->title('Invalid: Item Codes') // ->body($message) // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // return; // } // $existingSerialNumbers = SerialValidation::whereIn('serial_number', $serialNumbers)->where('plant_id', $plantId)->pluck('serial_number')->toArray(); // // If there are duplicates, notify and stop the process // if (!empty($existingSerialNumbers)) { // Notification::make() // ->title('Duplicate Serial Numbers') // ->body('The following serial numbers are already exist in database:
' . implode(', ', $existingSerialNumbers)) // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // return; // } // $inserted = 0; // foreach ($rows as $index => $row) // { // if ($index == 0) continue; // $materialCode = trim($row[0]); // $serialNumber = trim($row[1]); // if (empty($materialCode) || empty($serialNumber)) { // continue; // } // $sticker = StickerMaster::where('plant_id', $plantId)->whereHas('item', function ($query) use ($materialCode) { // $query->where('plant_id', $this->plantId)->where('code', $materialCode); //Check if item.code matches Excel's materialCode // })->first(); // if ($sticker) { // SerialValidation::create([ // 'sticker_master_id' => $sticker->id, // 'plant_id' => $plantId, // 'invoice_number' => $invoiceNumber, // 'serial_number' => $serialNumber, // 'operator_id'=> $operatorName, // ]); // $inserted++; // } // } // if ($inserted > 0) // { // Notification::make() // ->title("Start the scanning process!") // ->body("'$inserted' serial invoice records were inserted.") // ->info() // // ->success() // ->seconds(1) // ->send(); // $this->dispatch('playNotificationSound'); // // Update total quantity in the form // $totalQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count(); // $scannedQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->where('scanned_status', 'Scanned')->where('plant_id', $plantId)->count(); // $this->form->fill([ // 'plant_id' => $plantId, // 'invoice_number' => $invoiceNumber, // 'serial_number' => null, // 'total_quantity' => $totalQuantity, // 'scanned_quantity'=> $scannedQuantity, // ]); // if ($totalQuantity == $scannedQuantity) // { // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } // $this->dispatch('refreshCompletedInvoice', invoiceNumber: $invoiceNumber, plantId: $plantId, isSerial: true); // } // else // { // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // // $hasRecords = InvoiceValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->first()->stickerMasterRelation->material_type ?? null; // // $this->dispatch( (!empty($hasRecords) && $hasRecords) ? 'refreshMaterialInvoiceData' : 'refreshInvoiceData', invoiceNumber: $invoiceNumber, plantId: $plantId); //$this->invoiceNumber // $this->dispatch('refreshInvoiceData', invoiceNumber: $invoiceNumber, plantId: $plantId); // } // } // else // { // Notification::make() // ->title("Import Failed: Serial Invoice") // ->body("No new records were inserted for Serial Invoice : '$invoiceNumber'.") // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // $totalQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count(); // $scannedQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->where('scanned_status', 'Scanned')->where('plant_id', $plantId)->count(); // $this->form->fill([ // 'plant_id' => $plantId, // 'invoice_number' => $invoiceNumber, // 'serial_number' => null, // 'total_quantity' => $totalQuantity, // 'scanned_quantity'=> $scannedQuantity, // ]); // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // $this->dispatch('refreshEmptyInvoice', invoiceNumber: $invoiceNumber, plantId: $plantId); // return; // } // } // else // { // Notification::make() // ->title('Invoice Type Not Found') // ->body("Import the valid 'Invoice' file to proceed..!") // ->danger() // ->seconds(3) // ->send(); // $this->dispatch('playWarnSound'); // // if ($disk->exists($filePath)) { // // $disk->delete($filePath); // // } // return; // } // } // } public function processInvoice($invoiceNumber) { $invoiceNumber = trim($invoiceNumber); $parts = explode('.', $invoiceNumber); $this->showCapacitorInput = false; $user = Filament::auth()->user(); $operatorName = $user->name; $plantId = $this->form->getState()['plant_id']; $this->plantId = $plantId; $plant = Plant::find($plantId); $plantCode = $plant?->code ?? null; // ..GET SERIAL INVOICE API if (strlen($invoiceNumber) > 15) { $payloadJson = base64_decode(strtr($parts[1], '-_', '+/')); if (empty($payloadJson)) { Notification::make() ->title('Invalid payload for scanned qr code.') ->danger() ->seconds(1) ->send(); return; } $payload = json_decode($payloadJson, true); if (! isset($payload['data'])) { Notification::make() ->title('Invalid payload for scanned qr code.') ->info() ->seconds(1) ->send(); return; } $documentData = $payload['data']; if ($documentData == '' || $documentData == '') { Notification::make() ->title('Invalid payload for scanned qr code.') ->info() ->seconds(1) ->send(); return; } // Extract DocNo preg_match('/"DocNo"\s*:\s*"([^"]+)"/', $documentData, $matches); if (! isset($matches[1])) { Notification::make() ->title('Invoice number not found.') ->info() ->seconds(1) ->send(); return; } if (isset($matches[1])) { $invoiceNumber = strtoupper($matches[1]); } } else { $invoiceNumber = strtoupper($invoiceNumber); } $updateStatus = $this->form->getState()['update_invoice'] ?? null; $this->invoiceNumber = strtoupper(trim($this->form->getState()['invoice_number'])) ?? $invoiceNumber; $invoiceType = null; // $this->invoiceNumber = $this->invoiceNumber ?? $invoiceNumber; $invoiceExist = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->exists(); if (! $invoiceExist) { Notification::make() ->title('New invoice detected.') ->info() ->seconds(1) ->send(); $this->dispatch('playNotificationSound'); $this->form->fill([ 'plant_id' => $plantId, 'invoice_number' => $invoiceNumber, 'serial_number' => null, 'total_quantity' => 0, 'scanned_quantity' => 0, ]); $this->dispatch('refreshEmptyInvoice', invoiceNumber: $invoiceNumber, plantId: $plantId); } else { $totQuan = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count(); $scanSQuan = SerialValidation::where('invoice_number', $invoiceNumber)->where('scanned_status', 'Scanned')->where('plant_id', $plantId)->count(); $totMQuan = SerialValidation::where('invoice_number', $invoiceNumber)->whereNotNull('quantity')->where('plant_id', $plantId)->count(); // ->where('quantity', '!=', '') $scanMQuan = SerialValidation::where('invoice_number', $invoiceNumber)->whereNotNull('serial_number')->where('serial_number', '!=', '')->where('plant_id', $plantId)->count(); if ($totMQuan > 0) { $this->form->fill([ 'plant_id' => $plantId, 'invoice_number' => $invoiceNumber, 'serial_number' => null, 'total_quantity' => $totQuan, 'scanned_quantity' => $scanMQuan, ]); if ($totQuan == $scanMQuan) { Notification::make() ->title('Completed: Material Invoice') ->body("Material invoice '$invoiceNumber' completed the scanning process.
Scan the next 'Material Invoice' to proceed!") ->warning() ->seconds(2) ->send(); $this->dispatch('playNotificationSound'); $filename = $invoiceNumber.'.xlsx'; $directory = "uploads/temp/{$plantCode}"; $disk = Storage::disk('local'); $filePath = $directory.'/'.$filename; // $fullPath = null; if ($disk->exists($filePath)) { // $fullPath = $disk->path($filePath); $disk->delete($filePath); } $this->form->fill([ 'plant_id' => $plantId, 'invoice_number' => null, 'serial_number' => null, 'total_quantity' => 0, 'update_invoice' => false, 'scanned_quantity' => 0, ]); $this->dispatch('refreshCompletedInvoice', invoiceNumber: $invoiceNumber, plantId: $plantId, isSerial: false); } else { Notification::make() ->title('Start the scanning process!') ->info() ->seconds(1) ->send(); $this->dispatch('playNotificationSound'); // $hasRecords = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->first()->stickerMasterRelation->material_type ?? null; // $this->dispatch( (!empty($hasRecords) && $hasRecords) ? 'refreshMaterialInvoiceData' : 'refreshInvoiceData', invoiceNumber: $invoiceNumber, plantId: $plantId, onCapFocus: false); //$this->invoiceNumber $this->dispatch('refreshMaterialInvoiceData', invoiceNumber: $invoiceNumber, plantId: $plantId); if ($updateStatus == '1') { // 'Material invoice update in progress...'; $filename = $invoiceNumber.'.xlsx'; $directory = "uploads/temp/{$plantCode}"; $disk = Storage::disk('local'); $filePath = $directory.'/'.$filename; $fullPath = $disk->path($filePath); if ($fullPath && file_exists($fullPath)) { // Now you can read/process the file here $rows = Excel::toArray(null, $fullPath)[0]; if ((count($rows) - 1) <= 0) { Notification::make() ->title('Records Not Found') ->body("Import the valid updated 'Material Invoice' file to proceed..!") ->danger() ->seconds(2) ->send(); $this->dispatch('playWarnSound'); if ($disk->exists($filePath)) { $disk->delete($filePath); } return; } $invalidMatCodes = []; $materialCodes = []; $missingQuantities = []; $invalidMatQuan = []; $hasQuanTypIds = []; $validRowsFound = false; foreach ($rows as $index => $row) { if ($index == 0) { continue; } // Skip header $materialCode = trim($row[0]); $materialQuantity = trim($row[1]); if (empty($materialCode) && empty($materialQuantity)) { continue; } if (! empty($materialCode)) { if (Str::length($materialCode) < 6 || ! ctype_alnum($materialCode)) { $invalidMatCodes[] = $materialCode; } else { if (empty($materialQuantity)) { $missingQuantities[] = $materialCode; } elseif (! is_numeric($materialQuantity)) { $invalidMatQuan[] = $materialCode; } elseif ($materialQuantity == 0) { $invalidMatQuan[] = $materialCode; } else { $materialCodes[] = $materialCode; $validRowsFound = true; } } } else { continue; } } $uniqueInvalidCodes = array_unique($invalidMatCodes); if (! empty($uniqueInvalidCodes)) { Notification::make() ->title('Invalid: Item Codes') ->body('The following item codes should contain minimum 6 digit alpha numeric values:
'.implode(', ', $uniqueInvalidCodes)) ->danger() ->seconds(2) ->send(); $this->dispatch('playWarnSound'); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } return; } $uniqueMissingQuanCodes = array_unique($missingQuantities); if (! empty($uniqueMissingQuanCodes)) { Notification::make() ->title('Missing Material Quantity') ->body("The following item codes doesn't have valid material quantity:
".implode(', ', $uniqueMissingQuanCodes)) ->danger() ->seconds(2) ->send(); $this->dispatch('playWarnSound'); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } return; } $uniqueInvalidMatQuan = array_unique($invalidMatQuan); if (! empty($uniqueInvalidMatQuan)) { Notification::make() ->title('Invalid Material Quantity') ->body("The following item codes doesn't have valid material quantity:
".implode(', ', $uniqueInvalidMatQuan)) ->danger() ->seconds(2) ->send(); $this->dispatch('playWarnSound'); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } return; } if (! $validRowsFound) { Notification::make() ->title('Invalid Material Invoice') ->danger() // This makes the notification red to indicate an error ->body('Uploaded Excel sheet is empty or
contains no valid data.') ->seconds(2) ->send(); $this->dispatch('playWarnSound'); if ($disk->exists($filePath)) { $disk->delete($filePath); } return; } $uniqueCodes = array_unique($materialCodes); // itemNotFound $matchedItems = StickerMaster::with('item') ->whereHas('item', function ($query) use ($uniqueCodes) { $query->whereIn('code', $uniqueCodes); }) ->get(); $matchedCodes = $matchedItems->pluck('item.code')->toArray(); $missingCodes = array_diff($uniqueCodes, $matchedCodes); if (! empty($missingCodes)) { $missingCount = count($missingCodes); $message = $missingCount > 10 ? "'$missingCount' item codes are not found in database." : 'The following item codes are not found in database:
'.implode(', ', $missingCodes); Notification::make() ->title('Unknown: Item Codes') ->body($message) ->danger() ->seconds(2) ->send(); $this->dispatch('playWarnSound'); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } return; } // plantNotFound $matchedItems = StickerMaster::with('item') ->whereHas('item', function ($query) use ($uniqueCodes, $plantId) { $query->whereIn('code', $uniqueCodes)->where('plant_id', $plantId); }) ->get(); $matchedCodes = $matchedItems->pluck('item.code')->toArray(); $missingCodes = array_diff($uniqueCodes, $matchedCodes); if (! empty($missingCodes)) { $missingCount = count($missingCodes); $message = $missingCount > 10 ? "'$missingCount' item codes are not found in database for choosed plant." : 'The following item codes are not found in database for choosed plant:
'.implode(', ', $missingCodes); Notification::make() ->title('Unknown: Item Codes') ->body($message) ->danger() ->seconds(2) ->send(); $this->dispatch('playWarnSound'); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } return; } $invalidCodes = $matchedItems ->filter(fn ($sticker) => empty($sticker->material_type)) // filter invalid ->pluck('item.code') ->toArray(); if (! empty($invalidCodes)) { $missingCount = count($invalidCodes); $message = $missingCount > 10 ? "'$missingCount' Serial Invoice item codes found." : "'Serial Invoice' item codes found:
".implode(', ', $invalidCodes); Notification::make() ->title('Invalid: Item Codes') ->body($message) ->danger() ->seconds(2) ->send(); $this->dispatch('playWarnSound'); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } return; } $nonNumericQtyCodes = []; $zeroQtyCodes = []; $notDivisibleCodes = []; $hasQuanTyp = false; foreach ($matchedItems as $sticker) { $code = $sticker->item->code; $materialType = $sticker->material_type; if ($materialType == 2) { $bundleQty = $sticker->bundle_quantity ?? 0; $totalExcelQty = 0; foreach ($rows as $index => $row) { if ($index == 0) { continue; } // Skip header $excelCode = trim($row[0]); $excelMatQty = trim($row[1]); if (empty($excelCode) || empty($excelMatQty)) { continue; } if ($excelCode == $code && is_numeric($excelMatQty)) { $totalExcelQty += $excelMatQty; // Sum up the quantities } } if ($totalExcelQty == 0) { $zeroQtyCodes[] = $code; } elseif (! is_numeric($totalExcelQty)) { $nonNumericQtyCodes[] = $code; // Here you may want to check divisibility condition too } elseif ($bundleQty != 0 && $totalExcelQty % $bundleQty != 0) { $notDivisibleCodes[] = $code; } } elseif ($materialType == 3) { $hasQuanTyp = true; $hasQuanTypIds[] = $sticker->id; } } $showValidationNotification = function (array $codes, string $message) { if (count($codes) == 0) { return; } $uniqueCodes = array_unique($codes); $codeList = implode(', ', $uniqueCodes); Notification::make() ->title('Invalid Bundle Quantity') ->body("$message
$codeList") ->danger() ->seconds(2) ->send(); $this->dispatch('playWarnSound'); }; $showValidationNotification($nonNumericQtyCodes, 'The following item codes contains invalid bundle quantity:'); $showValidationNotification($zeroQtyCodes, "The following item codes quantity should be greater than '0':"); $showValidationNotification($notDivisibleCodes, 'The following item codes quantity is not divisible by bundle quantity.'); if ($nonNumericQtyCodes || $zeroQtyCodes || $notDivisibleCodes) { // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } return; } else { $oldQuan = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count(); $newQuan = -1; $inserted = 0; foreach ($matchedItems as $sticker) { if ($newQuan == -1 && ! $hasQuanTyp) { SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->where(function ($query) { $query->whereNull('serial_number')->orWhere('serial_number', ''); }) ->forceDelete(); // ->delete(); $newQuan = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count(); } elseif ($newQuan == -1 && $hasQuanTyp) { SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->where(function ($query) { $query->whereNull('serial_number')->orWhere('serial_number', ''); })->whereNotIn('sticker_master_id', $hasQuanTypIds) ->forceDelete(); // ->delete(); $newQuan = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count(); } $code = $sticker->item->code; $materialType = $sticker->material_type; // $sticker = StickerMaster::where('plant_id', $plantId)->whereHas('item', function ($query) use ($code) { $query->where('plant_id', $this->plantId)->where('code', $code); })->first(); if ($materialType == 1 || $materialType == 4) { $totalExcelQty = 0; foreach ($rows as $index => $row) { if ($index == 0) { continue; } // Skip header $excelCode = trim($row[0]); $excelMatQty = trim($row[1]); if (empty($excelCode) || empty($excelMatQty)) { continue; } if ($excelCode == $code && is_numeric($excelMatQty)) { $totalExcelQty += $excelMatQty; // Sum up the quantities } } $existQty = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->where('sticker_master_id', $sticker->id)->count(); if ($existQty < $totalExcelQty) { $newQty = $totalExcelQty - $existQty; for ($i = 0; $i < $newQty; $i++) { if ($sticker) { SerialValidation::create([ 'sticker_master_id' => $sticker->id, 'plant_id' => $plantId, 'invoice_number' => $invoiceNumber, 'quantity' => 1, 'operator_id' => $operatorName, 'created_by' => $operatorName, ]); $inserted++; } } } } elseif ($materialType == 2) { $bundleQty = $sticker->bundle_quantity; $totalExcelQty = 0; foreach ($rows as $index => $row) { if ($index == 0) { continue; } // Skip header $excelCode = trim($row[0]); $excelMatQty = trim($row[1]); if (empty($excelCode) || empty($excelMatQty)) { continue; } if ($excelCode == $code && is_numeric($excelMatQty)) { $totalExcelQty += $excelMatQty; // Sum up the quantities } } $existQty = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->where('sticker_master_id', $sticker->id)->count(); // for ($i = 0; $i < ($totalExcelQty/$bundleQty); $i++) $newTotQty = $totalExcelQty / $bundleQty; if ($existQty < $newTotQty) { $newQty = $newTotQty - $existQty; for ($i = 0; $i < $newQty; $i++) { if ($sticker) { SerialValidation::create([ 'sticker_master_id' => $sticker->id, 'plant_id' => $plantId, 'invoice_number' => $invoiceNumber, 'quantity' => $bundleQty, 'operator_id' => $operatorName, 'created_by' => $operatorName, ]); $inserted++; } } } } elseif ($materialType == 3) { $totalExcelQty = 0; foreach ($rows as $index => $row) { if ($index == 0) { continue; } // Skip header $excelCode = trim($row[0]); $excelMatQty = trim($row[1]); if (empty($excelCode) || empty($excelMatQty)) { continue; } if ($excelCode == $code && is_numeric($excelMatQty)) { $totalExcelQty += $excelMatQty; } } $existEmpRecQty = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->where(function ($query) { $query->whereNull('serial_number')->orWhere('serial_number', ''); })->where('sticker_master_id', $sticker->id)->first(); $existEmpQty = $existEmpRecQty ? $existEmpRecQty->quantity : 0; $existComQty = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->where(function ($query) { $query->whereNotNull('serial_number')->where('serial_number', '!=', ''); }) ->where('sticker_master_id', $sticker->id) ->sum(column: 'quantity'); $existComQty = $existComQty ? $existComQty : 0; // 8 = 3 + 5 // 8 = 5 + 3 // 8 = 0 + 8 // 8 = 8 + 0 // 8 = 3 + 5 // 8 = 5 + 3 // 8 = 0 + 8 // 8 = 8 + 0 // 0 = 0 + 0 $existQty = $existEmpQty + $existComQty; // 8 <= 11 // 8 <= 8 // 8 <= 11 // 8 <= 9 // 8 <= 7 // 8 <= 7 // 8 <= 7 // 8 <= 7 // 0 <= 5 if ($existQty <= $totalExcelQty) { // 6 = 11 - 5 // 5 = 8 - 3 // 3 = 11 - 8 // 9 = 9 - 0 // 5 = 5 - 0 $newInsQty = $totalExcelQty - $existComQty; // 3 > 0 // 5 > 0 // 0 > 0 // 8 > 0 // 0 > 0 if ($existEmpQty > 0) { // update // 3 = 6 // 5 = 5 // 0 = 3 // 8 = 9 // 0 = 5 if ($existEmpQty == $newInsQty) { continue; } // $existEmpRecQty->delete(); $existEmpRecQty->update([ 'quantity' => $newInsQty, 'operator_id' => $operatorName, 'updated_at' => now(), ]); $newQuan--; $inserted++; } elseif ($newInsQty > 0) { // if ($sticker) // create SerialValidation::create([ 'sticker_master_id' => $sticker->id, 'plant_id' => $plantId, 'invoice_number' => $invoiceNumber, 'quantity' => $newInsQty, 'operator_id' => $operatorName, 'created_by' => $operatorName, ]); $inserted++; } } // 8 > 7 // 8 > 7 // 8 > 7 // 8 > 7 else { // 2 = 7 - 5 // 4 = 7 - 3 // -1 = 7 - 8 // 7 = 7 - 0 $newInsQty = $totalExcelQty - $existComQty; // 3 > 0 // 5 > 0 // 0 > 0 // 8 > 0 if ($existEmpQty > 0) { // update // 3 = 2 // 5 = 4 // 0 = -1 // 8 = 7 if ($existEmpQty == $newInsQty) { continue; } // $existEmpRecQty->delete(); $existEmpRecQty->update([ 'quantity' => $newInsQty, 'operator_id' => $operatorName, 'updated_at' => now(), ]); $newQuan--; $inserted++; } elseif ($newInsQty > 0) { // create SerialValidation::create([ 'sticker_master_id' => $sticker->id, 'plant_id' => $plantId, 'invoice_number' => $invoiceNumber, 'quantity' => $newInsQty, 'operator_id' => $operatorName, 'created_by' => $operatorName, ]); $inserted++; } } } } if ($inserted > 0 || $oldQuan != $newQuan) { Notification::make() ->title('Material invoice successfully updated.') ->success() ->seconds(1) ->send(); Notification::make() ->title('Start the scanning process!') ->body("'$inserted' new material invoice records were inserted.") ->info() // ->success() ->seconds(1) ->send(); $this->dispatch('playNotificationSound'); SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->update(['updated_by' => $operatorName]); // 'updated_at' => now(), // Update total quantity in the form $totalQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count(); $scannedQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->whereNotNull('serial_number')->where('serial_number', '!=', '')->where('plant_id', $plantId)->count(); $this->form->fill([ 'plant_id' => $plantId, 'invoice_number' => $invoiceNumber, 'serial_number' => null, 'total_quantity' => $totalQuantity, 'scanned_quantity' => $scannedQuantity, ]); if ($totalQuantity == $scannedQuantity) { if ($disk->exists($filePath)) { $disk->delete($filePath); } $this->dispatch('refreshCompletedInvoice', invoiceNumber: $invoiceNumber, plantId: $plantId, isSerial: false); } else { // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } $this->dispatch('refreshMaterialInvoiceData', invoiceNumber: $invoiceNumber, plantId: $plantId); } } else { Notification::make() ->title('Update Failed: Material Invoice') ->body("No new records were inserted for Material Invoice : '$invoiceNumber'.") ->danger() ->seconds(2) ->send(); $this->dispatch('playWarnSound'); $totalQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count(); $scannedQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->whereNotNull('serial_number')->where('serial_number', '!=', '')->where('plant_id', $plantId)->count(); $this->form->fill([ 'plant_id' => $plantId, 'invoice_number' => $invoiceNumber, 'serial_number' => null, 'total_quantity' => $totalQuantity, 'scanned_quantity' => $scannedQuantity, ]); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } $this->dispatch('refreshEmptyInvoice', invoiceNumber: $invoiceNumber, plantId: $plantId); return; } } } else { Notification::make() ->title('Updated Invoice Not Found') ->body("Import the updated 'Material Invoice' file to proceed..!") ->danger() ->seconds(2) ->send(); $this->dispatch('playWarnSound'); $this->form->fill([ 'plant_id' => $plantId, 'invoice_number' => $invoiceNumber, 'serial_number' => null, 'total_quantity' => 0, 'scanned_quantity' => 0, ]); $this->dispatch('refreshEmptyInvoice', invoiceNumber: $invoiceNumber, plantId: $plantId); return; } } } return; } else { $this->form->fill([ 'plant_id' => $plantId, 'invoice_number' => $invoiceNumber, 'serial_number' => null, 'total_quantity' => $totQuan, 'scanned_quantity' => $scanSQuan, ]); // $hasRecords = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->first()->stickerMasterRelation->material_type ?? null; // $this->dispatch('refreshInvoiceData', invoiceNumber: $invoiceNumber, plantId: $plantId, onCapFocus: false); if ($totQuan == $scanSQuan) { Notification::make() ->title('Completed: Serial Invoice') ->body("Serial invoice '$invoiceNumber' completed the scanning process.
Scan the next 'Serial Invoice' to proceed..!") ->warning() ->seconds(3) ->send(); $this->dispatch('playNotificationSound'); $filename = $invoiceNumber.'.xlsx'; $directory = "uploads/temp/{$plantCode}"; $disk = Storage::disk('local'); $filePath = $directory.'/'.$filename; // $fullPath = null; if ($disk->exists($filePath)) { // $fullPath = $disk->path($filePath); $disk->delete($filePath); } $this->form->fill([ 'plant_id' => $plantId, 'invoice_number' => null, 'serial_number' => null, 'total_quantity' => 0, 'update_invoice' => false, 'scanned_quantity' => 0, ]); $this->dispatch('refreshCompletedInvoice', invoiceNumber: $invoiceNumber, plantId: $plantId, isSerial: true); } else { Notification::make() ->title('Start the scanning process!') ->info() ->seconds(1) ->send(); $this->dispatch('playNotificationSound'); $this->dispatch('refreshInvoiceData', invoiceNumber: $invoiceNumber, plantId: $plantId, onCapFocus: false); if ($updateStatus == '1') { $filename = $invoiceNumber.'.xlsx'; $directory = "uploads/temp/{$plantCode}"; $disk = Storage::disk('local'); $filePath = $directory.'/'.$filename; $fullPath = $disk->path($filePath); // Check if file exists //if ($disk->exists($filePath)) if ($fullPath && file_exists($fullPath)) { // /home/iot-dev/projects/pds/storage/app/private/uploads/temp/{$plantCode}/3RA0018735.xlsx // 'Serial invoice update in progress...' // Now you can read/process the file here $rows = Excel::toArray(null, $fullPath)[0]; if ((count($rows) - 1) <= 0) { Notification::make() ->title('Records Not Found') ->body("Import the valid updated 'Serial Invoice' file to proceed..!") ->danger() ->seconds(3) ->send(); $this->dispatch('playWarnSound'); if ($disk->exists($filePath)) { $disk->delete($filePath); } return; } $invalidMatCodes = []; $materialCodes = []; $missingSerials = []; $invalidSerCodes = []; $duplicateSerials = []; $serialNumbers = []; $validRowsFound = false; foreach ($rows as $index => $row) { if ($index == 0) { continue; } // Skip header $materialCode = trim($row[0]); $serialNumber = trim($row[1]); if (empty($materialCode) && empty($serialNumber)) { continue; } if (! empty($materialCode)) { if (Str::length($materialCode) < 6 || ! ctype_alnum($materialCode)) { $invalidMatCodes[] = $materialCode; continue; } else { if (empty($serialNumber)) { $missingSerials[] = $materialCode; } elseif (Str::length($serialNumber) < 9 || ! ctype_alnum($serialNumber)) { $invalidSerCodes[] = $serialNumber; } else { if (in_array($serialNumber, $serialNumbers)) { $duplicateSerials[] = $serialNumber; } else { $serialNumbers[] = $serialNumber; $materialCodes[] = $materialCode; $validRowsFound = true; } } } } else { continue; } } $uniqueInvalidCodes = array_unique($invalidMatCodes); if (! empty($uniqueInvalidCodes)) { Notification::make() ->title('Invalid: Item Codes') ->body('The following item codes should contain minimum 6 digit alpha numeric values:
'.implode(', ', $uniqueInvalidCodes)) ->danger() ->seconds(3) ->send(); $this->dispatch('playWarnSound'); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } return; } $uniqueMissingSerials = array_unique($missingSerials); if (! empty($uniqueMissingSerials)) { Notification::make() ->title('Missing Serial Numbers') ->body("The following item codes doesn't have valid serial number:
".implode(', ', $uniqueMissingSerials)) ->danger() ->seconds(3) ->send(); $this->dispatch('playWarnSound'); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } return; } $uniqueInvalidSerCodes = array_unique($invalidSerCodes); if (! empty($uniqueInvalidSerCodes)) { Notification::make() ->title('Invalid Serial Numbers') ->body('The following serial numbers should contain minimum 9 digit alpha numeric values:
'.implode(', ', $uniqueInvalidSerCodes)) ->danger() ->seconds(3) ->send(); $this->dispatch('playWarnSound'); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } return; } $uniqueDupSerCodes = array_unique($duplicateSerials); if (! empty($uniqueDupSerCodes)) { Notification::make() ->title('Duplicate Serial Numbers') ->body('The following serial numbers are already exist in invoice excel:
'.implode(', ', $uniqueDupSerCodes)) ->danger() ->seconds(3) ->send(); $this->dispatch('playWarnSound'); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } return; } if (! $validRowsFound) { Notification::make() ->title('Invalid Serial Invoice') ->danger() // This makes the notification red to indicate an error ->body('Uploaded excel sheet is empty or
contains no valid data.') ->seconds(3) ->send(); $this->dispatch('playWarnSound'); if ($disk->exists($filePath)) { $disk->delete($filePath); } return; } $uniqueCodes = array_unique($materialCodes); // itemNotFound $matchedItems = StickerMaster::with('item') ->whereHas('item', function ($query) use ($uniqueCodes) { $query->whereIn('code', $uniqueCodes); }) ->get(); $matchedCodes = $matchedItems->pluck('item.code')->toArray(); $missingCodes = array_diff($uniqueCodes, $matchedCodes); if (! empty($missingCodes)) { $missingCount = count($missingCodes); $message = $missingCount > 10 ? "'$missingCount' item codes are not found in database." : 'The following item codes are not found in database:
'.implode(', ', $missingCodes); // ->where('plant_id', $plantId) Notification::make() ->title('Unknown: Item Codes') ->body($message) ->danger() ->seconds(3) ->send(); $this->dispatch('playWarnSound'); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } return; } // plantNotFound $matchedItems = StickerMaster::with('item') ->whereHas('item', function ($query) use ($uniqueCodes, $plantId) { $query->whereIn('code', $uniqueCodes)->where('plant_id', $plantId); }) ->get(); $matchedCodes = $matchedItems->pluck('item.code')->toArray(); $missingCodes = array_diff($uniqueCodes, $matchedCodes); if (! empty($missingCodes)) { $missingCount = count($missingCodes); $message = $missingCount > 10 ? "'$missingCount' item codes are not found in database for choosed plant." : 'The following item codes are not found in database for choosed plant:
'.implode(', ', $missingCodes); Notification::make() ->title('Unknown: Item Codes') ->body($message) ->danger() ->seconds(3) ->send(); $this->dispatch('playWarnSound'); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } return; } $invalidCodes = $matchedItems ->filter(fn ($sticker) => ! empty($sticker->material_type)) // filter invalid ->pluck('item.code') ->toArray(); if (! empty($invalidCodes)) { $missingCount = count($invalidCodes); $message = $missingCount > 10 ? "'$missingCount' Material Invoice item codes found." : "'Material Invoice' item codes found:
".implode(', ', $invalidCodes); Notification::make() ->title('Invalid: Item Codes') ->body($message) ->danger() ->seconds(3) ->send(); $this->dispatch('playWarnSound'); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } return; } $missPackCodes = $matchedItems ->filter(fn ($sticker) => empty($sticker->tube_sticker_motor) && empty($sticker->pack_slip_motor) && empty($sticker->tube_sticker_pump) && empty($sticker->pack_slip_pump) && empty($sticker->tube_sticker_pumpset) && empty($sticker->pack_slip_pumpset) && empty($sticker->panel_box_code)) // filter invalid ->pluck('item.code') ->toArray(); if (! empty($missPackCodes)) { $missingCount = count($missPackCodes); $message = $missingCount > 10 ? "'$missingCount' item codes doesn't have valid package type to proceed!" : "The following 'Item Code' doesn't have valid package type:
".implode(', ', $missPackCodes); Notification::make() ->title('Invalid: Item Codes') ->body($message) ->danger() ->seconds(3) ->send(); $this->dispatch('playWarnSound'); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } return; } $oldQuan = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count(); $newQuan = 0; $inserted = 0; foreach ($rows as $index => $row) { if ($index == 0) { // Skip header; SerialValidation::where('invoice_number', $invoiceNumber) ->where(function ($query) { $query->whereNull('motor_scanned_status')->orWhere('motor_scanned_status', ''); }) ->where(function ($query) { $query->whereNull('pump_scanned_status')->orWhere('pump_scanned_status', ''); }) ->where(function ($query) { $query->whereNull('capacitor_scanned_status')->orWhere('capacitor_scanned_status', ''); }) ->where(function ($query) { $query->whereNull('scanned_status_set')->orWhere('scanned_status_set', ''); }) ->where(function ($query) { $query->whereNull('scanned_status')->orWhere('scanned_status', ''); }) ->forceDelete(); // ->delete(); $newQuan = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count(); continue; } $materialCode = trim($row[0]); $serialNumber = trim($row[1]); if (empty($materialCode) || empty($serialNumber)) { continue; } $sNoExist = SerialValidation::where('serial_number', $serialNumber)->where('plant_id', $plantId)->exists(); // ->pluck('serial_number') if ($sNoExist) { continue; } $sticker = StickerMaster::where('plant_id', $plantId)->whereHas('item', function ($query) use ($materialCode) { $query->where('plant_id', $this->plantId)->where('code', $materialCode); // Check if item.code matches Excel's materialCode })->first(); if ($sticker) { SerialValidation::create([ 'sticker_master_id' => $sticker->id, 'plant_id' => $plantId, 'invoice_number' => $invoiceNumber, 'serial_number' => $serialNumber, 'operator_id' => $operatorName, 'created_by' => $operatorName, ]); $inserted++; } } if ($inserted > 0 || $oldQuan != $newQuan) { Notification::make() ->title('Serial invoice successfully updated.') ->success() ->seconds(1) ->send(); Notification::make() ->title('Start the scanning process!') ->body("'$inserted' new serial invoice records were inserted.") ->info() // ->success() ->seconds(1) ->send(); $this->dispatch('playNotificationSound'); SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->update(['updated_by' => $operatorName]); // 'updated_at' => now(), // Update total quantity in the form $totalQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count(); $scannedQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->where('scanned_status', 'Scanned')->where('plant_id', $plantId)->count(); $this->form->fill([ 'plant_id' => $plantId, 'invoice_number' => $invoiceNumber, 'serial_number' => null, 'total_quantity' => $totalQuantity, 'scanned_quantity' => $scannedQuantity, ]); if ($totalQuantity == $scannedQuantity) { if ($disk->exists($filePath)) { $disk->delete($filePath); } $this->dispatch('refreshCompletedInvoice', invoiceNumber: $invoiceNumber, plantId: $plantId, isSerial: true); } else { // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } // $hasRecords = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->first()->stickerMasterRelation->material_type ?? null; // $this->dispatch( (!empty($hasRecords) && $hasRecords) ? 'refreshMaterialInvoiceData' : 'refreshInvoiceData', invoiceNumber: $invoiceNumber, plantId: $plantId, onCapFocus: false); //$this->invoiceNumber $this->dispatch('refreshInvoiceData', invoiceNumber: $invoiceNumber, plantId: $plantId, onCapFocus: false); } } else { Notification::make() ->title('Update Failed: Serial Invoice') ->body("No new records were inserted for Serial Invoice : '$invoiceNumber'.") ->danger() ->seconds(3) ->send(); $this->dispatch('playWarnSound'); $totalQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count(); $scannedQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->where('scanned_status', 'Scanned')->where('plant_id', $plantId)->count(); $this->form->fill([ 'plant_id' => $plantId, 'invoice_number' => $invoiceNumber, 'serial_number' => null, 'total_quantity' => $totalQuantity, 'scanned_quantity' => $scannedQuantity, ]); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } $this->dispatch('refreshEmptyInvoice', invoiceNumber: $invoiceNumber, plantId: $plantId); return; } } else { Notification::make() ->title('Updated Invoice Not Found') ->body("Import the updated 'Serial Invoice' file to proceed..!") ->danger() ->seconds(3) ->send(); $this->dispatch('playWarnSound'); $this->form->fill([ 'plant_id' => $plantId, 'invoice_number' => $invoiceNumber, 'serial_number' => null, 'total_quantity' => 0, 'scanned_quantity' => 0, ]); $this->dispatch('refreshEmptyInvoice', invoiceNumber: $invoiceNumber, plantId: $plantId); return; } } } return; } } $filename = $invoiceNumber.'.xlsx'; $directory = "uploads/temp/{$plantCode}"; $disk = Storage::disk('local'); $filePath = $directory.'/'.$filename; $fullPath = null; // $fullPath = $disk->path($filePath); // Check if file exists if ($disk->exists($filePath)) { $fullPath = $disk->path($filePath); // $fullPath = session('uploaded_invoice_path'); // Notification::make() // ->title('File exists.') // ->success() // ->seconds(3) // ->send(); } else { Notification::make() ->title('Invoice Not Found') ->body("Import the scanned 'Invoice' file to proceed..!") ->danger() ->seconds(3) ->send(); $this->dispatch('playWarnSound'); $this->form->fill([ 'plant_id' => $plantId, 'invoice_number' => $invoiceNumber, 'serial_number' => null, 'total_quantity' => 0, 'scanned_quantity' => 0, ]); $this->dispatch('refreshEmptyInvoice', invoiceNumber: $invoiceNumber, plantId: $plantId); return; } if (! file_exists($fullPath)) { Notification::make() ->title('Invoice file doesn\'t exist.') ->danger() ->seconds(3) ->send(); $this->dispatch('playWarnSound'); return; } // Extract filename without extension (e.g., "3RA0018732") $uploadedFilename = pathinfo($fullPath, PATHINFO_FILENAME); // Compare with invoice number if ($uploadedFilename != $invoiceNumber) { Notification::make() ->title('Uploaded file name does not match the invoice number.') ->danger() ->seconds(3) ->send(); $this->dispatch('playWarnSound'); return; } if ($fullPath && file_exists($fullPath)) { // Now you can read/process the file here $rows = Excel::toArray(null, $fullPath)[0]; // $collection = Excel::toCollection(null, $fullPath); // $rows = $collection[0]->toArray(); // $collection = Excel::toCollection(new ExcelImport, $fullPath); // // Convert the collection to an array // $rows = $collection->toArray(); // $excelImport = new ExcelImport(); // // Import the Excel file // Excel::import($excelImport, $fullPath); // // Get the rows // $rows = $excelImport->getRows(); if ((count($rows) - 1) <= 0) { Notification::make() ->title('Records Not Found') ->body("Import the valid 'Invoice' file to proceed..!") ->danger() ->seconds(3) ->send(); $this->dispatch('playWarnSound'); if ($disk->exists($filePath)) { $disk->delete($filePath); } return; } $missingCodes = []; foreach ($rows as $index => $row) { if ($index == 0) { continue; } $materialCode = trim($row[0]); if (! empty($materialCode)) { if (Str::length($materialCode) < 6) { continue; } else { $sticker = StickerMaster::where('plant_id', $plantId)->whereHas('item', function ($query) use ($plantId, $materialCode) { $query->where('plant_id', $plantId)->where('code', $materialCode); // $this->plantId >> Check if item.code matches Excel's materialCode }); if ($sticker->exists()) { if ($sticker->first()->material_type && ! empty($sticker->first()->material_type)) { $invoiceType = 'M'; break; } else { $invoiceType = 'S'; break; } } else { $missingCodes[] = $materialCode; continue; } } } else { continue; } } $uniqueCodes = array_unique($missingCodes); if (! empty($uniqueCodes)) { $missingCount = count($uniqueCodes); $message = $missingCount > 10 ? "'$missingCount' item codes are not found in database for choosed plant." : 'The following item codes are not found in database for choosed plant:
'.implode(', ', $uniqueCodes); Notification::make() ->title('Unknown: Item Codes') ->body($message) ->danger() ->seconds(3) ->send(); $this->dispatch('playWarnSound'); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } return; } elseif ($invoiceType == 'M') { $invalidMatCodes = []; $materialCodes = []; $missingQuantities = []; $invalidMatQuan = []; $validRowsFound = false; foreach ($rows as $index => $row) { if ($index == 0) { continue; } // Skip header $materialCode = trim($row[0]); $materialQuantity = trim($row[1]); if (empty($materialCode) && empty($materialQuantity)) { continue; } if (! empty($materialCode)) { if (Str::length($materialCode) < 6 || ! ctype_alnum($materialCode)) { $invalidMatCodes[] = $materialCode; } else { if (empty($materialQuantity)) { $missingQuantities[] = $materialCode; } elseif (! is_numeric($materialQuantity)) { $invalidMatQuan[] = $materialCode; } elseif ($materialQuantity == 0) { $invalidMatQuan[] = $materialCode; } else { $materialCodes[] = $materialCode; $validRowsFound = true; } } } else { continue; } } $uniqueInvalidCodes = array_unique($invalidMatCodes); if (! empty($uniqueInvalidCodes)) { Notification::make() ->title('Invalid: Item Codes') ->body('The following item codes should contain minimum 6 digit alpha numeric values:
'.implode(', ', $uniqueInvalidCodes)) ->danger() ->seconds(2) ->send(); $this->dispatch('playWarnSound'); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } return; } $uniqueMissingQuanCodes = array_unique($missingQuantities); if (! empty($uniqueMissingQuanCodes)) { Notification::make() ->title('Missing Material Quantity') ->body("The following item codes doesn't have valid material quantity:
".implode(', ', $uniqueMissingQuanCodes)) ->danger() ->seconds(2) ->send(); $this->dispatch('playWarnSound'); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } return; } $uniqueInvalidMatQuan = array_unique($invalidMatQuan); if (! empty($uniqueInvalidMatQuan)) { Notification::make() ->title('Invalid Material Quantity') ->body("The following item codes doesn't have valid material quantity:
".implode(', ', $uniqueInvalidMatQuan)) ->danger() ->seconds(2) ->send(); $this->dispatch('playWarnSound'); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } return; } if (! $validRowsFound) { Notification::make() ->title('Invalid Material Invoice') ->danger() // This makes the notification red to indicate an error ->body('Uploaded Excel sheet is empty or
contains no valid data.') ->seconds(2) ->send(); $this->dispatch('playWarnSound'); if ($disk->exists($filePath)) { $disk->delete($filePath); } return; } $uniqueCodes = array_unique($materialCodes); // itemNotFound $matchedItems = StickerMaster::with('item') ->whereHas('item', function ($query) use ($uniqueCodes) { $query->whereIn('code', $uniqueCodes); }) ->get(); $matchedCodes = $matchedItems->pluck('item.code')->toArray(); $missingCodes = array_diff($uniqueCodes, $matchedCodes); if (! empty($missingCodes)) { $missingCount = count($missingCodes); $message = $missingCount > 10 ? "'$missingCount' item codes are not found in database." : 'The following item codes are not found in database:
'.implode(', ', $missingCodes); Notification::make() ->title('Unknown: Item Codes') ->body($message) ->danger() ->seconds(2) ->send(); $this->dispatch('playWarnSound'); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } return; } // plantNotFound $matchedItems = StickerMaster::with('item') ->whereHas('item', function ($query) use ($uniqueCodes, $plantId) { $query->whereIn('code', $uniqueCodes)->where('plant_id', $plantId); }) ->get(); $matchedCodes = $matchedItems->pluck('item.code')->toArray(); $missingCodes = array_diff($uniqueCodes, $matchedCodes); if (! empty($missingCodes)) { $missingCount = count($missingCodes); $message = $missingCount > 10 ? "'$missingCount' item codes are not found in database for choosed plant." : 'The following item codes are not found in database for choosed plant:
'.implode(', ', $missingCodes); Notification::make() ->title('Unknown: Item Codes') ->body($message) ->danger() ->seconds(2) ->send(); $this->dispatch('playWarnSound'); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } return; } $invalidCodes = $matchedItems ->filter(fn ($sticker) => empty($sticker->material_type)) // filter invalid ->pluck('item.code') ->toArray(); if (! empty($invalidCodes)) { $missingCount = count($invalidCodes); $message = $missingCount > 10 ? "'$missingCount' Serial Invoice item codes found." : "'Serial Invoice' item codes found:
".implode(', ', $invalidCodes); Notification::make() ->title('Invalid: Item Codes') ->body($message) ->danger() ->seconds(2) ->send(); $this->dispatch('playWarnSound'); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } return; } $nonNumericQtyCodes = []; $zeroQtyCodes = []; $notDivisibleCodes = []; foreach ($matchedItems as $sticker) { $code = $sticker->item->code; $materialType = $sticker->material_type; if ($materialType == 2) { $bundleQty = $sticker->bundle_quantity ?? 0; $totalExcelQty = 0; foreach ($rows as $index => $row) { if ($index == 0) { continue; } // Skip header $excelCode = trim($row[0]); $excelMatQty = trim($row[1]); if (empty($excelCode) || empty($excelMatQty)) { continue; } if ($excelCode == $code && is_numeric($excelMatQty)) { $totalExcelQty += $excelMatQty; // Sum up the quantities } } if ($totalExcelQty == 0) { $zeroQtyCodes[] = $code; } elseif (! is_numeric($totalExcelQty)) { $nonNumericQtyCodes[] = $code; // Here you may want to check divisibility condition too } elseif ($bundleQty != 0 && $totalExcelQty % $bundleQty != 0) { $notDivisibleCodes[] = $code; } } } $showValidationNotification = function (array $codes, string $message) { if (count($codes) == 0) { return; } $uniqueCodes = array_unique($codes); $codeList = implode(', ', $uniqueCodes); Notification::make() ->title('Invalid Bundle Quantity') ->body("$message
$codeList") ->danger() ->seconds(2) ->send(); $this->dispatch('playWarnSound'); }; $showValidationNotification($nonNumericQtyCodes, 'The following item codes contains invalid bundle quantity:'); $showValidationNotification($zeroQtyCodes, "The following item codes quantity should be greater than '0':"); $showValidationNotification($notDivisibleCodes, 'The following item codes quantity is not divisible by bundle quantity.'); if ($nonNumericQtyCodes || $zeroQtyCodes || $notDivisibleCodes) { // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } return; } else { $inserted = 0; foreach ($matchedItems as $sticker) { $code = $sticker->item->code; $materialType = $sticker->material_type; // $sticker = StickerMaster::where('plant_id', $plantId)->whereHas('item', function ($query) use ($code) { $query->where('plant_id', $this->plantId)->where('code', $code); })->first(); if ($materialType == 1 || $materialType == 4) { $totalExcelQty = 0; foreach ($rows as $index => $row) { if ($index == 0) { continue; } // Skip header $excelCode = trim($row[0]); $excelMatQty = trim($row[1]); if (empty($excelCode) || empty($excelMatQty)) { continue; } if ($excelCode == $code && is_numeric($excelMatQty)) { $totalExcelQty += $excelMatQty; // Sum up the quantities } } for ($i = 0; $i < $totalExcelQty; $i++) { if ($sticker) { SerialValidation::create([ 'sticker_master_id' => $sticker->id, 'plant_id' => $plantId, 'invoice_number' => $invoiceNumber, 'quantity' => 1, 'operator_id' => $operatorName, 'created_by' => $operatorName, ]); $inserted++; } } } elseif ($materialType == 2) { $bundleQty = $sticker->bundle_quantity; $totalExcelQty = 0; foreach ($rows as $index => $row) { if ($index == 0) { continue; } // Skip header $excelCode = trim($row[0]); $excelMatQty = trim($row[1]); if (empty($excelCode) || empty($excelMatQty)) { continue; } if ($excelCode == $code && is_numeric($excelMatQty)) { $totalExcelQty += $excelMatQty; // Sum up the quantities } } for ($i = 0; $i < ($totalExcelQty / $bundleQty); $i++) { if ($sticker) { SerialValidation::create([ 'sticker_master_id' => $sticker->id, 'plant_id' => $plantId, 'invoice_number' => $invoiceNumber, 'quantity' => $bundleQty, 'operator_id' => $operatorName, 'created_by' => $operatorName, ]); $inserted++; } } } elseif ($materialType == 3) { $totalExcelQty = 0; foreach ($rows as $index => $row) { if ($index == 0) { continue; } // Skip header $excelCode = trim($row[0]); $excelMatQty = trim($row[1]); if (empty($excelCode) || empty($excelMatQty)) { continue; } if ($excelCode == $code && is_numeric($excelMatQty)) { $totalExcelQty += $excelMatQty; // Sum up the quantities } } if ($sticker) { SerialValidation::create([ 'sticker_master_id' => $sticker->id, 'plant_id' => $plantId, 'invoice_number' => $invoiceNumber, 'quantity' => $totalExcelQty, 'operator_id' => $operatorName, 'created_by' => $operatorName, ]); $inserted++; } } } if ($inserted > 0) { Notification::make() ->title('Start the scanning process!') ->body("'$inserted' material invoice records were inserted.") ->info() // ->success() ->seconds(1) ->send(); // Update total quantity in the form $totalQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count(); $scannedQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->whereNotNull('serial_number')->where('serial_number', '!=', '')->where('plant_id', $plantId)->count(); $this->form->fill([ 'plant_id' => $plantId, 'invoice_number' => $invoiceNumber, 'serial_number' => null, 'total_quantity' => $totalQuantity, 'scanned_quantity' => $scannedQuantity, ]); if ($totalQuantity == $scannedQuantity) { if ($disk->exists($filePath)) { $disk->delete($filePath); } $this->dispatch('refreshCompletedInvoice', invoiceNumber: $invoiceNumber, plantId: $plantId, isSerial: false); } else { // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } // $hasRecords = InvoiceValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->first()->stickerMasterRelation->material_type ?? null; // $this->dispatch( (!empty($hasRecords) && $hasRecords) ? 'refreshMaterialInvoiceData' : 'refreshInvoiceData', invoiceNumber: $invoiceNumber, plantId: $plantId, onCapFocus: false); //$this->invoiceNumber $this->dispatch('refreshMaterialInvoiceData', invoiceNumber: $invoiceNumber, plantId: $plantId); } } else { Notification::make() ->title('Import Failed: Material Invoice') ->body("No new records were inserted for Material Invoice: '$invoiceNumber'.") ->danger() ->seconds(2) ->send(); $totalQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count(); $scannedQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->whereNotNull('serial_number')->where('serial_number', '!=', '')->where('plant_id', $plantId)->count(); $this->form->fill([ 'plant_id' => $plantId, 'invoice_number' => $invoiceNumber, 'serial_number' => null, 'total_quantity' => $totalQuantity, 'scanned_quantity' => $scannedQuantity, ]); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } $this->dispatch('refreshEmptyInvoice', invoiceNumber: $invoiceNumber, plantId: $plantId); return; } } } elseif ($invoiceType == 'S') { $invalidMatCodes = []; $materialCodes = []; $missingSerials = []; $invalidSerCodes = []; $duplicateSerials = []; $serialNumbers = []; $validRowsFound = false; foreach ($rows as $index => $row) { if ($index == 0) { continue; } // Skip header $materialCode = trim($row[0]); $serialNumber = trim($row[1]); if (empty($materialCode) && empty($serialNumber)) { continue; } if (! empty($materialCode)) { if (Str::length($materialCode) < 6 || ! ctype_alnum($materialCode)) { $invalidMatCodes[] = $materialCode; continue; } else { if (empty($serialNumber)) { $missingSerials[] = $materialCode; } elseif (Str::length($serialNumber) < 9 || ! ctype_alnum($serialNumber)) { $invalidSerCodes[] = $serialNumber; } else { if (in_array($serialNumber, $serialNumbers)) { $duplicateSerials[] = $serialNumber; } else { $serialNumbers[] = $serialNumber; $materialCodes[] = $materialCode; $validRowsFound = true; } } } } else { continue; } } $uniqueInvalidCodes = array_unique($invalidMatCodes); if (! empty($uniqueInvalidCodes)) { Notification::make() ->title('Invalid: Item Codes') ->body('The following item codes should contain minimum 6 digit alpha numeric values:
'.implode(', ', $uniqueInvalidCodes)) ->danger() ->seconds(3) ->send(); $this->dispatch('playWarnSound'); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } return; } $uniqueMissingSerials = array_unique($missingSerials); if (! empty($uniqueMissingSerials)) { Notification::make() ->title('Missing Serial Numbers') ->body("The following item codes doesn't have valid serial number:
".implode(', ', $uniqueMissingSerials)) ->danger() ->seconds(3) ->send(); $this->dispatch('playWarnSound'); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } return; } $uniqueInvalidSerCodes = array_unique($invalidSerCodes); if (! empty($uniqueInvalidSerCodes)) { Notification::make() ->title('Invalid Serial Numbers') ->body('The following serial numbers should contain minimum 9 digit alpha numeric values:
'.implode(', ', $uniqueInvalidSerCodes)) ->danger() ->seconds(3) ->send(); $this->dispatch('playWarnSound'); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } return; } $uniqueDupSerCodes = array_unique($duplicateSerials); if (! empty($uniqueDupSerCodes)) { Notification::make() ->title('Duplicate Serial Numbers') ->body('The following serial numbers are already exist in invoice excel:
'.implode(', ', $uniqueDupSerCodes)) ->danger() ->seconds(3) ->send(); $this->dispatch('playWarnSound'); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } return; } if (! $validRowsFound) { Notification::make() ->title('Invalid Serial Invoice') ->danger() // This makes the notification red to indicate an error ->body('Uploaded excel sheet is empty or
contains no valid data.') ->seconds(3) ->send(); $this->dispatch('playWarnSound'); if ($disk->exists($filePath)) { $disk->delete($filePath); } return; } $uniqueCodes = array_unique($materialCodes); // itemNotFound $matchedItems = StickerMaster::with('item') ->whereHas('item', function ($query) use ($uniqueCodes) { $query->whereIn('code', $uniqueCodes); }) ->get(); // // Get all codes that exist in the database for the given plant_id // $existingCodes = StickerMaster::where('plant_id', $plantId) // ->whereHas('item', function ($query) use ($uniqueCodes) { // $query->whereIn('code', $uniqueCodes); // }) // ->with('item') // Eager load for performance // ->get() // ->pluck('item.code') // ->toArray(); $matchedCodes = $matchedItems->pluck('item.code')->toArray(); $missingCodes = array_diff($uniqueCodes, $matchedCodes); if (! empty($missingCodes)) { $missingCount = count($missingCodes); $message = $missingCount > 10 ? "'$missingCount' item codes are not found in database." : 'The following item codes are not found in database:
'.implode(', ', $missingCodes); Notification::make() ->title('Unknown: Item Codes') ->body($message) ->danger() ->seconds(3) ->send(); $this->dispatch('playWarnSound'); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } return; } // plantNotFound $matchedItems = StickerMaster::with('item') ->whereHas('item', function ($query) use ($uniqueCodes, $plantId) { $query->whereIn('code', $uniqueCodes)->where('plant_id', $plantId); }) ->get(); $matchedCodes = $matchedItems->pluck('item.code')->toArray(); $missingCodes = array_diff($uniqueCodes, $matchedCodes); if (! empty($missingCodes)) { $missingCount = count($missingCodes); $message = $missingCount > 10 ? "'$missingCount' item codes are not found in database for choosed plant." : 'The following item codes are not found in database for choosed plant:
'.implode(', ', $missingCodes); Notification::make() ->title('Unknown: Item Codes') ->body($message) ->danger() ->seconds(3) ->send(); $this->dispatch('playWarnSound'); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } return; } $invalidCodes = $matchedItems ->filter(fn ($sticker) => ! empty($sticker->material_type)) // filter invalid ->pluck('item.code') ->toArray(); if (! empty($invalidCodes)) { $missingCount = count($invalidCodes); $message = $missingCount > 10 ? "'$missingCount' Material Invoice item codes found." : "'Material Invoice' item codes found:
".implode(', ', $invalidCodes); Notification::make() ->title('Invalid: Item Codes') ->body($message) ->danger() ->seconds(3) ->send(); $this->dispatch('playWarnSound'); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } return; } $missPackCodes = $matchedItems ->filter(fn ($sticker) => empty($sticker->tube_sticker_motor) && empty($sticker->pack_slip_motor) && empty($sticker->tube_sticker_pump) && empty($sticker->pack_slip_pump) && empty($sticker->tube_sticker_pumpset) && empty($sticker->pack_slip_pumpset) && empty($sticker->panel_box_code)) ->pluck('item.code') ->toArray(); if (! empty($missPackCodes)) { $missingCount = count($missPackCodes); $message = $missingCount > 10 ? "'$missingCount' item codes doesn't have valid package type to proceed!" : "The following 'Item Code' doesn't have valid package type:
".implode(', ', $missPackCodes); Notification::make() ->title('Invalid: Item Codes') ->body($message) ->danger() ->seconds(3) ->send(); $this->dispatch('playWarnSound'); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } return; } $existingSerialNumbers = SerialValidation::whereIn('serial_number', $serialNumbers)->where('plant_id', $plantId)->pluck('serial_number')->toArray(); // If there are duplicates, notify and stop the process if (! empty($existingSerialNumbers)) { Notification::make() ->title('Duplicate Serial Numbers') ->body('The following serial numbers are already exist in database:
'.implode(', ', $existingSerialNumbers)) ->danger() ->seconds(3) ->send(); $this->dispatch('playWarnSound'); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } return; } $inserted = 0; foreach ($rows as $index => $row) { if ($index == 0) { continue; } $materialCode = trim($row[0]); $serialNumber = trim($row[1]); if (empty($materialCode) || empty($serialNumber)) { continue; } $sticker = StickerMaster::where('plant_id', $plantId)->whereHas('item', function ($query) use ($materialCode) { $query->where('plant_id', $this->plantId)->where('code', $materialCode); // Check if item.code matches Excel's materialCode })->first(); if ($sticker) { SerialValidation::create([ 'sticker_master_id' => $sticker->id, 'plant_id' => $plantId, 'invoice_number' => $invoiceNumber, 'serial_number' => $serialNumber, 'operator_id' => $operatorName, 'created_by' => $operatorName, ]); $inserted++; } } if ($inserted > 0) { Notification::make() ->title('Start the scanning process!') ->body("'$inserted' serial invoice records were inserted.") ->info() // ->success() ->seconds(1) ->send(); $this->dispatch('playNotificationSound'); // Update total quantity in the form $totalQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count(); $scannedQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->where('scanned_status', 'Scanned')->where('plant_id', $plantId)->count(); $this->form->fill([ 'plant_id' => $plantId, 'invoice_number' => $invoiceNumber, 'serial_number' => null, 'total_quantity' => $totalQuantity, 'scanned_quantity' => $scannedQuantity, ]); if ($totalQuantity == $scannedQuantity) { if ($disk->exists($filePath)) { $disk->delete($filePath); } $this->dispatch('refreshCompletedInvoice', invoiceNumber: $invoiceNumber, plantId: $plantId, isSerial: true); } else { // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } // $hasRecords = InvoiceValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->first()->stickerMasterRelation->material_type ?? null; // $this->dispatch( (!empty($hasRecords) && $hasRecords) ? 'refreshMaterialInvoiceData' : 'refreshInvoiceData', invoiceNumber: $invoiceNumber, plantId: $plantId, onCapFocus: false); //$this->invoiceNumber $this->dispatch('refreshInvoiceData', invoiceNumber: $invoiceNumber, plantId: $plantId, onCapFocus: false); } } else { Notification::make() ->title('Import Failed: Serial Invoice') ->body("No new records were inserted for Serial Invoice : '$invoiceNumber'.") ->danger() ->seconds(3) ->send(); $this->dispatch('playWarnSound'); $totalQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count(); $scannedQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->where('scanned_status', 'Scanned')->where('plant_id', $plantId)->count(); $this->form->fill([ 'plant_id' => $plantId, 'invoice_number' => $invoiceNumber, 'serial_number' => null, 'total_quantity' => $totalQuantity, 'scanned_quantity' => $scannedQuantity, ]); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } $this->dispatch('refreshEmptyInvoice', invoiceNumber: $invoiceNumber, plantId: $plantId); return; } } else { Notification::make() ->title('Invoice Type Not Found') ->body("Import the valid 'Invoice' file to proceed..!") ->danger() ->seconds(3) ->send(); $this->dispatch('playWarnSound'); // if ($disk->exists($filePath)) { // $disk->delete($filePath); // } return; } } } protected function refreshInvoiceTable() { $this->plantId = $this->form->getState()['plant_id'] ?? ''; $this->invoiceNumber = $this->form->getState()['invoice_number'] ?? ''; if (!empty($this->invoiceNumber)) { $hasInvoice = SerialValidation::where('invoice_number', $this->invoiceNumber)->where('plant_id', $this->plantId)->first(); if (empty($hasInvoice) || !$hasInvoice) { $this->dispatch('refreshEmptyInvoice', invoiceNumber: $this->invoiceNumber, plantId: $this->plantId); } else { $totalQuantity = SerialValidation::where('invoice_number', $this->invoiceNumber)->where('plant_id', $this->plantId)->count(); $scannedQuantity = SerialValidation::where('invoice_number', $this->invoiceNumber)->where('scanned_status', 'Scanned')->where('plant_id', $this->plantId)->count(); if ($totalQuantity == $scannedQuantity) { $this->dispatch('refreshCompletedInvoice', invoiceNumber: $this->invoiceNumber, plantId: $this->plantId, isSerial: true); } else { $hasRecords = $hasInvoice->stickerMasterRelation->material_type ?? null; $this->dispatch( (!empty($hasRecords) && $hasRecords) ? 'refreshMaterialInvoiceData' : 'refreshInvoiceData', invoiceNumber: $this->invoiceNumber, plantId: $this->plantId); } } } } public function processSer($serNo) { $serNo = trim($serNo); $user = Filament::auth()->user(); $operatorName = $user->name; $serialNumber = null; $plantId = $this->form->getState()['plant_id']; $this->plantId = $plantId; if (!preg_match('/^([a-zA-Z0-9]{6,})\|([1-9][a-zA-Z0-9]{8,})(?:\/[MmPpCc])?\|?$/', $serNo, $matches)) { Notification::make() ->danger() ->title('Invalid Serial QR Format') ->body('Scan valid Serial QR code proceed!
Sample formats are:
123456|1234567890123/M (or)
123456|1234567890123/P (or)
123456|1234567890123/C (or)
123456|1234567890123') ->seconds(3) ->send(); $this->dispatch('playWarnSound'); $this->invoiceNumber = ''; $this->dispatch('refreshEmptyInvoice', invoiceNumber: $this->invoiceNumber, plantId: $plantId); $this->form->fill([ 'plant_id' => $plantId, 'invoice_number' => null, 'serial_number' => null, // 'total_quantity' => $totQuan, // 'update_invoice' => false, // 'scanned_quantity'=> $scanSQuan, ]); return; } if (preg_match('/^([a-zA-Z0-9]{6,})\|([1-9][a-zA-Z0-9]{8,})(?:\/[MmPpCc])?\|?$/', $serNo, $matches)) { $itemCode = $matches[1]; $serialNumber = $matches[2]; // // Check if it ends with /M, /P, /C etc. // $isMarkM = preg_match('/\/[Mm]$/', $serialNumber); // $isMarkP = preg_match('/\/[Pp]$/', $serialNumber); // $isMarkC = preg_match('/\/[Cc]$/', $serialNumber); $isMarkM = preg_match('/^([a-zA-Z0-9]{6,})\|([1-9][a-zA-Z0-9]{8,})\/[Mm]?\|?$/', $serNo) ? true : false; $isMarkP = preg_match('/^([a-zA-Z0-9]{6,})\|([1-9][a-zA-Z0-9]{8,})\/[Pp]?\|?$/', $serNo) ? true : false; $isMarkC = preg_match('/^([a-zA-Z0-9]{6,})\|([1-9][a-zA-Z0-9]{8,})\/[Cc]?\|?$/', $serNo) ? true : false; $isMarkPs = (!$isMarkM && !$isMarkP && !$isMarkC) ? true : false; //dd($serialNumber, $isMarkM, $isMarkP, $isMarkC, $isMarkPs); $serialNumber = preg_replace('/\/[MmPpCc]?\|$/', '', $serialNumber); $record = SerialValidation::where('serial_number', $serialNumber)->where('plant_id', $plantId)->first(); if (!$record) { Notification::make() ->title('Serial Number Not Found
Serial \''.$serialNumber.'\' not found in database for choosed plant.
') // ->body("Serial '$serialNumber' not found in database for choosed plant.").......... ->danger() ->seconds(3) ->send(); $this->invoiceNumber = ''; $this->dispatch('play-warn-sound'); $this->dispatch('refreshEmptyInvoice', invoiceNumber: $this->invoiceNumber, plantId: $plantId); $this->form->fill([ 'plant_id' => $plantId, 'invoice_number' => null, 'serial_number' => null, // 'total_quantity' => $totQuan, // 'update_invoice' => false, // 'scanned_quantity'=> $scanSQuan, ]); return; } $invoiceNumber = $record->invoice_number; $totQuan = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count(); $scanSQuan = SerialValidation::where('invoice_number', $invoiceNumber)->where('scanned_status', 'Scanned')->where('plant_id', $plantId)->count(); $record = SerialValidation::where('serial_number', $serialNumber) ->where('plant_id', $plantId) ->whereHas('stickerMasterRelation.item', function ($query) use ($itemCode) { $query->where('plant_id', $this->plantId)->where('code', $itemCode); }) ->first(); $totQuan = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count(); $scanSQuan = SerialValidation::where('invoice_number', $invoiceNumber)->where('scanned_status', 'Scanned')->where('plant_id', $plantId)->count(); if (!$record) { Notification::make() ->title('Unknown: Item Code') ->body("Item code '$itemCode' with serial number '$serialNumber' not found.") ->danger() ->seconds(3) ->send(); $this->dispatch('playWarnSound'); // $this->dispatch('refreshEmptyInvoice', invoiceNumber: $invoiceNumber, plantId: $plantId); $this->form->fill([ 'plant_id' => $plantId, 'invoice_number' => $invoiceNumber, 'serial_number' => null, 'total_quantity' => $totQuan, 'update_invoice' => false, 'scanned_quantity'=> $scanSQuan, ]); return; } // $hasMotorQr = $record->stickerMasterRelation->tube_sticker_motor ?? null; // $hasPumpQr = $record->stickerMasterRelation->tube_sticker_pump ?? null; // $hasPumpSetQr = $record->stickerMasterRelation->tube_sticker_pumpset ?? null; $hasMotorQr = $record->stickerMasterRelation->pack_slip_motor ?? null; $hasPumpQr = $record->stickerMasterRelation->pack_slip_pump ?? null; $hasPumpSetQr = $record->stickerMasterRelation->pack_slip_pumpset ?? null; $hasCapacitorQr = $record->stickerMasterRelation->panel_box_code ?? null; $hadMotorQr = $record->motor_scanned_status ?? null; $hadPumpQr = $record->pump_scanned_status ?? null; $hadPumpSetQr = $record->scanned_status_set ?? null; $hadCapacitorQr = $record->capacitor_scanned_status ?? null; if (!$hasMotorQr && !$hasPumpQr && !$hasPumpSetQr && !$hasCapacitorQr) { Notification::make() ->title('Invalid: Item Code') ->body("Scanned 'Item Code' doesn't have valid package type to proceed!") ->danger() ->seconds(3) ->send(); $this->dispatch('playWarnSound'); $this->form->fill([ 'plant_id' => $plantId, 'invoice_number' => null, 'serial_number' => null, 'total_quantity' => $totQuan, 'update_invoice' => false, 'scanned_quantity'=> $scanSQuan, ]); return; } if ($hasMotorQr && !$hasPumpQr && !$hasPumpSetQr && !$hasCapacitorQr) { $isMarkM = true; $isMarkP = false; $isMarkC = false; $isMarkPs = false; } else if (!$hasMotorQr && $hasPumpQr && !$hasPumpSetQr && !$hasCapacitorQr) { $isMarkM = false; $isMarkP = true; $isMarkC = false; $isMarkPs = false; } else if (!$hasMotorQr && !$hasPumpQr && !$hasPumpSetQr && $hasCapacitorQr) { $isMarkM = false; $isMarkP = false; $isMarkC = true; $isMarkPs = false; } if ($isMarkM) { // $record = SerialValidation::where('serial_number', $serialNumber) // ->where('plant_id', $plantId) // ->first(); // $invoiceNumber = $record->invoice_number; $totQuan = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count(); $scanSQuan = SerialValidation::where('invoice_number', $invoiceNumber)->where('scanned_status', 'Scanned')->where('plant_id', $plantId)->count(); if (!$hasMotorQr) { Notification::make() ->title('Unknown: Motor QR') ->body("Scanned 'Item Code' doesn't have 'Motor' QR to proceed!") ->danger() ->seconds(3) ->send(); $this->dispatch('playWarnSound'); $this->form->fill([ 'plant_id' => $plantId, 'invoice_number' => $invoiceNumber, 'serial_number' => null, 'total_quantity' => $totQuan, 'update_invoice' => false, 'scanned_quantity'=> $scanSQuan, ]); $this->dispatch( 'refreshInvoiceData', invoiceNumber: $invoiceNumber, plantId: $plantId); return; } else if ($hadMotorQr == $hasMotorQr) { Notification::make() ->title('Duplicate: Motor QR') ->body("Scanned 'Motor' serial number already completed the scanning process.") ->danger() ->seconds(3) ->send(); $this->dispatch('playWarnSound'); $this->form->fill([ 'plant_id' => $plantId, 'invoice_number' => $invoiceNumber, 'serial_number' => null, 'total_quantity' => $totQuan, 'update_invoice' => false, 'scanned_quantity'=> $scanSQuan, ]); $this->dispatch( 'refreshInvoiceData', invoiceNumber: $invoiceNumber, plantId: $plantId); return; } $packCnt = 1; $scanCnt = 1; $record->motor_scanned_status = 1; //if ($hadPumpQr == $hasPumpQr && $hadPumpSetQr == $hasPumpSetQr) if ($hasPumpQr || $hasPumpSetQr || $hasCapacitorQr) { $packCnt = $hasPumpQr ? $packCnt + 1 : $packCnt; $packCnt = $hasPumpSetQr ? $packCnt + 1 : $packCnt; $packCnt = $hasCapacitorQr ? $packCnt + 1 : $packCnt; $scanCnt = $hadPumpQr ? $scanCnt + 1: $scanCnt; $scanCnt = $hadPumpSetQr ? $scanCnt + 1: $scanCnt; $scanCnt = $hadCapacitorQr ? $scanCnt + 1: $scanCnt; if ($packCnt == $scanCnt) { $record->scanned_status = 'Scanned'; } } else { $record->scanned_status = 'Scanned'; } $record->operator_id = $operatorName; $record->save(); // Notification::make() // ->title('Success: Motor QR') // ->body("'Motor' QR scanned status updated, Scan next QR.") // ->success() // commented // ->seconds(3) // ->send(); $scannedQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->where('scanned_status', 'Scanned')->where('plant_id', $plantId)->count(); $this->form->fill([ 'plant_id' => $plantId, 'invoice_number' => $invoiceNumber, 'serial_number' => null, 'total_quantity' => $totQuan, 'update_invoice' => false, 'scanned_quantity'=> $scannedQuantity, ]); if ($totQuan == $scannedQuantity) { Notification::make() ->title('Completed: Serial Invoice') ->body("Serial invoice '$invoiceNumber' completed the scanning process.
Scan the next 'Serial Invoice' to proceed!") ->success() ->seconds(3) ->send(); $this->dispatch('playNotificationSound'); $filename = $invoiceNumber . '.xlsx'; $directory = 'uploads/temp'; $disk = Storage::disk('local'); $filePath = $directory . '/' . $filename; //$fullPath = null; if ($disk->exists($filePath)) { //$fullPath = $disk->path($filePath); $disk->delete($filePath); } $this->dispatch('refreshCompletedInvoice', invoiceNumber: $invoiceNumber, plantId: $plantId, isSerial: true); } else { $this->dispatch( 'refreshInvoiceData', invoiceNumber: $invoiceNumber, plantId: $plantId); // $this->refreshInvoiceTable(); } return; } else if ($isMarkP) { // $record = SerialValidation::where('serial_number', $serialNumber) // ->where('plant_id', $plantId) // ->first(); // $invoiceNumber = $record->invoice_number; $totQuan = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count(); $scanSQuan = SerialValidation::where('invoice_number', $invoiceNumber)->where('scanned_status', 'Scanned')->where('plant_id', $plantId)->count(); if (!$hasPumpQr) { Notification::make() ->title('Unknown: Pump QR') ->body("Scanned 'Item Code' doesn't have 'Pump' QR to proceed!") ->danger() ->seconds(3) ->send(); $this->dispatch('playWarnSound'); $this->dispatch( 'refreshInvoiceData', invoiceNumber: $invoiceNumber, plantId: $plantId); $this->form->fill([ 'plant_id' => $plantId, 'invoice_number' => $invoiceNumber, 'serial_number' => null, 'total_quantity' => $totQuan, 'update_invoice' => false, 'scanned_quantity'=> $scanSQuan, ]); return; } else if ($hadPumpQr == $hasPumpQr) { Notification::make() ->title('Duplicate: Pump QR') ->body("Scanned 'Pump' serial number already completed the scanning process.") ->danger() ->seconds(3) ->send(); $this->dispatch('playWarnSound'); $this->dispatch( 'refreshInvoiceData', invoiceNumber: $invoiceNumber, plantId: $plantId); $this->form->fill([ 'plant_id' => $plantId, 'invoice_number' => $invoiceNumber, 'serial_number' => null, 'total_quantity' => $totQuan, 'update_invoice' => false, 'scanned_quantity'=> $scanSQuan, ]); return; } $packCnt = 1; $scanCnt = 1; $record->pump_scanned_status = 1; if ($hasMotorQr || $hasPumpSetQr || $hasCapacitorQr) { $packCnt = $hasMotorQr ? $packCnt + 1 : $packCnt; $packCnt = $hasPumpSetQr ? $packCnt + 1 : $packCnt; $packCnt = $hasCapacitorQr ? $packCnt + 1 : $packCnt; $scanCnt = $hadMotorQr ? $scanCnt + 1: $scanCnt; $scanCnt = $hadPumpSetQr ? $scanCnt + 1: $scanCnt; $scanCnt = $hadCapacitorQr ? $scanCnt + 1: $scanCnt; if ($packCnt == $scanCnt) { $record->scanned_status = 'Scanned'; } } else { $record->scanned_status = 'Scanned'; } $record->operator_id = $operatorName; $record->save(); // Notification::make() // ->title('Success: Pump QR') // ->body("'Pump' QR scanned status updated, Scan next QR.") // ->success() // commented // ->seconds(3) // ->send(); $scannedQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->where('scanned_status', 'Scanned')->where('plant_id', $plantId)->count(); $this->form->fill([ 'plant_id' => $plantId, 'invoice_number' => $invoiceNumber, 'serial_number' => null, 'total_quantity' => $totQuan, 'update_invoice' => false, 'scanned_quantity'=> $scannedQuantity, ]); if ($totQuan == $scannedQuantity) { Notification::make() ->title('Completed: Serial Invoice') ->body("Serial invoice '$invoiceNumber' completed the scanning process.
Scan the next 'Serial Invoice' to proceed!") ->success() ->seconds(3) ->send(); $this->dispatch('playNotificationSound'); $filename = $invoiceNumber . '.xlsx'; $directory = 'uploads/temp'; $disk = Storage::disk('local'); $filePath = $directory . '/' . $filename; //$fullPath = null; if ($disk->exists($filePath)) { //$fullPath = $disk->path($filePath); $disk->delete($filePath); } $this->dispatch('refreshCompletedInvoice', invoiceNumber: $invoiceNumber, plantId: $plantId, isSerial: true); } else { $this->dispatch( 'refreshInvoiceData', invoiceNumber: $invoiceNumber, plantId: $plantId); } return; } else if ($isMarkC) { // $record = SerialValidation::where('serial_number', $serialNumber) // ->where('plant_id', $plantId) // ->first(); // $invoiceNumber = $record->invoice_number; $totQuan = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count(); $scanSQuan = SerialValidation::where('invoice_number', $invoiceNumber)->where('scanned_status', 'Scanned')->where('plant_id', $plantId)->count(); if (!$hasCapacitorQr) { Notification::make() ->title('Missing: Panel Box Code') ->body("Scanned 'Item Code' doesn't have 'Panel Box Code' to proceed!") ->danger() ->seconds(3) ->send(); $this->dispatch('playWarnSound'); $this->form->fill([ 'plant_id' => $plantId, 'invoice_number' => $invoiceNumber, 'serial_number' => null, 'total_quantity' => $totQuan, 'update_invoice' => false, 'scanned_quantity'=> $scanSQuan, ]); $this->dispatch( 'refreshInvoiceData', invoiceNumber: $invoiceNumber, plantId: $plantId); return; } else if ($hadCapacitorQr == '1' && $hasCapacitorQr) { Notification::make() ->title('Duplicate: Capacitor QR') ->body("Scanned 'Capacitor' serial number already completed the scanning process.") ->danger() ->seconds(3) ->send(); $this->dispatch('playWarnSound'); $this->form->fill([ 'plant_id' => $plantId, 'invoice_number' => $invoiceNumber, 'serial_number' => null, 'total_quantity' => $totQuan, 'update_invoice' => false, 'scanned_quantity'=> $scanSQuan, ]); $this->dispatch( 'refreshInvoiceData', invoiceNumber: $invoiceNumber, plantId: $plantId); return; } // $this->dispatch('openCapacitorModal', itemCode: $itemCode, serialNumber: $serialNumber, plantId: $plantId); //$this->dispatch('focusCapacitor', invoiceNumber: $invoiceNumber, plantId: $plantId); $this->dispatch('focusCapacitor', itemCode: $itemCode); //$scannedQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->where('scanned_status', 'Scanned')->where('plant_id', $plantId)->count(); // $totQuan = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count(); // $scanSQuan = SerialValidation::where('invoice_number', $invoiceNumber)->where('scanned_status', 'Scanned')->where('plant_id', $plantId)->count(); // $totMQuan = SerialValidation::where('invoice_number', $invoiceNumber)->whereNotNull('quantity')->where('plant_id', $plantId)->count(); //->where('quantity', '!=', '') // $scanMQuan = SerialValidation::where('invoice_number', $invoiceNumber)->whereNotNull('serial_number')->where('serial_number', '!=', '')->where('plant_id', $plantId)->count(); // $this->form->fill([ // 'plant_id' => $plantId, // 'invoice_number' => $invoiceNumber, // 'serial_number' => $serNo, // 'total_quantity' => $totQuan, // 'update_invoice' => false, // 'scanned_quantity'=> $scanSQuan, // ]); // $this->dispatch( 'refreshInvoiceData', invoiceNumber: $invoiceNumber, plantId: $plantId); return; } else if ($isMarkPs) { // $record = SerialValidation::where('serial_number', $serialNumber) // ->where('plant_id', $plantId) // ->first(); // $invoiceNumber = $record->invoice_number; $totQuan = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count(); $scanSQuan = SerialValidation::where('invoice_number', $invoiceNumber)->where('scanned_status', 'Scanned')->where('plant_id', $plantId)->count(); if (!$hasPumpSetQr) { Notification::make() ->title('Unknown: Pump Set QR') ->body("Scanned 'Item Code' doesn't have 'Pump Set' QR to proceed!") ->danger() ->seconds(3) ->send(); $this->dispatch('playWarnSound'); $this->form->fill([ 'plant_id' => $plantId, 'invoice_number' => $invoiceNumber, 'serial_number' => null, 'total_quantity' => $totQuan, 'update_invoice' => false, 'scanned_quantity'=> $scanSQuan, ]); $this->dispatch('refreshInvoiceData', invoiceNumber: $invoiceNumber, plantId: $plantId); return; } else if ($hadPumpSetQr == $hasPumpSetQr) { Notification::make() ->title('Duplicate: Pump Set QR') ->body("Scanned 'Pump Set' serial number already completed the scanning process.") ->danger() ->seconds(3) ->send(); $this->dispatch('playWarnSound'); $this->form->fill([ 'plant_id' => $plantId, 'invoice_number' => $invoiceNumber, 'serial_number' => null, 'total_quantity' => $totQuan, 'update_invoice' => false, 'scanned_quantity'=> $scanSQuan, ]); return; } // Fill the invoice_number field in the form immediately $this->form->fill([ 'plant_id' => $plantId, 'invoice_number' => $invoiceNumber, 'serial_number' => $serialNumber, 'total_quantity' => $totQuan, 'update_invoice' => false, ]); $packCnt = 1; $scanCnt = 1; $record->scanned_status_set = 1; // if ($hadMotorQr == $hasMotorQr && $hadPumpQr == $hasPumpQr && ($hadCapacitorQr == '1' && $hasCapacitorQr)) if ($hasMotorQr || $hasPumpQr || $hasCapacitorQr) { $packCnt = $hasMotorQr ? $packCnt + 1 : $packCnt; $packCnt = $hasPumpQr ? $packCnt + 1 : $packCnt; $packCnt = $hasCapacitorQr ? $packCnt + 1 : $packCnt; $scanCnt = $hadMotorQr ? $scanCnt + 1: $scanCnt; $scanCnt = $hadPumpQr ? $scanCnt + 1: $scanCnt; $scanCnt = $hadCapacitorQr ? $scanCnt + 1: $scanCnt; if ($packCnt == $scanCnt) { $record->scanned_status = 'Scanned'; } } else { $record->scanned_status = 'Scanned'; } $record->operator_id = $operatorName; $record->save(); // Notification::make() // ->title('Success: Pump Set QR') // ->body("'Pump Set' QR scanned status updated, Scan next QR.") // ->success() // commented // ->seconds(3) // ->send(); $scannedQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->where('scanned_status', 'Scanned')->where('plant_id', $plantId)->count(); $this->form->fill([ 'plant_id' => $plantId, 'invoice_number' => $invoiceNumber, 'serial_number' => null, 'total_quantity' => $totQuan, 'update_invoice' => false, 'scanned_quantity'=> $scannedQuantity, ]); // $invoiceNumber = $this->form->getState()['invoice_number']; // $this->invoiceNumber = $invoiceNumber; $scanSQuan = SerialValidation::where('invoice_number', $invoiceNumber)->where('scanned_status', 'Scanned')->where('plant_id', $plantId)->count(); $totMQuan = SerialValidation::where('invoice_number', $invoiceNumber)->whereNotNull('quantity')->where('plant_id', $plantId)->count(); //->where('quantity', '!=', '') $scanMQuan = SerialValidation::where('invoice_number', $invoiceNumber)->whereNotNull('serial_number')->where('serial_number', '!=', '')->where('plant_id', $plantId)->count(); if ($totQuan == $scannedQuantity) { Notification::make() ->title('Completed: Serial Invoice') ->body("Serial invoice '$invoiceNumber' completed the scanning process.
Scan the next 'Serial Invoice' to proceed!") ->success() ->seconds(3) ->send(); $this->dispatch('playNotificationSound'); $filename = $invoiceNumber . '.xlsx'; $directory = 'uploads/temp'; $disk = Storage::disk('local'); $filePath = $directory . '/' . $filename; //$fullPath = null; if ($disk->exists($filePath)) { //$fullPath = $disk->path($filePath); $disk->delete($filePath); } $this->dispatch('refreshCompletedInvoice', invoiceNumber: $invoiceNumber, plantId: $plantId, isSerial: true); } else { $this->dispatch( 'refreshInvoiceData', invoiceNumber: $invoiceNumber, plantId: $plantId); } return; } } } #[On('process-scan')] public function processSerial($serial) { $this->processSer($serial); } public function processCapacitor($serial, $itemCode) { $user = Filament::auth()->user(); $operatorName = $user->name; $this->currentItemCode = $itemCode; if (!$serial) { return; } if (!preg_match('/^[^\/]+\/[^\/]+\/.+$/', $serial)) { Notification::make() ->title('Invalid Panel Box QR Format:') ->body('Scan the valid panel box QR code to proceed!') ->danger() // ->duration(3000) ->seconds(2) ->send(); return; } $parts = explode('/', $serial); $supplier = $parts[0]; $itemCode = $parts[1]; $serialNumber = implode('/', array_slice($parts, 2)); // Keep rest of the string $existsInStickerMaster = StickerMaster::where('panel_box_code', $itemCode)->where('plant_id', $this->plantId)->whereHas('item', function ($query) { $query->where('code', $this->currentItemCode); }) ->exists(); if (!$existsInStickerMaster) { Notification::make() ->title('Unknown: Panel Box Code') ->body("Unknown panel box code: $itemCode found for item code: $this->currentItemCode") ->danger() // ->duration(4000) ->seconds(2) ->send(); return; } foreach ($this->invoiceData as &$row) { if ( ($row['code'] ?? '') === $this->currentItemCode && ($row['serial_number'] ?? '') === $this->currentSerialNumber ) { $row['panel_box_supplier'] = $supplier; $row['panel_box_item_code'] = $itemCode; $row['panel_box_serial_number'] = $serialNumber; $row['capacitor_scanned_status'] = 1; // $row['scanned_status_set'] = true; $matchingValidation = SerialValidation::with('stickerMaster.item') ->where('serial_number', $this->currentSerialNumber) ->where('plant_id', $this->plantId) ->get() ->first(function ($validation) { return $validation->stickerMaster?->item?->code === $this->currentItemCode; }); if ($matchingValidation) { $hasMotorQr = $matchingValidation->stickerMasterRelation->tube_sticker_motor ?? null; $hasPumpQr = $matchingValidation->stickerMasterRelation->tube_sticker_pump ?? null; $hasPumpSetQr = $matchingValidation->stickerMasterRelation->tube_sticker_pumpset ?? null; // $hasCapacitorQr = $matchingValidation->stickerMasterRelation->panel_box_code ?? null; $hadMotorQr = $matchingValidation->motor_scanned_status ?? null; $hadPumpQr = $matchingValidation->pump_scanned_status ?? null; $hadPumpSetQr = $matchingValidation->scanned_status_set ?? null; // $hadCapacitorQr = $matchingValidation->capacitor_scanned_status ?? null; $packCnt = 1; $scanCnt = 1; // if($hadMotorQr === $hasMotorQr && $hadPumpQr === $hasPumpQr && $hadPumpSetQr === $hasPumpSetQr) if($hasMotorQr || $hasPumpQr || $hasPumpSetQr) { $packCnt = $hasMotorQr ? $packCnt + 1 : $packCnt; $packCnt = $hasPumpQr ? $packCnt + 1 : $packCnt; $packCnt = $hasPumpSetQr ? $packCnt + 1 : $packCnt; $scanCnt = $hadMotorQr ? $scanCnt + 1: $scanCnt; $scanCnt = $hadPumpQr ? $scanCnt + 1: $scanCnt; $scanCnt = $hadPumpSetQr ? $scanCnt + 1: $scanCnt; if($packCnt === $scanCnt) { $matchingValidation->update([ 'panel_box_supplier' => $supplier, 'panel_box_item_code' => $itemCode, 'panel_box_serial_number' => $serialNumber, 'capacitor_scanned_status' => 1, 'scanned_status' => 'Scanned', 'operator_id'=> $operatorName, ]); } else { $matchingValidation->update([ 'panel_box_supplier' => $supplier, 'panel_box_item_code' => $itemCode, 'panel_box_serial_number' => $serialNumber, 'capacitor_scanned_status' => 1, 'operator_id'=> $operatorName, ]); } } else { $matchingValidation->update([ 'panel_box_supplier' => $supplier, 'panel_box_item_code' => $itemCode, 'panel_box_serial_number' => $serialNumber, 'capacitor_scanned_status' => 1, 'scanned_status' => 'Scanned', 'operator_id'=> $operatorName, ]); } // Notification::make() // ->title('Success: Capacitor QR') // // ->title("Panel box code scanned: $itemCode") // ->body("'Capacitor' QR scanned status updated, Scan next QR.") // ->success() // commented // ->seconds(2) // ->send(); $totalQuantity = SerialValidation::where('invoice_number', $matchingValidation->invoice_number)->where('plant_id', $this->plantId)->count(); $scannedQuantity = SerialValidation::where('invoice_number', $matchingValidation->invoice_number)->where('plant_id', $this->plantId)->where('scanned_status', 'Scanned')->count(); // $this->form->fill([ // 'plant_id' => $matchingValidation->plant_id, // 'invoice_number' => $matchingValidation->invoice_number, // 'serial_number' => null, // 'total_quantity' => $totalQuantity, // 'scanned_quantity'=> $scannedQuantity, // ]); if($totalQuantity === $scannedQuantity) { Notification::make() ->title('Completed: Serial Invoice') ->body("Serial invoice '$matchingValidation->invoice_number' completed the scanning process.
Scan the next 'Serial Invoice' to proceed!") ->success() ->seconds(2) ->send(); $this->loadCompletedData($matchingValidation->invoice_number, $matchingValidation->plant_id, true); } else { $this->loadData($matchingValidation->invoice_number, $matchingValidation->plant_id); } } break; } } $this->showCapacitorInput = false; $this->dispatch('focus-serial-number'); } public function getHeading(): string { return 'Scan Serial Validation'; } }