100 Commits

Author SHA1 Message Date
dhanabalan
bfed40f535 Add Laravel Pint workflow for code style checks
Some checks failed
Laravel Pint / pint (pull_request) Failing after 2m3s
2025-07-28 16:04:45 +05:30
dhanabalan
83f98d9e83 Added import / export permissions to mfm meter and create permission to production sticker reprint page 2025-07-25 12:34:01 +05:30
dhanabalan
3d84661640 removed unwanted notification for production quantity 2025-07-25 11:43:26 +05:30
dhanabalan
26ecaf49ef Added sticker master get controller production reprint 2025-07-24 18:03:00 +05:30
dhanabalan
5fe2b74174 Aded filter list api for invoice 2025-07-22 11:11:26 +05:30
dhanabalan
ce901e3b78 Added scan_quantity and pend_quantity fields with respective validations 2025-07-18 20:37:11 +05:30
dhanabalan
31ad036d0e Updated duration for failure messages to 5 seconds and label changed for total sno quantity field 2025-07-18 19:11:51 +05:30
dhanabalan
c363faa357 Updated duration for failure messages to 5 seconds 2025-07-18 19:06:42 +05:30
dhanabalan
a71864905e Updated validation functionality on import 2025-07-18 19:04:30 +05:30
dhanabalan
c75ac4781f Updated duration for success message to 600 ms 2025-07-18 18:57:48 +05:30
dhanabalan
c76cf1fb98 Added permission for import and export file 2025-07-18 18:26:39 +05:30
dhanabalan
95a4ddf11e Added mfm parameter api controller 2025-07-18 18:25:32 +05:30
dhanabalan
c309bed7d9 Added mfm reading policy file 2025-07-18 18:24:15 +05:30
dhanabalan
b2dc9e7024 Added mfm reading resource file 2025-07-18 18:23:57 +05:30
dhanabalan
bff2601ddc Added Mfm reading model file 2025-07-18 18:22:54 +05:30
dhanabalan
e80812b82e Added mfm reading migration file 2025-07-18 18:22:31 +05:30
dhanabalan
81c7812ef6 Added mfm parameter exporter file 2025-07-18 18:18:59 +05:30
dhanabalan
14b5f4ae8b Added importer file for mfm parameter 2025-07-18 18:18:37 +05:30
dhanabalan
eb31e6a406 Added mfm parameter policy 2025-07-18 18:16:45 +05:30
dhanabalan
740ceff0f8 Added mfm parameter resource page 2025-07-18 18:16:15 +05:30
dhanabalan
ea1261fb01 Added mfm parameter model file 2025-07-18 18:15:13 +05:30
dhanabalan
74ad73622d Added mfm parameter migration file 2025-07-18 18:14:35 +05:30
dhanabalan
a62220c9d0 Added temp live reading policy 2025-07-18 18:06:04 +05:30
dhanabalan
a5036b7d6f Added temp live reading resource files 2025-07-18 18:05:27 +05:30
dhanabalan
27b8058ba8 Added templivereading model file 2025-07-18 18:03:55 +05:30
dhanabalan
58091726a4 Added temp live readings migration file 2025-07-18 18:02:55 +05:30
dhanabalan
6bdd210162 Added mfm meter policy file 2025-07-18 17:57:48 +05:30
dhanabalan
b9e3d463ed Added mfm meter resource file 2025-07-18 17:57:30 +05:30
dhanabalan
418e4fcf79 Added mfm meter model file 2025-07-18 17:56:34 +05:30
dhanabalan
33881a3978 Added mfm meter migration file 2025-07-18 17:55:52 +05:30
dhanabalan
9d4cf0e3d9 Increased font size and qr code size 2025-07-18 16:33:02 +05:30
dhanabalan
72704a4a3f Added focusing for capacitor input box in invoice validation 2025-07-16 18:20:31 +05:30
dhanabalan
a34b55267d Changed design in production quantity page 2025-07-16 17:39:15 +05:30
dhanabalan
b6dcb93402 Set duration for success message in production quantity page 2025-07-16 11:34:43 +05:30
dhanabalan
313dc012d5 issue solve for slow going process of item code in production quantity 2025-07-15 13:57:01 +05:30
dhanabalan
2541300910 removed live () in production quantity page 2025-07-15 13:48:30 +05:30
dhanabalan
d1894e0d35 Added logic for fg line concept in production mail alert 2025-07-15 10:56:14 +05:30
dhanabalan
e5143a0ce8 removed fg line in plnt line controller 2025-07-15 09:39:22 +05:30
dhanabalan
b1674bba53 Added FGnames list out api 2025-07-14 12:15:27 +05:30
dhanabalan
52a25fec8e Added FG Line in plant line controller 2025-07-14 11:20:56 +05:30
dhanabalan
dafe1ca458 Added gurad names get api for guard dashboard 2025-07-12 16:20:00 +05:30
dhanabalan
af384faa7c Added guard day count get api 2025-07-12 15:08:29 +05:30
dhanabalan
c6f61fa19a Added unique constraint fro invoice mail report 2025-07-12 14:35:29 +05:30
dhanabalan
aaa93e740b Added get api for invoice quantity for invoice module 2025-07-12 14:31:40 +05:30
dhanabalan
33acf73b5e Added invoice dashboard module get api 2025-07-12 14:03:12 +05:30
dhanabalan
ea5af41f7f Removed unwanted lines in final filter data in production dashboard 2025-07-12 11:36:24 +05:30
dhanabalan
c8ea502833 removed all lines options in production hourly chart 2025-07-12 11:35:30 +05:30
dhanabalan
7e317f6e5f Added status_description in production dashboard 2025-07-12 11:12:47 +05:30
dhanabalan
1465734acd Added all modules with fg count logic 2025-07-12 11:04:31 +05:30
dhanabalan
642053653c Added module production order controller get api 2025-07-12 09:15:42 +05:30
dhanabalan
27524c4d62 Updated validations and success durations and added serial_number maximum length should be 20 digit and clear field if invalid input 2025-07-11 18:23:52 +05:30
dhanabalan
9fa4c0dd49 Added this week nd this month and yesterday and today filter logic for hourly chart in production module 2025-07-11 17:47:09 +05:30
dhanabalan
4d5b14fe69 Added hourly chart logic for production in modules 2025-07-11 17:26:46 +05:30
dhanabalan
b4ca4a9fcd Added hourly data in production quantity in modules 2025-07-11 17:18:01 +05:30
dhanabalan
484bc6d070 Added proper status code for all the api modules 2025-07-11 16:01:37 +05:30
dhanabalan
b153a53f4b Added logic for all lines in modulefilterdataController and changed logic in module controller 2025-07-11 15:51:09 +05:30
dhanabalan
658dea8e72 Added all get api for modules data 2025-07-11 15:32:53 +05:30
dhanabalan
e934cdb193 Added module controller and api logic 2025-07-11 12:30:00 +05:30
dhanabalan
d61c61879f Added module list policy file 2025-07-11 12:27:33 +05:30
dhanabalan
4b597629aa Added module list resource page 2025-07-11 12:26:44 +05:30
dhanabalan
9173dcb50a Added module list model file 2025-07-11 12:26:17 +05:30
dhanabalan
4a17892865 Added module list migration file 2025-07-11 12:25:49 +05:30
dhanabalan
e9d967e2c2 Added logic for all plants in production report 2025-07-11 09:16:32 +05:30
dhanabalan
215e1302cc Added 0 instead of all plamnts in alert mail 2025-07-10 18:26:15 +05:30
dhanabalan
1f085b3f91 solved logic for invalid data type for all plants in alert mail 2025-07-10 18:25:45 +05:30
dhanabalan
ab9c3a80db Added logic in edit page for alert mail 2025-07-10 18:23:48 +05:30
dhanabalan
5f0c01176a Added logic for all plants in invoice report 2025-07-10 17:58:30 +05:30
dhanabalan
b73202e03f resolved logic invoice report 2025-07-10 17:46:34 +05:30
dhanabalan
6a8978f676 commented unwanted lines in production report 2025-07-10 17:07:46 +05:30
dhanabalan
61320dfae8 issue solved for production pln in production report 2025-07-10 17:06:59 +05:30
dhanabalan
7715a20c19 issue solved in qulaity data send to sap page 2025-07-10 16:54:35 +05:30
dhanabalan
bb41d72701 Added production sap data of filament page 2025-07-10 16:39:49 +05:30
dhanabalan
fcb6a945ff Added quality data sap of filament page 2025-07-10 16:39:05 +05:30
dhanabalan
2d2f0d3662 Added production data sap livewire page 2025-07-10 16:38:28 +05:30
dhanabalan
cb4605221c Added quality sap data livewire page 2025-07-10 16:36:55 +05:30
dhanabalan
5a8775c092 Added production data send to sap page 2025-07-10 16:36:00 +05:30
dhanabalan
bef0c986b2 Added Quality data send to sap page 2025-07-10 16:35:16 +05:30
dhanabalan
80163fb0ff Updated validation functionality on import 2025-07-10 16:20:07 +05:30
dhanabalan
170b784a9b Added plant in model file 2025-07-10 15:12:01 +05:30
dhanabalan
4311c64531 changed logici n production mail report 2025-07-10 15:08:32 +05:30
dhanabalan
3c9cc702d4 added plant column in alert mail rules migration file 2025-07-10 15:06:02 +05:30
dhanabalan
752c3cb0da changed logic for sending mails for only have schedule types in production report 2025-07-10 11:21:53 +05:30
dhanabalan
1597795c74 Commented success message 2025-07-10 10:21:53 +05:30
dhanabalan
d75dcdfdd1 Updated validation on import rework data 2025-07-09 21:03:46 +05:30
dhanabalan
b8738a2f6a Added serial_number minimum length should be 9 digit and notification display duration and updated validations 2025-07-09 20:57:06 +05:30
dhanabalan
4ac1823e5b Added serial_number minimum length should be 9 digit and notification display duration and updated validations 2025-07-09 19:35:39 +05:30
dhanabalan
eb2b857aa7 Updated column position in view report 2025-07-09 18:05:11 +05:30
dhanabalan
693e3a23a4 Added serial_number minimum length should be 9 digit and notification display duration 2025-07-09 17:27:41 +05:30
dhanabalan
49d2f1088f Removed colon symbol in notifications 2025-07-09 17:03:09 +05:30
dhanabalan
34b2a05166 Added serial_number minimum length should be 9 digit 2025-07-09 16:16:47 +05:30
dhanabalan
ee99ada3e7 Added notification display duration 2025-07-09 16:15:44 +05:30
dhanabalan
3665b63ff9 Commented scheduler run commands 2025-07-09 11:02:19 +05:30
dhanabalan
aeb3b694e4 Added filter functionality on view report 2025-07-09 11:00:31 +05:30
dhanabalan
a4d2c20451 Removed unwanted space line and updated indentations 2025-07-09 11:00:04 +05:30
dhanabalan
15849fc543 issue solve din production report send mail 2025-07-09 10:32:45 +05:30
dhanabalan
fec85824c2 changed logic for only production mail alert only 2025-07-09 10:30:06 +05:30
dhanabalan
6d6d3f2d60 chnaged logic for prooduction mail report 2025-07-09 10:18:57 +05:30
dhanabalan
29de91e03d Added logic for production mail report 2025-07-09 10:04:54 +05:30
dhanabalan
5ab109006e Added production mail and invoice mail report 2025-07-08 19:42:12 +05:30
dhanabalan
35aa2fab56 Added alert mail rule policy file 2025-07-08 19:03:22 +05:30
105 changed files with 10267 additions and 1635 deletions

30
.github/workflows/pint.yaml vendored Normal file
View File

@@ -0,0 +1,30 @@
name: Laravel Pint
on:
pull_request:
workflow_dispatch:
jobs:
pint:
runs-on: ubuntu-latest
steps:
# Reinstall system libraries to ensure compatibility
- name: Ensure system libraries are up-to-date
run: |
sudo apt-get update
sudo apt-get install --reinstall --yes git libc6
- uses: actions/checkout@v4
- name: Set up PHP
uses: shivammathur/setup-php@v2
with:
php-version: "8.3"
- name: Install dependencies
run: composer install --no-interaction --prefer-dist --no-progress
# Run pint in test mode, check only files different from master branch
- name: Run Laravel Pint in test mode
run: vendor/bin/pint --test --diff=master

View File

@@ -16,7 +16,7 @@ class SendInvoiceReport extends Command
* @var string
*/
// protected $signature = 'app:send-invoice-report';
protected $signature = 'send:invoice-report';
protected $signature = 'send:invoice-report{schedule_type} {plant}';
/**
@@ -29,95 +29,275 @@ class SendInvoiceReport extends Command
/**
* Execute the console command.
*/
// public function handle()
// {
// //
// }
// public function handle()
// {
// $mailRules = \App\Models\AlertMailRule::where('module', 'InvoiceValidation')
// ->where('rule_name', 'InvoiceMailAlert')
// ->get();
// $schedule = $this->argument('schedule_type');
// $plantid = $this->argument('plant');
// $emails = $mailRules->pluck('email')->unique()->toArray();
// $mailRules = \App\Models\AlertMailRule::where('module', 'InvoiceValidation')->get()->groupBy('rule_name');
// $startDate = now()->setTime(8, 0, 0);
// $endDate = now()->copy()->addDay()->setTime(8, 0, 0);
// $plants = InvoiceValidation::select('plant_id')->distinct()->pluck('plant_id');
// $tableData = [];
// $no = 1;
// $serialTableData = [];
// $materialTableData = [];
// $bundleTableData = [];
// $noSerial = 1;
// $noMaterial = 1;
// $noBundle = 1;
// foreach ($plants as $plantId) {
// $plant = Plant::find($plantId);
// $plantName = $plant ? $plant->name : $plantId;
// $totalInvoice = InvoiceValidation::where('plant_id', $plantId)
// //..Serial Invoice
// $totalSerialCount = InvoiceValidation::where('plant_id', $plantId)
// ->whereNull('quantity')
// ->whereBetween('created_at', [$startDate, $endDate])
// ->distinct('invoice_number')
// ->count('invoice_number');
// $startDate = now()->setTime(8, 0, 0);
// $endDate = now()->copy()->addDay()->setTime(8, 0, 0);
// $scannedInvoice = InvoiceValidation::select('invoice_number')
// $scannedSerialCount = InvoiceValidation::select('invoice_number')
// ->where('plant_id', $plantId)
// ->whereNull('quantity')
// ->whereBetween('updated_at', [$startDate, $endDate])
// ->groupBy('invoice_number')
// ->havingRaw("COUNT(*) = SUM(CASE WHEN scanned_status = 'Scanned' THEN 1 ELSE 0 END)")
// ->havingRaw(
// "COUNT(*) = SUM(CASE WHEN scanned_status = 'Scanned' THEN 1 ELSE 0 END)"
// )
// ->count();
// $tableData[] = [
// 'no' => $no++,
// $serialTableData[] = [
// 'no' => $noSerial++,
// 'plant' => $plantName,
// 'totalInvoice' => $totalInvoice,
// 'scannedInvoice' => $scannedInvoice,
// 'totalInvoice' => $totalSerialCount,
// 'scannedInvoice' => $scannedSerialCount,
// ];
// //..Individual Invoice
// $TotalMatCount = InvoiceValidation::where('plant_id', $plantId)
// ->where('quantity', 1)
// ->whereBetween('created_at', [$startDate, $endDate])
// ->distinct('invoice_number')
// ->count('invoice_number');
// $scannedMatCount = InvoiceValidation::select('invoice_number')
// ->where('plant_id', $plantId)
// ->where('quantity', 1)
// ->whereBetween('updated_at', [$startDate, $endDate])
// ->groupBy('invoice_number')
// ->havingRaw(
// "COUNT(*) = SUM(CASE WHEN serial_number IS NOT NULL AND serial_number != '' THEN 1 ELSE 0 END)"
// )
// ->count();
// $materialTableData[] = [
// 'no' => $noMaterial++,
// 'plant' => $plantName,
// 'totalInvoice' => $TotalMatCount,
// 'scannedInvoice' => $scannedMatCount,
// ];
// //..BUndle Invoice
// $totalBundleCount = InvoiceValidation::where('plant_id', $plantId)
// ->where('quantity', '>', 1)
// ->whereBetween('created_at', [$startDate, $endDate])
// ->distinct('invoice_number')
// ->count('invoice_number');
// $scannedBundleCount = InvoiceValidation::select('invoice_number')
// ->where('plant_id', $plantId)
// ->where('quantity', '>', 1)
// ->whereBetween('updated_at', [$startDate, $endDate])
// ->groupBy('invoice_number')
// ->havingRaw(
// "COUNT(*) = SUM(CASE WHEN serial_number IS NOT NULL AND serial_number != '' THEN 1 ELSE 0 END)"
// )
// ->count();
// $bundleTableData[] = [
// 'no' => $noBundle++,
// 'plant' => $plantName,
// 'totalInvoice' => $totalBundleCount,
// 'scannedInvoice' => $scannedBundleCount,
// ];
// }
// // Mail::to('jothikumar.padmanaban@cripumps.com')->send(
// // new test($tableData)
// // );
// if (!empty($emails))
// {
// // Mail::to($emails)->send(new test($tableData));
// // $this->info('Invoice report email sent successfully to: ' . implode(', ', $emails));
// // Send to SerialInvoiceMail recipients
// if ($mailRules->has('SerialInvoiceMail')) {
// $emails = $mailRules['SerialInvoiceMail']->pluck('email')->unique()->toArray();
// foreach ($emails as $email) {
// Mail::to($email)->send(new test($tableData));
// Mail::to($email)->send(new test($serialTableData, [], []));
// }
// }
// else
// {
// $this->info('No recipients found for InvoiceMailAlert.');
// // Send to MaterialInvoiceMail recipients (material + bundle table)
// if ($mailRules->has('MaterialInvoiceMail')) {
// $emails = $mailRules['MaterialInvoiceMail']->pluck('email')->unique()->toArray();
// foreach ($emails as $email) {
// Mail::to($email)->send(new test([], $materialTableData, $bundleTableData));
// }
// }
// // Send to InvoiceMail recipients (all three tables)
// if ($mailRules->has('InvoiceMail')) {
// $emails = $mailRules['InvoiceMail']->pluck('email')->unique()->toArray();
// foreach ($emails as $email) {
// Mail::to($email)->send(new test($serialTableData, $materialTableData, $bundleTableData));
// }
// }
// //$this->info(json_encode($materialTableData));
// }
// public function handle()
// {
// $schedule = $this->argument('schedule_type');
// $plantId = $this->argument('plant');
// $mailRules = \App\Models\AlertMailRule::where('module', 'InvoiceValidation')->get()->groupBy('rule_name');
// $startDate = now()->setTime(8, 0, 0);
// $endDate = now()->copy()->addDay()->setTime(8, 0, 0);
// $serialTableData = [];
// $materialTableData = [];
// $bundleTableData = [];
// $plant = Plant::find($plantId);
// $plantName = $plant ? $plant->name : $plantId;
// // Serial Invoice
// $totalSerialCount = InvoiceValidation::where('plant_id', $plantId)
// ->whereNull('quantity')
// ->whereBetween('created_at', [$startDate, $endDate])
// ->distinct('invoice_number')
// ->count('invoice_number');
// $scannedSerialCount = InvoiceValidation::select('invoice_number')
// ->where('plant_id', $plantId)
// ->whereNull('quantity')
// ->whereBetween('updated_at', [$startDate, $endDate])
// ->groupBy('invoice_number')
// ->havingRaw(
// "COUNT(*) = SUM(CASE WHEN scanned_status = 'Scanned' THEN 1 ELSE 0 END)"
// )
// ->count();
// $serialTableData[] = [
// 'no' => 1,
// 'plant' => $plantName,
// 'totalInvoice' => $totalSerialCount,
// 'scannedInvoice' => $scannedSerialCount,
// ];
// // Individual Material Invoice
// $TotalMatCount = InvoiceValidation::where('plant_id', $plantId)
// ->where('quantity', 1)
// ->whereBetween('created_at', [$startDate, $endDate])
// ->distinct('invoice_number')
// ->count('invoice_number');
// $scannedMatCount = InvoiceValidation::select('invoice_number')
// ->where('plant_id', $plantId)
// ->where('quantity', 1)
// ->whereBetween('updated_at', [$startDate, $endDate])
// ->groupBy('invoice_number')
// ->havingRaw(
// "COUNT(*) = SUM(CASE WHEN serial_number IS NOT NULL AND serial_number != '' THEN 1 ELSE 0 END)"
// )
// ->count();
// $materialTableData[] = [
// 'no' => 1,
// 'plant' => $plantName,
// 'totalInvoice' => $TotalMatCount,
// 'scannedInvoice' => $scannedMatCount,
// ];
// // Bundle Invoice
// $totalBundleCount = InvoiceValidation::where('plant_id', $plantId)
// ->where('quantity', '>', 1)
// ->whereBetween('created_at', [$startDate, $endDate])
// ->distinct('invoice_number')
// ->count('invoice_number');
// $scannedBundleCount = InvoiceValidation::select('invoice_number')
// ->where('plant_id', $plantId)
// ->where('quantity', '>', 1)
// ->whereBetween('updated_at', [$startDate, $endDate])
// ->groupBy('invoice_number')
// ->havingRaw(
// "COUNT(*) = SUM(CASE WHEN serial_number IS NOT NULL AND serial_number != '' THEN 1 ELSE 0 END)"
// )
// ->count();
// $bundleTableData[] = [
// 'no' => 1,
// 'plant' => $plantName,
// 'totalInvoice' => $totalBundleCount,
// 'scannedInvoice' => $scannedBundleCount,
// ];
// // Send to SerialInvoiceMail recipients
// if ($mailRules->has('SerialInvoiceMail')) {
// $emails = $mailRules['SerialInvoiceMail']->pluck('email')->unique()->toArray();
// foreach ($emails as $email) {
// Mail::to($email)->send(new test($serialTableData, [], []));
// }
// }
// // Send to MaterialInvoiceMail recipients (material + bundle table)
// if ($mailRules->has('MaterialInvoiceMail')) {
// $emails = $mailRules['MaterialInvoiceMail']->pluck('email')->unique()->toArray();
// foreach ($emails as $email) {
// Mail::to($email)->send(new test([], $materialTableData, $bundleTableData));
// }
// }
// // Send to InvoiceMail recipients (all three tables)
// if ($mailRules->has('InvoiceMail')) {
// $emails = $mailRules['InvoiceMail']->pluck('email')->unique()->toArray();
// foreach ($emails as $email) {
// Mail::to($email)->send(new test($serialTableData, $materialTableData, $bundleTableData));
// }
// }
// // $this->table(
// // ['No', 'Plant', 'Total Invoice', 'Scanned Invoice'],
// // $serialTableData
// // );
// }
public function handle()
{
// Group emails by rule name
$schedule = $this->argument('schedule_type');
$plantIdArg = (int) $this->argument('plant'); // can be 0 for all plants
$mailRules = \App\Models\AlertMailRule::where('module', 'InvoiceValidation')->get()->groupBy('rule_name');
$startDate = now()->setTime(8, 0, 0);
$endDate = now()->copy()->addDay()->setTime(8, 0, 0);
$plants = InvoiceValidation::select('plant_id')->distinct()->pluck('plant_id');
// Build all tables once
$serialTableData = [];
$materialTableData = [];
$bundleTableData = [];
$noSerial = 1;
$noMaterial = 1;
$noBundle = 1;
foreach ($plants as $plantId) {
// Get plant IDs: either one plant or all
$plantIds = $plantIdArg == 0
? InvoiceValidation::select('plant_id')->distinct()->pluck('plant_id')->toArray()
: [$plantIdArg];
$no = 1;
foreach ($plantIds as $plantId) {
$plant = Plant::find($plantId);
$plantName = $plant ? $plant->name : $plantId;
//..Serial Invoice
// Serial Invoice
$totalSerialCount = InvoiceValidation::where('plant_id', $plantId)
->whereNull('quantity')
->whereBetween('created_at', [$startDate, $endDate])
@@ -129,21 +309,18 @@ class SendInvoiceReport extends Command
->whereNull('quantity')
->whereBetween('updated_at', [$startDate, $endDate])
->groupBy('invoice_number')
->havingRaw(
"COUNT(*) = SUM(CASE WHEN scanned_status = 'Scanned' THEN 1 ELSE 0 END)"
)
->havingRaw("COUNT(*) = SUM(CASE WHEN scanned_status = 'Scanned' THEN 1 ELSE 0 END)")
->count();
$serialTableData[] = [
'no' => $noSerial++,
'no' => $no,
'plant' => $plantName,
'totalInvoice' => $totalSerialCount,
'scannedInvoice' => $scannedSerialCount,
];
//..Individual Invoice
$TotalMatCount = InvoiceValidation::where('plant_id', $plantId)
// Material Invoice
$totalMatCount = InvoiceValidation::where('plant_id', $plantId)
->where('quantity', 1)
->whereBetween('created_at', [$startDate, $endDate])
->distinct('invoice_number')
@@ -154,20 +331,17 @@ class SendInvoiceReport extends Command
->where('quantity', 1)
->whereBetween('updated_at', [$startDate, $endDate])
->groupBy('invoice_number')
->havingRaw(
"COUNT(*) = SUM(CASE WHEN serial_number IS NOT NULL AND serial_number != '' THEN 1 ELSE 0 END)"
)
->havingRaw("COUNT(*) = SUM(CASE WHEN serial_number IS NOT NULL AND serial_number != '' THEN 1 ELSE 0 END)")
->count();
$materialTableData[] = [
'no' => $noMaterial++,
'no' => $no,
'plant' => $plantName,
'totalInvoice' => $TotalMatCount,
'totalInvoice' => $totalMatCount,
'scannedInvoice' => $scannedMatCount,
];
//..BUndle Invoice
// Bundle Invoice
$totalBundleCount = InvoiceValidation::where('plant_id', $plantId)
->where('quantity', '>', 1)
->whereBetween('created_at', [$startDate, $endDate])
@@ -179,17 +353,17 @@ class SendInvoiceReport extends Command
->where('quantity', '>', 1)
->whereBetween('updated_at', [$startDate, $endDate])
->groupBy('invoice_number')
->havingRaw(
"COUNT(*) = SUM(CASE WHEN serial_number IS NOT NULL AND serial_number != '' THEN 1 ELSE 0 END)"
)
->havingRaw("COUNT(*) = SUM(CASE WHEN serial_number IS NOT NULL AND serial_number != '' THEN 1 ELSE 0 END)")
->count();
$bundleTableData[] = [
'no' => $noBundle++,
'no' => $no,
'plant' => $plantName,
'totalInvoice' => $totalBundleCount,
'scannedInvoice' => $scannedBundleCount,
];
$no++;
}
// Send to SerialInvoiceMail recipients
@@ -216,8 +390,16 @@ class SendInvoiceReport extends Command
}
}
//$this->info(json_encode($materialTableData));
// Show preview in console
$this->info('--- Serial Invoice Table ---');
$this->table(['#', 'Plant', 'Total Invoice', 'Scanned Invoice'], $serialTableData);
$this->info('--- Material Invoice Table ---');
$this->table(['#', 'Plant', 'Total Invoice', 'Scanned Invoice'], $materialTableData);
$this->info('--- Bundle Invoice Table ---');
$this->table(['#', 'Plant', 'Total Invoice', 'Scanned Invoice'], $bundleTableData);
}
}

View File

@@ -8,7 +8,9 @@ use Illuminate\Console\Command;
use Illuminate\Support\Facades\Mail;
use App\Mail\ProductionMail;
use App\Models\Line;
use App\Models\ProductionPlan;
use App\Models\ProductionQuantity;
use DB;
class SendProductionReport extends Command
{
@@ -17,7 +19,8 @@ class SendProductionReport extends Command
*
* @var string
*/
protected $signature = 'send:production-report';
//protected $signature = 'send:production-report';
protected $signature = 'send:production-report {schedule_type} {plant}';
/**
* The console command description.
@@ -29,106 +32,216 @@ class SendProductionReport extends Command
/**
* Execute the console command.
*/
// public function handle()
// {
// $scheduleType = $this->argument('schedule_type');
// $plantId = $this->argument('plant');
// $mailRules = \App\Models\AlertMailRule::where('module', 'ProductionQuantities')
// ->where('rule_name', 'ProductionMail')
// ->where('plant', $plantId)
// ->where('schedule_type', $scheduleType)
// ->get();
// $emails = $mailRules->pluck('email')->unique()->toArray();
// $plant = Plant::find($plantId);
// if (!$plant) {
// $this->error("Invalid plant ID: $plantId");
// return;
// }
// $lines = Line::where('plant_id', $plantId)->get();
// $startDate = now()->setTime(8, 0, 0);
// $endDate = now()->copy()->addDay()->setTime(8, 0, 0);
// $PlanstartDate = now()->setTime(8, 0, 0);
// $planendDate = now()->copy()->addDay()->setTime(7, 59, 00);
// $tableData = [];
// $no = 1;
// foreach ($lines as $line) {
// $lineId = $line->id;
// $lineName = $line->name;
// $targetQuantity = ProductionPlan::where('plant_id', $plantId)
// ->where('line_id', $lineId)
// ->whereBetween('created_at', [$PlanstartDate, $planendDate])
// ->sum('plan_quantity');
// $productionQuantity = ProductionQuantity::where('plant_id', $plantId)
// ->where('line_id', $lineId)
// ->whereBetween('created_at', [$startDate, $endDate])
// ->count();
// $tableData[] = [
// 'no' => $no++,
// 'plant' => $plant->name,
// 'line' => $lineName,
// 'targetQuantity' => $targetQuantity,
// 'productionQuantity' => $productionQuantity,
// ];
// }
// // $this->table(
// // ['No', 'Plant', 'Line', 'Target Quantity', 'Production Quantity'],
// // $tableData
// // );
// if (!empty($emails)) {
// foreach ($emails as $email) {
// Mail::to($email)->send(new ProductionMail($tableData));
// }
// } else {
// $this->info('No recipients found for ProductionMailAlert.');
// }
// $this->info("Production report sent to " . count($emails) . " recipient(s).");
// }
public function handle()
{
$scheduleType = $this->argument('schedule_type');
$plantId = (int) $this->argument('plant'); // cast to int for safety
// Fetch mail rules based on schedule type
$mailRules = \App\Models\AlertMailRule::where('module', 'ProductionQuantities')
->where('rule_name', 'ProductionMail')
->where('schedule_type', $scheduleType)
->where('plant', $plantId)
->get();
$emails = $mailRules->pluck('email')->unique()->toArray();
$lines = Line::all();
$fgLineIds = [];
$nonFgLineIds = [];
$lineNames = [];
$plants = $plantId == 0
? Plant::all()
: Plant::where('id', $plantId)->get();
foreach ($lines as $line) {
$lineNames[$line->id] = $line->name;
if ($line->type == 'FG Line') {
$fgLineIds[] = $line->id;
} else {
$nonFgLineIds[] = $line->id;
}
if ($plants->isEmpty()) {
$this->error("No valid plant(s) found.");
return;
}
// 2. Set date range
$startDate = now()->setTime(8, 0, 0);
$endDate = now()->copy()->addDay()->setTime(8, 0, 0);
// $startDate = now()->setTime(8, 0, 0);
// $endDate = now()->copy()->addDay()->setTime(8, 0, 0);
if (strtolower($scheduleType) == 'daily')
{
$startDate = now()->subDay()->setTime(8, 0, 0);
$endDate = now()->setTime(8, 0, 0);
}
else
{
$startDate = now()->setTime(8, 0, 0);
$endDate = now()->copy()->addDay()->setTime(8, 0, 0);
}
// 3. Get all plants
$plants = ProductionQuantity::select('plant_id')->distinct()->pluck('plant_id');
// 4. Get production quantities for FG and non-FG lines in one go
$fgProduction = ProductionQuantity::select('line_id', \DB::raw('COUNT(*) as total_quantity'))
->whereBetween('created_at', [$startDate, $endDate])
->whereIn('line_id', $fgLineIds)
->groupBy('line_id')
->pluck('total_quantity', 'line_id')
->toArray();
$nonFgProduction = ProductionQuantity::select('line_id', \DB::raw('COUNT(*) as total_quantity'))
->whereBetween('created_at', [$startDate, $endDate])
->whereIn('line_id', $nonFgLineIds)
->groupBy('line_id')
->pluck('total_quantity', 'line_id')
->toArray();
$PlanstartDate = now()->setTime(8, 0, 0);
$planendDate = now()->copy()->addDay()->setTime(7, 59, 0);
$tableData = [];
$no = 1;
foreach ($plants as $plantId)
// foreach ($plants as $plant) {
// $lines = Line::where('plant_id', $plant->id)->get();
// foreach ($lines as $line) {
// $targetQuantity = ProductionPlan::where('plant_id', $plant->id)
// ->where('line_id', $line->id)
// ->whereBetween('created_at', [$PlanstartDate, $planendDate])
// ->sum('plan_quantity');
// $productionQuantity = ProductionQuantity::where('plant_id', $plant->id)
// ->where('line_id', $line->id)
// ->whereBetween('created_at', [$startDate, $endDate])
// ->count();
// $tableData[] = [
// 'no' => $no++,
// 'plant' => $plant->name,
// 'line' => $line->name,
// 'targetQuantity' => $targetQuantity,
// 'productionQuantity' => $productionQuantity,
// ];
// }
// }
// $fgTableData = []; // store FG Line related data
// foreach ($plants as $plant) {
// // ✅ Only get FG Lines
// $fgLines = Line::where('plant_id', $plant->id)
// ->where('type', 'FG Line')
// ->get();
// foreach ($fgLines as $line) {
// $validationCount = \App\Models\QualityValidation::where('plant_id', $plant->id)
// ->where('line_id', $line->id)
// ->whereBetween('created_at', [$startDate, $endDate])
// ->count();
// $fgTableData[] = [
// 'no' => $no++,
// 'plant' => $plant->name,
// 'line' => $line->name,
// 'targetQuantity' => $targetQuantity,
// 'productionQuantity' => $validationCount,
// ];
// }
// }
foreach ($plants as $plant)
{
$plant = Plant::find($plantId);
$plantName = $plant ? $plant->name : $plantId;
$lines = Line::where('plant_id', $plant->id)->get();
//Get all unique line_ids for this plant
$lineIds = ProductionQuantity::where('plant_id', $plantId)
->select('line_id')
->distinct()
->pluck('line_id');
foreach ($lines as $line) {
$targetQuantity = ProductionPlan::where('plant_id', $plant->id)
->where('line_id', $line->id)
->whereBetween('created_at', [$PlanstartDate, $planendDate])
->sum('plan_quantity');
foreach ($lineIds as $lineId) {
$lineName = $lineNames[$lineId] ?? $lineId;
$targetQuantity = \App\Models\ProductionPlan::where('plant_id', $plantId)
->where('line_id', $lineId)
->whereBetween('created_at', [$startDate, $endDate])
->sum('plan_quantity');
$productionQuantity = 0;
// Use the correct production quantity array based on line type
if (in_array($lineId, $nonFgLineIds))
{
$productionQuantity = $nonFgProduction[$lineId] ?? 0;
}
else
{
$fgproductionQuan = $fgProduction[$lineId] ?? 0;
if (strtolower($line->type) === 'fg line') {
$productionQuantity = \App\Models\QualityValidation::where('plant_id', $plant->id)
->where('line_id', $line->id)
->whereBetween('created_at', [$startDate, $endDate])
->count();
} else {
$productionQuantity = ProductionQuantity::where('plant_id', $plant->id)
->where('line_id', $line->id)
->whereBetween('created_at', [$startDate, $endDate])
->count();
}
$tableData[] = [
'no' => $no++,
'plant' => $plantName,
'line' => $lineName,
'plant' => $plant->name,
'line' => $line->name,
'targetQuantity' => $targetQuantity,
'productionQuantity' => $productionQuantity,
];
}
}
//$this->info(json_encode($tableData));
if (!empty($emails))
{
// Mail::to($emails)->send(new test($tableData));
$this->info('production report email sent successfully to: ' . implode(', ', $emails));
foreach ($emails as $email)
{
///$this->table(['No', 'Plant', 'Line', 'Target Quantity', 'Production Quantity'], $fgTableData);
$this->table(['No', 'Plant', 'Line', 'Target Quantity', 'Production Quantity'], $tableData);
if (!empty($emails)) {
foreach ($emails as $email) {
Mail::to($email)->send(new ProductionMail($tableData));
}
} else {
$this->info('No recipients found for ProductionMailAlert.');
}
else
{
$this->info('No recipients found for InvoiceMailAlert.');
}
//$this->info(implode(', ', $emails));
$this->info("Production report sent to " . count($emails) . " recipient(s).");
}
}

View File

@@ -0,0 +1,43 @@
<?php
namespace App\Filament\Exports;
use App\Models\MfmParameter;
use Filament\Actions\Exports\ExportColumn;
use Filament\Actions\Exports\Exporter;
use Filament\Actions\Exports\Models\Export;
class MfmParameterExporter extends Exporter
{
protected static ?string $model = MfmParameter::class;
public static function getColumns(): array
{
return [
ExportColumn::make('id')
->label('ID'),
ExportColumn::make('plant.name'),
ExportColumn::make('name'),
ExportColumn::make('register_id'),
ExportColumn::make('identifier'),
ExportColumn::make('byte_to_convert'),
ExportColumn::make('type_to_convert'),
ExportColumn::make('decimal_to_display'),
ExportColumn::make('created_at'),
ExportColumn::make('updated_at'),
ExportColumn::make('deleted_at'),
ExportColumn::make('mfmMeter.name'),
];
}
public static function getCompletedNotificationBody(Export $export): string
{
$body = 'Your mfm parameter export has completed and ' . number_format($export->successful_rows) . ' ' . str('row')->plural($export->successful_rows) . ' exported.';
if ($failedRowsCount = $export->getFailedRowsCount()) {
$body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to export.';
}
return $body;
}
}

View File

@@ -59,17 +59,19 @@ class ItemImporter extends Importer
public function resolveRecord(): ?Item
{
$warnMsg = [];
$iCode = trim($this->data['code']);
$description = trim($this->data['description']);
$plant = Plant::where('name', $this->data['plant'])->first();
if (!$plant) {
$warnMsg[] = "Plant not found"; // '" . $this->data['plant'] . "'
}
if (Str::length($this->data['code']) < 6 || !ctype_alnum($this->data['code'])) {
if (Str::length($iCode) < 6 || !ctype_alnum($iCode)) {
$warnMsg[] = "Invalid item code found";
}
// if (Str::length($this->data['uom']) <= 0) {
// $warnMsg[] = "Invalid unit of measure found";
// }
if (Str::length($this->data['description']) < 5) {
if (Str::length($description) < 5) {
$warnMsg[] = "Invalid description found";
}
if (Str::length($this->data['hourly_quantity']) < 0 || !is_numeric($this->data['hourly_quantity']) || $this->data['hourly_quantity'] <= 0) {
@@ -79,14 +81,14 @@ class ItemImporter extends Importer
throw new RowImportFailedException(implode(', ', $warnMsg));
}
return Item::updateOrCreate([
'code' => $this->data['code'],
'code' => $iCode,
'plant_id' => $plant->id
],
[
'category' => $this->data['category'],
'description' => $this->data['description'],
'category' => trim($this->data['category']),
'description' => $description,
'hourly_quantity' => $this->data['hourly_quantity'],
'uom' => $this->data['uom']
'uom' => trim($this->data['uom'])
]
);
// return new Item;

View File

@@ -129,7 +129,7 @@ class LocatorInvoiceValidationImporter extends Importer
if (Str::length($invoiceNo) < 5 || !ctype_alnum($invoiceNo)) {
$warnMsg[] = "Invalid invoice number found";
}
if (Str::length($serialNo) < 9 || !ctype_alnum($serialNo)) {
if (Str::length($serialNo) < 9 || Str::length($serialNo) > 20 || !ctype_alnum($serialNo)) {
$warnMsg[] = "Invalid serial number found";
}
if (Str::length($palletNo) > 0 && Str::length($palletNo) < 10) {

View File

@@ -0,0 +1,91 @@
<?php
namespace App\Filament\Imports;
use App\Models\MfmParameter;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
class MfmParameterImporter extends Importer
{
protected static ?string $model = MfmParameter::class;
public static function getColumns(): array
{
return [
ImportColumn::make('plant')
->requiredMapping()
->exampleHeader('Plant Name')
->example('Ransar Industries-I')
->label('Plant Name')
->relationship(resolveUsing:'name')
->rules(['required']),
ImportColumn::make('mfmMeter')
->requiredMapping()
->exampleHeader('Mfm Meter Sequence')
->example('1')
->label('Mfm Meter Sequence')
->relationship(resolveUsing:'sequence')
->rules(['required']),
ImportColumn::make('name')
->requiredMapping()
->exampleHeader('Parameter Name')
->example('apparent_energy_received')
->label('Parameter Name')
->rules(['required']),
ImportColumn::make('register_id')
->requiredMapping()
->exampleHeader('Register ID')
->example('2715')
->label('Register ID')
->rules(['required']),
ImportColumn::make('identifier')
->requiredMapping()
->exampleHeader('Identifier')
->example('Kvah')
->label('Identifier')
->rules(['required']),
ImportColumn::make('byte_to_convert')
->requiredMapping()
->exampleHeader('Byte To Convert')
->example('1')
->label('Byte To Convert')
->rules(['required', 'integer']),
ImportColumn::make('type_to_convert')
->requiredMapping()
->exampleHeader('Type To Convert')
->example('FLOAT32')
->label('Type To Convert')
->rules(['required']),
ImportColumn::make('decimal_to_display')
->requiredMapping()
->exampleHeader('Decimal To Display')
->example('2')
->label('Decimal To Display')
->rules(['required', 'integer']),
];
}
public function resolveRecord(): ?MfmParameter
{
// return MfmParameter::firstOrNew([
// // Update existing records, matching them by `$this->data['column_name']`
// 'email' => $this->data['email'],
// ]);
return new MfmParameter();
}
public static function getCompletedNotificationBody(Import $import): string
{
$body = 'Your mfm parameter import has completed and ' . number_format($import->successful_rows) . ' ' . str('row')->plural($import->successful_rows) . ' imported.';
if ($failedRowsCount = $import->getFailedRowsCount()) {
$body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to import.';
}
return $body;
}
}

View File

@@ -122,7 +122,7 @@ class PalletValidationImporter extends Importer
}
else
{
if (Str::length($serialNo) < 9 || !ctype_alnum($serialNo)) {
if (Str::length($serialNo) < 9 || Str::length($serialNo) > 20 || !ctype_alnum($serialNo)) {
$warnMsg[] = "Invalid serial number found";
}
if (Str::length($palletNo) > 0 && Str::length($palletNo) < 10) {

View File

@@ -148,7 +148,7 @@ class ReworkLocatorInvoiceValidationImporter extends Importer
if (Str::length($invoiceNo) < 5 || !ctype_alnum($invoiceNo)) {
$warnMsg[] = "Invalid invoice number found";
}
if (Str::length($serialNo) < 9 || !ctype_alnum($serialNo)) {
if (Str::length($serialNo) < 9 || Str::length($serialNo) > 20 || !ctype_alnum($serialNo)) {
$warnMsg[] = "Invalid serial number found";
}
if (Str::length($palletNo) > 0 && Str::length($palletNo) < 10) {
@@ -213,27 +213,24 @@ class ReworkLocatorInvoiceValidationImporter extends Importer
$warnMsg[] = "Invalid 'Scanned DateTime' format. Expected DD-MM-YYYY HH:MM:SS";
}
if (Str::length($updatedAt) > 0)
{
foreach ($formats as $format) {
try {
$uDateTime = Carbon::createFromFormat($format, $updatedAt);
break;
} catch (\Exception $e) {
// Optionally collect warning messages
// $warnMsg[] = "Date format mismatch with format: $format";
}
foreach ($formats as $format) {
try {
$uDateTime = Carbon::createFromFormat($format, $updatedAt);
break;
} catch (\Exception $e) {
// Optionally collect warning messages
// $warnMsg[] = "Date format mismatch with format: $format";
}
}
if (!isset($uDateTime)) {
$warnMsg[] = "Invalid 'Updated DateTime' format. Expected DD-MM-YYYY HH:MM:SS";
}
else
{
if (isset($cDateTime) && isset($uDateTime)) {
if ($cDateTime->greaterThan($uDateTime)) {
$warnMsg[] = "'Created DataTime' is greater than 'Updated DateTime'.";
}
if (!isset($uDateTime)) {
$warnMsg[] = "Invalid 'Updated DateTime' format. Expected DD-MM-YYYY HH:MM:SS";
}
else
{
if (isset($cDateTime) && isset($uDateTime)) {
if ($cDateTime->greaterThan($uDateTime)) {
$warnMsg[] = "'Created DataTime' is greater than 'Updated DateTime'.";
}
}
}
@@ -280,9 +277,9 @@ class ReworkLocatorInvoiceValidationImporter extends Importer
'scanned_status' => $scannedStat,
'upload_status' => $uploadStat,
'created_at' => $cDateTime->format('Y-m-d H:i:s'),
'scanned_at' => (Str::length($scannedAt) > 0) ? $sDateTime->format('Y-m-d H:i:s') : null,
'updated_at' => (Str::length($updatedAt) > 0) ? $uDateTime->format('Y-m-d H:i:s') : null,
'reworked_at' => (Str::length($reworkedAt) > 0) ? $rDateTime->format('Y-m-d H:i:s') : null,
'scanned_at' => $sDateTime->format('Y-m-d H:i:s'),
'updated_at' => $uDateTime->format('Y-m-d H:i:s'),
'reworked_at' => $rDateTime->format('Y-m-d H:i:s'),
'created_by' => $createdBy,
'scanned_by' => $scannedBy,
'updated_by' => $updatedBy,

View File

@@ -162,73 +162,78 @@ class StickerMasterImporter extends Importer
public function resolveRecord(): ?StickerMaster
{
$warnMsg = [];
$item = null;
$plant = Plant::where('name', $this->data['plant'])->first();
if (!$plant) {
$warnMsg[] = "Plant not found";
}
$item = null;
if ($plant) {
else
{
$item = Item::where('code', $this->data['item'])->where('plant_id', $plant->id)->first();
}
if (!$item) {
$warnMsg[] = "Item code not found";
}
if (Str::length($this->data['serial_number_motor']) > 0 && $this->data['serial_number_motor'] != '1') {
$warnMsg[] = "Serial number motor must be 1 or empty";
}
if (Str::length($this->data['serial_number_pump']) > 0 && $this->data['serial_number_pump'] != '1') {
$warnMsg[] = "Serial number pump must be 1 or empty";
}
if (Str::length($this->data['serial_number_pumpset']) > 0 && $this->data['serial_number_pumpset'] != '1') {
$warnMsg[] = "Serial number pumpset must be 1 or empty";
}
if (Str::length($this->data['pack_slip_motor']) > 0 && $this->data['pack_slip_motor'] != '1') {
$warnMsg[] = "Pack slip motor must be 1 or empty";
}
if (Str::length($this->data['pack_slip_pump']) > 0 && $this->data['pack_slip_pump'] != '1') {
$warnMsg[] = "Pack slip pump must be 1 or empty";
}
if (Str::length($this->data['pack_slip_pumpset']) > 0 && $this->data['pack_slip_pumpset'] != '1') {
$warnMsg[] = "Pack slip pumpset must be 1 or empty";
}
if (Str::length($this->data['name_plate_motor']) > 0 && $this->data['name_plate_motor'] != '1') {
$warnMsg[] = "Name plate motor must be 1 or empty";
}
if (Str::length($this->data['name_plate_pump']) > 0 && $this->data['name_plate_pump'] != '1') {
$warnMsg[] = "Name plate pump must be 1 or empty";
}
if (Str::length($this->data['name_plate_pumpset']) > 0 && $this->data['name_plate_pumpset'] != '1') {
$warnMsg[] = "Name plate pumpset must be 1 or empty";
}
if (Str::length($this->data['tube_sticker_motor']) > 0 && $this->data['tube_sticker_motor'] != '1') {
$warnMsg[] = "Tube sticker motor must be 1 or empty";
}
if (Str::length($this->data['tube_sticker_pump']) > 0 && $this->data['tube_sticker_pump'] != '1') {
$warnMsg[] = "Tube sticker pump must be 1 or empty";
}
if (Str::length($this->data['tube_sticker_pumpset']) > 0 && $this->data['tube_sticker_pumpset'] != '1') {
$warnMsg[] = "Tube sticker pumpset must be 1 or empty";
}
if (Str::length($this->data['warranty_card']) > 0 && $this->data['warranty_card'] != '1') {
$warnMsg[] = "Warranty card must be 1 or empty";
}
if (Str::length($this->data['panel_box_code']) > 0 && (Str::length($this->data['panel_box_code']) < 6 || !ctype_alnum($this->data['panel_box_code']))) {
$warnMsg[] = "Invalid panel box code found";
}
if (!is_numeric($this->data['load_rate']) || $this->data['load_rate'] < 0) {
$warnMsg[] = "Load rate must be greater than or equal to 0";
}
if (Str::length($this->data['bundle_quantity']) > 0 && (!is_numeric($this->data['bundle_quantity']) || $this->data['bundle_quantity'] <= 1)) {
$warnMsg[] = "Bundle quantity must be greater than or equal to '2' or empty";
}
if (Str::length($this->data['material_type']) > 0 && $this->data['material_type'] != '1' && $this->data['material_type'] != '2' && $this->data['material_type'] != '3') { //($this->data['material_type'] != null) &&
$warnMsg[] = "Material type must be 1 or 2 or 3 or empty";
if (!$item) {
$warnMsg[] = "Item code not found";
}
else
{
if (Str::length($this->data['serial_number_motor']) > 0 && $this->data['serial_number_motor'] != '1') {
$warnMsg[] = "Serial number motor must be 1 or empty";
}
if (Str::length($this->data['serial_number_pump']) > 0 && $this->data['serial_number_pump'] != '1') {
$warnMsg[] = "Serial number pump must be 1 or empty";
}
if (Str::length($this->data['serial_number_pumpset']) > 0 && $this->data['serial_number_pumpset'] != '1') {
$warnMsg[] = "Serial number pumpset must be 1 or empty";
}
if (Str::length($this->data['pack_slip_motor']) > 0 && $this->data['pack_slip_motor'] != '1') {
$warnMsg[] = "Pack slip motor must be 1 or empty";
}
if (Str::length($this->data['pack_slip_pump']) > 0 && $this->data['pack_slip_pump'] != '1') {
$warnMsg[] = "Pack slip pump must be 1 or empty";
}
if (Str::length($this->data['pack_slip_pumpset']) > 0 && $this->data['pack_slip_pumpset'] != '1') {
$warnMsg[] = "Pack slip pumpset must be 1 or empty";
}
if (Str::length($this->data['name_plate_motor']) > 0 && $this->data['name_plate_motor'] != '1') {
$warnMsg[] = "Name plate motor must be 1 or empty";
}
if (Str::length($this->data['name_plate_pump']) > 0 && $this->data['name_plate_pump'] != '1') {
$warnMsg[] = "Name plate pump must be 1 or empty";
}
if (Str::length($this->data['name_plate_pumpset']) > 0 && $this->data['name_plate_pumpset'] != '1') {
$warnMsg[] = "Name plate pumpset must be 1 or empty";
}
if (Str::length($this->data['tube_sticker_motor']) > 0 && $this->data['tube_sticker_motor'] != '1') {
$warnMsg[] = "Tube sticker motor must be 1 or empty";
}
if (Str::length($this->data['tube_sticker_pump']) > 0 && $this->data['tube_sticker_pump'] != '1') {
$warnMsg[] = "Tube sticker pump must be 1 or empty";
}
if (Str::length($this->data['tube_sticker_pumpset']) > 0 && $this->data['tube_sticker_pumpset'] != '1') {
$warnMsg[] = "Tube sticker pumpset must be 1 or empty";
}
if (Str::length($this->data['warranty_card']) > 0 && $this->data['warranty_card'] != '1') {
$warnMsg[] = "Warranty card must be 1 or empty";
}
if (Str::length($this->data['panel_box_code']) > 0 && (Str::length($this->data['panel_box_code']) < 6 || !ctype_alnum($this->data['panel_box_code']))) {
$warnMsg[] = "Invalid panel box code found";
}
if (Str::length($this->data['load_rate']) < 0 || !is_numeric($this->data['load_rate']) || $this->data['load_rate'] < 0) {
$warnMsg[] = "Load rate must be greater than or equal to 0";
}
if (Str::length($this->data['bundle_quantity']) > 0 && (!is_numeric($this->data['bundle_quantity']) || $this->data['bundle_quantity'] <= 1)) {
$warnMsg[] = "Bundle quantity must be greater than or equal to '2' or empty";
}
if (Str::length($this->data['material_type']) > 0 && $this->data['material_type'] != '1' && $this->data['material_type'] != '2' && $this->data['material_type'] != '3') { //($this->data['material_type'] != null) &&
$warnMsg[] = "Material type must be 1 or 2 or 3 or empty";
}
}
}
if (!empty($warnMsg)) {
throw new RowImportFailedException(implode(', ', $warnMsg));
}
return StickerMaster::updateOrCreate([
StickerMaster::updateOrCreate([
'item_id' => $item->id,
'plant_id' => $plant->id
],
@@ -251,11 +256,14 @@ class StickerMasterImporter extends Importer
'part_validation3' => $this->data['part_validation3'],
'part_validation4' => $this->data['part_validation4'],
'part_validation5' => $this->data['part_validation5'],
'laser_part_validation1' => $this->data['laser_part_validation1'],
'laser_part_validation2' => $this->data['laser_part_validation2'],
'panel_box_code' => $this->data['panel_box_code'],
'load_rate' => $this->data['load_rate'],
'bundle_quantity' => $this->data['bundle_quantity'],
'material_type' => $this->data['material_type']
]);
return null;
// return StickerMaster::firstOrNew([
// // Update existing records, matching them by `$this->data['column_name']`
// 'email' => $this->data['email'],

View File

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

View File

@@ -61,7 +61,7 @@ class InvoiceFinder extends Page implements HasForms
->readOnly()
->reactive(),
TextInput::make('total_sno_quantity')
->label('Total SNo. Quantity')
->label('Invoice Quantity')
->readOnly()
->reactive(),
@@ -77,9 +77,10 @@ class InvoiceFinder extends Page implements HasForms
if(!$invoiceNo)
{
Notification::make()
->title("Invoice number '$invoiceNo' can't be empty!")
->danger()
->send();
->title("Invoice number '$invoiceNo' can't be empty!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', '', [], [], [], [], $plantId);
$this->form->fill([
'plant_id' => $plantId,
@@ -98,13 +99,14 @@ class InvoiceFinder extends Page implements HasForms
if(!$invoiceExists)
{
Notification::make()
->title("Invoice number '$invoiceNo' does not exist in locator invoice table!")
->danger()
->send();
->title("Invoice number '$invoiceNo' does not exist in locator invoice table!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', '', [], [], [], [], $plantId);
$this->form->fill([
'plant_id' => $plantId,
'scan_invoice' => $invoiceNo,
'scan_invoice' => null,//$invoiceNo,
'total_sno_quantity' => 0,
'pending_quantity' => 0,
'scan_quantity' => 0
@@ -120,21 +122,22 @@ class InvoiceFinder extends Page implements HasForms
if(!$invoiceCompleted)
{
$count = LocatorInvoiceValidation::where('invoice_number', $invoiceNo)
->where('plant_id', $plantId)
->count();
// $count = LocatorInvoiceValidation::where('invoice_number', $invoiceNo)
// ->where('plant_id', $plantId)
// ->count();
Notification::make()
->title("Invoice number '$invoiceNo' already completed the scanning process...")
->success()
->send();
->title("Invoice number '$invoiceNo' already completed the scanning process..!")
->success()
->duration(5000)
->send();
$this->dispatch('loadData', '', [], [], [], [], $plantId);
$this->form->fill([
'plant_id' => $plantId,
'scan_invoice' => $invoiceNo,
'total_sno_quantity' => $count,
'pending_quantity' => 0,
'scan_quantity' => $count
'scan_invoice' => null,//$invoiceNo,
'total_sno_quantity' => 0,//$count,
'pending_quantity' => 0,//0,
'scan_quantity' => 0//$count
]);
return;
}

File diff suppressed because it is too large Load Diff

View File

@@ -3,6 +3,7 @@
namespace App\Filament\Pages;
use App\Models\Locator;
use App\Models\LocatorInvoiceValidation;
use App\Models\PalletValidation;
use App\Models\Plant;
use Filament\Facades\Filament;
@@ -93,6 +94,7 @@ class PalletFromLocator extends Page implements HasForms
TextInput::make('scan_locator_number')
->label('Scan Locator Number')
->reactive()
->minLength(7)
->columnSpan(1)
->readOnly(fn (callable $get) => !$get('plant') || $get('scan_serial_number') || $get('scan_remove_sno'))
->extraAttributes([
@@ -101,6 +103,7 @@ class PalletFromLocator extends Page implements HasForms
TextInput::make('scan_serial_number')
->label('Scan Serial Number')
->reactive()
->minLength(9)
->columnSpan(1)
->readOnly(fn (callable $get) => !$get('plant') || $get('scan_locator_number') || $get('scan_remove_sno'))
->extraAttributes([
@@ -109,6 +112,7 @@ class PalletFromLocator extends Page implements HasForms
TextInput::make('scan_remove_sno')
->label('Remove Serial Number')
->reactive()
->minLength(9)
->columnSpan(1)
->readOnly(fn (callable $get) => !$get('plant') || $get('scan_locator_number') || $get('scan_serial_number') || count($this->records) <= 0)
->extraAttributes([
@@ -141,8 +145,9 @@ class PalletFromLocator extends Page implements HasForms
Notification::make()
->title('Press enter on "Scan Serial Number" field to proceed..!')
->danger()
->seconds(2)
->duration(5000)
->send();
$this->dispatch('loadData', $this->records, $plantId);
$this->form->fill([
'plant_id' => $plantId,
@@ -159,8 +164,9 @@ class PalletFromLocator extends Page implements HasForms
Notification::make()
->title('Press enter on "Remove Serial Number" field to proceed..!')
->danger()
->seconds(2)
->duration(5000)
->send();
$this->dispatch('loadData', $this->records, $plantId);
$this->form->fill([
'plant_id' => $plantId,
@@ -179,8 +185,9 @@ class PalletFromLocator extends Page implements HasForms
->title('Invalid: Locator Number')
->body("Locator number can't be empty!")
->danger()
->seconds(3)
->duration(5000)
->send();
$this->dispatch('loadData', $this->records, $plantId);
$this->form->fill([
'plant_id' => $plantId,
@@ -198,8 +205,9 @@ class PalletFromLocator extends Page implements HasForms
->title('Invalid: Locator Number')
->body("Locator number '$locatorNo' must be at least 7 digits.")
->danger()
->seconds(3)
->duration(5000)
->send();
$this->dispatch('loadData', $this->records, $plantId);
$this->form->fill([
'plant_id' => $plantId,
@@ -222,8 +230,9 @@ class PalletFromLocator extends Page implements HasForms
->title('Unknown: Locator Number')
->body("Locator number '$locatorNo' does not exist in the master.")
->danger()
->seconds(3)
->duration(5000)
->send();
$this->dispatch('loadData', $this->records, $plantId);
$this->form->fill([
'plant_id' => $plantId,
@@ -254,8 +263,9 @@ class PalletFromLocator extends Page implements HasForms
->body("Scanned locator number '$locatorNo' does not have any locator serial numbers to store into the pallet.<br>
Please scan a valid stored locator number to proceed.")
->danger()
->seconds(3)
->duration(5000)
->send();
$this->dispatch('loadData', $this->records, $plantId);
$this->form->fill([
'plant_id' => $plantId,
@@ -273,8 +283,9 @@ class PalletFromLocator extends Page implements HasForms
->title('Add: Locator Serial Numbers')
->body("Scanned locator number '$locatorNo' has '".$serialLocator->count()."' locator serial numbers!<br>Do you want to store it into 'PALLET DATA' table?")
->info()
->seconds(2)
->duration(2000)
->send();
$this->dispatch('open-confirm-modal', locatorNo: $locatorNo, plantId: $plantId);
}
}
@@ -389,7 +400,7 @@ class PalletFromLocator extends Page implements HasForms
->title('Add: Locator Serial Number')
->body("Scanned locator serial number '$serialNo' successfully added into 'PALLET DATA' table.")
->success()
->seconds(3)
->duration(500)
->send();
$this->dispatch('loadData', $this->records, $plantId);
@@ -412,7 +423,7 @@ class PalletFromLocator extends Page implements HasForms
->title('Remove: Locator Serial Number')
->body("Scanned locator serial number '$removeserial' removed successfully from 'PALLET DATA' table.")
->success()
->seconds(3)
->duration(500)
->send();
$this->dispatch('loadData', $this->records, $plantId);
@@ -451,8 +462,9 @@ class PalletFromLocator extends Page implements HasForms
->title('Add: Locator Serial Numbers')
->body("Scanned locator number '$locatorNo' has '$serialLocator' locator serial numbers!<br>Successfully added into 'PALLET DATA' table.")
->success()
->seconds(3)
->duration(500)
->send();
$this->dispatch('loadData', $this->records, $plantId);
$this->form->fill([
'plant_id' => $plantId,
@@ -471,8 +483,9 @@ class PalletFromLocator extends Page implements HasForms
->title('Skipped: Locator Number')
->body('Scan the new locator number to proceed..!')
->info()
->seconds(3)
->duration(2000)
->send();
$this->dispatch('loadData', $this->records, $plantId);
$this->form->fill([
'plant_id' => $plantId,
@@ -501,8 +514,9 @@ class PalletFromLocator extends Page implements HasForms
Notification::make()
->title('Press enter on "Scan Locator Number" field to proceed..!')
->danger()
->seconds(2)
->duration(5000)
->send();
$this->dispatch('loadData', $this->records, $plantId);
$this->form->fill([
'plant_id' => $plantId,
@@ -519,8 +533,9 @@ class PalletFromLocator extends Page implements HasForms
Notification::make()
->title('Press enter on "Remove Serial Number" field to proceed..!')
->danger()
->seconds(2)
->duration(5000)
->send();
$this->dispatch('loadData', $this->records, $plantId);
$this->form->fill([
'plant_id' => $plantId,
@@ -539,8 +554,9 @@ class PalletFromLocator extends Page implements HasForms
->title('Invalid: Serial Number')
->body("Serial number can't be empty!")
->danger()
->seconds(3)
->duration(5000)
->send();
$this->dispatch('loadData', $this->records, $plantId);
$this->form->fill([
'plant_id' => $plantId,
@@ -552,14 +568,15 @@ class PalletFromLocator extends Page implements HasForms
]);
return;
}
else if (strlen($serialNo) < 13)
else if (strlen($serialNo) < 9 || strlen($serialNo) > 20)
{
Notification::make()
->title('Invalid: Serial Number')
->body("Serial number '$serialNo' must be at least 13 digits.")
->body("Serial number should contain minimum 9 digits and maximum 20 digits.")
->danger()
->seconds(3)
->duration(5000)
->send();
$this->dispatch('loadData', $this->records, $plantId);
$this->form->fill([
'plant_id' => $plantId,
@@ -577,8 +594,9 @@ class PalletFromLocator extends Page implements HasForms
->title('Invalid: Serial Number')
->body("Serial number '$serialNo' must contain alpha-numeric values only.")
->danger()
->seconds(3)
->duration(5000)
->send();
$this->dispatch('loadData', $this->records, $plantId);
$this->form->fill([
'plant_id' => $plantId,
@@ -602,22 +620,53 @@ class PalletFromLocator extends Page implements HasForms
if ($serialLocator == '' || $serialLocator == null)
{
Notification::make()
->title('Unknown: Serial Number')
->body("Scanned serial number: '$serialNo' doesn't exist in pallet table.<br>Scan the valid exist locator-serial number to proceed..!")
->danger()
->seconds(3)
->send();
$this->dispatch('loadData', $this->records, $plantId);
$this->form->fill([
'plant_id' => $plantId,
'plant' => $plantId,
'scan_locator_number' => null,
'scan_serial_number' => null,
'scan_remove_sno' => null,
'sno_quantity' => null,
]);
return;
$invoicesnoexists = LocatorInvoiceValidation::where('plant_id', $plantId)
->where('serial_number', $serialNo)
->where('scanned_status', '=','Scanned')
->first();
$invoiceNo = $invoicesnoexists?->invoice_number;
if ($invoicesnoexists)
{
Notification::make()
->title('Invalid: Serial Number')
->body("Serial number '$serialNo' already exists in invoice number '$invoiceNo' and completed the scanning process..!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', $this->records, $plantId);
$this->form->fill([
'plant_id' => $plantId,
'plant' => $plantId,
'scan_locator_number' => null,
'scan_serial_number' => null,
'scan_remove_sno' => null,
'sno_quantity' => $count,
]);
return;
}
else
{
Notification::make()
->title('Unknown: Serial Number')
->body("Scanned serial number: '$serialNo' doesn't exist in pallet table.<br>Scan the valid exist locator-serial number to proceed..!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', $this->records, $plantId);
$this->form->fill([
'plant_id' => $plantId,
'plant' => $plantId,
'scan_locator_number' => null,
'scan_serial_number' => null,
'scan_remove_sno' => null,
'sno_quantity' => $count,
]);
return;
}
}
elseif ($serialLocator->pallet_number != '' && $serialLocator->pallet_number != null)
{
@@ -625,8 +674,9 @@ class PalletFromLocator extends Page implements HasForms
->title('Invalid: Serial Number')
->body("Scanned serial number: '$serialNo' already exist in pallet number '".$serialLocator->pallet_number."'.<br>Scan the valid locator-serial number to proceed..!")
->danger()
->seconds(3)
->duration(5000)
->send();
$this->dispatch('loadData', $this->records, $plantId);
$this->form->fill([
'plant_id' => $plantId,
@@ -634,7 +684,7 @@ class PalletFromLocator extends Page implements HasForms
'scan_locator_number' => null,
'scan_serial_number' => null,
'scan_remove_sno' => null,
'sno_quantity' => null,
'sno_quantity' => $count,
]);
return;
}
@@ -657,8 +707,9 @@ class PalletFromLocator extends Page implements HasForms
->title('Locator Serials Not Found')
->body("Add some locator serial numbers to proceed generate pallet..!")
->danger()
->seconds(3)
->duration(5000)
->send();
$this->dispatch('loadData', $this->records, $plantId);
$this->form->fill([
'plant_id' => $plantId,
@@ -750,15 +801,16 @@ class PalletFromLocator extends Page implements HasForms
->title('Success: Pallet Generated')
->body("Pallet number '$newPalletNumber' completed the master packing successfully!")
->success()
->seconds(3)
->duration(600)
->send();
$this->dispatch('loadData', $this->records, $plantId);
$this->form->fill([
'plant_id' => $plantId,
'plant' => $plantId,
'scan_locator_number' => $locatorNo,
'scan_serial_number' => $serialNo,
'scan_remove_sno' => $removeSerial,
'scan_locator_number' => null,
'scan_serial_number' => null,
'scan_remove_sno' => null,
'sno_quantity' => 0,
]);
return;
@@ -770,15 +822,16 @@ class PalletFromLocator extends Page implements HasForms
->title('Failed: Pallet Generated')
->body("No locator serial number records found to generate pallet..!")
->danger()
->seconds(3)
->duration(5000)
->send();
$this->dispatch('loadData', $this->records, $plantId);
$this->form->fill([
'plant_id' => $plantId,
'plant' => $plantId,
'scan_locator_number' => $locatorNo,
'scan_serial_number' => $serialNo,
'scan_remove_sno' => $removeSerial,
'scan_locator_number' => null,
'scan_serial_number' => null,
'scan_remove_sno' => null,
'sno_quantity' => 0,
]);
return;
@@ -800,6 +853,7 @@ class PalletFromLocator extends Page implements HasForms
// ->title('Pallet Generated')
// ->body("Pallet number {$this->latestPalletNumber} assigned to all serials for locator {$locatorNo}")
// ->success()
// ->duration(1000)
// ->send();
// $this->dispatch('loadData', $this->records, $plantId);
// $this->form->fill([
@@ -828,8 +882,9 @@ class PalletFromLocator extends Page implements HasForms
Notification::make()
->title('Press enter on "Scan Locator Number" field to proceed..!')
->danger()
->seconds(2)
->duration(5000)
->send();
$this->dispatch('loadData', $this->records, $plantId);
$this->form->fill([
'plant_id' => $plantId,
@@ -846,8 +901,9 @@ class PalletFromLocator extends Page implements HasForms
Notification::make()
->title('Press enter on "Scan Serial Number" field to proceed..!')
->danger()
->seconds(2)
->duration(5000)
->send();
$this->dispatch('loadData', $this->records, $plantId);
$this->form->fill([
'plant_id' => $plantId,
@@ -866,8 +922,9 @@ class PalletFromLocator extends Page implements HasForms
->title('Invalid: Serial Number')
->body("Serial number can't be empty!")
->danger()
->seconds(3)
->duration(5000)
->send();
$this->dispatch('loadData', $this->records, $plantId);
$this->form->fill([
'plant_id' => $plantId,
@@ -879,14 +936,15 @@ class PalletFromLocator extends Page implements HasForms
]);
return;
}
else if (strlen($removeSno) < 13)
else if (strlen($removeSno) < 9 || strlen($removeSno) > 20)
{
Notification::make()
->title('Invalid: Serial Number')
->body("Serial number '$removeSno' must be at least 13 digits.")
->body("Serial number should contain minimum 9 digits and maximum 20 digits.")
->danger()
->seconds(3)
->duration(5000)
->send();
$this->dispatch('loadData', $this->records, $plantId);
$this->form->fill([
'plant_id' => $plantId,
@@ -904,8 +962,9 @@ class PalletFromLocator extends Page implements HasForms
->title('Invalid: Serial Number')
->body("Serial number '$removeSno' must contain alpha-numeric values only.")
->danger()
->seconds(3)
->duration(5000)
->send();
$this->dispatch('loadData', $this->records, $plantId);
$this->form->fill([
'plant_id' => $plantId,
@@ -936,8 +995,9 @@ class PalletFromLocator extends Page implements HasForms
->title('Unknown: Serial Number')
->body("Scanned serial number: '$removeSno' doesn't exist in 'PALLET DATA' table.<br>Scan the valid exist locator-serial number to proceed..!")
->danger()
->seconds(3)
->duration(5000)
->send();
$this->dispatch('loadData', $this->records, $plantId);
$this->form->fill([
'plant_id' => $plantId,

View File

@@ -0,0 +1,370 @@
<?php
namespace App\Filament\Pages;
use App\Models\Item;
use App\Models\Plant;
use App\Models\ProductionQuantity;
use App\Models\QualityValidation;
use App\Models\StickerMaster;
use Filament\Forms\Components\Actions;
use Filament\Forms\Components\Actions\Action;
use Filament\Forms\Form;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Pages\Page;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Filament\Notifications\Notification;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Auth;
class ProductionDataSap extends Page implements HasForms
{
use InteractsWithForms;
public $pId , $pOrder, $pUom, $pItem, $transHeadLog, $sNums = [];
public $scanned_quantity;
public array $data = []; //Required to back form state
protected static ?string $navigationIcon = 'heroicon-o-document-text';
protected static string $view = 'filament.pages.production-data-sap';
protected static ?string $navigationGroup = 'Send To SAP';
protected $listeners = ['updateScannedQuantity' => 'setScannedQuantity'];
public function setScannedQuantity($quantity)
{
// Set the scanned_quantity value in the Filament page/form
$this->scanned_quantity = $quantity;
$this->form->fill([
'scanned_quantity' => $quantity,
'production_order' => $this->pOrder,
'plant_id' => $this->pId,
]);
}
public function form(Form $form): Form
{
return $form
->statePath('data')
->schema([
Select::make('plant_id')
->options(Plant::pluck('name', 'id'))
->label('Plant')
->reactive()
->required()
->afterStateUpdated(function ($state, $set, callable $get) {
$plantId = $get('plant_id');
if (!$plantId) {
$set('pqPlantError', 'Please select a plant first.');
$set('production_order', null);
$set('scanned_quantity', null);
return;
}
else {
$this->pId = $plantId;
$set('production_order', null);
$set('scanned_quantity', null);
$set('validationError', null);
$set('pqPlantError', null);
}
})
->hint(fn ($get) => $get('pqPlantError') ? $get('pqPlantError') : null)
->hintColor('danger'),
TextInput::make('production_order')
->required()
->reactive()
->afterStateUpdated(function ($state, $set, callable $get) {
$productionOrder = $get('production_order');
if (!$productionOrder) {
$set('pqproducError', 'Please provide production order.');
$set('scanned_quantity', null);
$this->dispatch('refreshed', $this->pId, $this->pOrder);
return;
}
else {
$this->pOrder = null;
$this->dispatch('refreshed', $this->pId, $this->pOrder);
$set('scanned_quantity', null);
$set('validationError', null);
$set('pqproducError', null);
}
})
->hint(fn ($get) => $get('pqproducError') ? $get('pqproducError') : null)
->hintColor('danger')
->extraAttributes([
'wire:keydown.enter' => 'processValues($event.target.value)',
]),
TextInput::make('scanned_quantity')
->reactive() // Make it reactive to update when changed
->afterStateUpdated(function ($state, $set, $get) {
$this->scanned_quantity = $state;
})
->readOnly()
->required(),
// Add your custom action button here
Actions::make([
Action::make('send_to_sap')
->label('Send Data to SAP')
->action(function ($set, $get) {
$plantId = $get('plant_id');
$plantWarehouseCodes = [
// plant_id => warehouse_code
1 => '110', // Ransar I
2 => '101', // Ransar II
3 => '102', // Chola Pumps
4 => '104', // Tuff Pumps
//5 => '107', //WH-Nark
5 => '200', // Go-flex
//7 => '301', // Krisgo II
];
$year = date('y'); // '25' for 2025
$month = date('m'); // '05' for May
$transHeadLogId = $this->transHeadLog; //'3256';
$lineItemCnt = '1'; //1 hard code
$sapOrder = $get('production_order');
$itemCode = $this->pItem;
$quantity = (string)$get('scanned_quantity');
$UOM = $this->pUom;
$locationName = '';
$lamiCdate = $get('lami_cdate');
$serialNumbers = $this->sNums;
$warehouseCode = $plantWarehouseCodes[$plantId] ?? null;
$finalBatch = $warehouseCode . $year . $month;
$batchNumber = $finalBatch;
//dd($batchNumber);
$currentDateTime = date('j/n/Y h:i:s A');
$header = [
'Trans_Head_Log_Id' => $transHeadLogId, //'3256',
'Line_Item_Count' => $lineItemCnt, //'1',
'SAP_Order_Number' => $sapOrder, //'12345678'
'Item_Code' => $itemCode, //'6458795'
];
// $serialNumbers = ['12024090000142', '12024090000142', '12024090000142'];
$Receipt = [
// 'Receipt' => [
[
'Quantity' => $quantity, //'1',
'UOM' => $UOM,
'Batch_Number' => $batchNumber,
'Location_Name' => $locationName,
'LAMI_Cdate' => $currentDateTime, //'9/9/2024 10:48:37 AM',
'Serial_Number' => array_map(function ($serial) {
return ['Serial_Number' => $serial];
}, $serialNumbers)
]
// ]
];
$payload = [
// ...$header,
'Receipt' => $Receipt
];
// dd($payload);
// $header = [
// 'Trans_Head_Log_Id' => '3256',
// 'Line_Item_Count' => '1',
// 'SAP_Order_Number' => '12345678',
// 'Item_Code' => '6458795'
// ];
// $serialNumbers = ['12024090000142'];
// $Receipt = [
// // 'Receipt' => [
// [
// 'Quantity' => '1',
// 'UOM' => 'EA',
// 'Batch_Number' => '',
// 'Location_Name' => '',
// 'LAMI_Cdate' => '9/9/2024 10:48:37 AM',
// 'Serial_Number' => array_map(function ($serial) {
// return ['Serial_Number' => $serial];
// }, $serialNumbers)
// ]
// // ]
// ];
// $payload = [
// // ...$header,
// 'Receipt' => $Receipt
// ];
// dd($payload);
try {
// $response = Http::withHeaders([
// 'Content-Type' => 'application/json',
// 'Trans_Head_Log_Id' => '3256',//$transHeadLogId,
// 'Line_Item_Count' => '1', // $lineItemCnt,
// 'SAP_Order_Number' => '12345678', //$sapOrder,
// 'Item_Code' => '6458795', //$itemCode,
// ])
$response = Http::withHeaders([
'Content-Type' => 'application/json',
'Trans_Head_Log_Id' => $transHeadLogId,
'Line_Item_Count' => $lineItemCnt,
'SAP_Order_Number' => $sapOrder,
'Item_Code' => $itemCode,
])
->withBasicAuth(
'sb-eba140ab-74bb-44a4-8d92-70a636940def!b1182|it-rt-dev-cri-stjllphr!b68',
'616d8991-307b-4ab1-be37-7894a8c6db9d$0p0fE2I7w1Ve23-lVSKQF0ka3mKrTVcKPJYELr-i4nE='
)
->withBody(json_encode($payload), 'application/json')
//->dump()
->post('https://dev-cri-stjllphr.it-cpi004-rt.cfapps.ap11.hana.ondemand.com/http/LA2CRI/GoodsReceiptAgFG', $payload);
// dump($response->transferStats->getRequest());
// dd(json_encode($payload, JSON_PRETTY_PRINT));
//dd($response->status(), $response->body());
// dump($response);
$messageCode = $response->headers()['messagecode'][0] ?? null;
if ($messageCode && str_starts_with($messageCode, 'ERROR')) {
$cleanError = str_replace('ERROR:|', '', $messageCode);
// Update rows where plant_id and production_order match
ProductionQuantity::where('plant_id', $get('plant_id'))
->where('production_order', $get('production_order'))
->update([
'sap_msg_status' => 'ERROR',
'sap_msg_description' => $cleanError,
]);
Notification::make()
->title('SAP Error')
->body($cleanError)
->danger()
->send();
$this->dispatch('loadItems', $this->pId, $this->pOrder);
}
else
{
$messageCode = $response->headers()['messagecode'][0] ?? null;
$sapSuccessMsg = str_replace('SUCCESS:|', '', $messageCode);
ProductionQuantity::where('plant_id', $get('plant_id'))
->where('production_order', $get('production_order'))
->update([
'sap_msg_status' => 'SUCCESS',
'sap_msg_description' => $sapSuccessMsg,
]);
Notification::make()
->title('SAP Success')
->body($sapSuccessMsg)
->success()
->send();
}
} catch (\Exception $e) {
Notification::make()
->title('Exception')
->body('Error sending data to SAP: ' . $e->getMessage())
->danger()
->send();
}
})
->color('success')
->outlined()
->hidden(fn (callable $get) => (!$get('scanned_quantity'))) //!$get('plant_id') && !$get('production_order') &&
->extraAttributes(['class' => 'align-to-input']),
]),
])
->columns(4);
}
public function processValues($value)
{
$this->pOrder = $value;
$latestValidation = ProductionQuantity::where('plant_id', $this->pId)
->where('production_order', $this->pOrder)
->latest()
->first();
if (!$latestValidation) {
Notification::make()
->title('Invalid Production Order')
->body('No data found for the selected plant and production order.')
->danger()
->send();
$this->dispatch('refreshed', $this->pId, $this->pOrder);
return;
}
// $this->pUom = $latestValidation->uom;
$this->transHeadLog = $latestValidation->id;
$itemId = $latestValidation->item_id;
$this->pUom = Item::where('id', $itemId)->value('uom');
$this->sNums = [];
if(!$this->pUom)
{
Notification::make()
->title('UOM Not Found')
->body('UOM not found for the production order')
->icon('heroicon-o-x-circle')
->danger()
->send();
$this->dispatch('refreshed', $this->pId, $this->pOrder);
}
else
{
$latestProduction = ProductionQuantity::where('plant_id', $this->pId)
->where('production_order', $this->pOrder)
->latest()
->first();
$this->pItem = $latestProduction
? Item::where('id', $latestProduction->item_id)->value('code')
: null;
$this->sNums = ProductionQuantity::where('plant_id', $this->pId)
->where('production_order', $this->pOrder)
->pluck('serial_number')
->toArray();
$this->dispatch('loadItems', $this->pId, $this->pOrder);
}
}
public static function canAccess(): bool
{
return Auth::check() && Auth::user()->can('view production data send to sap');
}
public static function getNavigationLabel(): string
{
return 'Production Data';
}
}

View File

@@ -20,6 +20,8 @@ use Route;
use Illuminate\Support\Facades\Request;
use Filament\Notifications\Notification;
use Illuminate\Support\Facades\Auth;
use Livewire\Attributes\On;
class ProductionQuantityPage extends Page implements HasForms
{
@@ -130,7 +132,6 @@ class ProductionQuantityPage extends Page implements HasForms
->options(Plant::pluck('name', 'id'))
->label('Plant')
->reactive()
->live()
->required()
->columnSpan(1)
->default(function () {
@@ -163,7 +164,7 @@ class ProductionQuantityPage extends Page implements HasForms
->label('Block')
->required()
// ->nullable()
->live()
->reactive()
->columnSpan(1)
->options(function (callable $get) {
if (!$get('plant_id')) {
@@ -174,7 +175,6 @@ class ProductionQuantityPage extends Page implements HasForms
->pluck('name', 'id')
->toArray();
})
->reactive()
->default(function () {
$latestShiftId = optional(ProductionQuantity::latest()->first())->shift_id;
return optional(Shift::where('id', $latestShiftId)->first())->block_id;
@@ -276,7 +276,6 @@ class ProductionQuantityPage extends Page implements HasForms
->toArray();
})
->reactive()
->live()
->default(function () {
return optional(ProductionQuantity::latest()->first())->line_id;
})
@@ -323,9 +322,9 @@ class ProductionQuantityPage extends Page implements HasForms
TextInput::make('production_order')
->label('Production Order')
->reactive()
->live()
->required()
->columnSpan(1)
//->columnSpan(1)
->columnSpan(['default' => 1, 'sm' => 1])
->afterStateUpdated(function ($state, callable $get, callable $set): void {
$set('item_code', null);
$set('item_id', null);
@@ -339,16 +338,16 @@ class ProductionQuantityPage extends Page implements HasForms
// }
}),
TextInput::make('item_code')
->label('Item Code')
->columnSpan(1)
->autofocus(true)
->reactive()
->live()
->default(fn () => $this->clear_qr)
->extraAttributes([
'wire:keydown.enter' => 'processAllValues($event.target.value)',
]),
// TextInput::make('item_code')
// ->label('Item Code')
// ->columnSpan(1)
// ->autofocus(true)
// //->reactive()
// ->live(onBlur: true) // avoids per-keystroke triggering
// ->default(fn () => $this->clear_qr)
// ->extraAttributes([
// 'wire:keydown.enter' => 'processAllValues($event.target.value)',
// ]),
Hidden::make('serial_number')
->required(),
@@ -362,7 +361,8 @@ class ProductionQuantityPage extends Page implements HasForms
TextInput::make('recent_qr')
->label('Last scanned QR')
->reactive()
->columnSpan(1)
->columnSpan(['default' => 1, 'sm' => 2])
//->columnSpan(2)
// ->default(function () {
// // Get the latest 'item_id' foreign key from 'production_quantities' table
// $latestProductionQuantity = ProductionQuantity::latest()->first();
@@ -383,7 +383,6 @@ class ProductionQuantityPage extends Page implements HasForms
// })
->default(fn () => $this->recQr)
->readOnly(true),
TextInput::make('id')
@@ -392,11 +391,19 @@ class ProductionQuantityPage extends Page implements HasForms
Hidden::make('operator_id')
->default(Filament::auth()->user()->name),
])
->columns(7);
// ->columns(6);
->columns(['default' => 1, 'sm' => 7]);
}
// Method to process the value when Enter is pressed
#[On('handleQrScan')]
public function handleQrScan($value)
{
$this->processAllValues($value);
}
public function processAllValues($formQRData)
{
@@ -417,36 +424,6 @@ class ProductionQuantityPage extends Page implements HasForms
$user = Filament::auth()->user(); //->name
$operatorName = $user->name;
$this->qrData = $formQRData;
// dd($formData, $formQRData);
// dd($this->form->getState()['serial_number']);
// try {
// // Access the nested form data
// $componentData = json_decode($formValues['components'][0]['snapshot'], true);
// $formData = $componentData['data']['data'][0]; // Access first item in data array
// // Extract specific values
// $this->qrData = $formQRData ?? $formData['item_code'];
// $this->pId = $formData['plant_id'] ?? null;
// $this->bId = $formData['block_name'] ?? null;
// $this->sId = $formData['shift_id'] ?? null;
// $this->lId = $formData['line_id'] ?? null;
// $this->iId = $formData['item_id'] ?? null;
// $this->succId = $formData['success_msg'] ?? null;
// // $this->sNoId = $formData['serial_number'] ?? null;
// $this->prodOrder = $formData['production_order'] ?? null;
// $this->recQr = $formData['recent_qr'] ?? null;
// $this->dispatch('plant-line-updated', $this->pId,$this->lId);
// } catch (\Exception $e) {
// //dd('Error parsing form data:', $e->getMessage(), $formValues);
// Notification::make()
// ->title("Error Parsing Form Data") // {$operatorName}
// ->body($e->getMessage())
// ->danger()
// // ->persistent()
// ->send();
// return;
// }
$latestProductionQuantity = ProductionQuantity::latest()->first();
@@ -456,7 +433,6 @@ class ProductionQuantityPage extends Page implements HasForms
$this->recQr = $itemCode && $serialNumber ? "{$itemCode} | {$serialNumber}" : null;
}
if (empty($formQRData)) {
$this->form->fill([
'plant_id'=> $this->pId,
@@ -1303,7 +1279,7 @@ class ProductionQuantityPage extends Page implements HasForms
'shift_id'=> $this->sId,
'line_id'=> $this->lId,
'item_id'=> null,
// 'item_code'=> null,
//'item_code'=> null,
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> $this->prodOrder,
@@ -1317,6 +1293,7 @@ class ProductionQuantityPage extends Page implements HasForms
->title("Valid QR Found") // {$operatorName}
->body("Valid QR code scanned: {$this->qrData}.")
->success()
->duration(200)
->send();
}
}
@@ -1327,25 +1304,25 @@ class ProductionQuantityPage extends Page implements HasForms
// For example:
$model = ProductionQuantity::create($formValues);
// dd('Production Updated Event Dispatched');
// dd('Production Updated Event Dispatched');
$this->dispatch('productionUpdated');
// // Optionally, you can emit an event or perform a redirect after saving
// $this->emit('formSaved', $model->id);
}
public function triggerChartUpdate(): void
{
if (session()->has('select_plant') && session()->has('select_line')) {
$this->dispatch('filtersUpdated');
}
}
public function triggerChartUpdate(): void
{
if (session()->has('select_plant') && session()->has('select_line')) {
$this->dispatch('filtersUpdated');
}
}
// Override the getTitle method
public function getTitle(): string
{
return ''; // Return an empty string to remove the title
}
// Override the getTitle method
public function getTitle(): string
{
return ''; // Return an empty string to remove the title
}
public static function getNavigationLabel(): string
{

File diff suppressed because it is too large Load Diff

View File

@@ -5,8 +5,11 @@ namespace App\Filament\Resources;
use App\Filament\Resources\AlertMailRuleResource\Pages;
use App\Filament\Resources\AlertMailRuleResource\RelationManagers;
use App\Models\AlertMailRule;
use App\Models\Plant;
use Dotenv\Exception\ValidationException;
use Filament\Facades\Filament;
use Filament\Forms;
use Filament\Forms\Components\Checkbox;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
@@ -14,6 +17,7 @@ use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Forms\Components\Section;
use Illuminate\Validation\ValidationException as ValidationValidationException;
class AlertMailRuleResource extends Resource
{
@@ -29,6 +33,13 @@ class AlertMailRuleResource extends Resource
->schema([
Section::make('')
->schema([
Forms\Components\Select::make('plant')
->label('Plant')
->reactive()
->options(fn () => Plant::pluck('name', 'id')->toArray())
->required(fn ($get) => ! $get('is_active'))
->afterStateUpdated(fn ($state, callable $set) => $state ? $set('is_active', false) : null),
// ->options(fn () => Plant::pluck('id', 'name')->toArray()),
Forms\Components\Select::make('module')
->label('Module')
->required()
@@ -56,15 +67,29 @@ class AlertMailRuleResource extends Resource
'Hourly' => 'Hourly',
'Daily' => 'Daily',
]),
Checkbox::make('is_active')
->label('All Plants Reports')
->afterStateUpdated(fn ($state, callable $set) => $state ? $set('plant', null) : null)
->reactive(),
Forms\Components\Hidden::make('created_by')
->default(fn () => Filament::auth()->user()?->name),
Forms\Components\Hidden::make('updated_by')
->default(fn () => Filament::auth()->user()?->name),
])
->columns(4),
->columns(5),
]);
}
// Optionally, also override for update/editing
// public static function mutateFormDataBeforeSave(array $data): array
// {
// dd('test');
// if ($data['is_active']) {
// $data['plant'] = 'All Plants';
// }
// return $data;
// }
public static function table(Table $table): Table
{
return $table
@@ -73,6 +98,16 @@ class AlertMailRuleResource extends Resource
->label('ID')
->numeric()
->sortable(),
Tables\Columns\TextColumn::make('plant')
->label('Plant')
->sortable()
->formatStateUsing(function ($state) {
static $plants;
if (! $plants) {
$plants = Plant::pluck('name', 'id')->toArray();
}
return $plants[$state] ?? 'All Plants';
}),
Tables\Columns\TextColumn::make('module')
->label('Module')
->sortable(),

View File

@@ -9,4 +9,14 @@ use Filament\Resources\Pages\CreateRecord;
class CreateAlertMailRule extends CreateRecord
{
protected static string $resource = AlertMailRuleResource::class;
protected function mutateFormDataBeforeCreate(array $data): array
{
if ($data['is_active']) {
$data['plant'] = 0;
}
return $data;
}
}

View File

@@ -10,6 +10,15 @@ class EditAlertMailRule extends EditRecord
{
protected static string $resource = AlertMailRuleResource::class;
protected function mutateFormDataBeforeSave(array $data): array
{
//dd('test');
if ($data['is_active']) {
$data['plant'] = 0;
}
return $data;
}
protected function getHeaderActions(): array
{
return [

View File

@@ -121,12 +121,14 @@ class InvoiceValidationResource extends Resource
->readOnly(fn (callable $get) => empty($get('invoice_number')))
//->disabled(fn (Get $get) => empty($get('invoice_number')))
->extraAttributes([
'id' => 'serial_number_input',
'x-data' => '{ value: "" }',
'x-model' => 'value',
'wire:keydown.enter.prevent' => 'processSerialNumber(value)', // Using wire:keydown
])
->afterStateUpdated(function ($state, callable $set, callable $get) {
$set('update_invoice', 0);
// $this->dispatch('focus-serial-number');
// if (!$invNo) { return; } else { }
})
->columnSpan(1),

View File

@@ -65,7 +65,9 @@ class LocatorInvoiceValidationResource extends Resource
$set('invoice_number', null);
$set('pallet_number', null);
$set('serial_number', null);
$set('sno_quantity', null);
$set('sno_quantity', 0);
$set('scan_quantity', 0);
$set('pend_quantity', 0);
}
else
{
@@ -73,7 +75,9 @@ class LocatorInvoiceValidationResource extends Resource
$set('invoice_number', null);
$set('pallet_number', null);
$set('serial_number', null);
$set('sno_quantity', null);
$set('sno_quantity', 0);
$set('scan_quantity', 0);
$set('pend_quantity', 0);
}
}),
@@ -92,18 +96,33 @@ class LocatorInvoiceValidationResource extends Resource
->readOnly(fn (callable $get) => !$get('plant') || $get('pallet_number') || $get('serial_number'))
->afterStateUpdated(function ($state, callable $set, callable $get) {
$plantId = $get('plant');
$invNo = $get('invoice_number');
$snoCount = 0;
$pendingCount = 0;
$scannedCount = 0;
if (!$plantId) {
$set('invoice_number', null);
$set('pallet_number', null);
}
else if ($invNo)
{
$snoCount = LocatorInvoiceValidation::where('plant_id', $plantId)->where('invoice_number', $invNo)->count();
$pendingCount = LocatorInvoiceValidation::where('invoice_number', $invNo)->where('plant_id', $plantId)->whereNull('scanned_status')->orWhere('scanned_status', '=', '')->count();
$scannedCount = LocatorInvoiceValidation::where('invoice_number', $invNo)->where('plant_id', $plantId)->where('scanned_status', '=', 'Scanned')->count();
}
$set('update_invoice', null);
$set('pallet_number', null);
$set('serial_number', null);
$set('sno_quantity', $snoCount);
$set('scan_quantity', $scannedCount);
$set('pend_quantity', $pendingCount);
}),
Forms\Components\TextInput::make('pallet_number')
->label('Scan Pallet No')
->reactive()
->minLength(10)
// ->readOnly(fn (callable $get) => !$get('plant') || !$get('invoice_number') || $get('serial_number'))
->readOnly(function (callable $get) {
$invoiceNumber = $get('invoice_number');
@@ -145,6 +164,7 @@ class LocatorInvoiceValidationResource extends Resource
Forms\Components\TextInput::make('serial_number')
->label('Scan Serial No')
->reactive()
->minLength(9)
// ->readOnly(fn (callable $get) => !$get('plant') || !$get('invoice_number') || $get('pallet_number'))
->readOnly(function (callable $get) {
$invoiceNumber = $get('invoice_number');
@@ -178,7 +198,18 @@ class LocatorInvoiceValidationResource extends Resource
'x-on:keydown.enter.prevent' => '$wire.processSerialNo()',
]),
Forms\Components\TextInput::make('sno_quantity')
->label('SNo. Quantity')
->label('Invoice Quantity')
->default(0)
->readOnly(),
Forms\Components\TextInput::make('scan_quantity')
->label('Scanned Quantity')
->default(0)
->readOnly(),
Forms\Components\TextInput::make('pend_quantity')
->label('Pending Quantity')
->default(0)
->readOnly(),
//Forms\Components\View::make('forms.components.update-invoice-button'),
@@ -264,9 +295,10 @@ class LocatorInvoiceValidationResource extends Resource
if (!$palletRecord)
{
Notification::make()
->title("Pallet number '{$palletNumber}' does not exist.")
->danger()
->send();
->title("Pallet number '{$palletNumber}' does not exist.")
->danger()
->duration(5000)
->send();
return;
}
@@ -287,8 +319,9 @@ class LocatorInvoiceValidationResource extends Resource
Notification::make()
->title("Pallet number '{$palletNumber}' is not completed in masters")
->danger()
->duration(5000)
->send();
return;
return;
}
// if ($allCompleted)
@@ -331,6 +364,7 @@ class LocatorInvoiceValidationResource extends Resource
// Notification::make()
// ->title("Pallet number '{$palletNumber}' scanned successfully")
// ->success()
// ->duration(800)
// ->send();
// }
@@ -362,6 +396,7 @@ class LocatorInvoiceValidationResource extends Resource
// Notification::make()
// ->title("Pallet number '{$palletNumber}' scanned successfully")
// ->success()
// ->duration(800)
// ->send();
// }
@@ -462,16 +497,16 @@ class LocatorInvoiceValidationResource extends Resource
->label('Import Invoice')
->form([
Select::make('plant_id')
->options(Plant::pluck('name', 'id')->toArray())
->label('Select Plant')
->required()
->default(function () {
return optional(InvoiceValidation::latest()->first())->plant_id;
})
->afterStateUpdated(function ($state, callable $set, callable $get) {
$set('invoice_serial_number', null);
})
->reactive(),
->options(Plant::pluck('name', 'id')->toArray())
->label('Select Plant')
->required()
->default(function () {
return optional(InvoiceValidation::latest()->first())->plant_id;
})
->afterStateUpdated(function ($state, callable $set, callable $get) {
$set('invoice_serial_number', null);
})
->reactive(),
FileUpload::make('invoice_serial_number')
->label('Invoice Serial Number')
@@ -522,6 +557,7 @@ class LocatorInvoiceValidationResource extends Resource
->title('Invalid Locator Invoice Found')
->body('Uploaded excel sheet is empty or<br>contains no valid data.')
->danger()
->duration(5000)
->send();
if ($disk->exists($path)) {
@@ -547,7 +583,7 @@ class LocatorInvoiceValidationResource extends Resource
}
else
{
if(Str::length($serialNumber) < 13 || !ctype_alnum($serialNumber))
if(Str::length($serialNumber) < 9 || Str::length($serialNumber) > 20 || !ctype_alnum($serialNumber))
{
$invalidSerialCodes[] = $serialNumber;
}
@@ -569,10 +605,12 @@ class LocatorInvoiceValidationResource extends Resource
if (!empty($uniqueSerialCodes)) {
Notification::make()
->title('Invalid Serial Numbers Found')
->body('The following serial numbers should contain minimum 13 digit alpha numeric values:<br>' . implode(', ', $uniqueSerialCodes))
->danger()
->send();
->title('Invalid Serial Numbers Found')
->body('The following serial numbers should contain minimum 9 digit (and maximum 20 digit) alpha numeric values:<br>' . implode(', ', $uniqueSerialCodes))
->danger()
->duration(5000)
->send();
if ($disk->exists($path)) {
$disk->delete($path);
}
@@ -586,7 +624,9 @@ class LocatorInvoiceValidationResource extends Resource
->title('Duplicate Serial Numbers Found')
->body('The following serial numbers are already exist in imported excel:<br>' . implode(', ', $duplicateSerialCodes))
->danger()
->duration(5000)
->send();
if ($disk->exists($path)) {
$disk->delete($path);
}
@@ -598,10 +638,12 @@ class LocatorInvoiceValidationResource extends Resource
->title('Invalid Locator Invoice Found')
->body('Uploaded excel sheet is empty or<br>contains no valid data.')
->danger()
->duration(5000)
->send();
if ($disk->exists($path)) {
$disk->delete($path);
}
if ($disk->exists($path)) {
$disk->delete($path);
}
return;
}
@@ -618,20 +660,22 @@ class LocatorInvoiceValidationResource extends Resource
->title('Duplicate Serial Numbers Found')
->body('The following serial numbers already exist with a different invoice number:<br>' . implode(', ', $existingSerials))
->danger()
->duration(5000)
->send();
if ($disk->exists($path))
{
if ($disk->exists($path)) {
$disk->delete($path);
}
return;
}
else
{
// Save full file path to session
// Save full file path to session
session(['uploaded_invoice_path' => $fullPath]);
Notification::make()
->title('Success: Invoice imported successfully.')
->success()
->duration(800)
->send();
}
}

View File

@@ -8,14 +8,19 @@ use App\Filament\Resources\LocatorResource\Pages;
use App\Filament\Resources\LocatorResource\RelationManagers;
use App\Models\Locator;
use App\Models\PalletValidation;
use App\Models\Plant;
use Filament\Forms\Components\DateTimePicker;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Get;
use Filament\Tables\Actions\ImportAction;
use Filament\Facades\Filament;
use Filament\Forms;
use Filament\Forms\Components\Select;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Actions\ExportAction;
use Filament\Tables\Filters\Filter;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
@@ -139,34 +144,183 @@ class LocatorResource extends Resource
return ($currentPage - 1) * $perPage + $rowLoop->iteration;
}),
Tables\Columns\TextColumn::make('plant.name')
->numeric()
->searchable()
->label('Plant')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('locator_number')
->label('Locator Number')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('locator_quantity')
->label('Locator Quantity')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('operator_id')
->label('Operator ID')
->searchable()
->label('Created By')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('created_at')
->label('Created At')
->dateTime()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('updated_at')
->label('Updated At')
->dateTime()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('deleted_at')
->label('Deleted At')
->dateTime()
->alignCenter()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
Tables\Filters\TrashedFilter::make(),
Filter::make('advanced_filters')
->label('Advanced Filters')
->form([
Select::make('Plant')
->label('Select Plant')
->nullable()
->options(function () {
return Plant::pluck('name', 'id');
})
->reactive()
->afterStateUpdated(function ($state, callable $set, callable $get): void {
$set('locator_number', null);
$set('locator_quantity', null);
$set('created_from', null);
$set('created_to', null);
$set('created_by', null);
$set('updated_from', null);
$set('updated_to', null);
}),
Select::make('locator_number')
->label('Locator Number')
->options(function (callable $get) {
$plantId = $get('Plant');
if (!$plantId) {
return [];
}
return Locator::where('plant_id', $plantId)->orderBy('locator_number', 'asc')->get()->unique('locator_number')->pluck('locator_number', 'locator_number')->toArray();
// ->whereNotNull('locator_number')
// ->where('locator_number','!=', '')
})
->searchable()
->reactive(),
Select::make('locator_quantity')
->label('Locator Quantity')
->options([
0 => 0,
1 => 1,
2 => 2,
])
->reactive(),
DateTimePicker::make(name: 'created_from')
->label('Created From')
->placeholder(placeholder: 'Select From DateTime')
->reactive()
->native(false),
DateTimePicker::make('created_to')
->label('Created To')
->placeholder(placeholder: 'Select To DateTime')
->reactive()
->native(false),
TextInput::make('created_by')
->label('Created By')
->reactive()
->placeholder(placeholder: 'Enter Created By'),
DateTimePicker::make(name: 'updated_from')
->label('Updated From')
->placeholder(placeholder: 'Select From DateTime')
->reactive()
->native(false),
DateTimePicker::make('updated_to')
->label('Updated To')
->placeholder(placeholder: 'Select To DateTime')
->reactive()
->native(false),
])
->query(function ($query, array $data) {
// Hide all records initially if no filters are applied
if (empty($data['Plant']) && empty($data['locator_number']) && $data['locator_quantity'] == null && empty($data['created_from']) && empty($data['created_to']) && empty($data['created_by']) && empty($data['updated_from']) && empty($data['updated_to'])) {
return $query->whereRaw('1 = 0');
}
if (!empty($data['Plant'])) { //$plant = $data['Plant'] ?? null
$query->where('plant_id', $data['Plant']);
}
if (!empty($data['locator_number'])) {
$query->where('locator_number', $data['locator_number']);
}
if ($data['locator_quantity'] != null && $data['locator_quantity'] != '') { //isset($data['locator_quantity']) &&
$query->where('locator_quantity', $data['locator_quantity']);//(int)
}
if (!empty($data['created_from'])) {
$query->where('created_at', '>=', $data['created_from']);
}
if (!empty($data['created_to'])) {
$query->where('created_at', '<=', $data['created_to']);
}
if (!empty($data['created_by'])) {
$query->where('operator_id', $data['created_by']);
}
if (!empty($data['updated_from'])) {
$query->where('updated_at', '>=', $data['updated_from']);
}
if (!empty($data['updated_to'])) {
$query->where('updated_at', '<=', $data['updated_to']);
}
})
->indicateUsing(function (array $data) {
$indicators = [];
if (!empty($data['Plant'])) {
$indicators[] = 'Plant: ' . Plant::where('id', $data['Plant'])->value('name');
}
if (!empty($data['locator_number'])) {
$indicators[] = 'Locator Number: ' . $data['locator_number'];
}
if ($data['locator_quantity'] != null && $data['locator_quantity'] != '') { //isset($data['locator_quantity']) &&
$indicators[] = 'Locator Quantity: ' . $data['locator_quantity'];
}
if (!empty($data['created_from'])) {
$indicators[] = 'From: ' . $data['created_from'];
}
if (!empty($data['created_to'])) {
$indicators[] = 'To: ' . $data['created_to'];
}
if (!empty($data['created_by'])) {
$indicators[] = 'Created By: ' . $data['created_by'];
}
if (!empty($data['updated_from'])) {
$indicators[] = 'Updated From: ' . $data['updated_from'];
}
if (!empty($data['updated_to'])) {
$indicators[] = 'Updated To: ' . $data['updated_to'];
}
return $indicators;
})
])
->filtersFormMaxHeight('280px')
->actions([
Tables\Actions\ViewAction::make(),
Tables\Actions\EditAction::make(),

View File

@@ -0,0 +1,121 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Resources\MfmMeterResource\Pages;
use App\Filament\Resources\MfmMeterResource\RelationManagers;
use App\Models\MfmMeter;
use Filament\Facades\Filament;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Forms\Components\Section;
class MfmMeterResource extends Resource
{
protected static ?string $model = MfmMeter::class;
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
protected static ?string $navigationGroup = 'Power House';
public static function form(Form $form): Form
{
return $form
->schema([
Section::make('')
->schema([
Forms\Components\Select::make('plant_id')
->relationship('plant', 'name')
->label('Plant')
->required(),
Forms\Components\TextInput::make('sequence')
->required(),
Forms\Components\TextInput::make('name')
->required(),
Forms\Components\Hidden::make('created_by')
->default(Filament::auth()->user()?->name),
])
->columns(4),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('id')
->label('ID')
->numeric()
->sortable(),
Tables\Columns\TextColumn::make('plant.name')
->label('Plant')
->sortable(),
Tables\Columns\TextColumn::make('sequence')
->label('Sequence')
->sortable(),
Tables\Columns\TextColumn::make('name')
->label('Meter Name')
->sortable(),
Tables\Columns\TextColumn::make('created_at')
->label('Created At')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('updated_at')
->label('Updated At')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('deleted_at')
->label('Deleted At')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
Tables\Filters\TrashedFilter::make(),
])
->actions([
Tables\Actions\ViewAction::make(),
Tables\Actions\EditAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
Tables\Actions\ForceDeleteBulkAction::make(),
Tables\Actions\RestoreBulkAction::make(),
]),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListMfmMeters::route('/'),
'create' => Pages\CreateMfmMeter::route('/create'),
'view' => Pages\ViewMfmMeter::route('/{record}'),
'edit' => Pages\EditMfmMeter::route('/{record}/edit'),
];
}
public static function getEloquentQuery(): Builder
{
return parent::getEloquentQuery()
->withoutGlobalScopes([
SoftDeletingScope::class,
]);
}
}

View File

@@ -0,0 +1,12 @@
<?php
namespace App\Filament\Resources\MfmMeterResource\Pages;
use App\Filament\Resources\MfmMeterResource;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
class CreateMfmMeter extends CreateRecord
{
protected static string $resource = MfmMeterResource::class;
}

View File

@@ -0,0 +1,22 @@
<?php
namespace App\Filament\Resources\MfmMeterResource\Pages;
use App\Filament\Resources\MfmMeterResource;
use Filament\Actions;
use Filament\Resources\Pages\EditRecord;
class EditMfmMeter extends EditRecord
{
protected static string $resource = MfmMeterResource::class;
protected function getHeaderActions(): array
{
return [
Actions\ViewAction::make(),
Actions\DeleteAction::make(),
Actions\ForceDeleteAction::make(),
Actions\RestoreAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\MfmMeterResource\Pages;
use App\Filament\Resources\MfmMeterResource;
use Filament\Actions;
use Filament\Resources\Pages\ListRecords;
class ListMfmMeters extends ListRecords
{
protected static string $resource = MfmMeterResource::class;
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\MfmMeterResource\Pages;
use App\Filament\Resources\MfmMeterResource;
use Filament\Actions;
use Filament\Resources\Pages\ViewRecord;
class ViewMfmMeter extends ViewRecord
{
protected static string $resource = MfmMeterResource::class;
protected function getHeaderActions(): array
{
return [
Actions\EditAction::make(),
];
}
}

View File

@@ -0,0 +1,176 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Exports\MfmParameterExporter;
use App\Filament\Imports\MfmParameterImporter;
use App\Filament\Resources\MfmParameterResource\Pages;
use App\Filament\Resources\MfmParameterResource\RelationManagers;
use App\Models\MfmParameter;
use Filament\Facades\Filament;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Forms\Components\Section;
use Filament\Tables\Actions\ImportAction;
use Filament\Tables\Actions\ExportAction;
class MfmParameterResource extends Resource
{
protected static ?string $model = MfmParameter::class;
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
protected static ?string $navigationGroup = 'Power House';
public static function form(Form $form): Form
{
return $form
->schema([
Section::make('')
->schema([
Forms\Components\Select::make('plant_id')
->label('Plant')
->relationship('plant', 'name')
->required(),
Forms\Components\Select::make('mfm_meter_id')
->label('Mfm Meter')
->relationship('mfmMeter', 'sequence')
->required(),
Forms\Components\TextInput::make('name')
->label('Parameter Name')
->required(),
Forms\Components\TextInput::make('register_id')
->label('Register ID')
->required(),
Forms\Components\TextInput::make('identifier')
->label('Identifier')
->required(),
Forms\Components\TextInput::make('byte_to_convert')
->label('Byte To Convert')
->default(2)
->required(),
Forms\Components\TextInput::make('type_to_convert')
->label('Type To Convert')
->required(),
Forms\Components\TextInput::make('decimal_to_display')
->label('Decimal To Display')
->default(1)
->required(),
])
->columns(8),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('id')
->label('ID')
->numeric()
->sortable(),
Tables\Columns\TextColumn::make('plant.name')
->label('Plant')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('mfmMeter.name')
->label('Sequence')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('name')
->label('Parameter Name')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('register_id')
->label('Register ID')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('identifier')
->label('Identifier')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('byte_to_convert')
->label('Byte To Convert')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('type_to_convert')
->label('Type To Convert')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('decimal_to_display')
->label('Decimal To Display')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('created_at')
->dateTime()
->alignCenter()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('updated_at')
->alignCenter()
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('deleted_at')
->alignCenter()
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
Tables\Filters\TrashedFilter::make(),
])
->actions([
Tables\Actions\ViewAction::make(),
Tables\Actions\EditAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
Tables\Actions\ForceDeleteBulkAction::make(),
Tables\Actions\RestoreBulkAction::make(),
]),
])
->headerActions([
ImportAction::make()
->importer(MfmParameterImporter::class)
->visible(function() {
return Filament::auth()->user()->can('view import mfm parameter');
}),
ExportAction::make()
->exporter(MfmParameterExporter::class)
->visible(function() {
return Filament::auth()->user()->can('view export mfm parameter');
}),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListMfmParameters::route('/'),
'create' => Pages\CreateMfmParameter::route('/create'),
'view' => Pages\ViewMfmParameter::route('/{record}'),
'edit' => Pages\EditMfmParameter::route('/{record}/edit'),
];
}
public static function getEloquentQuery(): Builder
{
return parent::getEloquentQuery()
->withoutGlobalScopes([
SoftDeletingScope::class,
]);
}
}

View File

@@ -0,0 +1,12 @@
<?php
namespace App\Filament\Resources\MfmParameterResource\Pages;
use App\Filament\Resources\MfmParameterResource;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
class CreateMfmParameter extends CreateRecord
{
protected static string $resource = MfmParameterResource::class;
}

View File

@@ -0,0 +1,22 @@
<?php
namespace App\Filament\Resources\MfmParameterResource\Pages;
use App\Filament\Resources\MfmParameterResource;
use Filament\Actions;
use Filament\Resources\Pages\EditRecord;
class EditMfmParameter extends EditRecord
{
protected static string $resource = MfmParameterResource::class;
protected function getHeaderActions(): array
{
return [
Actions\ViewAction::make(),
Actions\DeleteAction::make(),
Actions\ForceDeleteAction::make(),
Actions\RestoreAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\MfmParameterResource\Pages;
use App\Filament\Resources\MfmParameterResource;
use Filament\Actions;
use Filament\Resources\Pages\ListRecords;
class ListMfmParameters extends ListRecords
{
protected static string $resource = MfmParameterResource::class;
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\MfmParameterResource\Pages;
use App\Filament\Resources\MfmParameterResource;
use Filament\Actions;
use Filament\Resources\Pages\ViewRecord;
class ViewMfmParameter extends ViewRecord
{
protected static string $resource = MfmParameterResource::class;
protected function getHeaderActions(): array
{
return [
Actions\EditAction::make(),
];
}
}

View File

@@ -0,0 +1,223 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Resources\MfmReadingResource\Pages;
use App\Filament\Resources\MfmReadingResource\RelationManagers;
use App\Models\MfmReading;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
class MfmReadingResource extends Resource
{
protected static ?string $model = MfmReading::class;
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
protected static ?string $navigationGroup = 'Power House';
public static function form(Form $form): Form
{
return $form
->schema([
Forms\Components\Select::make('plant_id')
->relationship('plant', 'name')
->required(),
Forms\Components\Select::make('mfm_meter_id')
->relationship('mfmMeter', 'name')
->required(),
Forms\Components\TextInput::make('apparent_energy_received'),
Forms\Components\TextInput::make('reactive_energy_received'),
Forms\Components\TextInput::make('active_energy_received'),
Forms\Components\TextInput::make('active_power_r'),
Forms\Components\TextInput::make('active_power_y'),
Forms\Components\TextInput::make('active_power_b'),
Forms\Components\TextInput::make('active_power_total'),
Forms\Components\TextInput::make('voltage_ry'),
Forms\Components\TextInput::make('voltage_yb'),
Forms\Components\TextInput::make('voltage_br'),
Forms\Components\TextInput::make('current_r'),
Forms\Components\TextInput::make('current_y'),
Forms\Components\TextInput::make('current_b'),
Forms\Components\TextInput::make('current_n'),
Forms\Components\TextInput::make('voltage_r_n'),
Forms\Components\TextInput::make('voltage_y_n'),
Forms\Components\TextInput::make('voltage_b_n'),
Forms\Components\TextInput::make('frequency'),
Forms\Components\TextInput::make('power_factor_r'),
Forms\Components\TextInput::make('power_factor_y'),
Forms\Components\TextInput::make('power_factor_b'),
Forms\Components\TextInput::make('power_factor_total'),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('id')
->label('ID')
->alignCenter()
->numeric()
->sortable(),
Tables\Columns\TextColumn::make('plant.name')
->label('Plant')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('mfmMeter.name')
->label('Mfm Meter')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('apparent_energy_received')
->label('Apparent Energy Received')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('reactive_energy_received')
->label('Reactive Energy Received')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('active_energy_received')
->label('Active Energy Received')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('active_power_r')
->label('Active Power R')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('active_power_y')
->label('Active Power Y')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('active_power_b')
->label('Active Power B')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('active_power_total')
->label('Active Power Total')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('voltage_ry')
->label('Voltage RY')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('voltage_yb')
->label('Voltage YB')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('voltage_br')
->label('Voltage BR')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('current_r')
->label('Current R')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('current_y')
->label('Current Y')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('current_b')
->label('Current B')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('current_n')
->label('Current N')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('voltage_r_n')
->label('Voltage R N')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('voltage_y_n')
->label('Voltage Y N')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('voltage_b_n')
->label('Voltage B N')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('frequency')
->label('Frequency')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('power_factor_r')
->label('Power Factor R')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('power_factor_y')
->label('Power Factor Y')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('power_factor_b')
->label('Power Factor B')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('power_factor_total')
->label('Power Factor Total')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('created_at')
->label('Created At')
->alignCenter()
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('updated_at')
->label('Updated At')
->alignCenter()
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('deleted_at')
->label('Deleted At')
->alignCenter()
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
Tables\Filters\TrashedFilter::make(),
])
->actions([
Tables\Actions\ViewAction::make(),
Tables\Actions\EditAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
Tables\Actions\ForceDeleteBulkAction::make(),
Tables\Actions\RestoreBulkAction::make(),
]),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListMfmReadings::route('/'),
'create' => Pages\CreateMfmReading::route('/create'),
'view' => Pages\ViewMfmReading::route('/{record}'),
'edit' => Pages\EditMfmReading::route('/{record}/edit'),
];
}
public static function getEloquentQuery(): Builder
{
return parent::getEloquentQuery()
->withoutGlobalScopes([
SoftDeletingScope::class,
]);
}
}

View File

@@ -0,0 +1,12 @@
<?php
namespace App\Filament\Resources\MfmReadingResource\Pages;
use App\Filament\Resources\MfmReadingResource;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
class CreateMfmReading extends CreateRecord
{
protected static string $resource = MfmReadingResource::class;
}

View File

@@ -0,0 +1,22 @@
<?php
namespace App\Filament\Resources\MfmReadingResource\Pages;
use App\Filament\Resources\MfmReadingResource;
use Filament\Actions;
use Filament\Resources\Pages\EditRecord;
class EditMfmReading extends EditRecord
{
protected static string $resource = MfmReadingResource::class;
protected function getHeaderActions(): array
{
return [
Actions\ViewAction::make(),
Actions\DeleteAction::make(),
Actions\ForceDeleteAction::make(),
Actions\RestoreAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\MfmReadingResource\Pages;
use App\Filament\Resources\MfmReadingResource;
use Filament\Actions;
use Filament\Resources\Pages\ListRecords;
class ListMfmReadings extends ListRecords
{
protected static string $resource = MfmReadingResource::class;
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\MfmReadingResource\Pages;
use App\Filament\Resources\MfmReadingResource;
use Filament\Actions;
use Filament\Resources\Pages\ViewRecord;
class ViewMfmReading extends ViewRecord
{
protected static string $resource = MfmReadingResource::class;
protected function getHeaderActions(): array
{
return [
Actions\EditAction::make(),
];
}
}

View File

@@ -0,0 +1,125 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Resources\ModuleListResource\Pages;
use App\Filament\Resources\ModuleListResource\RelationManagers;
use App\Models\ModuleList;
use Filament\Facades\Filament;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Forms\Components\Section;
class ModuleListResource extends Resource
{
protected static ?string $model = ModuleList::class;
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
protected static ?string $navigationGroup = 'Modules';
public static function form(Form $form): Form
{
return $form
->schema([
Section::make('')
->schema([
Forms\Components\TextInput::make('module_name')
->label('Module Name')
->required(),
Forms\Components\TextInput::make('dashboard_name')
->label('DashBoard Name')
->required(),
Forms\Components\TextInput::make('filter_name')
->label('Filter Name')
->required(),
Forms\Components\Hidden::make('created_by')
->label('Created By')
->default(Filament::auth()->user()?->name),
Forms\Components\Hidden::make('updated_by')
->label('Updated By')
->default(Filament::auth()->user()?->name),
])
->columns(3),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('id')
->label('ID')
->numeric()
->sortable(),
Tables\Columns\TextColumn::make('module_name')
->label('Module Name')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('dashboard_name')
->label('DashBoard Name')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('filter_name')
->label('Filter Name')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('deleted_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
Tables\Filters\TrashedFilter::make(),
])
->actions([
Tables\Actions\ViewAction::make(),
Tables\Actions\EditAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
Tables\Actions\ForceDeleteBulkAction::make(),
Tables\Actions\RestoreBulkAction::make(),
]),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListModuleLists::route('/'),
'create' => Pages\CreateModuleList::route('/create'),
'view' => Pages\ViewModuleList::route('/{record}'),
'edit' => Pages\EditModuleList::route('/{record}/edit'),
];
}
public static function getEloquentQuery(): Builder
{
return parent::getEloquentQuery()
->withoutGlobalScopes([
SoftDeletingScope::class,
]);
}
}

View File

@@ -0,0 +1,12 @@
<?php
namespace App\Filament\Resources\ModuleListResource\Pages;
use App\Filament\Resources\ModuleListResource;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
class CreateModuleList extends CreateRecord
{
protected static string $resource = ModuleListResource::class;
}

View File

@@ -0,0 +1,22 @@
<?php
namespace App\Filament\Resources\ModuleListResource\Pages;
use App\Filament\Resources\ModuleListResource;
use Filament\Actions;
use Filament\Resources\Pages\EditRecord;
class EditModuleList extends EditRecord
{
protected static string $resource = ModuleListResource::class;
protected function getHeaderActions(): array
{
return [
Actions\ViewAction::make(),
Actions\DeleteAction::make(),
Actions\ForceDeleteAction::make(),
Actions\RestoreAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\ModuleListResource\Pages;
use App\Filament\Resources\ModuleListResource;
use Filament\Actions;
use Filament\Resources\Pages\ListRecords;
class ListModuleLists extends ListRecords
{
protected static string $resource = ModuleListResource::class;
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\ModuleListResource\Pages;
use App\Filament\Resources\ModuleListResource;
use Filament\Actions;
use Filament\Resources\Pages\ViewRecord;
class ViewModuleList extends ViewRecord
{
protected static string $resource = ModuleListResource::class;
protected function getHeaderActions(): array
{
return [
Actions\EditAction::make(),
];
}
}

View File

@@ -20,7 +20,6 @@ use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Forms\Components\Actions;
use Filament\Notifications\Notification;
use Filament\Tables\Actions\ExportAction;
use Filament\Tables\Actions\ImportAction;
use Log;
@@ -112,6 +111,7 @@ class PalletValidationResource extends Resource
Forms\Components\TextInput::make('serial_number')
->label('Scan Serial No')
->reactive()
->minLength(9)
->readOnly(fn (callable $get) => !$get('pallet_number') || $get('removeSno_number'))
->extraAttributes([
'x-on:keydown.enter.prevent' => '$wire.processPalletSNo()',
@@ -119,6 +119,7 @@ class PalletValidationResource extends Resource
Forms\Components\TextInput::make('removeSno_number')
->label('Remove Serial No')
->reactive()
->minLength(9)
->readOnly(fn (callable $get) => !$get('pallet_number') || $get('serial_number'))
->extraAttributes([
'x-data' => '{ value: "" }',
@@ -220,24 +221,24 @@ class PalletValidationResource extends Resource
->label('Created By')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('scanned_by')
->label('Scanned By')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('updated_by')
->label('Updated By')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('created_at')
->dateTime()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('updated_at')
Tables\Columns\TextColumn::make('scanned_by')
->label('Scanned By')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('scanned_at')
->dateTime()
->alignCenter()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('scanned_at')
Tables\Columns\TextColumn::make('updated_by')
->label('Updated By')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('updated_at')
->dateTime()
->alignCenter()
->sortable()
@@ -254,218 +255,218 @@ class PalletValidationResource extends Resource
->filters([
Tables\Filters\TrashedFilter::make(),
Filter::make('advanced_filters')
->label('Advanced Filters')
->form([
Select::make('Plant')
->label('Select Plant')
->nullable()
->options(function () {
return Plant::pluck('name', 'id');
})
->reactive()
->afterStateUpdated(function ($state, callable $set, callable $get): void {
$set('pallet_number', null);
$set('serial_number', null);
$set('pallet_status', null);
$set('locator_number', null);
$set('locator_quantity', null);
$set('created_from', null);
$set('created_to', null);
$set('created_by', null);
$set('scanned_from', null);
$set('scanned_to', null);
$set('scanned_by', null);
}),
Select::make('pallet_number')
->label('Pallet Number')
->options(function (callable $get) {
$plantId = $get('Plant');
if (!$plantId) {
return [];
}
return PalletValidation::where('plant_id', $plantId)
->whereNotNull('pallet_number')
->where('pallet_number','!=', '')
->orderBy('pallet_number', 'asc')
->get()
->unique('pallet_number')
->pluck('pallet_number', 'pallet_number')
->toArray();
})
->searchable()
->reactive(),
TextInput::make('serial_number')
->label('Serial Number')
->placeholder(placeholder: 'Enter Serial Number'),
Select::make('pallet_status')
->label('Pallet Status')
->options([
'Completed' => 'Completed',
]),
Select::make('locator_number')
->label('Locator Number')
->options(function (callable $get) {
$plantId = $get('Plant');
if (!$plantId) {
return [];
}
return PalletValidation::where('plant_id', $plantId)
->whereNotNull('locator_number')
->where('locator_number','!=', '')
->orderBy('locator_number', 'asc')
->get()
->unique('locator_number')
->pluck('locator_number', 'locator_number')
->toArray();
})
->searchable()
->reactive(),
Select::make('locator_quantity')
->label('Locator Quantity')
->options([
0 => 0,
1 => 1,
2 => 2,
])
->reactive(),
DateTimePicker::make(name: 'created_from')
->label('Created From')
->placeholder(placeholder: 'Select From DateTime')
->reactive()
->native(false),
DateTimePicker::make('created_to')
->label('Created To')
->placeholder(placeholder: 'Select To DateTime')
->reactive()
->native(false),
TextInput::make('created_by')
->label('Created By')
->placeholder(placeholder: 'Enter Created By'),
DateTimePicker::make(name: 'scanned_from')
->label('Scanned From')
->placeholder(placeholder: 'Select From DateTime')
->reactive()
->native(false),
DateTimePicker::make('scanned_to')
->label('Scanned To')
->placeholder(placeholder: 'Select To DateTime')
->reactive()
->native(false),
TextInput::make('scanned_by')
->label('Scanned By')
->placeholder(placeholder: 'Enter Scanned By'),
])
->query(function ($query, array $data) {
// Hide all records initially if no filters are applied
if (empty($data['Plant']) && empty($data['pallet_number']) && empty($data['serial_number']) && empty($data['pallet_status']) && empty($data['locator_number']) && $data['locator_quantity'] == null && empty($data['created_from']) && empty($data['created_to']) && empty($data['created_by']) && empty($data['scanned_from']) && empty($data['scanned_to']) && empty($data['scanned_by'])) {
return $query->whereRaw('1 = 0');
}
->label('Advanced Filters')
->form([
Select::make('Plant')
->label('Select Plant')
->nullable()
->options(function () {
return Plant::pluck('name', 'id');
})
->reactive()
->afterStateUpdated(function ($state, callable $set, callable $get): void {
$set('pallet_number', null);
$set('serial_number', null);
$set('pallet_status', null);
$set('locator_number', null);
$set('locator_quantity', null);
$set('created_from', null);
$set('created_to', null);
$set('created_by', null);
$set('scanned_from', null);
$set('scanned_to', null);
$set('scanned_by', null);
}),
Select::make('pallet_number')
->label('Pallet Number')
->options(function (callable $get) {
$plantId = $get('Plant');
if (!$plantId) {
return [];
}
return PalletValidation::where('plant_id', $plantId)
->whereNotNull('pallet_number')
->where('pallet_number','!=', '')
->orderBy('pallet_number', 'asc')
->get()
->unique('pallet_number')
->pluck('pallet_number', 'pallet_number')
->toArray();
})
->searchable()
->reactive(),
TextInput::make('serial_number')
->label('Serial Number')
->placeholder(placeholder: 'Enter Serial Number'),
Select::make('pallet_status')
->label('Pallet Status')
->options([
'Completed' => 'Completed',
]),
Select::make('locator_number')
->label('Locator Number')
->options(function (callable $get) {
$plantId = $get('Plant');
if (!$plantId) {
return [];
}
return PalletValidation::where('plant_id', $plantId)
->whereNotNull('locator_number')
->where('locator_number','!=', '')
->orderBy('locator_number', 'asc')
->get()
->unique('locator_number')
->pluck('locator_number', 'locator_number')
->toArray();
})
->searchable()
->reactive(),
Select::make('locator_quantity')
->label('Locator Quantity')
->options([
0 => 0,
1 => 1,
2 => 2,
])
->reactive(),
DateTimePicker::make(name: 'created_from')
->label('Created From')
->placeholder(placeholder: 'Select From DateTime')
->reactive()
->native(false),
DateTimePicker::make('created_to')
->label('Created To')
->placeholder(placeholder: 'Select To DateTime')
->reactive()
->native(false),
TextInput::make('created_by')
->label('Created By')
->placeholder(placeholder: 'Enter Created By'),
DateTimePicker::make(name: 'scanned_from')
->label('Scanned From')
->placeholder(placeholder: 'Select From DateTime')
->reactive()
->native(false),
DateTimePicker::make('scanned_to')
->label('Scanned To')
->placeholder(placeholder: 'Select To DateTime')
->reactive()
->native(false),
TextInput::make('scanned_by')
->label('Scanned By')
->placeholder(placeholder: 'Enter Scanned By'),
])
->query(function ($query, array $data) {
// Hide all records initially if no filters are applied
if (empty($data['Plant']) && empty($data['pallet_number']) && empty($data['serial_number']) && empty($data['pallet_status']) && empty($data['locator_number']) && $data['locator_quantity'] == null && empty($data['created_from']) && empty($data['created_to']) && empty($data['created_by']) && empty($data['scanned_from']) && empty($data['scanned_to']) && empty($data['scanned_by'])) {
return $query->whereRaw('1 = 0');
}
if (!empty($data['Plant'])) { //$plant = $data['Plant'] ?? null
$query->where('plant_id', $data['Plant']);
}
if (!empty($data['Plant'])) { //$plant = $data['Plant'] ?? null
$query->where('plant_id', $data['Plant']);
}
if (!empty($data['pallet_number'])) {
$query->where('pallet_number', $data['pallet_number']);
}
if (!empty($data['pallet_number'])) {
$query->where('pallet_number', $data['pallet_number']);
}
if (!empty($data['serial_number'])) {
$query->where('serial_number', $data['serial_number']);
}
if (!empty($data['serial_number'])) {
$query->where('serial_number', $data['serial_number']);
}
if (!empty($data['pallet_status'])) {
$query->where('pallet_status', $data['pallet_status']);
}
if (!empty($data['pallet_status'])) {
$query->where('pallet_status', $data['pallet_status']);
}
if (!empty($data['locator_number'])) {
$query->where('locator_number', $data['locator_number']);
}
if (!empty($data['locator_number'])) {
$query->where('locator_number', $data['locator_number']);
}
// if (!empty($data['locator_quantity'])) {
// $query->where('locator_quantity', $data['locator_quantity']);
// }
// if (!empty($data['locator_quantity'])) {
// $query->where('locator_quantity', $data['locator_quantity']);
// }
if ($data['locator_quantity'] != null && $data['locator_quantity'] != '') { //isset($data['locator_quantity']) &&
$query->where('locator_quantity', $data['locator_quantity']);//(int)
}
if ($data['locator_quantity'] != null && $data['locator_quantity'] != '') { //isset($data['locator_quantity']) &&
$query->where('locator_quantity', $data['locator_quantity']);//(int)
}
if (!empty($data['created_from'])) {
$query->where('created_at', '>=', $data['created_from']);
}
if (!empty($data['created_from'])) {
$query->where('created_at', '>=', $data['created_from']);
}
if (!empty($data['created_to'])) {
$query->where('created_at', '<=', $data['created_to']);
}
if (!empty($data['created_to'])) {
$query->where('created_at', '<=', $data['created_to']);
}
if (!empty($data['created_by'])) {
$query->where('created_by', $data['created_by']);
}
if (!empty($data['created_by'])) {
$query->where('created_by', $data['created_by']);
}
if (!empty($data['scanned_from'])) {
$query->where('scanned_at', '>=', $data['scanned_from']);
}
if (!empty($data['scanned_from'])) {
$query->where('scanned_at', '>=', $data['scanned_from']);
}
if (!empty($data['scanned_to'])) {
$query->where('scanned_at', '<=', $data['scanned_to']);
}
if (!empty($data['scanned_to'])) {
$query->where('scanned_at', '<=', $data['scanned_to']);
}
if (!empty($data['scanned_by'])) {
$query->where('scanned_by', $data['scanned_by']);
}
})
->indicateUsing(function (array $data) {
$indicators = [];
if (!empty($data['scanned_by'])) {
$query->where('scanned_by', $data['scanned_by']);
}
})
->indicateUsing(function (array $data) {
$indicators = [];
if (!empty($data['Plant'])) {
$indicators[] = 'Plant: ' . Plant::where('id', $data['Plant'])->value('name');
}
if (!empty($data['Plant'])) {
$indicators[] = 'Plant: ' . Plant::where('id', $data['Plant'])->value('name');
}
if (!empty($data['pallet_number'])) {
$indicators[] = 'Pallet Number: ' . $data['pallet_number'];
}
if (!empty($data['pallet_number'])) {
$indicators[] = 'Pallet Number: ' . $data['pallet_number'];
}
if (!empty($data['serial_number'])) {
$indicators[] = 'Serial Number: ' . $data['serial_number'];
}
if (!empty($data['serial_number'])) {
$indicators[] = 'Serial Number: ' . $data['serial_number'];
}
if (!empty($data['pallet_status'])) {
$indicators[] = 'Pallet Status: ' . $data['pallet_status'];
}
if (!empty($data['pallet_status'])) {
$indicators[] = 'Pallet Status: ' . $data['pallet_status'];
}
if (!empty($data['locator_number'])) {
$indicators[] = 'Locator Number: ' . $data['locator_number'];
}
if (!empty($data['locator_number'])) {
$indicators[] = 'Locator Number: ' . $data['locator_number'];
}
// if (!empty($data['locator_quantity'])) {
// $indicators[] = 'Locator Quantity: ' . $data['locator_quantity'];
// }
if (isset($data['locator_quantity']) && $data['locator_quantity'] !== '') {
$indicators[] = 'Locator Quantity: ' . $data['locator_quantity'];
}
// if (!empty($data['locator_quantity'])) {
// $indicators[] = 'Locator Quantity: ' . $data['locator_quantity'];
// }
if ($data['locator_quantity'] != null && $data['locator_quantity'] != '') { //isset($data['locator_quantity']) &&
$indicators[] = 'Locator Quantity: ' . $data['locator_quantity'];
}
if (!empty($data['created_from'])) {
$indicators[] = 'From: ' . $data['created_from'];
}
if (!empty($data['created_from'])) {
$indicators[] = 'From: ' . $data['created_from'];
}
if (!empty($data['created_to'])) {
$indicators[] = 'To: ' . $data['created_to'];
}
if (!empty($data['created_to'])) {
$indicators[] = 'To: ' . $data['created_to'];
}
if (!empty($data['created_by'])) {
$indicators[] = 'Created By: ' . $data['created_by'];
}
if (!empty($data['scanned_from'])) {
$indicators[] = 'Scanned From: ' . $data['scanned_from'];
}
if (!empty($data['scanned_to'])) {
$indicators[] = 'Scanned To: ' . $data['scanned_to'];
}
if (!empty($data['scanned_by'])) {
$indicators[] = 'Scanned By: ' . $data['scanned_by'];
}
if (!empty($data['created_by'])) {
$indicators[] = 'Created By: ' . $data['created_by'];
}
if (!empty($data['scanned_from'])) {
$indicators[] = 'Scanned From: ' . $data['scanned_from'];
}
if (!empty($data['scanned_to'])) {
$indicators[] = 'Scanned To: ' . $data['scanned_to'];
}
if (!empty($data['scanned_by'])) {
$indicators[] = 'Scanned By: ' . $data['scanned_by'];
}
return $indicators;
})
return $indicators;
})
])
->filtersFormMaxHeight('280px')
->actions([
@@ -484,38 +485,37 @@ class PalletValidationResource extends Resource
Tables\Actions\Action::make('reprint_pallet')
->label('Re-Print Pallet QR')
->form([
Forms\Components\Section::make()
->schema([
Forms\Components\Select::make('plant')
->label('Select Plant')
->options(Plant::pluck('name', 'id')->toArray())
->required()
->reactive()
->columnSpan(2),
Forms\Components\Section::make()
->schema([
Forms\Components\Select::make('plant')
->label('Select Plant')
->options(Plant::pluck('name', 'id')->toArray())
->required()
->reactive()
->columnSpan(2),
Forms\Components\Select::make('pallet_list')
->label('Select Pallet')
->searchable()
->required()
->reactive()
->columnSpan(1)
->options(function (callable $get) {
$plantId = $get('plant');
Forms\Components\Select::make('pallet_list')
->label('Select Pallet')
->searchable()
->required()
->reactive()
->columnSpan(1)
->options(function (callable $get) {
$plantId = $get('plant');
if (!$plantId) {
return [];
}
if (!$plantId) {
return [];
}
return PalletValidation::query()
->where('plant_id', $plantId)
->whereNotNull('pallet_number')
->where('pallet_number', '!=', '')
->select('pallet_number')
->distinct()
->orderBy('pallet_number')
->pluck('pallet_number', 'pallet_number')
->toArray();
}),
return PalletValidation::query()
->where('plant_id', $plantId)
->whereNotNull('pallet_number')
->where('pallet_number', '!=', '')
->select('pallet_number')
->distinct()
->orderBy('pallet_number')
->pluck('pallet_number', 'pallet_number')
->toArray();
}),
])
->columns(['default' => 1, 'sm' => 3]),
])

View File

@@ -57,13 +57,14 @@ class CreatePalletValidation extends CreateRecord
$clickedBy = session('pallet_created_by');
if(!$palletNumber)
if (!$palletNumber)
{
Notification::make()
->title('Pallet number cannot be empty')
->danger()
->send();
->title("Pallet number can't be empty")
->danger()
->duration(5000)
->send();
$this->form->fill([
'serial_number' => null,
'plant_id' => $plantId,
@@ -76,18 +77,17 @@ class CreatePalletValidation extends CreateRecord
return;
}
$count = PalletValidation::where('plant_id', $plantId)
->where('pallet_number', $palletNumber)
->count('pallet_number');
if(!$serialNumber)
if (!$serialNumber)
{
Notification::make()
->title('Serial number cannot be empty')
->danger()
->send();
->title('Serial number is required to add.')
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', $palletNumber, $plantId);
$this->form->fill([
'serial_number' => null,
@@ -100,12 +100,14 @@ class CreatePalletValidation extends CreateRecord
]);
return;
}
if(strlen($serialNumber) < 13)
else if (strlen($serialNumber) < 9 || strlen($serialNumber) > 20)
{
Notification::make()
->title('Serial number should contain minimum 13 digits.')
->danger()
->send();
->title('Serial number should contain minimum 9 digits and maximum 20 digits.')
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', $palletNumber, $plantId);
$this->form->fill([
'serial_number' => null,
@@ -118,12 +120,14 @@ class CreatePalletValidation extends CreateRecord
]);
return;
}
if (!ctype_alnum($serialNumber))
else if (!ctype_alnum($serialNumber))
{
Notification::make()
->title('Serial number must contain alpha-numeric values only.')
->danger()
->send();
->title('Serial number must contain alpha-numeric values only.')
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', $palletNumber, $plantId);
$this->form->fill([
'serial_number' => null,
@@ -143,12 +147,14 @@ class CreatePalletValidation extends CreateRecord
->first();
$invoiceNumber = $existInvoiceSno?->invoice_number;
if($existInvoiceSno)
if ($existInvoiceSno)
{
Notification::make()
->title("Scanned serial number '{$serialNumber}' already completed the scanning process and exist in invoice number : {$invoiceNumber}.<br>Scan the new serial number to add!")
->danger()
->send();
->title("Scanned serial number '{$serialNumber}' already completed the scanning process and exist in invoice number : {$invoiceNumber}.<br>Scan the new serial number to add!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', $palletNumber, $plantId);
$this->form->fill([
'serial_number' => null,
@@ -173,6 +179,7 @@ class CreatePalletValidation extends CreateRecord
// Notification::make()
// ->title("Scanned serial number '{$serialNumber}' exists in pallet table .<br>scan the valid serial number to proceed...")
// ->danger()
// ->duration(5000)
// ->send();
// $this->form->fill([
// 'serial_number' => null,
@@ -191,6 +198,7 @@ class CreatePalletValidation extends CreateRecord
Notification::make()
->title("Scanned serial number '{$serialNumber}' is already exists in pallet number '{$palletNumber}'.<br>Scan the new serial number to proceed...")
->danger()
->duration(5000)
->send();
}
else if ($existingRecord && $existingRecord->pallet_number && $existingRecord->pallet_number != $palletNumber)
@@ -198,6 +206,7 @@ class CreatePalletValidation extends CreateRecord
Notification::make()
->title("Scanned serial number '{$serialNumber}' already exists in pallet number '{$existingRecord->pallet_number}'.<br>Scan the new serial number to proceed...")
->danger()
->duration(5000)
->send();
}
else if ($existingRecord && $existingRecord->locator_number)
@@ -205,6 +214,7 @@ class CreatePalletValidation extends CreateRecord
Notification::make()
->title("Scanned serial number '{$serialNumber}' is already exists in locator number '{$existingRecord->locator_number}'.<br>Scan the new serial number to proceed...")
->danger()
->duration(5000)
->send();
}
$this->dispatch('loadData', $palletNumber, $plantId);
@@ -248,15 +258,17 @@ class CreatePalletValidation extends CreateRecord
if ($record)
{
Notification::make()
->title("Scanned serial number : '{$serialNumber}' successfully inserted into pallet table!<br>Scan the next new serial number to proceed...")
->success()
->send();
// Notification::make()
// ->title("Scanned serial number '{$serialNumber}' successfully inserted into pallet table!<br>Scan the next new serial number to proceed...")
// ->success()
// ->duration(600)
// ->send();
$this->snoCount = PalletValidation::where('plant_id', $plantId)
->where('pallet_number', $palletNumber)
->count();
$this->dispatch('loadData', $palletNumber, $plantId);
$this->form->fill([
'plant_id' => $plantId,
'pallet_number' => $palletNumber,
@@ -266,34 +278,36 @@ class CreatePalletValidation extends CreateRecord
'created_by' => $operatorName,
'scanned_by' => $operatorName,
]);
$this->dispatch('loadData', $palletNumber, $plantId);
}
else
{
Notification::make()
->title('Pallet validation not inserted.')
->title("Failed to insert scanned serial number '$serialNumber' into pallet table!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', $palletNumber, $plantId);
$this->form->fill([
'plant_id' => $plantId,
'pallet_number' => $palletNumber,
'serial_number' => null,
'pending_pallet_list' => $pendingPallet,
'Sno_quantity' => $count,
'scanned_by' => $operatorName,
]);
return;
$this->dispatch('loadData', $palletNumber, $plantId);
$this->form->fill([
'plant_id' => $plantId,
'pallet_number' => $palletNumber,
'serial_number' => null,
'pending_pallet_list' => $pendingPallet,
'Sno_quantity' => $count,
'scanned_by' => $operatorName,
]);
return;
}
}
catch (\Exception $e)
{
Notification::make()
->title('Error: Pallet validation not inserted.')
->body("Something went wrong while inserting serial number : '{$serialNumber}' into pallet table!\nScan the new serial number to proceed...")
->title('Error: Serial not inserted.')
->body("Something went wrong while inserting serial number '{$serialNumber}' into pallet table!\nScan the new serial number to proceed...")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', $palletNumber, $plantId);
$this->form->fill([
'plant_id' => $plantId,
@@ -362,12 +376,14 @@ class CreatePalletValidation extends CreateRecord
->where('plant_id', $plantId)
->first();
if(!$palletExist)
if (!$palletExist)
{
Notification::make()
->title("Pallet number '$palletNumber' does not have serial numbers to save!<br>Add the valid serial number into pallet number to proceed...")
->danger()
->send();
->title("Pallet number '$palletNumber' does not have serial numbers to save!<br>Add the valid serial number into pallet number to proceed...")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', $palletNumber, $plantId);
$this->form->fill([
'serial_number' => null,
@@ -391,7 +407,9 @@ class CreatePalletValidation extends CreateRecord
Notification::make()
->title("Pallet number '$palletNumber' already completed the master packing!<br>Generate the new pallet number or choose from pending pallet list!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', '', $plantId);
$this->form->fill([
'serial_number' => null,
@@ -420,7 +438,12 @@ class CreatePalletValidation extends CreateRecord
if ($updated > 0)
{
Notification::make()->title("Pallet number '$palletNumber' records saved successfully!")->success()->send();
Notification::make()
->title("Pallet number '$palletNumber' records saved successfully!")
->success()
->duration(800)
->send();
$this->dispatch('loadData', '', $plantId);
$this->form->fill([
'serial_number' => null,
@@ -446,7 +469,12 @@ class CreatePalletValidation extends CreateRecord
if ($updated > 0)
{
Notification::make()->title("Pallet number '$palletNumber' completed the master packing successfully!")->success()->send();
Notification::make()
->title("Pallet number '$palletNumber' completed the master packing successfully!")
->success()
->duration(800)
->send();
$this->dispatch('loadData', '', $plantId);
$this->form->fill([
'serial_number' => null,
@@ -487,6 +515,7 @@ class CreatePalletValidation extends CreateRecord
Notification::make()
->title('Pallet number is required to remove.')
->danger()
->duration(5000)
->send();
return;
}
@@ -501,7 +530,9 @@ class CreatePalletValidation extends CreateRecord
Notification::make()
->title('Serial number is required to remove.')
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', $palletNumber, $plantId);
$this->form->fill([
'serial_number' => null,
@@ -514,12 +545,14 @@ class CreatePalletValidation extends CreateRecord
]);
return;
}
if(strlen($serialNumber) < 13)
else if (strlen($serialNumber) < 9 || strlen($serialNumber) > 20)
{
Notification::make()
->title('Serial number should contain minimum 13 digits.')
->danger()
->send();
->title('Serial number should contain minimum 9 digits and maximum 20 digits.')
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', $palletNumber, $plantId);
$this->form->fill([
'serial_number' => null,
@@ -535,9 +568,11 @@ class CreatePalletValidation extends CreateRecord
else if (!ctype_alnum($serialNumber))
{
Notification::make()
->title('Serial number must contain alpha-numeric values only.')
->danger()
->send();
->title('Serial number must contain alpha-numeric values only.')
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', $palletNumber, $plantId);
$this->form->fill([
'serial_number' => null,
@@ -556,12 +591,14 @@ class CreatePalletValidation extends CreateRecord
->where('scanned_status', '=', 'Scanned')
->first();
if($invoiceExist)
if ($invoiceExist)
{
Notification::make()
->title("Scanned serial number '{$serialNumber}' already completed the scanning process and exist in invoice number : '{$invoiceExist->invoice_number}'.<br>Scan the valid exist serial number to remove!")
->danger()
->send();
->title("Scanned serial number '{$serialNumber}' already completed the scanning process and exist in invoice number '{$invoiceExist->invoice_number}'.<br>Scan the valid exist serial number to remove!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', $palletNumber, $plantId);
$this->form->fill([
'serial_number' => null,
@@ -578,12 +615,14 @@ class CreatePalletValidation extends CreateRecord
$serialexist = PalletValidation::where('plant_id', $plantId)
->where('serial_number', $serialNumber)
->first();
if(!$serialexist)
if (!$serialexist)
{
Notification::make()
->title('Serial number not exists in pallet table.')
->danger()
->send();
->title('Serial number not exists in pallet table.')
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', $palletNumber, $plantId);
$this->form->fill([
'serial_number' => null,
@@ -603,12 +642,14 @@ class CreatePalletValidation extends CreateRecord
->where('pallet_number', '!=', null)
->first();
if($palletExist && $palletExist->pallet_number != $palletNumber)
if ($palletExist && $palletExist->pallet_number != $palletNumber)
{
Notification::make()
->title("Scanned serial number exist in pallet number '$palletExist->pallet_number'.<br>Scan the valid exist serial number to remove!")
->danger()
->send();
->title("Scanned serial number exist in pallet number '$palletExist->pallet_number'.<br>Scan the valid exist serial number to remove!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', $palletNumber, $plantId);
$this->form->fill([
'serial_number' => null,
@@ -628,12 +669,14 @@ class CreatePalletValidation extends CreateRecord
->where('locator_number', '!=', null)
->first();
if($locatorExist && $locatorExist->locator_number)
if ($locatorExist && $locatorExist->locator_number)
{
Notification::make()
->title("Scanned serial number exist in locator number '$locatorExist->locator_number'.<br>Scan the valid exist serial number to remove!")
->danger()
->send();
->title("Scanned serial number exist in locator number '$locatorExist->locator_number'.<br>Scan the valid exist serial number to remove!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', $palletNumber, $plantId);
$this->form->fill([
'serial_number' => null,
@@ -655,10 +698,11 @@ class CreatePalletValidation extends CreateRecord
if ($deleted)
{
Notification::make()
->title("Scanned serial number : '$serialNumber' successfully removed from pallet table!<br>Scan the next exist serial number to remove...")
->success()
->send();
// Notification::make()
// ->title("Scanned serial number '$serialNumber' successfully removed from pallet table!<br>Scan the next exist serial number to remove...")
// ->success()
// ->duration(600)
// ->send();
$this->snoCount = PalletValidation::where('plant_id', $plantId)
->where('pallet_number', $palletNumber)
@@ -679,24 +723,24 @@ class CreatePalletValidation extends CreateRecord
else
{
Notification::make()
->title('Failed to delete serial number.')
->title("Failed to remove scanned serial number '$serialNumber' from pallet table!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', $palletNumber, $plantId);
$this->form->fill([
'serial_number' => null,
'plant_id' => $plantId,
'pallet_number' => $palletNumber,
'pending_pallet_list' => $pendingPallet,
'Sno_quantity' => $count,
'created_by' => $operatorName,
'scanned_by' => $operatorName,
]);
$this->dispatch('loadData', $palletNumber, $plantId);
$this->form->fill([
'serial_number' => null,
'plant_id' => $plantId,
'pallet_number' => $palletNumber,
'pending_pallet_list' => $pendingPallet,
'Sno_quantity' => $count,
'created_by' => $operatorName,
'scanned_by' => $operatorName,
]);
}
//$this->dispatch('removeSno', $serialNumber, $palletNumber, $plantId);
}
public function processPalletNo()
@@ -735,7 +779,9 @@ class CreatePalletValidation extends CreateRecord
Notification::make()
->title('Pallet number is required.')
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', '', $plantId);
$this->form->fill([
'serial_number' => null,
@@ -754,7 +800,9 @@ class CreatePalletValidation extends CreateRecord
Notification::make()
->title("Pallet number '$palletNumber' must be at least 10 digits.")
->danger()
->duration(5000)
->send();
$this->dispatch('loadLocator' ,'',$plantId);
$this->form->fill([
'serial_number' => null,
@@ -782,8 +830,9 @@ class CreatePalletValidation extends CreateRecord
if (!$palletNotCompleted)
{
Notification::make()
->title("Already completed for pallet number $palletNumber")
->title("Already completed for pallet number $palletNumber!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', $palletNumber, $plantId);

View File

@@ -1050,7 +1050,7 @@ class CreateProductionQuantity extends CreateRecord
->body("Valid QR code scanned:<br>{$this->qrData}")
->success()
// ->persistent()
->seconds(2)
->duration(600)
->send();
$formQRData = null;

View File

@@ -86,6 +86,7 @@ class ReworkLocatorInvoiceValidationResource extends Resource
->label('Scan Pallet No')
->required( fn ($get) => $get('rework_type') == 'pallet')
->readOnly(fn ($get) => $get('rework_type') == 'invoice')
->minLength(10)
->reactive()
->readOnly(fn (callable $get) => (!$get('plant') || !$get('rework_type') || ($get('rework_type') == 'invoice' && !$get('invoice_number')) || $get('scan_serial_no')))
->extraAttributes([
@@ -93,8 +94,9 @@ class ReworkLocatorInvoiceValidationResource extends Resource
]),
Forms\Components\TextInput::make('scan_serial_no')
->label('Scan Serial No')
->reactive()
->readOnly(fn (callable $get) => (!$get('plant') || !$get('rework_type') || ($get('rework_type') == 'invoice' && !$get('invoice_number')) || ($get('rework_type') == 'invoice' && $get('scan_pallet_no')) || ($get('rework_type') == 'pallet' && !$get('scan_pallet_no'))))
->minLength(9)
->reactive()
->extraAttributes([
'wire:keydown.enter' => 'processSno($event.target.value)',
]),
@@ -145,21 +147,21 @@ class ReworkLocatorInvoiceValidationResource extends Resource
$invoiceNumber = $get('invoice_number');
$rows = LocatorInvoiceValidation::where('invoice_number', $invoiceNumber)
->where('plant_id', $plantId)
->get();
->where('plant_id', $plantId)
->get();
$notCompletedCount = LocatorInvoiceValidation::where('invoice_number', $invoiceNumber)
->where('plant_id', $plantId)
->where(function($query) {
$query->whereNull('scanned_status')
->orWhere('scanned_status', '');
})
->count();
->where('plant_id', $plantId)
->where(function($query) {
$query->whereNull('scanned_status')
->orWhere('scanned_status', '');
})
->count();
$isScanningComplete = true;
foreach ($rows as $row)
{
if ($row->scanned_status !== 'Scanned') {
if ($row->scanned_status != 'Scanned') {
$isScanningComplete = false;
break;
}
@@ -168,9 +170,13 @@ class ReworkLocatorInvoiceValidationResource extends Resource
if (!$isScanningComplete)
{
Notification::make()
->title("Scanned invoice number: '$invoiceNumber' does not completed the scanning process!<br>Has '$notCompletedCount' pending serial number to scan!<br>Please, scan the valid completed invoice number to proceed...")
->danger()
->send();
->title("Scanned invoice number: '$invoiceNumber' does not completed the scanning process!<br>Has '$notCompletedCount' pending serial number to scan!<br>Please, scan the valid completed invoice number to proceed...")
->danger()
->duration(5000)
->send();
$set('invoice_number', null);
$set('update_invoice', null);
return;
}
}),
@@ -184,24 +190,16 @@ class ReworkLocatorInvoiceValidationResource extends Resource
->afterStateUpdated(function ($state, callable $set, callable $get, $livewire) {
$plantId = $get('plant');
$invoiceNumber = $get('invoice_number');
$palletNumber = $get('scan_pallet_no');
$rows = LocatorInvoiceValidation::where('invoice_number', $invoiceNumber)
->where('plant_id', $plantId)
->get();
$notCompletedCount = LocatorInvoiceValidation::where('invoice_number', $invoiceNumber)
->where('plant_id', $plantId)
->where(function($query) {
$query->whereNull('scanned_status')
->orWhere('scanned_status', '');
})
->count();
$rows = PalletValidation::where('pallet_number', $palletNumber)
->where('plant_id', $plantId)
->get();
$isScanningComplete = true;
foreach ($rows as $row)
{
if ($row->scanned_status !== 'Scanned') {
if ($row->pallet_status != 'Completed') {
$isScanningComplete = false;
break;
}
@@ -210,9 +208,13 @@ class ReworkLocatorInvoiceValidationResource extends Resource
if (!$isScanningComplete)
{
Notification::make()
->title("Scanned invoice number: '$invoiceNumber' does not completed the scanning process!<br>Has '$notCompletedCount' pending serial number to scan!<br>Please, scan the valid completed invoice number to proceed...")
->danger()
->send();
->title("Scanned pallet number '$palletNumber' does not completed the master packing!<br>Please, scan the valid completed pallet number to proceed...")
->danger()
->duration(5000)
->send();
$set('scan_pallet_no', null);
$set('update_pallet', null);
return;
}
}),

View File

@@ -54,7 +54,9 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
->title("Invalid: Invoice Number")
->body("Invoice number can't be empty!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', '', '', $plantId, $reworkType);
// $snoCount = LocatorInvoiceValidation::where('plant_id', $plantId)->where('invoice_number', $invoiceNo)->count();
$this->form->fill([
@@ -81,6 +83,7 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
->title('Invoice Not Found')
->body("Invoice number '$invoiceNo' doesn't exist in invoice table!<br><br>Scan the valid exist 'Invoice Number' to proceed..!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', '', '', $plantId, $reworkType);
@@ -126,7 +129,9 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
->title("Invalid: Pallet Number")
->body("Pallet number '$palletNo' must be at least 10 digits.")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', $invoiceNo, '', $plantId, $reworkType);
$this->form->fill([
'plant_id' => $plantId,
@@ -143,13 +148,40 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
]);
return;
}
else if (strlen($serialNo) > 0 && strlen($serialNo) < 13)
else if (strlen($serialNo) > 0 && (strlen($serialNo) < 9 || strlen($serialNo) > 20))
{
Notification::make()
->title("Invalid: Serial Number")
->body("Serial number '$serialNo' must be at least 13 digits.")
->body("Serial number should contain minimum 9 digits and maximum 20 digits.")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', $invoiceNo, '', $plantId, $reworkType);
$this->form->fill([
'plant_id' => $plantId,
'plant' => $plantId,
'invoice_number' => $invoiceNo,
'scan_pallet_no' => null,
'scan_serial_no' => null,
'rework_type' => $reworkType,
'reworkType' => $reworkType,
'update_invoice' => 0,
'update_pallet' => 0,
'created_by' => $operatorName,
'scanned_by' => $operatorName,
]);
return;
}
else if (strlen($serialNo) > 0 && !ctype_alnum($serialNo))
{
Notification::make()
->title("Invalid: Serial Number")
->body("Serial number '$serialNo' must contain alpha-numeric values only.")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', $invoiceNo, '', $plantId, $reworkType);
$this->form->fill([
'plant_id' => $plantId,
@@ -196,6 +228,7 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
->title('Completed: Rework Invoice')
->body("Scanned invoice number '$invoiceNo' successfully moved into rework invoice table.<br><br>Please, scan the next completed invoice number to proceed..!")
->success()
->duration(800)
->send();
$this->dispatch('loadData', '', '', $plantId, $reworkType);
@@ -219,6 +252,7 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
->title('Completed: Invoice Found')
->body("Press 'Yes' and Press 'Enter' in Scan Invoice No to do rework for entire invoice.<br><br>Press 'No' to do rework against 'Pallet or Serial Number'..!")
->info()
->duration(5000)
->send();
$this->dispatch('loadData', $invoiceNo, '', $plantId, $reworkType);
@@ -244,6 +278,7 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
->title('Invoice Not Completed')
->body("Scanned invoice number '$invoiceNo' doesn't completed the scanning process!<br><br>Has '$notCompletedCount' pending serial number to scan!<br><br>Please, scan the valid completed invoice number to proceed..!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', '', '', $plantId, $reworkType);
@@ -269,15 +304,18 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
->title("Choosed: Pallet Rework Type")
->body("Scan valid pallet number to proceed..!")
->danger()
->duration(5000)
->send();
return;
return;
}
else
{
Notification::make()
->title("Rework Type Not Found")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', '', '', $plantId, $reworkType);
$this->form->fill([
'plant_id' => $plantId,
@@ -331,7 +369,9 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
->title("Invalid: Invoice Number")
->body("Invoice number can't be empty!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', '', '', $plantId, $reworkType);
// $snoCount = LocatorInvoiceValidation::where('plant_id', $plantId)->where('invoice_number', $invoiceNo)->count();
$this->form->fill([
@@ -358,6 +398,7 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
->title('Invoice Not Found')
->body("Invoice number '$invoiceNo' doesn't exist in invoice table!<br><br>Scan the valid exist 'Invoice Number' to proceed..!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', '', '', $plantId, $reworkType);
@@ -403,7 +444,9 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
->title("Invalid: Pallet Number")
->body("Pallet number can't be empty!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', $invoiceNo, '', $plantId, $reworkType);
// $snoCount = LocatorInvoiceValidation::where('plant_id', $plantId)->where('invoice_number', $invoiceNo)->count();
$this->form->fill([
@@ -427,7 +470,9 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
->title("Invalid: Pallet Number")
->body("Pallet number '$palletNo' must be at least 10 digits.")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', $invoiceNo, '', $plantId, $reworkType);
$this->form->fill([
'plant_id' => $plantId,
@@ -453,6 +498,7 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
->title('Pallet Not Found')
->body("Pallet number '$palletNo' doesn't exist in scanned invoice number '$invoiceNo'!<br><br>Scan the valid exist 'Pallet Number' to proceed..!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', $invoiceNo, '', $plantId, $reworkType);
@@ -472,13 +518,40 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
return;
}
if (strlen($serialNo) > 0 && strlen($serialNo) < 13)
if (strlen($serialNo) > 0 && (strlen($serialNo) < 9 || strlen($serialNo) > 20))
{
Notification::make()
->title("Invalid: Serial Number")
->body("Serial number '$serialNo' must be at least 13 digits.")
->body("Serial number should contain minimum 9 digits and maximum 20 digits.")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', $invoiceNo, $palletNo, $plantId, $reworkType);
$this->form->fill([
'plant_id' => $plantId,
'plant' => $plantId,
'invoice_number' => $invoiceNo,
'scan_pallet_no' => $palletNo,
'scan_serial_no' => null,
'rework_type' => $reworkType,
'reworkType' => $reworkType,
'update_invoice' => 0,
'update_pallet' => 0,
'created_by' => $operatorName,
'scanned_by' => $operatorName,
]);
return;
}
else if (strlen($serialNo) > 0 && !ctype_alnum($serialNo))
{
Notification::make()
->title("Invalid: Serial Number")
->body("Serial number '$serialNo' must contain alpha-numeric values only.")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', $invoiceNo, $palletNo, $plantId, $reworkType);
$this->form->fill([
'plant_id' => $plantId,
@@ -526,6 +599,7 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
->title('Completed: Rework Pallet from Invoice')
->body("Scanned pallet number '$palletNo' successfully moved into rework invoice table from invoice number '$invoiceNo'.<br><br>Please, scan the next pallet number to proceed..!")
->success()
->duration(500)
->send();
$InvoiceSerialNumbers = LocatorInvoiceValidation::where('plant_id', $plantId)->where('invoice_number', $invoiceNo)->first();
@@ -535,6 +609,7 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
Notification::make()
->title("All available serial numbers are successfully moved into rework invoice table from invoice number '$invoiceNo'.<br><br>Please, scan the next invoice number to proceed..!")
->success()
->duration(800)
->send();
$this->dispatch('loadData', '', '', $plantId, $reworkType);
@@ -576,6 +651,7 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
->title('Invoice Not Completed')
->body("Scanned invoice number '$invoiceNo' doesn't completed the scanning process!<br><br>Has '$notCompletedCount' pending serial number to scan!<br><br>Please, scan the valid completed invoice number to proceed..!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', '', '', $plantId, $reworkType);
@@ -603,7 +679,9 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
->title("Invalid: Pallet Number")
->body("Pallet number can't be empty!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', '', '', $plantId, $reworkType);
// $snoCount = LocatorInvoiceValidation::where('plant_id', $plantId)->where('invoice_number', $invoiceNo)->count();
$this->form->fill([
@@ -627,7 +705,9 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
->title("Invalid: Pallet Number")
->body("Pallet number '$palletNo' must be at least 10 digits.")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', '', '', $plantId, $reworkType);
$this->form->fill([
'plant_id' => $plantId,
@@ -653,6 +733,7 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
->title('Pallet Not Found')
->body("Pallet number '$palletNo' doesn't exist in pallet table!<br><br>Scan the valid exist 'Pallet Number' to proceed..!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', '', '', $plantId, $reworkType);
@@ -692,6 +773,7 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
->title('Locator Pallet Found')
->body("Scanned pallet number '$palletNo' exist in locator number '$locatExist'.<br><br>Remove scanned 'Pallet' from 'Locator' to proceed re-master packing..!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', '', '', $plantId, $reworkType);
@@ -712,13 +794,40 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
}
else
{
if (strlen($serialNo) > 0 && strlen($serialNo) < 13)
if (strlen($serialNo) > 0 && (strlen($serialNo) < 9 || strlen($serialNo) > 20))
{
Notification::make()
->title("Invalid: Serial Number")
->body("Serial number '$serialNo' must be at least 13 digits.")
->body("Serial number should contain minimum 9 digits and maximum 20 digits.")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', '', $palletNo, $plantId, $reworkType);
$this->form->fill([
'plant_id' => $plantId,
'plant' => $plantId,
'invoice_number' => null,
'scan_pallet_no' => $palletNo,
'scan_serial_no' => null,
'rework_type' => $reworkType,
'reworkType' => $reworkType,
'update_invoice' => 0,
'update_pallet' => 0,
'created_by' => $operatorName,
'scanned_by' => $operatorName,
]);
return;
}
else if (strlen($serialNo) > 0 && !ctype_alnum($serialNo))
{
Notification::make()
->title("Invalid: Serial Number")
->body("Serial number '$serialNo' must contain alpha-numeric values only.")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', '', $palletNo, $plantId, $reworkType);
$this->form->fill([
'plant_id' => $plantId,
@@ -747,6 +856,7 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
->title('Completed: Rework Pallet')
->body("Scanned pallet number '$palletNo' successfully removed from pallet table.<br><br>Please, scan the next pallet number to re-master packing..!")
->success()
->duration(800)
->send();
$this->dispatch('loadData', '', '', $plantId, $reworkType);
@@ -771,6 +881,7 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
->title('Completed: Pallet Found')
->body("Press 'Yes' and Press 'Enter' in Scan Pallet No to do re-master packing for entire pallet.<br><br>Press 'No' to do partial re-master packing against 'Serial Number'..!")
->info()
->duration(5000)
->send();
$this->dispatch('loadData', '', $palletNo, $plantId, $reworkType);
@@ -797,6 +908,7 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
->title('Pallet Not Completed')
->body("Scanned pallet number '$palletNo' doesn't completed the master packing!<br><br>Please, scan the valid completed pallet number to proceed..!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', '', '', $plantId, $reworkType);
@@ -821,7 +933,9 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
Notification::make()
->title("Rework Type Not Found")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', '', '', $plantId, $reworkType);
$this->form->fill([
'plant_id' => $plantId,
@@ -875,7 +989,9 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
->title("Invalid: Invoice Number")
->body("Invoice number can't be empty!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', '', '', $plantId, $reworkType);
// $snoCount = LocatorInvoiceValidation::where('plant_id', $plantId)->where('invoice_number', $invoiceNo)->count();
$this->form->fill([
@@ -902,6 +1018,7 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
->title('Invoice Not Found')
->body("Invoice number '$invoiceNo' doesn't exist in invoice table!<br><br>Scan the valid exist 'Invoice Number' to proceed..!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', '', '', $plantId, $reworkType);
@@ -947,7 +1064,9 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
->title("Invalid: Pallet Number")
->body("Pallet number '$palletNo' must be at least 10 digits.")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', $invoiceNo, '', $plantId, $reworkType);
$this->form->fill([
'plant_id' => $plantId,
@@ -970,7 +1089,9 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
->title("Invalid: Serial Number")
->body("Serial number can't be empty!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', $invoiceNo, '', $plantId, $reworkType);
// $snoCount = LocatorInvoiceValidation::where('plant_id', $plantId)->where('invoice_number', $invoiceNo)->count();
$this->form->fill([
@@ -988,13 +1109,40 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
]);
return;
}
else if (strlen($serialNo) < 13)
else if (strlen($serialNo) < 9 || strlen($serialNo) > 20)
{
Notification::make()
->title("Invalid: Serial Number")
->body("Serial number '$serialNo' must be at least 13 digits.")
->body("Serial number should contain minimum 9 digits and maximum 20 digits.")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', $invoiceNo, '', $plantId, $reworkType);
$this->form->fill([
'plant_id' => $plantId,
'plant' => $plantId,
'invoice_number' => $invoiceNo,
'scan_pallet_no' => null,
'scan_serial_no' => null,
'rework_type' => $reworkType,
'reworkType' => $reworkType,
'update_invoice' => 0,
'update_pallet' => 0,
'created_by' => $operatorName,
'scanned_by' => $operatorName,
]);
return;
}
else if (!ctype_alnum($serialNo))
{
Notification::make()
->title("Invalid: Serial Number")
->body("Serial number '$serialNo' must contain alpha-numeric values only.")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', $invoiceNo, '', $plantId, $reworkType);
$this->form->fill([
'plant_id' => $plantId,
@@ -1020,6 +1168,7 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
->title('Serial Not Found')
->body("Serial number '$serialNo' doesn't exist in scanned invoice number '$invoiceNo'!<br><br>Scan the valid exist 'Serial Number' to proceed..!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', $invoiceNo, '', $plantId, $reworkType);
@@ -1069,6 +1218,7 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
->title('Completed: Rework Serial from Invoice')
->body("Scanned serial number '$serialNo' successfully moved into rework invoice table from invoice number '$invoiceNo'.<br><br>Please, scan the next serial number to proceed..!")
->success()
->duration(500)
->send();
$InvoiceSerialNumbers = LocatorInvoiceValidation::where('plant_id', $plantId)->where('invoice_number', $invoiceNo)->first();
@@ -1078,6 +1228,7 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
Notification::make()
->title("All available serial numbers are successfully moved into rework invoice table from invoice number '$invoiceNo'.<br><br>Please, scan the next invoice number to proceed..!")
->success()
->duration(800)
->send();
$this->dispatch('loadData', '', '', $plantId, $reworkType);
@@ -1119,6 +1270,7 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
->title('Invoice Not Completed')
->body("Scanned invoice number '$invoiceNo' doesn't completed the scanning process!<br><br>Has '$notCompletedCount' pending serial number to scan!<br><br>Please, scan the valid completed invoice number to proceed..!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', '', '', $plantId, $reworkType);
@@ -1146,7 +1298,9 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
->title("Invalid: Pallet Number")
->body("Pallet number can't be empty!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', '', '', $plantId, $reworkType);
// $snoCount = LocatorInvoiceValidation::where('plant_id', $plantId)->where('invoice_number', $invoiceNo)->count();
$this->form->fill([
@@ -1170,7 +1324,9 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
->title("Invalid: Pallet Number")
->body("Pallet number '$palletNo' must be at least 10 digits.")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', '', '', $plantId, $reworkType);
$this->form->fill([
'plant_id' => $plantId,
@@ -1196,6 +1352,7 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
->title('Pallet Not Found')
->body("Pallet number '$palletNo' doesn't exist in pallet table!<br><br>Scan the valid exist 'Pallet Number' to proceed..!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', '', '', $plantId, $reworkType);
@@ -1235,6 +1392,7 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
->title('Locator Pallet Found')
->body("Scanned pallet number '$palletNo' exist in locator number '$locatExist'.<br><br>Remove scanned 'Pallet' from 'Locator' to proceed re-master packing..!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', '' , '', $plantId, $reworkType);
@@ -1261,7 +1419,9 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
->title("Invalid: Serial Number")
->body("Serial number can't be empty!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', '', $palletNo, $plantId, $reworkType);
// $snoCount = LocatorInvoiceValidation::where('plant_id', $plantId)->where('invoice_number', $invoiceNo)->count();
$this->form->fill([
@@ -1279,13 +1439,40 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
]);
return;
}
else if (strlen($serialNo) < 13)
else if (strlen($serialNo) < 9 || strlen($serialNo) > 20)
{
Notification::make()
->title("Invalid: Serial Number")
->body("Serial number '$serialNo' must be at least 13 digits.")
->title("Invalid: Serial Number")
->body("Serial number should contain minimum 9 digits and maximum 20 digits.")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', '', $palletNo, $plantId, $reworkType);
$this->form->fill([
'plant_id' => $plantId,
'plant' => $plantId,
'invoice_number' => null,
'scan_pallet_no' => $palletNo,
'scan_serial_no' => null,
'rework_type' => $reworkType,
'reworkType' => $reworkType,
'update_invoice' => 0,
'update_pallet' => 0,
'created_by' => $operatorName,
'scanned_by' => $operatorName,
]);
return;
}
else if (!ctype_alnum($serialNo))
{
Notification::make()
->title("Invalid: Serial Number")
->body("Serial number '$serialNo' must contain alpha-numeric values only.")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', '', $palletNo, $plantId, $reworkType);
$this->form->fill([
'plant_id' => $plantId,
@@ -1311,6 +1498,7 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
->title('Serial Not Found')
->body("Serial number '$serialNo' doesn't exist in pallet number '$palletNo'!<br><br>Scan the valid exist 'Serial Number' to proceed..!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', '', $palletNo, $plantId, $reworkType);
@@ -1332,9 +1520,10 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
foreach ($records as $row)
{
if ($PalletSerialNumbers->serial_number != null && $PalletSerialNumbers->serial_number != '' && $PalletSerialNumbers->serial_number != $serialNo)
if ($row->serial_number != null && $row->serial_number != '' && $row->serial_number == $serialNo)
{
$row->forceDelete();
continue;
}
$row->pallet_status = null;
@@ -1347,6 +1536,7 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
->title('Completed: Rework Serial from Pallet')
->body("Scanned serial number '$serialNo' successfully removed from pallet number '$palletNo'.<br><br>Please, scan the next pallet number to re-master packing..!")
->success()
->duration(500)
->send();
$PalletSerialNumbers = PalletValidation::where('plant_id', $plantId)->where('pallet_number', $palletNo)->first();
@@ -1356,6 +1546,7 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
Notification::make()
->title("Pallet number '$palletNo' successfully re-master packed.<br><br>Please, scan the next pallet number to re-master packing..!")
->success()
->duration(800)
->send();
$this->dispatch('loadData', '', '', $plantId, $reworkType);
@@ -1398,6 +1589,7 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
->title('Pallet Not Completed')
->body("Pallet number '$palletNo' doesn't completed the master packing for scanned serial number '$serialNo'!<br><br>Please, scan the valid completed pallet number to proceed..!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', '' , '', $plantId, $reworkType);
@@ -1422,7 +1614,9 @@ class CreateReworkLocatorInvoiceValidation extends CreateRecord
Notification::make()
->title("Rework Type Not Found")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', '', '', $plantId, $reworkType);
$this->form->fill([
'plant_id' => $plantId,

View File

@@ -0,0 +1,134 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Resources\TempLiveReadingResource\Pages;
use App\Filament\Resources\TempLiveReadingResource\RelationManagers;
use App\Models\MfmMeter;
use App\Models\TempLiveReading;
use Filament\Facades\Filament;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Forms\Components\Section;
class TempLiveReadingResource extends Resource
{
protected static ?string $model = TempLiveReading::class;
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
protected static ?string $navigationGroup = 'Power House';
public static function form(Form $form): Form
{
return $form
->schema([
Section::make('')
->schema([
Forms\Components\Select::make('plant_id')
->label('Plant')
->relationship('plant', 'name')
->reactive()
->required(),
Forms\Components\Select::make('mfm_meter_id')
->label('MFM Meter ID')
->required()
->reactive()
->options(function (callable $get) {
$plantId = $get('plant_id');
if (!$plantId) {
return [];
}
return MfmMeter::where('plant_id', $plantId)
->pluck('sequence', 'id')
->toArray();
}),
Forms\Components\TextInput::make('register_data')
->label('Register Data')
->required(),
Forms\Components\Hidden::make('created_by')
->default(Filament::auth()->user()?->name),
])
->columns(3),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('id')
->label('ID')
->numeric()
->sortable(),
Tables\Columns\TextColumn::make('plant.name')
->numeric()
->sortable(),
// Tables\Columns\TextColumn::make('mfm_meter_id.sequence')
// ->label('Sequence')
// ->sortable(),
Tables\Columns\TextColumn::make('mfmMeter.name')
->label('Name')
->sortable(),
Tables\Columns\TextColumn::make('register_data')
->label('Register Data')
->sortable(),
Tables\Columns\TextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('deleted_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
Tables\Filters\TrashedFilter::make(),
])
->actions([
Tables\Actions\ViewAction::make(),
Tables\Actions\EditAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
Tables\Actions\ForceDeleteBulkAction::make(),
Tables\Actions\RestoreBulkAction::make(),
]),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListTempLiveReadings::route('/'),
'create' => Pages\CreateTempLiveReading::route('/create'),
'view' => Pages\ViewTempLiveReading::route('/{record}'),
'edit' => Pages\EditTempLiveReading::route('/{record}/edit'),
];
}
public static function getEloquentQuery(): Builder
{
return parent::getEloquentQuery()
->withoutGlobalScopes([
SoftDeletingScope::class,
]);
}
}

View File

@@ -0,0 +1,12 @@
<?php
namespace App\Filament\Resources\TempLiveReadingResource\Pages;
use App\Filament\Resources\TempLiveReadingResource;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
class CreateTempLiveReading extends CreateRecord
{
protected static string $resource = TempLiveReadingResource::class;
}

View File

@@ -0,0 +1,22 @@
<?php
namespace App\Filament\Resources\TempLiveReadingResource\Pages;
use App\Filament\Resources\TempLiveReadingResource;
use Filament\Actions;
use Filament\Resources\Pages\EditRecord;
class EditTempLiveReading extends EditRecord
{
protected static string $resource = TempLiveReadingResource::class;
protected function getHeaderActions(): array
{
return [
Actions\ViewAction::make(),
Actions\DeleteAction::make(),
Actions\ForceDeleteAction::make(),
Actions\RestoreAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\TempLiveReadingResource\Pages;
use App\Filament\Resources\TempLiveReadingResource;
use Filament\Actions;
use Filament\Resources\Pages\ListRecords;
class ListTempLiveReadings extends ListRecords
{
protected static string $resource = TempLiveReadingResource::class;
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
];
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace App\Filament\Resources\TempLiveReadingResource\Pages;
use App\Filament\Resources\TempLiveReadingResource;
use Filament\Actions;
use Filament\Resources\Pages\ViewRecord;
class ViewTempLiveReading extends ViewRecord
{
protected static string $resource = TempLiveReadingResource::class;
protected function getHeaderActions(): array
{
return [
Actions\EditAction::make(),
];
}
}

View File

@@ -0,0 +1,205 @@
<?php
namespace App\Http\Controllers;
use App\Models\MfmMeter;
use App\Models\MfmParameter;
use App\Models\Plant;
use Illuminate\Http\Request;
class MfmParameterController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
//
}
public function get_mfm_parameterid(Request $request)
{
$expectedUser = env('API_AUTH_USER');
$expectedPw = env('API_AUTH_PW');
$header_auth = $request->header('Authorization');
$expectedToken = $expectedUser . ':' . $expectedPw;
if ("Bearer " . $expectedToken != $header_auth) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Invalid authorization token!'
], 403);
}
$plantCode = $request->header('plant-code');
if (!$plantCode) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Plant Code value can't be empty"
], 404);
}
$plant = Plant::where('code', $plantCode)->first();
if (!$plant)
{
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Plant Code '{$plantCode}' not found!"
], 404);
}
// $sequences = MfmMeter::where('plant_id', $plant->id)
// ->whereNotNull('sequence')
// ->distinct()
// ->orderBy('sequence', 'asc')
// ->pluck('sequence');
$sequences = MfmMeter::where('plant_id', $plant->id)
->whereNotNull('sequence')
->pluck('sequence')
->unique()
->map(fn($s) => is_numeric($s) ? (int) $s : $s)
->sort()
->values();
if ($sequences->isEmpty())
{
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'No sequences found for the given plant.'
], 404);
}
return response()->json([
'status_code' => 'SUCCESS',
'status_description' => $sequences
], 200);
}
public function get_mfm_parameter(Request $request)
{
$expectedUser = env('API_AUTH_USER');
$expectedPw = env('API_AUTH_PW');
$header_auth = $request->header('Authorization');
$expectedToken = $expectedUser . ':' . $expectedPw;
if ("Bearer " . $expectedToken != $header_auth) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Invalid authorization token!'
], 403);
}
$plantCode = $request->header('plant-code');
$mfmParameterSeq = $request->header('mfm-meter-sequence');
if (!$plantCode) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Plant Code value can't be empty"
], 404);
}
else if (!$mfmParameterSeq) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Mfm Parameter sequence value can't be empty"
], 404);
}
$plant = Plant::where('code', $plantCode)->first();
if (!$plant)
{
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Plant Code '{$plantCode}' not found!"
], 404);
}
// Find mfm_meter by sequence and plant_id
$mfmMeter = MfmMeter::where('sequence', trim($mfmParameterSeq))
->where('plant_id', $plant->id)
->first();
if (!$mfmMeter) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "MFM Meter with sequence '{$mfmParameterSeq}' not found for plant code '{$plantCode}'"
], 404);
}
// Now fetch mfm_parameters for this plant and meter
$mfmParameters = MfmParameter::where('plant_id', $plant->id)
->where('mfm_meter_id', $mfmMeter->id)
->get(['register_id', 'byte_to_convert', 'type_to_convert', 'decimal_to_display']);
$transformed = $mfmParameters->map(function ($item) {
$array = $item->toArray();
foreach ($array as $key => $value) {
if (is_null($value)) {
$array[$key] = "";
}
}
return $array;
});
//..if want to send all values in string
// $transformed = $mfmParameters->map(function ($item) {
// $array = $item->toArray();
// foreach ($array as $key => $value) {
// // Always cast to string (empty string if null)
// $array[$key] = is_null($value) ? "" : strval($value);
// }
// return $array;
// });
if ($transformed->isEmpty()) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "No MFM parameters found for the specified plant and meter."
], 404);
}
// Success: return list
return response()->json([
'status_code' => 'SUCCESS',
'status_description' => $transformed
], 200);
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
}
}

View File

@@ -0,0 +1,103 @@
<?php
namespace App\Http\Controllers;
use App\Models\ModuleList;
use Illuminate\Http\Request;
class ModuleChartController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
//
}
public function get_moduleChart(Request $request)
{
$expectedUser = env('API_AUTH_USER');
$expectedPw = env('API_AUTH_PW');
$header_auth = $request->header('Authorization');
$expectedToken = $expectedUser . ':' . $expectedPw;
if ("Bearer " . $expectedToken != $header_auth)
{
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Invalid authorization token!'
], 403);
}
$moduleName = $request->header('module-name');
if (empty($moduleName))
{
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Module Name can't be empty!"
], 404);
}
$exists = ModuleList::where('module_name', $moduleName)->exists();
if (!$exists) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Module Name '{$moduleName}' not found in system!"
], 404);
}
// Fetch all unique dashboard names for the given module_name
// $dashboardNames = ModuleList::where('module_name', $moduleName)
// ->distinct()
// ->pluck('dashboard_name');
$dashboardNames = ModuleList::where('module_name', $moduleName)
->orderBy('created_at', 'asc')
->get()
->unique('dashboard_name')
->pluck('dashboard_name')
->values(); // reset array keys
return response()->json([
'status_code' => 'SUCCESS',
'status_description' => $dashboardNames
], 200);
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
}
}

View File

@@ -0,0 +1,105 @@
<?php
namespace App\Http\Controllers;
use App\Models\ModuleList;
use Illuminate\Http\Request;
class ModuleController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
//
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*/
// public function show(string $id)
// {
// //
// }
public function get_module(Request $request)
{
$expectedUser = env('API_AUTH_USER');
$expectedPw = env('API_AUTH_PW');
$header_auth = $request->header('Authorization');
$expectedToken = $expectedUser . ':' . $expectedPw;
if ("Bearer " . $expectedToken != $header_auth)
{
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Invalid authorization token!'
], 403);
}
$moduleName = $request->header('module-name');
if (empty($moduleName))
{
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Module Name can't be empty!"
], 404);
}
$headerValue = $request->header('module-name');
if ($headerValue != 'Module List') {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Invalid value for 'module-name' header!"
], 404);
}
$uniqueModules = ModuleList::select('module_name', 'created_at')
->orderBy('created_at', 'asc')
->get()
->unique('module_name')
->pluck('module_name')
->values();
if ($uniqueModules->isEmpty()) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Module names not found'
], 404);
}
return response()->json([
'status_code' => 'SUCCESS',
'status_description' => $uniqueModules
], 200);
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
}
}

View File

@@ -0,0 +1,106 @@
<?php
namespace App\Http\Controllers;
use App\Models\Line;
use App\Models\ModuleList;
use Illuminate\Http\Request;
class ModuleFGLineController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
//
}
public function get_moduleFGFilter(Request $request)
{
$expectedUser = env('API_AUTH_USER');
$expectedPw = env('API_AUTH_PW');
$header_auth = $request->header('Authorization');
$expectedToken = $expectedUser . ':' . $expectedPw;
if ("Bearer " . $expectedToken != $header_auth)
{
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Invalid authorization token!'
], 403);
}
$lineName = $request->header('line-name');
if (empty($lineName))
{
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Line name can't be empty!"
], 404);
}
$line = Line::where('name', $lineName)->first();
if (!$line) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Line '{$lineName}' not found!"
], 404);
}
if ($line->type !== 'FG Line') {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Line '{$lineName}' is not of type FG Line."
], 400);
}
// Default logic to return filter names
$filterNames = ModuleList::orderBy('created_at', 'asc')
->get()
->unique('filter_name')
->pluck('filter_name')
->filter()
->values();
return response()->json([
'status_code' => 'SUCCESS',
'status_description' => $filterNames
], 200);
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
}
}

View File

@@ -0,0 +1,119 @@
<?php
namespace App\Http\Controllers;
use App\Models\ModuleList;
use Illuminate\Http\Request;
class ModuleFilterController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
//
}
public function get_moduleFilter(Request $request)
{
$expectedUser = env('API_AUTH_USER');
$expectedPw = env('API_AUTH_PW');
$header_auth = $request->header('Authorization');
$expectedToken = $expectedUser . ':' . $expectedPw;
if ("Bearer " . $expectedToken != $header_auth)
{
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Invalid authorization token!'
], 403);
}
$lineName = $request->header('line-name');
if (empty($lineName))
{
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Line name can't be empty!"
], 404);
}
// If 'line-name' is 'FG Lines', return actual FG Line names
if (strtolower(trim($lineName)) == 'fg lines') {
$fgLines = \App\Models\Line::where('type', 'FG Line')
->orderBy('created_at', 'asc')
->pluck('name');
if ($fgLines->isEmpty()) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'No FG Lines found!'
], 404);
}
return response()->json([
'status_code' => 'SUCCESS',
'status_description' => $fgLines
], 200);
}
// Default logic to return filter names
$filterNames = ModuleList::orderBy('created_at', 'asc')
->get()
->unique('filter_name')
->pluck('filter_name')
->filter()
->values();
return response()->json([
'status_code' => 'SUCCESS',
'status_description' => $filterNames
], 200);
// $filterNames = ModuleList::orderBy('created_at', 'asc')
// ->get()
// ->unique('filter_name')
// ->pluck('filter_name')
// ->filter()
// ->values();
// return response()->json([
// 'status_code' => 'SUCCESS',
// 'status_description' => $filterNames
// ], 200);
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
}
}

View File

@@ -0,0 +1,573 @@
<?php
namespace App\Http\Controllers;
use App\Models\Line;
use App\Models\Plant;
use App\Models\ProductionQuantity;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class ModuleFilterDataController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
//
}
// public function get_moduleFilterData(Request $request)
// {
// $expectedUser = env('API_AUTH_USER');
// $expectedPw = env('API_AUTH_PW');
// $header_auth = $request->header('Authorization');
// $expectedToken = $expectedUser . ':' . $expectedPw;
// if ("Bearer " . $expectedToken != $header_auth)
// {
// return response()->json([
// 'status_code' => 'ERROR',
// 'status_description' => 'Invalid authorization token!'
// ], 403);
// }
// $moduleName = $request->header('module-name');
// $chartName = $request->header('chart-name');
// $plantName = $request->header('plant-name');
// $lineName = $request->header('line-name');
// $filterName = $request->header('filter-name');
// $requiredHeaders = [
// 'module-name',
// 'chart-name',
// 'plant-name',
// 'line-name',
// 'filter-name',
// ];
// $missingHeaders = [];
// foreach ($requiredHeaders as $header) {
// if (empty($request->header($header))) {
// $missingHeaders[] = $header;
// }
// }
// if (!empty($missingHeaders)) {
// return response()->json([
// 'status_code' => 'ERROR',
// 'status_description' => 'Missing required headers: ' . implode(', ', $missingHeaders)
// ], 400);
// }
// // Fetch plant ID
// $plant = Plant::where('name', $plantName)->first();
// if (!$plant) {
// return response()->json([
// 'status_code' => 'ERROR',
// 'status_description' => "Plant '{$plantName}' not found!"
// ], 404);
// }
// // Fetch line ID
// $line = Line::where('name', $lineName)->where('plant_id', $plant->id)->first();
// if (!$line) {
// return response()->json([
// 'status_code' => 'ERROR',
// 'status_description' => "Line '{$lineName}' not found for plant '{$plantName}'"
// ], 404);
// }
// $activeFilter = strtolower(trim($request->header('filter-name')));
// if ($activeFilter == 'yesterday') {
// $startDate = now()->subDay()->setTime(8, 0, 0);
// $endDate = now()->setTime(8, 0, 0);
// }
// elseif ($activeFilter == 'this week') {
// $startDate = now()->startOfWeek()->setTime(8, 0, 0);
// $endDate = now()->endOfWeek()->addDay()->setTime(8, 0, 0);
// }
// elseif ($activeFilter == 'this month') {
// $startDate = now()->startOfMonth();
// $endDate = now()->endOfMonth();
// }
// else {
// $startDate = now()->setTime(8, 0, 0);
// $endDate = now()->copy()->addDay()->setTime(8, 0, 0);
// }
// $rowCount = ProductionQuantity::where('plant_id', $plant->id)
// ->where('line_id', $line->id)
// ->whereBetween('created_at', [$startDate, $endDate])
// ->count();
// return response()->json([
// 'status_code' => 'SUCCESS',
// 'status_description' => $rowCount
// ], 200);
// }
// public function get_moduleFilterData(Request $request)
// {
// $expectedUser = env('API_AUTH_USER');
// $expectedPw = env('API_AUTH_PW');
// $header_auth = $request->header('Authorization');
// $expectedToken = $expectedUser . ':' . $expectedPw;
// if ("Bearer " . $expectedToken != $header_auth) {
// return response()->json([
// 'status_code' => 'ERROR',
// 'status_description' => 'Invalid authorization token!'
// ], 403);
// }
// $requiredHeaders = [
// 'module-name',
// 'chart-name',
// 'plant-name',
// 'line-name',
// 'filter-name',
// ];
// $missingHeaders = [];
// foreach ($requiredHeaders as $header) {
// if (empty($request->header($header))) {
// $missingHeaders[] = $header;
// }
// }
// if (!empty($missingHeaders)) {
// return response()->json([
// 'status_code' => 'ERROR',
// 'status_description' => 'Missing required headers: ' . implode(', ', $missingHeaders)
// ], 404);
// }
// $validFilters = ['Today', 'Yesterday', 'This Week', 'This Month'];
// $filterHeader = $request->header('filter-name');
// if (!in_array($filterHeader, $validFilters)) {
// return response()->json([
// 'status_code' => 'ERROR',
// 'status_description' => "Invalid filter-name value! Accepted values are: " . implode(', ', $validFilters)
// ], 404);
// }
// $plantName = $request->header('plant-name');
// $lineName = $request->header('line-name');
// $filterName = strtolower(trim($request->header('filter-name')));
// $plant = Plant::where('name', $plantName)->first();
// if (!$plant) {
// return response()->json([
// 'status_code' => 'ERROR',
// 'status_description' => "Plant '{$plantName}' not found!"
// ], 404);
// }
// // Set date filter range
// if ($filterName == 'yesterday') {
// $startDate = now()->subDay()->setTime(8, 0, 0);
// $endDate = now()->setTime(8, 0, 0);
// } elseif ($filterName == 'this week') {
// $startDate = now()->startOfWeek()->setTime(8, 0, 0);
// $endDate = now()->endOfWeek()->addDay()->setTime(8, 0, 0);
// } elseif ($filterName == 'this month') {
// $startDate = now()->startOfMonth();
// $endDate = now()->endOfMonth();
// } else {
// $startDate = now()->setTime(8, 0, 0);
// $endDate = now()->copy()->addDay()->setTime(8, 0, 0);
// }
// // Handle All Lines
// if (strtolower(trim($lineName)) == 'all lines') {
// $lines = Line::where('plant_id', $plant->id)->pluck('id', 'name');
// if ($lines->isEmpty()) {
// return response()->json([
// 'status_code' => 'ERROR',
// 'status_description' => "No lines found for plant '{$plantName}'"
// ], 404);
// }
// $lineCounts = [];
// foreach ($lines as $name => $id) {
// $count = ProductionQuantity::where('plant_id', $plant->id)
// ->where('line_id', $id)
// ->whereBetween('created_at', [$startDate, $endDate])
// ->count();
// $lineCounts[$name] = $count;
// }
// return response()->json([
// 'status_code' => 'SUCCESS',
// 'status_description' => $lineCounts
// ], 200);
// }
// // Handle single line
// $line = Line::where('name', $lineName)->where('plant_id', $plant->id)->first();
// if (!$line) {
// return response()->json([
// 'status_code' => 'ERROR',
// 'status_description' => "Line '{$lineName}' not found for plant '{$plantName}'"
// ], 404);
// }
// $rowCount = ProductionQuantity::where('plant_id', $plant->id)
// ->where('line_id', $line->id)
// ->whereBetween('created_at', [$startDate, $endDate])
// ->count();
// $chartName = $request->header('chart-name');
// if ($chartName == 'Production Hourly Count')
// {
// if ($filterHeader == 'Today' || $filterHeader == 'Yesterday') {
// $hourlyCounts = [];
// $hourStart = now()->startOfDay()->addHours(8); // Today 8:00 AM
// if ($filterHeader == 'Yesterday') {
// $hourStart->subDay(); // Yesterday 8:00 AM
// }
// $hourEndFinal = $hourStart->copy()->addDay(); // +1 day = 24 hourly slots
// while ($hourStart < $hourEndFinal) {
// $hourEnd = $hourStart->copy()->addHour();
// $label = $hourStart->format('g:i A') . ' to ' . $hourEnd->format('g:i A');
// $count = ProductionQuantity::where('plant_id', $plant->id)
// ->where('line_id', $line->id)
// ->whereBetween('created_at', [$hourStart, $hourEnd])
// ->count();
// $hourlyCounts[$label] = $count;
// $hourStart = $hourEnd;
// }
// return response()->json([
// 'status_code' => 'SUCCESS',
// 'hourly_data' => $hourlyCounts
// ], 200);
// }
// // THIS WEEK: group by weekdays (Mon to Sun)
// if ($filterHeader == 'This Week') {
// $dowCounts = ProductionQuantity::selectRaw('EXTRACT(DOW FROM created_at) as dow, COUNT(*) as total')
// ->where('plant_id', $plant->id)
// ->where('line_id', $line->id)
// ->whereBetween('created_at', [$startDate, $endDate])
// ->groupBy('dow')
// ->pluck('total', 'dow');
// $labels = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];
// $data = array_fill(0, 7, 0);
// foreach ($dowCounts as $dow => $count) {
// $data[$dow] = $count;
// }
// // Reorder from Monday (1) to Sunday (0)
// $orderedData = [
// $data[1] ?? 0,
// $data[2] ?? 0,
// $data[3] ?? 0,
// $data[4] ?? 0,
// $data[5] ?? 0,
// $data[6] ?? 0,
// $data[0] ?? 0
// ];
// return response()->json([
// 'status_code' => 'SUCCESS',
// 'weekly_labels' => $labels,
// 'weekly_counts' => $orderedData
// ], 200);
// }
// //THIS MONTH: group by weeks
// if ($filterHeader == 'This Month') {
// // Count records grouped by week number
// $weekCounts = ProductionQuantity::selectRaw("FLOOR((EXTRACT(DAY FROM created_at) - 1) / 7) + 1 as week_number, COUNT(*) as total")
// ->where('plant_id', $plant->id)
// ->where('line_id', $line->id)
// ->whereBetween('created_at', [$startDate, $endDate])
// ->groupBy('week_number')
// ->pluck('total', 'week_number');
// $weeksCount = ceil($endDate->day / 7); // Total number of weeks in month
// $allWeeks = array_fill(1, $weeksCount, 0);
// $data = array_replace($allWeeks, $weekCounts->toArray());
// // Prepare labels like Week 1 (01 Jul - 07 Jul)
// $labels = [];
// for ($i = 1; $i <= $weeksCount; $i++) {
// $weekStart = $startDate->copy()->addDays(($i - 1) * 7);
// $weekEnd = $startDate->copy()->addDays($i * 7 - 1)->min($endDate);
// $labels[] = "Week $i ({$weekStart->format('d M')} - {$weekEnd->format('d M')})";
// }
// $orderedData = array_values($data);
// return response()->json([
// 'status_code' => 'SUCCESS',
// 'monthly_labels' => $labels,
// 'monthly_counts' => $orderedData
// ], 200);
// }
// }
// if ($chartName == 'Production Line Count')
// {
// return response()->json([
// 'status_code' => 'SUCCESS',
// 'status_description' => $rowCount
// ], 200);
// }
// }
public function get_moduleFilterData(Request $request)
{
$expectedUser = env('API_AUTH_USER');
$expectedPw = env('API_AUTH_PW');
$header_auth = $request->header('Authorization');
$expectedToken = $expectedUser . ':' . $expectedPw;
if ("Bearer " . $expectedToken != $header_auth) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Invalid authorization token!'
], 403);
}
$requiredHeaders = [
'module-name', 'chart-name', 'plant-name', 'line-name', 'filter-name'
];
$missingHeaders = [];
foreach ($requiredHeaders as $header) {
if (empty($request->header($header))) {
$missingHeaders[] = $header;
}
}
if (!empty($missingHeaders)) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Missing required headers: ' . implode(', ', $missingHeaders)
], 404);
}
$validFilters = ['Today', 'Yesterday', 'This Week', 'This Month'];
$filterHeader = $request->header('filter-name');
if (!in_array($filterHeader, $validFilters)) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Invalid filter-name value! Accepted values are: " . implode(', ', $validFilters)
], 404);
}
$plantName = $request->header('plant-name');
$lineName = $request->header('line-name');
$filterName = strtolower(trim($request->header('filter-name')));
$chartName = $request->header('chart-name');
$plant = Plant::where('name', $plantName)->first();
if (!$plant) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Plant '{$plantName}' not found!"
], 404);
}
$isAllLines = strtolower(trim($lineName)) == 'all lines';
if ($isAllLines) {
$lines = Line::where('plant_id', $plant->id)->get();
$fgLineIds = $lines->where('type', 'FG Line')->pluck('id')->toArray();
$nonFgLineIds = $lines->where('type', '!=', 'FG Line')->pluck('id')->toArray();
} else {
$line = Line::where('name', $lineName)->where('plant_id', $plant->id)->first();
if (!$line) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Line '{$lineName}' not found for plant '{$plantName}'"
], 404);
}
$lineIds = [$line->id];
$isFgLine = $line->type == 'FG Line';
$baseTable = $isFgLine ? 'quality_validations' : 'production_quantities';
}
if ($filterName == 'yesterday') {
$startDate = now()->subDay()->setTime(8, 0, 0);
$endDate = now()->setTime(8, 0, 0);
$groupBy = 'EXTRACT(HOUR FROM created_at)';
} elseif ($filterName == 'this week') {
$startDate = now()->startOfWeek()->setTime(8, 0, 0);
$endDate = now()->endOfWeek()->addDay()->setTime(8, 0, 0);
$groupBy = 'EXTRACT(DOW FROM created_at)';
} elseif ($filterName == 'this month') {
$startDate = now()->startOfMonth();
$endDate = now()->endOfMonth();
$groupBy = "FLOOR((EXTRACT(DAY FROM created_at) - 1) / 7) + 1";
} else {
$startDate = now()->setTime(8, 0, 0);
$endDate = now()->copy()->addDay()->setTime(8, 0, 0);
$groupBy = 'EXTRACT(HOUR FROM created_at)';
}
if ($chartName == 'Production Line Count' && $isAllLines) {
$lineCounts = [];
foreach ($lines as $line) {
$table = ($line->type == 'FG Line') ? 'quality_validations' : 'production_quantities';
$count = DB::table($table)
->where('plant_id', $plant->id)
->where('line_id', $line->id)
->whereBetween('created_at', [$startDate, $endDate])
->count();
$lineCounts[$line->name] = $count;
}
return response()->json([
'status_code' => 'SUCCESS',
'status_description' => $lineCounts
], 200);
}
if (!$isAllLines)
{
$rowCount = DB::table($baseTable)
->where('plant_id', $plant->id)
->where('line_id', $line->id)
->whereBetween('created_at', [$startDate, $endDate])
->count();
$query = DB::table($baseTable)
->selectRaw("$groupBy AS time_unit, COUNT(*) AS total_quantity")
->where('created_at', '>=', $startDate)
->where('created_at', '<', $endDate)
->where('plant_id', $plant->id)
->where('line_id', $line->id)
->groupByRaw($groupBy)
->orderByRaw($groupBy)
->pluck('total_quantity', 'time_unit')
->toArray();
if ($chartName == 'Production Hourly Count') {
if ($filterName == 'this month') {
$weeksCount = ceil($endDate->day / 7);
$allWeeks = array_fill(1, $weeksCount, 0);
$data = array_replace($allWeeks, $query);
$labels = [];
for ($i = 1; $i <= $weeksCount; $i++) {
$weekStart = $startDate->copy()->addDays(($i - 1) * 7)->format('d M');
$weekEnd = $startDate->copy()->addDays($i * 7 - 1)->min($endDate)->format('d M');
$labels[] = "Week $i ($weekStart - $weekEnd)";
}
$orderedData = array_values($data);
} elseif ($filterName == 'this week') {
$labels = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];
$data = array_fill(0, 7, 0);
foreach ($query as $dow => $count) {
$data[$dow] = $count;
}
$orderedData = [
$data[1] ?? 0, $data[2] ?? 0, $data[3] ?? 0,
$data[4] ?? 0, $data[5] ?? 0, $data[6] ?? 0,
$data[0] ?? 0,
];
} else {
$allHours = array_fill(0, 24, 0);
$data = array_replace($allHours, $query);
$shiftedData = [];
foreach ($data as $hour => $count) {
$nextHour = ($hour + 1) % 24;
$shiftedData[$nextHour] = $count;
}
$shiftedKeys = array_merge(range(9, 23), range(0, 8));
$orderedData = array_map(fn($hour) => $shiftedData[$hour] ?? 0, $shiftedKeys);
$labels = array_map(function ($hour) {
$prevHour = ($hour - 1 + 24) % 24;
return date("g:i A", strtotime("$prevHour:00")) . ' to ' . date("g:i A", strtotime("$hour:00"));
}, $shiftedKeys);
}
return response()->json([
'status_code' => 'SUCCESS',
'datasets' => [[
'label' => match ($filterName) {
'this week' => $isFgLine ? 'Daily FG Count This Week' : 'Daily Production This Week',
'this month' => $isFgLine ? 'Weekly FG Count This Month' : 'Weekly Production This Month',
'yesterday' => $isFgLine ? "Yesterday's FG Count" : "Yesterday's Hourly Production",
default => $isFgLine ? "Today's FG Count" : "Today's Hourly Production",
},
'data' => $orderedData
]],
'labels' => $labels,
], 200);
}
if ($chartName == 'Production Line Count') {
return response()->json([
'status_code' => 'SUCCESS',
'status_description' => $rowCount
], 200);
}
}
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
}
}

View File

@@ -0,0 +1,191 @@
<?php
namespace App\Http\Controllers;
use App\Models\GuardPatrolEntry;
use App\Models\Plant;
use Carbon\Carbon;
use Illuminate\Http\Request;
class ModuleGuardDayCountController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
//
}
public function get_guardDay_countData(Request $request)
{
$expectedUser = env('API_AUTH_USER');
$expectedPw = env('API_AUTH_PW');
$header_auth = $request->header('Authorization');
$expectedToken = $expectedUser . ':' . $expectedPw;
if ("Bearer " . $expectedToken != $header_auth) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Invalid authorization token!'
], 403);
}
$plantName = $request->header('plant-name');
$filterHeader = $request->header('filter-name');
if (empty($plantName) || empty($filterHeader)) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Missing required headers: plant-name, or filter-name"
], 404);
}
$validFilters = ['Today', 'Yesterday', 'This Week', 'This Month'];
if (!in_array($filterHeader, $validFilters)) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Invalid filter-name value! Accepted values are: " . implode(', ', $validFilters)
], 404);
}
// $selectedPlant = $plant->id;
// $activeFilter = strtolower(trim($filterHeader));
$plant = Plant::where('name', $plantName)->first();
if (!$plant) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Plant '{$plantName}' not found!"
], 404);
}
$selectedPlant = $plant->id;
$activeFilter = strtolower(trim($filterHeader));
// Set date range based on filter
switch ($activeFilter) {
case 'yesterday':
$startDate = now()->subDay()->startOfDay();
$endDate = now()->subDay()->endOfDay();
break;
case 'this week':
$startDate = now()->startOfWeek();
$endDate = now()->endOfWeek();
break;
case 'this month':
$startDate = now()->startOfMonth();
$endDate = now()->endOfMonth();
break;
default: // today
$startDate = now()->startOfDay();
$endDate = now()->endOfDay();
break;
}
// Get all unique guard names for this plant
$uniqueGuardNames = GuardPatrolEntry::join('guard_names', 'guard_patrol_entries.guard_name_id', '=', 'guard_names.id')
->where('guard_patrol_entries.plant_id', $selectedPlant)
->select('guard_names.id', 'guard_names.name')
->groupBy('guard_names.id', 'guard_names.name')
->orderBy('guard_names.name')
->pluck('name')
->toArray();
// Get all patrol entries within the date range, grouped by guard name
$guardPatrols = GuardPatrolEntry::join('guard_names', 'guard_patrol_entries.guard_name_id', '=', 'guard_names.id')
->where('guard_patrol_entries.plant_id', $selectedPlant)
->whereBetween('guard_patrol_entries.patrol_time', [$startDate, $endDate])
->select('guard_names.id', 'guard_names.name', 'guard_patrol_entries.patrol_time')
->orderBy('guard_names.name')
->orderBy('guard_patrol_entries.patrol_time')
->get()
->groupBy('name');
$guardTimeSums = [];
foreach ($guardPatrols as $guardName => $patrols) {
$totalSeconds = 0;
$prevTime = null;
foreach ($patrols as $patrol) {
$currentTime = Carbon::parse($patrol->patrol_time);
if ($prevTime) {
$totalSeconds += abs($currentTime->diffInSeconds($prevTime));
}
$prevTime = $currentTime;
}
$guardTimeSums[$guardName] = [
'minutes' => round($totalSeconds / 60),
'hours' => round($totalSeconds / 3600, 1),
];
}
// Prepare chart data
$chartData = [];
foreach ($uniqueGuardNames as $guardName) {
if (in_array($activeFilter, ['today', 'yesterday'])) {
$chartData[] = $guardTimeSums[$guardName]['minutes'] ?? 0;
} else {
$chartData[] = $guardTimeSums[$guardName]['hours'] ?? 0;
}
}
// $chartData = array_map(function ($value) {
// return ($value == 0 || is_null($value)) ? null : $value;
// }, $chartData);
$chartData = array_map(function ($value) {
return ($value == 0 || is_null($value)) ? "" : $value;
}, $chartData);
return response()->json([
'status_code' => 'SUCCESS',
'labels' => array_values($uniqueGuardNames),
'datasets' => [
[
'label' => match ($activeFilter) {
'yesterday' => "Patrols by Guard (Yesterday) Minutes",
'this week' => "Patrols by Guard (This Week) Hours",
'this month' => "Patrols by Guard (This Month) Hours",
default => "Patrols by Guard (Today) Minutes",
},
'data' => $chartData,
],
],
]);
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
}
}

View File

@@ -0,0 +1,173 @@
<?php
namespace App\Http\Controllers;
use App\Models\CheckPointTime;
use App\Models\GuardName;
use App\Models\GuardPatrolEntry;
use App\Models\Plant;
use Carbon\Carbon;
use Illuminate\Http\Request;
class ModuleGuardHourlyCountController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
//
}
public function get_guardDay_hourlyData(Request $request)
{
$expectedUser = env('API_AUTH_USER');
$expectedPw = env('API_AUTH_PW');
$header_auth = $request->header('Authorization');
$expectedToken = $expectedUser . ':' . $expectedPw;
if ("Bearer " . $expectedToken != $header_auth) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Invalid authorization token!'
], 403);
}
$plantName = $request->header('plant-name');
$dateHeader = $request->header('date'); // required: format Y-m-d
$guardIdHeader = $request->header('guard-name'); // required: guard_name_id
$timeHeader = $request->header('time-range'); // required: "08:00 - 10:00"
if (!$plantName || !$dateHeader || !$guardIdHeader || !$timeHeader) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Missing one or more headers: plant-name, date, guard-name, time-range'
], 404);
}
$plant = Plant::where('name', $plantName)->first();
if (!$plant) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Plant '{$plantName}' not found!"
], 404);
}
$selectedPlant = $plant->id;
//$selectedDate = $dateHeader;
$selectedDate = Carbon::createFromFormat('d-m-Y', $dateHeader)->format('Y-m-d');
// $selectedGuardId = $guardIdHeader;
$guard = GuardName::where('name', $guardIdHeader)->first();
if (!$guard) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Guard '{$guardIdHeader}' not found!"
], 404);
}
$selectedGuardId = $guard->id;
[$startTime, $endTime] = explode(' - ', $timeHeader);
// $startFormatted = Carbon::parse("{$selectedDate} {$startTime}");
// $endFormatted = Carbon::parse("{$selectedDate} {$endTime}");
// $startDateTime = $startFormatted->format('H:i:s');
// $endDateTime = $endFormatted->format('H:i:s');
try
{
[$startTime, $endTime] = explode(' - ', $timeHeader);
$startDateTime = Carbon::parse("{$selectedDate} {$startTime}");
$endDateTime = Carbon::parse("{$selectedDate} {$endTime}");
}
catch (\Exception $e) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Invalid time-range format. Use HH:MM:SS - HH:MM:SS"
], 400);
}
$patrols = GuardPatrolEntry::where('plant_id', $selectedPlant)
->where('guard_name_id', $selectedGuardId)
->whereBetween('patrol_time', [$startDateTime, $endDateTime])
->orderBy('patrol_time')
->get();
if ($patrols->count() < 2) {
return response()->json([
'status_code' => 'SUCCESS',
'labels' => [],
'datasets' => []
]);
}
$checkPointTimes = CheckPointTime::where('plant_id', $selectedPlant)
->orderBy('sequence_number')
->get(['sequence_number', 'min_cushioning', 'max_cushioning', 'check_point1_id', 'check_point2_id']);
$expectedSequence = [];
foreach ($checkPointTimes as $row) {
$expectedSequence[] = $row->check_point1_id;
}
if ($checkPointTimes->isNotEmpty()) {
$expectedSequence[] = $checkPointTimes->last()->check_point2_id;
}
$intervals = [];
$labels = [];
$currentSeqIndex = 0;
for ($i = 0; $i < $patrols->count() - 1; $i++) {
$current = Carbon::parse($patrols[$i]->patrol_time);
$next = Carbon::parse($patrols[$i + 1]->patrol_time);
$interval = round($next->floatDiffInRealSeconds($current, true) / 60, 2);
$intervals[] = $interval;
$labels[] = "Seq " . ($i + 1);
}
return response()->json([
'status_code' => 'SUCCESS',
'labels' => $labels,
'datasets' => [
[
'label' => 'Interval (minutes)',
'data' => array_map(fn($val) => $val ?: "", $intervals),
]
]
]);
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
}
}

View File

@@ -0,0 +1,124 @@
<?php
namespace App\Http\Controllers;
use App\Models\GuardPatrolEntry;
use App\Models\Plant;
use Carbon\Carbon;
use Illuminate\Http\Request;
class ModuleGuardNameController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
//
}
public function get_guard_name_Data(Request $request)
{
$expectedUser = env('API_AUTH_USER');
$expectedPw = env('API_AUTH_PW');
$header_auth = $request->header('Authorization');
$expectedToken = $expectedUser . ':' . $expectedPw;
if ("Bearer " . $expectedToken != $header_auth) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Invalid authorization token!'
], 403);
}
$plantName = $request->header('plant-name');
$dateHeader = $request->header('date');
if (!$plantName) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Plant value can't be empty"
], 404);
}
else if (!$dateHeader) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Date value can't be empty"
], 404);
}
$plant = Plant::where('name', $plantName)->first();
if (!$plant) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Plant '{$plantName}' not found!"
], 404);
}
$selectedPlant = $plant->id;
try
{
$selectedDate = Carbon::createFromFormat('d-m-Y', $dateHeader)->format('Y-m-d');
}
catch (\Exception $e) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Invalid date format. Expected format: d-m-Y"
], 400);
}
//$selectedDate = Carbon::createFromFormat('d-m-Y', $dateHeader)->format('Y-m-d');
$guardNames = GuardPatrolEntry::join('guard_names', 'guard_patrol_entries.guard_name_id', '=', 'guard_names.id')
->where('guard_patrol_entries.plant_id', $selectedPlant)
->whereDate('guard_patrol_entries.patrol_time', $selectedDate)
->select('guard_names.name')
->distinct()
->orderBy('guard_names.name')
->pluck('name');
if ($guardNames->isEmpty()) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Guard names not found for the selected plant and date.'
], 404);
}
return response()->json([
'status_code' => 'SUCCESS',
'status_description' => $guardNames,
]);
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
}
}

View File

@@ -0,0 +1,91 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ModuleInvoiceDataController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
//
}
public function get_invoiceData(Request $request)
{
$expectedUser = env('API_AUTH_USER');
$expectedPw = env('API_AUTH_PW');
$header_auth = $request->header('Authorization');
$expectedToken = $expectedUser . ':' . $expectedPw;
if ("Bearer " . $expectedToken != $header_auth)
{
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Invalid authorization token!'
], 403);
}
$moduleName = $request->header('invoice-type-list');
if (empty($moduleName))
{
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Invoice type can't be empty!"
], 404);
}
$headerValue = $request->header('invoice-type-list');
if ($headerValue != 'Invoice Type List') {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Invalid value for 'invoice-type-list' header!"
], 404);
}
$invoiceTypes = ['All Invoice', 'Serial Invoice', 'Individual Invoice', 'Bundle Invoice'];
return response()->json([
'status_code' => 'SUCCESS',
'status_description' => $invoiceTypes
], 200);
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
}
}

View File

@@ -0,0 +1,274 @@
<?php
namespace App\Http\Controllers;
use App\Models\InvoiceValidation;
use App\Models\Plant;
use Illuminate\Http\Request;
class ModuleInvoiceQuantityController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
//
}
// public function get_invoiceQuantityData(Request $request)
// {
// $expectedUser = env('API_AUTH_USER');
// $expectedPw = env('API_AUTH_PW');
// $header_auth = $request->header('Authorization');
// $expectedToken = $expectedUser . ':' . $expectedPw;
// if ("Bearer " . $expectedToken != $header_auth) {
// return response()->json([
// 'status_code' => 'ERROR',
// 'status_description' => 'Invalid authorization token!'
// ], 403);
// }
// $plantName = $request->header('plant-name');
// $filterHeader = $request->header('filter-name');
// $invoiceHeader = $request->header('invoice-name');
// if (empty($plantName) || empty($invoiceHeader) || empty($filterHeader)) {
// return response()->json([
// 'status_code' => 'ERROR',
// 'status_description' => "Missing required headers: plant-name, invoice-name, or filter-name"
// ], 404);
// }
// $validFilters = ['Today', 'Yesterday', 'This Week', 'This Month'];
// if (!in_array($filterHeader, $validFilters)) {
// return response()->json([
// 'status_code' => 'ERROR',
// 'status_description' => "Invalid filter-name value! Accepted values are: " . implode(', ', $validFilters)
// ], 404);
// }
// $validInvoiceFilters = ['All Invoice', 'Serial Invoice', 'Individual Invoice', 'Bundle Invoice'];
// if (!in_array($invoiceHeader, $validInvoiceFilters)) {
// return response()->json([
// 'status_code' => 'ERROR',
// 'status_description' => "Invalid invoice-name value! Accepted values are: " . implode(', ', $validInvoiceFilters)
// ], 404);
// }
// $plant = Plant::where('name', $plantName)->first();
// if (!$plant) {
// return response()->json([
// 'status_code' => 'ERROR',
// 'status_description' => "Plant '{$plantName}' not found!"
// ], 404);
// }
// $selectedPlant = $plant->id;
// $activeFilter = strtolower(trim($filterHeader));
// $selectedInvoice = strtolower(trim($invoiceHeader));
// // Set time range
// if ($activeFilter == 'yesterday') {
// $startDate = now()->subDay()->setTime(8, 0, 0);
// $endDate = now()->setTime(8, 0, 0);
// } elseif ($activeFilter == 'this week') {
// $startDate = now()->startOfWeek()->setTime(8, 0, 0);
// $endDate = now()->endOfWeek()->addDay()->setTime(8, 0, 0);
// } elseif ($activeFilter == 'this month') {
// $startDate = now()->startOfMonth()->setTime(8, 0, 0);
// $endDate = now()->endOfMonth()->addDay()->setTime(8, 0, 0);
// } else {
// $startDate = now()->setTime(8, 0, 0);
// $endDate = now()->copy()->addDay()->setTime(8, 0, 0);
// }
// $labels = [];
// $datasets = [];
// }
/**
* Store a newly created resource in storage.
*/
public function get_invoiceQuantityData(Request $request)
{
$expectedUser = env('API_AUTH_USER');
$expectedPw = env('API_AUTH_PW');
$header_auth = $request->header('Authorization');
$expectedToken = $expectedUser . ':' . $expectedPw;
if ("Bearer " . $expectedToken != $header_auth) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Invalid authorization token!'
], 403);
}
$plantName = $request->header('plant-name');
$filterHeader = $request->header('filter-name');
$invoiceHeader = $request->header('invoice-name');
if (empty($plantName) || empty($invoiceHeader) || empty($filterHeader)) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Missing required headers: plant-name, invoice-name, or filter-name"
], 404);
}
$validFilters = ['Today', 'Yesterday', 'This Week', 'This Month'];
if (!in_array($filterHeader, $validFilters)) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Invalid filter-name value! Accepted values are: " . implode(', ', $validFilters)
], 404);
}
$validInvoiceFilters = ['All Invoice', 'Serial Invoice', 'Individual Invoice', 'Bundle Invoice'];
if (!in_array($invoiceHeader, $validInvoiceFilters)) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Invalid invoice-name value! Accepted values are: " . implode(', ', $validInvoiceFilters)
], 404);
}
$plant = Plant::where('name', $plantName)->first();
if (!$plant) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Plant '{$plantName}' not found!"
], 404);
}
$selectedPlant = $plant->id;
$activeFilter = strtolower(trim($filterHeader));
$selectedInvoice = strtolower(trim($invoiceHeader));
// Set time range
if ($activeFilter == 'yesterday') {
$startDate = now()->subDay()->setTime(8, 0, 0);
$endDate = now()->setTime(8, 0, 0);
} elseif ($activeFilter == 'this week') {
$startDate = now()->startOfWeek()->setTime(8, 0, 0);
$endDate = now()->endOfWeek()->addDay()->setTime(8, 0, 0);
} elseif ($activeFilter == 'this month') {
$startDate = now()->startOfMonth()->setTime(8, 0, 0);
$endDate = now()->endOfMonth()->addDay()->setTime(8, 0, 0);
} else {
$startDate = now()->setTime(8, 0, 0);
$endDate = now()->copy()->addDay()->setTime(8, 0, 0);
}
$types = ['individual_invoice', 'serial_invoice', 'bundle_invoice'];
if ($selectedInvoice != 'all invoice') {
$types = [str_replace(' ', '_', $selectedInvoice)];
}
$labels = ['Total Invoices', 'Scanned Invoices'];
$datasets = [];
$totals = [];
$scanneds = [];
foreach ($types as $type) {
$query = InvoiceValidation::where('plant_id', $selectedPlant)
->whereBetween('created_at', [$startDate, $endDate]);
$completedQuery = InvoiceValidation::where('plant_id', $selectedPlant)
->whereBetween('updated_at', [$startDate, $endDate]);
if ($type == 'individual_invoice') {
$query->where('quantity', 1);
$completedQuery->where('quantity', 1)
->whereNotNull('serial_number')
->where('serial_number', '!=', '');
} elseif ($type == 'serial_invoice') {
$query->whereNull('quantity');
$completedQuery->where('scanned_status', 'Scanned')
->where(function ($q) {
$q->whereNull('quantity')->orWhere('quantity', 0);
});
} elseif ($type == 'bundle_invoice') {
$query->where('quantity', '>', 1);
$completedQuery->where('quantity', '>', 1)
->whereNotNull('serial_number')
->where('serial_number', '!=', '');
}
$totals[] = $query->count();
$scanneds[] = $completedQuery->count();
}
// if (count($types) == 1) {
// $datasets[] = [
// 'label' => 'Invoices',
// 'data' => [$totals[0], $scanneds[0]],
// ];
// }
if (count($types) == 1)
{
$invoiceLabel = ucwords(str_replace('_invoice', '', str_replace('_', ' ', $types[0])));
$datasets[] = [
'label' => $invoiceLabel, // e.g., Serial Invoice
'data' => [$totals[0], $scanneds[0]],
];
}
else
{
$datasets[] = [
'label' => 'Total Invoices',
'data' => $totals,
];
$datasets[] = [
'label' => 'Scanned Invoices',
'data' => $scanneds,
];
$labels = array_map(function ($type) {
return ucwords(str_replace('_invoice', '', str_replace('_', ' ', $type)));
}, $types);
}
foreach ($datasets as &$dataset) {
$dataset['data'] = array_map(function ($value) {
return $value ?? 0;
}, $dataset['data']);
}
return response()->json([
'status_code' => 'SUCCESS',
'labels' => $labels,
'datasets' => $datasets,
], 200);
}
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
}
}

View File

@@ -0,0 +1,554 @@
<?php
namespace App\Http\Controllers;
use App\Models\InvoiceValidation;
use App\Models\ModuleList;
use App\Models\Plant;
use Illuminate\Http\Request;
class ModuleInvoiceTypeController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
//
}
public function get_invoiceFilter(Request $request)
{
$expectedUser = env('API_AUTH_USER');
$expectedPw = env('API_AUTH_PW');
$header_auth = $request->header('Authorization');
$expectedToken = $expectedUser . ':' . $expectedPw;
if ("Bearer " . $expectedToken != $header_auth)
{
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Invalid authorization token!'
], 403);
}
$filterName = $request->header('filter-name');
if (empty($filterName))
{
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Filter Name can't be empty!"
], 404);
}
$headerValue = $request->header('filter-name');
if ($headerValue != 'Filter List') {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Invalid value for 'module-name' header!"
], 404);
}
$uniqueModules = ModuleList::select('filter_name', 'created_at')
->orderBy('created_at', 'asc')
->get()
->unique('filter_name')
->pluck('filter_name')
->values();
if ($uniqueModules->isEmpty()) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Filter names not found'
], 404);
}
return response()->json([
'status_code' => 'SUCCESS',
'status_description' => $uniqueModules
], 200);
}
// public function get_invoiceCountData(Request $request)
// {
// $expectedUser = env('API_AUTH_USER');
// $expectedPw = env('API_AUTH_PW');
// $header_auth = $request->header('Authorization');
// $expectedToken = $expectedUser . ':' . $expectedPw;
// if ("Bearer " . $expectedToken != $header_auth)
// {
// return response()->json([
// 'status_code' => 'ERROR',
// 'status_description' => 'Invalid authorization token!'
// ], 403);
// }
// $moduleName = $request->header('invoice-name');
// if (empty($moduleName))
// {
// return response()->json([
// 'status_code' => 'ERROR',
// 'status_description' => "Invoice name can't be empty!"
// ], 404);
// }
// $plantName = $request->header('plant-name');
// $selectedInvoice = strtolower(trim($request->header('invoice-name')));
// $activeFilter = strtolower(trim($request->header('filter-name')));
// $plant = Plant::where('name', $plantName)->first();
// if (!$plant) {
// return response()->json([
// 'status_code' => 'ERROR',
// 'status_description' => "Plant '{$plantName}' not found!"
// ], 404);
// }
// $selectedPlant = $plant->id;
// if (empty($selectedInvoice) || empty($selectedPlant) || empty($activeFilter)) {
// return response()->json([
// 'status_code' => 'ERROR',
// 'status_description' => 'Missing required headers: invoice-name, plant-name, or filter-name'
// ], 404);
// }
// $validFilters = ['Today', 'Yesterday', 'This Week', 'This Month'];
// $filterHeader = $request->header('filter-name');
// if (!in_array($filterHeader, $validFilters)) {
// return response()->json([
// 'status_code' => 'ERROR',
// 'status_description' => "Invalid filter-name value! Accepted values are: " . implode(', ', $validFilters)
// ], 404);
// }
// $validInvoiceFilters = ['All Invoice', 'Serial Invoice', 'Individual Invoice', 'Bundle Invoice'];
// $filterInvoice = $request->header('invoice-name');
// if (!in_array($filterInvoice, $validInvoiceFilters)) {
// return response()->json([
// 'status_code' => 'ERROR',
// 'status_description' => "Invalid invoice-name value! Accepted values are: " . implode(', ', $validInvoiceFilters)
// ], 404);
// }
// if ($activeFilter == 'yesterday') {
// $startDate = now()->subDay()->setTime(8, 0, 0);
// $endDate = now()->setTime(8, 0, 0);
// } elseif ($activeFilter == 'this week') {
// $startDate = now()->startOfWeek()->setTime(8, 0, 0);
// $endDate = now()->endOfWeek()->addDay()->setTime(8, 0, 0);
// } elseif ($activeFilter == 'this month') {
// $startDate = now()->startOfMonth()->setTime(8, 0, 0);
// $endDate = now()->endOfMonth()->addDay()->setTime(8, 0, 0);
// } else {
// $startDate = now()->setTime(8, 0, 0);
// $endDate = now()->copy()->addDay()->setTime(8, 0, 0);
// }
// $labels = [];
// $datasets = [];
// if ($activeFilter == 'yesterday' || $activeFilter == 'today')
// {
// // === Imported Invoices ===
// $importedQuery = InvoiceValidation::where('plant_id', $selectedPlant)
// ->whereBetween('created_at', [$startDate, $endDate]);
// if ($selectedInvoice == 'individual invoice') {
// $importedQuery->where('quantity', 1);
// } elseif ($selectedInvoice == 'serial invoice') {
// $importedQuery->whereNull('quantity');
// } elseif ($selectedInvoice == 'bundle invoice') {
// $importedQuery->where('quantity', '>', 1);
// }
// $importedCount = $importedQuery->distinct('invoice_number')->count('invoice_number');
// // === Completed Invoices ===
// $completedQuery = InvoiceValidation::select('invoice_number')
// ->where('plant_id', $selectedPlant)
// ->whereBetween('updated_at', [$startDate, $endDate]);
// if ($selectedInvoice == 'individual invoice') {
// $completedQuery->where('quantity', 1)
// ->groupBy('invoice_number')
// ->havingRaw("COUNT(*) = SUM(CASE WHEN serial_number IS NOT NULL AND serial_number != '' THEN 1 ELSE 0 END)");
// } elseif ($selectedInvoice == 'serial invoice') {
// $completedQuery->whereNull('quantity')
// ->groupBy('invoice_number')
// ->havingRaw("COUNT(*) = SUM(CASE WHEN scanned_status = 'Scanned' THEN 1 ELSE 0 END)");
// } elseif ($selectedInvoice == 'bundle invoice') {
// $completedQuery->where('quantity', '>', 1)
// ->groupBy('invoice_number')
// ->havingRaw("COUNT(*) = SUM(CASE WHEN serial_number IS NOT NULL AND serial_number != '' THEN 1 ELSE 0 END)");
// }
// $completedCount = $completedQuery->count();
// $labels = ['Imported Invoice', 'Completed Invoice'];
// $datasets = [[
// 'label' => 'Invoices',
// 'data' => [$importedCount, $completedCount],
// ]];
// }
// elseif ($activeFilter == 'this week') {
// $labels = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];
// $imported = array_fill(0, 7, 0);
// $completed = array_fill(0, 7, 0);
// for ($i = 0; $i < 7; $i++) {
// $dayStart = now()->startOfWeek()->addDays($i)->setTime(8, 0, 0);
// $dayEnd = $dayStart->copy()->addDay()->setTime(8, 0, 0);
// $importedQuery = InvoiceValidation::where('plant_id', $selectedPlant)
// ->whereBetween('created_at', [$dayStart, $dayEnd]);
// $completedQuery = InvoiceValidation::select('invoice_number')
// ->where('plant_id', $selectedPlant)
// ->whereBetween('updated_at', [$dayStart, $dayEnd]);
// if ($selectedInvoice == 'individual invoice') {
// $importedQuery->where('quantity', 1);
// $completedQuery->where('quantity', 1)
// ->groupBy('invoice_number')
// ->havingRaw("COUNT(*) = SUM(CASE WHEN serial_number IS NOT NULL AND serial_number != '' THEN 1 ELSE 0 END)");
// } elseif ($selectedInvoice == 'serial invoice') {
// $importedQuery->whereNull('quantity');
// $completedQuery->whereNull('quantity')
// ->groupBy('invoice_number')
// ->havingRaw("COUNT(*) = SUM(CASE WHEN scanned_status = 'Scanned' THEN 1 ELSE 0 END)");
// } elseif ($selectedInvoice == 'bundle invoice') {
// $importedQuery->where('quantity', '>', 1);
// $completedQuery->where('quantity', '>', 1)
// ->groupBy('invoice_number')
// ->havingRaw("COUNT(*) = SUM(CASE WHEN serial_number IS NOT NULL AND serial_number != '' THEN 1 ELSE 0 END)");
// }
// $imported[$i] = $importedQuery->distinct('invoice_number')->count('invoice_number');
// $completed[$i] = $completedQuery->count();
// }
// $datasets = [
// ['label' => 'Imported Invoices', 'data' => $imported],
// ['label' => 'Completed Invoices', 'data' => $completed],
// ];
// }
// elseif ($activeFilter == 'this month') {
// $startOfMonth = now()->startOfMonth()->setTime(8, 0, 0);
// $endOfMonth = now()->endOfMonth()->addDay()->setTime(8, 0, 0);
// $labels = [];
// $imported = [];
// $completed = [];
// $weekStart = $startOfMonth->copy();
// while ($weekStart < $endOfMonth) {
// $weekEnd = $weekStart->copy()->addDays(7);
// $label = $weekStart->format('M') . ' (' . $weekStart->format('j') . '-' . $weekEnd->subDay()->format('j') . ')';
// $labels[] = $label;
// $importedQuery = InvoiceValidation::where('plant_id', $selectedPlant)
// ->whereBetween('created_at', [$weekStart, $weekEnd]);
// $completedQuery = InvoiceValidation::select('invoice_number')
// ->where('plant_id', $selectedPlant)
// ->whereBetween('updated_at', [$weekStart, $weekEnd]);
// if ($selectedInvoice == 'individual invoice') {
// $importedQuery->where('quantity', 1);
// $completedQuery->where('quantity', 1)
// ->groupBy('invoice_number')
// ->havingRaw("COUNT(*) = SUM(CASE WHEN serial_number IS NOT NULL AND serial_number != '' THEN 1 ELSE 0 END)");
// } elseif ($selectedInvoice == 'serial invoice') {
// $importedQuery->whereNull('quantity');
// $completedQuery->whereNull('quantity')
// ->groupBy('invoice_number')
// ->havingRaw("COUNT(*) = SUM(CASE WHEN scanned_status = 'Scanned' THEN 1 ELSE 0 END)");
// } elseif ($selectedInvoice == 'bundle invoice') {
// $importedQuery->where('quantity', '>', 1);
// $completedQuery->where('quantity', '>', 1)
// ->groupBy('invoice_number')
// ->havingRaw("COUNT(*) = SUM(CASE WHEN serial_number IS NOT NULL AND serial_number != '' THEN 1 ELSE 0 END)");
// }
// $imported[] = $importedQuery->distinct('invoice_number')->count('invoice_number');
// $completed[] = $completedQuery->count();
// $weekStart = $weekEnd;
// }
// $datasets = [
// ['label' => 'Imported Invoices', 'data' => $imported],
// ['label' => 'Completed Invoices', 'data' => $completed],
// ];
// }
// // Clean zero values to null
// foreach ($datasets as &$dataset) {
// $dataset['data'] = array_map(function ($value) {
// return ($value === null) ? 0 : $value;
// }, $dataset['data']);
// }
// return response()->json([
// 'status_code' => 'SUCCESS',
// 'labels' => $labels,
// 'datasets' => $datasets,
// ], 200);
// }
/**
* Store a newly created resource in storage.
*/
public function get_invoiceCountData(Request $request)
{
$expectedUser = env('API_AUTH_USER');
$expectedPw = env('API_AUTH_PW');
$header_auth = $request->header('Authorization');
$expectedToken = $expectedUser . ':' . $expectedPw;
if ("Bearer " . $expectedToken != $header_auth) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Invalid authorization token!'
], 403);
}
$plantName = $request->header('plant-name');
$filterHeader = $request->header('filter-name');
$invoiceHeader = $request->header('invoice-name');
if (empty($plantName) || empty($invoiceHeader) || empty($filterHeader)) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Missing required headers: plant-name, invoice-name, or filter-name"
], 404);
}
$validFilters = ['Today', 'Yesterday', 'This Week', 'This Month'];
if (!in_array($filterHeader, $validFilters)) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Invalid filter-name value! Accepted values are: " . implode(', ', $validFilters)
], 404);
}
$validInvoiceFilters = ['All Invoice', 'Serial Invoice', 'Individual Invoice', 'Bundle Invoice'];
if (!in_array($invoiceHeader, $validInvoiceFilters)) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Invalid invoice-name value! Accepted values are: " . implode(', ', $validInvoiceFilters)
], 404);
}
$plant = Plant::where('name', $plantName)->first();
if (!$plant) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Plant '{$plantName}' not found!"
], 404);
}
$selectedPlant = $plant->id;
$activeFilter = strtolower(trim($filterHeader));
$selectedInvoice = strtolower(trim($invoiceHeader));
// Set time range
if ($activeFilter == 'yesterday') {
$startDate = now()->subDay()->setTime(8, 0, 0);
$endDate = now()->setTime(8, 0, 0);
} elseif ($activeFilter == 'this week') {
$startDate = now()->startOfWeek()->setTime(8, 0, 0);
$endDate = now()->endOfWeek()->addDay()->setTime(8, 0, 0);
} elseif ($activeFilter == 'this month') {
$startDate = now()->startOfMonth()->setTime(8, 0, 0);
$endDate = now()->endOfMonth()->addDay()->setTime(8, 0, 0);
} else {
$startDate = now()->setTime(8, 0, 0);
$endDate = now()->copy()->addDay()->setTime(8, 0, 0);
}
$labels = [];
$datasets = [];
// Map types for All Invoice
$invoiceTypes = $selectedInvoice == 'all invoice'
? [
'Individual Invoice' => fn($q) => $q->where('quantity', 1),
'Serial Invoice' => fn($q) => $q->whereNull('quantity'),
'Bundle Invoice' => fn($q) => $q->where('quantity', '>', 1)
]
: [
ucfirst($selectedInvoice) => match ($selectedInvoice) {
'individual invoice' => fn($q) => $q->where('quantity', 1),
'serial invoice' => fn($q) => $q->whereNull('quantity'),
'bundle invoice' => fn($q) => $q->where('quantity', '>', 1),
}
];
foreach ($invoiceTypes as $labelPrefix => $queryModifier) {
if ($activeFilter == 'yesterday' || $activeFilter == 'today') {
$importedQuery = InvoiceValidation::where('plant_id', $selectedPlant)
->whereBetween('created_at', [$startDate, $endDate]);
$queryModifier($importedQuery);
$importedCount = $importedQuery->distinct('invoice_number')->count('invoice_number');
$completedQuery = InvoiceValidation::select('invoice_number')
->where('plant_id', $selectedPlant)
->whereBetween('updated_at', [$startDate, $endDate]);
if ($selectedInvoice == 'serial invoice' || $labelPrefix == 'Serial Invoice') {
$queryModifier($completedQuery)
->groupBy('invoice_number')
->havingRaw("COUNT(*) = SUM(CASE WHEN scanned_status = 'Scanned' THEN 1 ELSE 0 END)");
} else {
$queryModifier($completedQuery)
->groupBy('invoice_number')
->havingRaw("COUNT(*) = SUM(CASE WHEN serial_number IS NOT NULL AND serial_number != '' THEN 1 ELSE 0 END)");
}
$completedCount = $completedQuery->count();
$labels = ['Imported Invoice', 'Completed Invoice'];
$datasets[] = [
'label' => "$labelPrefix",
'data' => [$importedCount, $completedCount],
];
}
elseif ($activeFilter == 'this week') {
$labels = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];
$imported = array_fill(0, 7, 0);
$completed = array_fill(0, 7, 0);
for ($i = 0; $i < 7; $i++) {
$dayStart = now()->startOfWeek()->addDays($i)->setTime(8, 0, 0);
$dayEnd = $dayStart->copy()->addDay()->setTime(8, 0, 0);
$importedQuery = InvoiceValidation::where('plant_id', $selectedPlant)
->whereBetween('created_at', [$dayStart, $dayEnd]);
$queryModifier($importedQuery);
$imported[$i] = $importedQuery->distinct('invoice_number')->count('invoice_number');
$completedQuery = InvoiceValidation::select('invoice_number')
->where('plant_id', $selectedPlant)
->whereBetween('updated_at', [$dayStart, $dayEnd]);
if ($selectedInvoice == 'serial invoice' || $labelPrefix == 'Serial Invoice') {
$queryModifier($completedQuery)
->groupBy('invoice_number')
->havingRaw("COUNT(*) = SUM(CASE WHEN scanned_status = 'Scanned' THEN 1 ELSE 0 END)");
} else {
$queryModifier($completedQuery)
->groupBy('invoice_number')
->havingRaw("COUNT(*) = SUM(CASE WHEN serial_number IS NOT NULL AND serial_number != '' THEN 1 ELSE 0 END)");
}
$completed[$i] = $completedQuery->count();
}
$datasets[] = ['label' => "$labelPrefix Imported", 'data' => $imported];
$datasets[] = ['label' => "$labelPrefix Completed", 'data' => $completed];
}
elseif ($activeFilter == 'this month') {
$startOfMonth = now()->startOfMonth()->setTime(8, 0, 0);
$endOfMonth = now()->endOfMonth()->addDay()->setTime(8, 0, 0);
$labels = [];
$imported = [];
$completed = [];
$weekStart = $startOfMonth->copy();
while ($weekStart < $endOfMonth) {
$weekEnd = $weekStart->copy()->addDays(7);
$label = $weekStart->format('M') . ' (' . $weekStart->format('j') . '-' . $weekEnd->subDay()->format('j') . ')';
$labels[] = $label;
$importedQuery = InvoiceValidation::where('plant_id', $selectedPlant)
->whereBetween('created_at', [$weekStart, $weekEnd]);
$queryModifier($importedQuery);
$imported[] = $importedQuery->distinct('invoice_number')->count('invoice_number');
$completedQuery = InvoiceValidation::select('invoice_number')
->where('plant_id', $selectedPlant)
->whereBetween('updated_at', [$weekStart, $weekEnd]);
if ($selectedInvoice == 'serial invoice' || $labelPrefix == 'Serial Invoice') {
$queryModifier($completedQuery)
->groupBy('invoice_number')
->havingRaw("COUNT(*) = SUM(CASE WHEN scanned_status = 'Scanned' THEN 1 ELSE 0 END)");
} else {
$queryModifier($completedQuery)
->groupBy('invoice_number')
->havingRaw("COUNT(*) = SUM(CASE WHEN serial_number IS NOT NULL AND serial_number != '' THEN 1 ELSE 0 END)");
}
$completed[] = $completedQuery->count();
$weekStart = $weekEnd;
}
$datasets[] = ['label' => "$labelPrefix Imported", 'data' => $imported];
$datasets[] = ['label' => "$labelPrefix Completed", 'data' => $completed];
}
}
// Ensure 0 instead of null
foreach ($datasets as &$dataset) {
$dataset['data'] = array_map(fn($val) => $val === null ? 0 : $val, $dataset['data']);
}
return response()->json([
'status_code' => 'SUCCESS',
'labels' => $labels,
'datasets' => $datasets,
]);
}
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
}
}

View File

@@ -0,0 +1,94 @@
<?php
namespace App\Http\Controllers;
use App\Models\Plant;
use Illuminate\Http\Request;
class ModulePlantController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
//
}
public function get_modulePlant(Request $request)
{
$expectedUser = env('API_AUTH_USER');
$expectedPw = env('API_AUTH_PW');
$header_auth = $request->header('Authorization');
$expectedToken = $expectedUser . ':' . $expectedPw;
if ("Bearer " . $expectedToken != $header_auth)
{
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Invalid authorization token!'
], 403);
}
$plantName = $request->header('plant-name');
if (empty($plantName))
{
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Plant Name can't be empty!"
], 404);
}
$headerValue = $request->header('plant-name');
if ($headerValue != 'Plant List') {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Invalid value for 'plant-name' header!"
], 404);
}
$plantNames = Plant::orderBy('created_at', 'asc')
->pluck('name')
->values();
return response()->json([
'status_code' => 'SUCCESS',
'status_description' => $plantNames
], 200);
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
}
}

View File

@@ -0,0 +1,177 @@
<?php
namespace App\Http\Controllers;
use App\Models\Line;
use App\Models\Plant;
use Illuminate\Http\Request;
class ModulePlantLineController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
//
}
// public function get_modulePlantLine(Request $request)
// {
// $expectedUser = env('API_AUTH_USER');
// $expectedPw = env('API_AUTH_PW');
// $header_auth = $request->header('Authorization');
// $expectedToken = $expectedUser . ':' . $expectedPw;
// if ("Bearer " . $expectedToken != $header_auth)
// {
// return response()->json([
// 'status_code' => 'ERROR',
// 'status_description' => 'Invalid authorization token!'
// ], 403);
// }
// $plantName = $request->header('plant-name');
// if (empty($plantName))
// {
// return response()->json([
// 'status_code' => 'ERROR',
// 'status_description' => "Plant Name can't be empty!"
// ], 404);
// }
// $plant = Plant::where('name', $plantName)->first();
// if (!$plant) {
// return response()->json([
// 'status_code' => 'ERROR',
// 'status_description' => "Plant '{$plantName}' not found!"
// ], 404);
// }
// $lineNames = Line::where('plant_id', $plant->id)
// ->orderBy('created_at', 'asc')
// ->pluck('name');
// if ($lineNames->isEmpty()) {
// return response()->json([
// 'status_code' => 'ERROR',
// 'status_description' => "No lines found for plant '{$plantName}'"
// ], 404);
// }
// // Prepend 'All Lines'
// $lineNames->prepend('All Lines')->values();
// return response()->json([
// 'status_code' => 'SUCCESS',
// 'status_description' => $lineNames,
// ], 200);
// }
public function get_modulePlantLine(Request $request)
{
$expectedUser = env('API_AUTH_USER');
$expectedPw = env('API_AUTH_PW');
$header_auth = $request->header('Authorization');
$expectedToken = $expectedUser . ':' . $expectedPw;
if ("Bearer " . $expectedToken != $header_auth) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Invalid authorization token!'
], 403);
}
$plantName = $request->header('plant-name');
$chartName = $request->header('chart-name');
if (empty($plantName)) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Plant name can't be empty!"
], 404);
}
if (empty($chartName)) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Chart name can't be empty!"
], 404);
}
$plant = Plant::where('name', $plantName)->first();
if (!$plant)
{
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Plant '{$plantName}' not found!"
], 404);
}
// Load only lines NOT equal to FG Line
$nonFgLines = Line::where('plant_id', $plant->id)
//->where('type', '!=', 'FG Line')
->orderBy('created_at', 'asc')
->pluck('name')
->toArray();
if (empty($nonFgLines)) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "No non-FG lines found for plant '{$plantName}'"
], 404);
}
if (strtolower(trim($chartName)) != 'production hourly count') {
array_unshift($nonFgLines, 'All Lines');
}
// Add "All Lines" to beginning and "FG Lines" at the end
// array_unshift($nonFgLines, 'All Lines');
// $nonFgLines[] = 'FG Line';
return response()->json([
'status_code' => 'SUCCESS',
'status_description' => $nonFgLines,
], 200);
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
}
}

View File

@@ -0,0 +1,107 @@
<?php
namespace App\Http\Controllers;
use App\Models\Line;
use App\Models\Plant;
use Illuminate\Http\Request;
class ModuleProductionFGLineController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
//
}
public function get_moduleFGFilterList(Request $request)
{
$expectedUser = env('API_AUTH_USER');
$expectedPw = env('API_AUTH_PW');
$header_auth = $request->header('Authorization');
$expectedToken = $expectedUser . ':' . $expectedPw;
if ("Bearer " . $expectedToken != $header_auth) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Invalid authorization token!'
], 403);
}
$plantName = $request->header('plant-name');
$FGName = $request->header('fg-lines');
if (empty($plantName)) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Plant name can't be empty!"
], 404);
}
if (empty($FGName)) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "FG line name can't be empty!"
], 404);
}
$plant = Plant::where('name', $plantName)->first();
if (!$plant) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Plant '{$plantName}' not found!"
], 404);
}
$fgLines = Line::where('plant_id', $plant->id)
->where('type', $FGName)
->pluck('name'); // Only get line names
if ($fgLines->isEmpty()) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "No FG lines found for the selected plant and line!"
], 404);
}
return response()->json([
'status_code' => 'SUCCESS',
'status_description' => $fgLines,
]);
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
}
}

View File

@@ -0,0 +1,171 @@
<?php
namespace App\Http\Controllers;
use App\Models\Line;
use App\Models\Plant;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class ModuleProductionLineStopController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
//
}
public function get_moduleProductionLineStop(Request $request)
{
$expectedUser = env('API_AUTH_USER');
$expectedPw = env('API_AUTH_PW');
$header_auth = $request->header('Authorization');
$expectedToken = $expectedUser . ':' . $expectedPw;
if ("Bearer " . $expectedToken != $header_auth) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Invalid authorization token!'
], 403);
}
$requiredHeaders = ['module-name', 'chart-name', 'plant-name', 'line-name', 'filter-name'];
$missingHeaders = [];
foreach ($requiredHeaders as $header) {
if (empty($request->header($header))) {
$missingHeaders[] = $header;
}
}
if (!empty($missingHeaders)) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Missing required headers: ' . implode(', ', $missingHeaders)
], 404);
}
$plantName = $request->header('plant-name');
$lineName = $request->header('line-name');
$filterName = strtolower(trim($request->header('filter-name')));
$plant = Plant::where('name', $plantName)->first();
if (!$plant) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Plant '{$plantName}' not found!"
], 404);
}
$line = Line::where('name', $lineName)->where('plant_id', $plant->id)->first();
if (!$line) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Line '{$lineName}' not found for plant '{$plantName}'"
], 404);
}
// Set time range
if ($filterName == 'yesterday') {
$startDate = now()->subDay()->setTime(8, 0, 0);
$endDate = now()->setTime(8, 0, 0);
} elseif ($filterName == 'this week') {
$startDate = now()->startOfWeek()->setTime(8, 0, 0);
$endDate = now()->endOfWeek()->addDay()->setTime(8, 0, 0);
} elseif ($filterName == 'this month') {
$startDate = now()->startOfMonth();
$endDate = now()->endOfMonth();
} else {
$startDate = now()->setTime(8, 0, 0);
$endDate = now()->copy()->addDay()->setTime(8, 0, 0);
}
$query = DB::table('production_line_stops')
->join('line_stops as ls', 'production_line_stops.linestop_id', '=', 'ls.id')
->join('lines', 'production_line_stops.line_id', '=', 'lines.id')
->join('plants', 'production_line_stops.plant_id', '=', 'plants.id')
->select(
'ls.code',
'ls.reason',
DB::raw("SUM(production_line_stops.stop_hour) as total_stop_hours"),
DB::raw("SUM(production_line_stops.stop_min) as total_stop_minutes")
)
->where('plants.id', $plant->id)
->where('lines.id', $line->id)
->whereBetween('production_line_stops.created_at', [$startDate, $endDate])
->groupBy('ls.code', 'ls.reason')
->get();
if ($query->isEmpty()) {
return response()->json([
'status_code' => 'SUCCESS',
'labels' => ['No Data'],
'data' => [1],
], 200);
}
$labels = [];
$data = [];
$totalStopMinutes = 0;
foreach ($query as $row) {
$stopHours = $row->total_stop_hours;
$stopMinutes = $row->total_stop_minutes;
$visualTotal = $stopHours + ($stopMinutes / 100);
$labels[] = "{$row->code} - {$row->reason}";
$data[] = $visualTotal;
$totalStopMinutes += ($stopHours * 60) + $stopMinutes;
}
// Calculate available runtime
$remainingMinutes = 1440 - $totalStopMinutes;
$runtimeHours = floor($remainingMinutes / 60);
$runtimeMinutes = $remainingMinutes % 60;
$runtimeVisual = $runtimeHours + ($runtimeMinutes / 100);
$labels[] = 'Available Runtime';
$data[] = $runtimeVisual;
return response()->json([
'status_code' => 'SUCCESS',
'labels' => $labels,
'data' => $data,
], 200);
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
}
}

View File

@@ -0,0 +1,402 @@
<?php
namespace App\Http\Controllers;
use App\Models\Line;
use App\Models\Plant;
use App\Models\ProductionQuantity;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class ModuleProductionOrderDataController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
//
}
// public function get_moduleProductionOrder(Request $request)
// {
// $expectedUser = env('API_AUTH_USER');
// $expectedPw = env('API_AUTH_PW');
// $header_auth = $request->header('Authorization');
// $expectedToken = $expectedUser . ':' . $expectedPw;
// if ("Bearer " . $expectedToken != $header_auth) {
// return response()->json([
// 'status_code' => 'ERROR',
// 'status_description' => 'Invalid authorization token!'
// ], 403);
// }
// $requiredHeaders = [
// 'module-name',
// 'chart-name',
// 'plant-name',
// 'line-name',
// 'production-order',
// 'filter-name',
// ];
// $missingHeaders = [];
// foreach ($requiredHeaders as $header) {
// if (empty($request->header($header))) {
// $missingHeaders[] = $header;
// }
// }
// if (!empty($missingHeaders)) {
// return response()->json([
// 'status_code' => 'ERROR',
// 'status_description' => 'Missing required headers: ' . implode(', ', $missingHeaders)
// ], 404);
// }
// $validFilters = ['Today', 'Yesterday', 'This Week', 'This Month'];
// $filterHeader = $request->header('filter-name');
// if (!in_array($filterHeader, $validFilters)) {
// return response()->json([
// 'status_code' => 'ERROR',
// 'status_description' => "Invalid filter-name value! Accepted values are: " . implode(', ', $validFilters)
// ], 404);
// }
// $plantName = $request->header('plant-name');
// $lineName = $request->header('line-name');
// $orderValue = $request->header('production-order');
// $filterName = strtolower(trim($request->header('filter-name')));
// $plant = Plant::where('name', $plantName)->first();
// if (!$plant) {
// return response()->json([
// 'status_code' => 'ERROR',
// 'status_description' => "Plant '{$plantName}' not found!"
// ], 404);
// }
// $line = Line::where('name', $lineName)->where('plant_id', $plant->id)->first();
// if (!$line) {
// return response()->json([
// 'status_code' => 'ERROR',
// 'status_description' => 'Line not found!'
// ], 404);
// }
// $lineType = $line->type;
// if ($lineType === 'FG Line')
// {
// $table = 'quality_validations';
// }
// else
// {
// $table = 'production_quantities';
// }
// // Time Range
// if ($filterName == 'yesterday') {
// $startDate = now()->subDay()->setTime(8, 0, 0);
// $endDate = now()->setTime(8, 0, 0);
// $groupBy = "EXTRACT(HOUR FROM $table.created_at)";
// } elseif ($filterName == 'this week') {
// $startDate = now()->startOfWeek()->setTime(8, 0, 0);
// $endDate = now()->endOfWeek()->addDay()->setTime(8, 0, 0);
// $groupBy = "EXTRACT(DOW FROM $table.created_at)";
// } elseif ($filterName == 'this month') {
// $startDate = now()->startOfMonth();
// $endDate = now()->endOfMonth();
// $groupBy = "FLOOR((EXTRACT(DAY FROM $table.created_at) - 1) / 7) + 1";
// } else {
// $startDate = now()->setTime(8, 0, 0);
// $endDate = now()->copy()->addDay()->setTime(8, 0, 0);
// $groupBy = "EXTRACT(HOUR FROM $table.created_at)";
// }
// $query = \DB::table($table)
// ->join('plants', "$table.plant_id", '=', 'plants.id')
// ->join('lines', "$table.line_id", '=', 'lines.id')
// ->selectRaw("$groupBy AS time_unit, count(*) AS total_quantity")
// ->whereBetween("$table.created_at", [$startDate, $endDate])
// ->where('plants.id', $plant->id)
// ->where('lines.id', $line->id)
// ->where("$table.production_order", $orderValue)
// ->groupByRaw($groupBy)
// ->orderByRaw($groupBy)
// ->pluck('total_quantity', 'time_unit')
// ->toArray();
// if ($filterName == 'this month') {
// $weeksCount = ceil($endDate->day / 7);
// $allWeeks = array_fill(1, $weeksCount, 0);
// $data = array_replace($allWeeks, $query);
// $labels = [];
// for ($i = 1; $i <= $weeksCount; $i++) {
// $weekStart = $startDate->copy()->addDays(($i - 1) * 7)->format('d M');
// $weekEnd = $startDate->copy()->addDays($i * 7 - 1)->min($endDate)->format('d M');
// $labels[] = "Week $i ($weekStart - $weekEnd)";
// }
// $orderedData = array_values($data);
// } elseif ($filterName === 'this week') {
// $labels = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];
// $data = array_fill(0, 7, 0);
// foreach ($query as $dow => $count) {
// $data[$dow] = $count;
// }
// $orderedData = [
// $data[1] ?? 0, $data[2] ?? 0, $data[3] ?? 0,
// $data[4] ?? 0, $data[5] ?? 0, $data[6] ?? 0,
// $data[0] ?? 0,
// ];
// } else {
// $allHours = array_fill(0, 24, 0);
// $data = array_replace($allHours, $query);
// $shiftedData = [];
// foreach ($data as $hour => $count) {
// $nextHour = ($hour + 1) % 24;
// $shiftedData[$nextHour] = $count;
// }
// $shiftedKeys = array_merge(range(9, 23), range(0, 8));
// $orderedData = array_map(fn($hour) => $shiftedData[$hour] ?? 0, $shiftedKeys);
// $labels = array_map(fn ($hour) => date("g A", strtotime("$hour:00")), $shiftedKeys);
// }
// $orderedData = array_map(function ($value) {
// return ($value == 0 || is_null($value)) ? null : $value;
// }, $orderedData);
// return response()->json([
// 'status_code' => 'SUCCESS',
// 'datasets' => [
// [
// 'label' => match ($filterName) {
// 'this week' => $lineType == 'FG Line' ? "Daily Fg Production Order Count This Week" : "Daily Production Order Count This Week",
// 'this month' => $lineType == 'FG Line' ? "Weekly Fg Production Order Count This Month" : "Weekly Production Order Count This Month",
// 'yesterday' => $lineType == 'FG Line' ? "Yesterday's Hourly Fg Order Count Production" : "Yesterday's Hourly Order Count Production",
// default => $lineType == 'FG Line' ? "Today's Hourly Fg Production Order Count" : "Today's Hourly Production Order Count",
// },
// 'data' => $orderedData,
// 'borderColor' => 'rgba(75, 192, 192, 1)',
// 'backgroundColor' => 'rgba(75, 192, 192, 0.2)',
// 'fill' => false,
// 'tension' => 0.3,
// ]
// ],
// 'labels' => $labels
// ], 200);
// }
public function get_moduleProductionOrder(Request $request)
{
$expectedUser = env('API_AUTH_USER');
$expectedPw = env('API_AUTH_PW');
$header_auth = $request->header('Authorization');
$expectedToken = $expectedUser . ':' . $expectedPw;
if ("Bearer " . $expectedToken != $header_auth) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Invalid authorization token!'
], 403);
}
$requiredHeaders = [
'module-name', 'chart-name', 'plant-name',
'line-name', 'production-order', 'filter-name'
];
$missingHeaders = [];
foreach ($requiredHeaders as $header) {
if (empty($request->header($header))) {
$missingHeaders[] = $header;
}
}
if (!empty($missingHeaders)) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Missing required headers: ' . implode(', ', $missingHeaders)
], 404);
}
$filterHeader = $request->header('filter-name');
$validFilters = ['Today', 'Yesterday', 'This Week', 'This Month'];
if (!in_array($filterHeader, $validFilters)) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Invalid filter-name value! Accepted values are: " . implode(', ', $validFilters)
], 404);
}
$plantName = $request->header('plant-name');
$lineName = $request->header('line-name');
$orderVal = $request->header('production-order');
$filter = strtolower($filterHeader);
$plant = Plant::where('name', $plantName)->first();
if (!$plant) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Plant '{$plantName}' not found!"
], 404);
}
$line = Line::where('name', $lineName)->where('plant_id', $plant->id)->first();
if (!$line) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Line '{$lineName}' not found!"
], 404);
}
$lineType = $line->type;
$table = ($lineType == 'FG Line') ? 'quality_validations' : 'production_quantities';
if ($filter == 'today' || $filter == 'yesterday') {
$hourlyCounts = [];
$hourStart = $filter == 'today'
? now()->setTime(8, 0, 0)
: now()->subDay()->setTime(8, 0, 0);
$hourEndFinal = $hourStart->copy()->addDay();
while ($hourStart < $hourEndFinal) {
$hourEnd = $hourStart->copy()->addHour();
$label = $hourStart->format('g:i A') . ' to ' . $hourEnd->format('g:i A');
$count = DB::table($table)
->where('plant_id', $plant->id)
->where('line_id', $line->id)
->where('production_order', $orderVal)
->whereBetween('created_at', [$hourStart, $hourEnd])
->count();
$hourlyCounts[$label] = $count;
$hourStart = $hourEnd;
}
return response()->json([
'status_code' => 'SUCCESS',
'datasets' => [
[
'label' => $filter == 'yesterday'
? "Yesterday's Hourly Production Order Count"
: "Today's Hourly Production Order Count",
'data' => $hourlyCounts
]
]
], 200);
}
// Weekly or Monthly
if ($filter == 'this week') {
$startDate = now()->startOfWeek()->setTime(8, 0, 0);
$endDate = now()->endOfWeek()->addDay()->setTime(8, 0, 0);
$groupBy = "EXTRACT(DOW FROM $table.created_at)";
} else {
$startDate = now()->startOfMonth();
$endDate = now()->endOfMonth();
$groupBy = "FLOOR((EXTRACT(DAY FROM $table.created_at) - 1) / 7) + 1";
}
$query = DB::table($table)
->where('plant_id', $plant->id)
->where('line_id', $line->id)
->where('production_order', $orderVal)
->whereBetween('created_at', [$startDate, $endDate])
->selectRaw("$groupBy as group_key, COUNT(*) as total")
->groupByRaw("group_key")
->pluck('total', 'group_key')
->toArray();
if ($filter == 'this week') {
$labels = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];
$data = array_fill(0, 7, 0);
foreach ($query as $dow => $count) {
$data[$dow] = $count;
}
$orderedData = [
$data[1] ?? 0, $data[2] ?? 0, $data[3] ?? 0,
$data[4] ?? 0, $data[5] ?? 0, $data[6] ?? 0,
$data[0] ?? 0,
];
} else {
$weeksCount = ceil($endDate->day / 7);
$allWeeks = array_fill(1, $weeksCount, 0);
$data = array_replace($allWeeks, $query);
$labels = [];
for ($i = 1; $i <= $weeksCount; $i++) {
$weekStart = $startDate->copy()->addDays(($i - 1) * 7)->format('d M');
$weekEnd = $startDate->copy()->addDays($i * 7 - 1)->min($endDate)->format('d M');
$labels[] = "Week $i ($weekStart - $weekEnd)";
}
$orderedData = array_values($data);
}
return response()->json([
'status_code' => 'SUCCESS',
'datasets' => [
[
'label' => match ($filter) {
'this week' => $lineType == 'FG Line'
? "Daily Fg Production Order Count This Week"
: "Daily Production Order Count This Week",
'this month' => $lineType == 'FG Line'
? "Weekly Fg Production Order Count This Month"
: "Weekly Production Order Count This Month",
},
'data' => $orderedData
]
],
'labels' => $labels ?? []
], 200);
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
}
}

View File

@@ -30,9 +30,9 @@ class PalletController extends Controller
<style>
body { margin: 0; padding: 0; width: 60mm; height: 14mm; font-size: 10pt; font-family: DejaVu Sans, sans-serif; }
.sticker-table { width: 60mm; height: 14mm; border-collapse: collapse; }
.qr-cell { width: 14mm; text-align: left; vertical-align: middle; padding-left: 5mm; padding-top: 2mm; }
.text-cell { text-align: left; vertical-align: middle; font-size: 12pt; padding-left: 7mm; padding-top: 2mm; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-weight: bold; }
img.qr { width: 10mm; height: 10mm; display: block; }
.qr-cell { width: 14mm; text-align: left; vertical-align: middle; padding-left: 6mm; padding-top: 2mm; }
.text-cell { text-align: left; vertical-align: middle; font-size: 15pt; padding-left: 4mm; padding-top: 2mm; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-weight: bold; }
img.qr { width: 18mm; height: 18mm; display: block; }
</style>
</head>
<body>

View File

@@ -27,6 +27,126 @@ class StickerMasterController extends Controller
//
}
public function get_master_type(Request $request)
{
$expectedUser = env('API_AUTH_USER');
$expectedPw = env('API_AUTH_PW');
$header_auth = $request->header('Authorization');
$expectedToken = $expectedUser . ':' . $expectedPw;
if ("Bearer " . $expectedToken != $header_auth)
{
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Invalid authorization token!'
], 403);
}
$plantCode = $request->header('plant-code');
$itemCode = $request->header('item-code');
if ($plantCode == null || $plantCode == '')
{
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Plant code can't be empty!"
], 400);
}
else if (Str::length($plantCode) < 4 || !is_numeric($plantCode) || !preg_match('/^[1-9]\d{3,}$/', $plantCode))
{
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Invalid plant code found!"
], 400);
}
else if ($itemCode == null || $itemCode == '')
{
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Item Code can't be empty!"
], 400);
}
else if (Str::length($itemCode) < 6 || !ctype_alnum($itemCode))
{
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Invalid item code found!"
], 400);
}
$plant = Plant::where('code', $plantCode)->first();
if (!$plant) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Plant not found!"
], 400);
}
$plantId = $plant->id;
$item = Item::where('code', $itemCode)->first();
if (!$item)
{
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Item Code not found in item table!"
], 404);
}
$item = Item::where('plant_id', $plantId)->where('code', $itemCode)->first();
if (!$item)
{
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Item Code not found in item table for the plant : '$plant->name'!"
], 404);
}
$stickerMaster = StickerMaster::where('plant_id', $plantId)->where('item_id', $item->id)->first();
if (!$stickerMaster)
{
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Item Code not found in sticker master table for the plant : '$plant->name'!"
], 404);
}
$serial_number_motor = $stickerMaster->serial_number_motor ?? null;
$serial_number_pump = $stickerMaster->serial_number_pump ?? null;
if ($serial_number_motor != 1 && $serial_number_pump != 1) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "The Item Code '$itemCode' does not have serial pump or serial motor selected!"
], 400);
}
$serialInfo = [];
if ($serial_number_motor == 1 && $serial_number_pump == 1)
{
$serialInfo[] = 'Serial Pump';
}
else
{
if ($serial_number_motor == 1) {
$serialInfo[] = 'Serial Motor';
}
if ($serial_number_pump == 1) {
$serialInfo[] = 'Serial Pump';
}
}
$output = [
'status_code' => 'SUCCESS',
'status_description' => implode(', ', $serialInfo),
];
return response()->json($output, 200);
}
/**
* Display the specified resource.
*/

View File

@@ -175,6 +175,9 @@ class InvoiceDataTable extends Component
$this->completedInvoice = false;
$this->hasSearched = false;
$this->materialInvoice = false;
$this->dispatch('focus-capacitor-input');
}
public function cancelCapacitorInput()
@@ -339,6 +342,7 @@ class InvoiceDataTable extends Component
}
$this->showCapacitorInput = false;
$this->capacitorInput = '';
$this->dispatch('focus-serial-number');
}
public function render()

View File

@@ -0,0 +1,106 @@
<?php
namespace App\Livewire;
use App\Models\ProductionQuantity;
use App\Models\QualityValidation;
use Livewire\Component;
class ProductionSapData extends Component
{
public $plantId;
public $productionOrder;
public $items = [];
public bool $attempted = false;
public bool $refresh = false;
public $scanned_quantity;
protected $listeners = [
'loadItems',
'refreshed',
];
public function refreshed($plantId, $productionOrder)
{
$this->plantId = $plantId;
$this->productionOrder = $productionOrder;
$this->refresh = true;
$this->attempted = false;
if (!$plantId || !$productionOrder) {
$this->items = [];
return;
}
$this->items = ProductionQuantity::where('plant_id', $plantId)
->where('production_order', $productionOrder)
->get()
->map(function ($item) {
return [
'item_code' => optional($item->item)->code ?? 'N/A',
'serial_number' => $item->serial_number,
'created_at' => $item->created_at->format('Y-m-d H:i:s'),
'sap_status' => $item->sap_msg_status,
'sap_description' => $item->sap_msg_description,
];
})
->toArray();
$this->updateRowCount();
}
public function loadItems($plantId, $productionOrder)
{
$this->plantId = $plantId;
$this->productionOrder = $productionOrder;
$this->attempted = true;
$this->refresh = false;
if (!$plantId || !$productionOrder) {
$this->items = [];
return;
}
$this->items = ProductionQuantity::where('plant_id', $plantId)
->where('production_order', $productionOrder)
->get()
->map(function ($item) {
return [
'item_code' => optional($item->item)->code ?? 'N/A',
'serial_number' => $item->serial_number,
'created_at' => $item->created_at->format('Y-m-d H:i:s'),
'sap_status' => $item->sap_msg_status,
'sap_description' => $item->sap_msg_description,
];
})
->toArray();
$this->updateRowCount();
}
// Method to update row count based on scanned_quantity
public function updateRowCount()
{
$this->attempted = true;
// Ensure scanned_quantity is a valid number and doesn't exceed the available rows
if ($this->scanned_quantity > 0 && $this->scanned_quantity <= count($this->items)) {
$this->items = array_slice($this->items, 0, $this->scanned_quantity);
} else {
$this->scanned_quantity = count($this->items); // Reset to show all items if invalid quantity
}
$this->dispatch('updateScannedQuantity', $this->scanned_quantity);
}
public function render()
{
return view('livewire.production-sap-data');
}
}

105
app/Livewire/SapData.php Normal file
View File

@@ -0,0 +1,105 @@
<?php
namespace App\Livewire;
use App\Models\QualityValidation;
use Livewire\Component;
class SapData extends Component
{
public $plantId;
public $productionOrder;
public $items = [];
public bool $attempted = false;
public bool $refresh = false;
public $scanned_quantity;
protected $listeners = [
'loadItems',
'refreshed',
];
public function refreshed($plantId, $productionOrder)
{
$this->plantId = $plantId;
$this->productionOrder = $productionOrder;
$this->refresh = true;
$this->attempted = false;
if (!$plantId || !$productionOrder) {
$this->items = [];
return;
}
$this->items = QualityValidation::where('plant_id', $plantId)
->where('production_order', $productionOrder)
->get()
->map(function ($item) {
return [
'item_code' => optional($item->stickerMaster->item)->code ?? 'N/A',
'serial_number' => $item->serial_number,
'created_at' => $item->created_at->format('Y-m-d H:i:s'),
'sap_status' => $item->sap_msg_status,
'sap_description' => $item->sap_msg_description,
];
})
->toArray();
$this->updateRowCount();
}
public function loadItems($plantId, $productionOrder)
{
$this->plantId = $plantId;
$this->productionOrder = $productionOrder;
$this->attempted = true;
$this->refresh = false;
if (!$plantId || !$productionOrder) {
$this->items = [];
return;
}
$this->items = QualityValidation::where('plant_id', $plantId)
->where('production_order', $productionOrder)
->get()
->map(function ($item) {
return [
'item_code' => optional($item->stickerMaster->item)->code ?? 'N/A',
'serial_number' => $item->serial_number,
'created_at' => $item->created_at->format('Y-m-d H:i:s'),
'sap_status' => $item->sap_msg_status,
'sap_description' => $item->sap_msg_description,
];
})
->toArray();
$this->updateRowCount();
}
// Method to update row count based on scanned_quantity
public function updateRowCount()
{
$this->attempted = true;
// Ensure scanned_quantity is a valid number and doesn't exceed the available rows
if ($this->scanned_quantity > 0 && $this->scanned_quantity <= count($this->items)) {
$this->items = array_slice($this->items, 0, $this->scanned_quantity);
} else {
$this->scanned_quantity = count($this->items); // Reset to show all items if invalid quantity
}
$this->dispatch('updateScannedQuantity', $this->scanned_quantity);
}
public function render()
{
return view('livewire.sap-data');
}
}

View File

@@ -12,6 +12,7 @@ class AlertMailRule extends Model
protected $fillable = [
'module',
'plant',
'rule_name',
'email',
'schedule_type',
@@ -21,8 +22,8 @@ class AlertMailRule extends Model
'updated_by',
];
public function plant(): BelongsTo
{
return $this->belongsTo(Plant::class);
}
// public function plant(): BelongsTo
// {
// return $this->belongsTo(Plant::class);
// }
}

27
app/Models/MfmMeter.php Normal file
View File

@@ -0,0 +1,27 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class MfmMeter extends Model
{
use SoftDeletes;
protected $fillable = [
'plant_id',
'sequence',
'name',
'created_at',
'updated_at',
'created_by',
];
public function plant(): BelongsTo
{
return $this->belongsTo(Plant::class);
}
}

View File

@@ -0,0 +1,36 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class MfmParameter extends Model
{
use SoftDeletes;
protected $fillable = [
'plant_id',
'mfm_meter_id',
'name',
'register_id',
'identifier',
'byte_to_convert',
'type_to_convert',
'decimal_to_display',
'created_at',
'updated_at',
'created_by',
];
public function plant(): BelongsTo
{
return $this->belongsTo(Plant::class);
}
public function mfmMeter(): BelongsTo
{
return $this->belongsTo(MfmMeter::class, 'mfm_meter_id');
}
}

51
app/Models/MfmReading.php Normal file
View File

@@ -0,0 +1,51 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class MfmReading extends Model
{
use SoftDeletes;
protected $fillable = [
'plant_id',
'mfm_meter_id',
'apparent_energy_received',
'reactive_energy_received',
'active_energy_received',
'active_power_r',
'active_power_y',
'active_power_b',
'active_power_total',
'voltage_ry',
'voltage_yb',
'voltage_br',
'current_r',
'current_y',
'current_b',
'current_n',
'voltage_r_n',
'voltage_y_n',
'voltage_b_n',
'frequency',
'power_factor_r',
'power_factor_y',
'power_factor_b',
'power_factor_total',
'created_at',
'updated_at',
];
public function plant(): BelongsTo
{
return $this->belongsTo(Plant::class);
}
public function mfmMeter(): BelongsTo
{
return $this->belongsTo(MfmMeter::class, 'mfm_meter_id');
}
}

19
app/Models/ModuleList.php Normal file
View File

@@ -0,0 +1,19 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class ModuleList extends Model
{
use SoftDeletes;
protected $fillable = [
'module_name',
'dashboard_name',
'filter_name',
'created_by',
'updated_by',
];
}

View File

@@ -0,0 +1,31 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class TempLiveReading extends Model
{
use SoftDeletes;
protected $fillable = [
'plant_id',
'mfm_meter_id',
'register_data',
'created_at',
'updated_at',
'created_by',
];
public function plant(): BelongsTo
{
return $this->belongsTo(Plant::class);
}
public function mfmMeter(): BelongsTo
{
return $this->belongsTo(MfmMeter::class, 'mfm_meter_id');
}
}

View File

@@ -0,0 +1,106 @@
<?php
namespace App\Policies;
use Illuminate\Auth\Access\Response;
use App\Models\AlertMailRule;
use App\Models\User;
class AlertMailRulePolicy
{
/**
* Determine whether the user can view any models.
*/
public function viewAny(User $user): bool
{
return $user->checkPermissionTo('view-any AlertMailRule');
}
/**
* Determine whether the user can view the model.
*/
public function view(User $user, AlertMailRule $alertmailrule): bool
{
return $user->checkPermissionTo('view AlertMailRule');
}
/**
* Determine whether the user can create models.
*/
public function create(User $user): bool
{
return $user->checkPermissionTo('create AlertMailRule');
}
/**
* Determine whether the user can update the model.
*/
public function update(User $user, AlertMailRule $alertmailrule): bool
{
return $user->checkPermissionTo('update AlertMailRule');
}
/**
* Determine whether the user can delete the model.
*/
public function delete(User $user, AlertMailRule $alertmailrule): bool
{
return $user->checkPermissionTo('delete AlertMailRule');
}
/**
* Determine whether the user can delete any models.
*/
public function deleteAny(User $user): bool
{
return $user->checkPermissionTo('delete-any AlertMailRule');
}
/**
* Determine whether the user can restore the model.
*/
public function restore(User $user, AlertMailRule $alertmailrule): bool
{
return $user->checkPermissionTo('restore AlertMailRule');
}
/**
* Determine whether the user can restore any models.
*/
public function restoreAny(User $user): bool
{
return $user->checkPermissionTo('restore-any AlertMailRule');
}
/**
* Determine whether the user can replicate the model.
*/
public function replicate(User $user, AlertMailRule $alertmailrule): bool
{
return $user->checkPermissionTo('replicate AlertMailRule');
}
/**
* Determine whether the user can reorder the models.
*/
public function reorder(User $user): bool
{
return $user->checkPermissionTo('reorder AlertMailRule');
}
/**
* Determine whether the user can permanently delete the model.
*/
public function forceDelete(User $user, AlertMailRule $alertmailrule): bool
{
return $user->checkPermissionTo('force-delete AlertMailRule');
}
/**
* Determine whether the user can permanently delete any models.
*/
public function forceDeleteAny(User $user): bool
{
return $user->checkPermissionTo('force-delete-any AlertMailRule');
}
}

View File

@@ -0,0 +1,106 @@
<?php
namespace App\Policies;
use Illuminate\Auth\Access\Response;
use App\Models\MfmMeter;
use App\Models\User;
class MfmMeterPolicy
{
/**
* Determine whether the user can view any models.
*/
public function viewAny(User $user): bool
{
return $user->checkPermissionTo('view-any MfmMeter');
}
/**
* Determine whether the user can view the model.
*/
public function view(User $user, MfmMeter $mfmmeter): bool
{
return $user->checkPermissionTo('view MfmMeter');
}
/**
* Determine whether the user can create models.
*/
public function create(User $user): bool
{
return $user->checkPermissionTo('create MfmMeter');
}
/**
* Determine whether the user can update the model.
*/
public function update(User $user, MfmMeter $mfmmeter): bool
{
return $user->checkPermissionTo('update MfmMeter');
}
/**
* Determine whether the user can delete the model.
*/
public function delete(User $user, MfmMeter $mfmmeter): bool
{
return $user->checkPermissionTo('delete MfmMeter');
}
/**
* Determine whether the user can delete any models.
*/
public function deleteAny(User $user): bool
{
return $user->checkPermissionTo('delete-any MfmMeter');
}
/**
* Determine whether the user can restore the model.
*/
public function restore(User $user, MfmMeter $mfmmeter): bool
{
return $user->checkPermissionTo('restore MfmMeter');
}
/**
* Determine whether the user can restore any models.
*/
public function restoreAny(User $user): bool
{
return $user->checkPermissionTo('restore-any MfmMeter');
}
/**
* Determine whether the user can replicate the model.
*/
public function replicate(User $user, MfmMeter $mfmmeter): bool
{
return $user->checkPermissionTo('replicate MfmMeter');
}
/**
* Determine whether the user can reorder the models.
*/
public function reorder(User $user): bool
{
return $user->checkPermissionTo('reorder MfmMeter');
}
/**
* Determine whether the user can permanently delete the model.
*/
public function forceDelete(User $user, MfmMeter $mfmmeter): bool
{
return $user->checkPermissionTo('force-delete MfmMeter');
}
/**
* Determine whether the user can permanently delete any models.
*/
public function forceDeleteAny(User $user): bool
{
return $user->checkPermissionTo('force-delete-any MfmMeter');
}
}

View File

@@ -0,0 +1,106 @@
<?php
namespace App\Policies;
use Illuminate\Auth\Access\Response;
use App\Models\MfmParameter;
use App\Models\User;
class MfmParameterPolicy
{
/**
* Determine whether the user can view any models.
*/
public function viewAny(User $user): bool
{
return $user->checkPermissionTo('view-any MfmParameter');
}
/**
* Determine whether the user can view the model.
*/
public function view(User $user, MfmParameter $mfmparameter): bool
{
return $user->checkPermissionTo('view MfmParameter');
}
/**
* Determine whether the user can create models.
*/
public function create(User $user): bool
{
return $user->checkPermissionTo('create MfmParameter');
}
/**
* Determine whether the user can update the model.
*/
public function update(User $user, MfmParameter $mfmparameter): bool
{
return $user->checkPermissionTo('update MfmParameter');
}
/**
* Determine whether the user can delete the model.
*/
public function delete(User $user, MfmParameter $mfmparameter): bool
{
return $user->checkPermissionTo('delete MfmParameter');
}
/**
* Determine whether the user can delete any models.
*/
public function deleteAny(User $user): bool
{
return $user->checkPermissionTo('delete-any MfmParameter');
}
/**
* Determine whether the user can restore the model.
*/
public function restore(User $user, MfmParameter $mfmparameter): bool
{
return $user->checkPermissionTo('restore MfmParameter');
}
/**
* Determine whether the user can restore any models.
*/
public function restoreAny(User $user): bool
{
return $user->checkPermissionTo('restore-any MfmParameter');
}
/**
* Determine whether the user can replicate the model.
*/
public function replicate(User $user, MfmParameter $mfmparameter): bool
{
return $user->checkPermissionTo('replicate MfmParameter');
}
/**
* Determine whether the user can reorder the models.
*/
public function reorder(User $user): bool
{
return $user->checkPermissionTo('reorder MfmParameter');
}
/**
* Determine whether the user can permanently delete the model.
*/
public function forceDelete(User $user, MfmParameter $mfmparameter): bool
{
return $user->checkPermissionTo('force-delete MfmParameter');
}
/**
* Determine whether the user can permanently delete any models.
*/
public function forceDeleteAny(User $user): bool
{
return $user->checkPermissionTo('force-delete-any MfmParameter');
}
}

View File

@@ -0,0 +1,106 @@
<?php
namespace App\Policies;
use Illuminate\Auth\Access\Response;
use App\Models\MfmReading;
use App\Models\User;
class MfmReadingPolicy
{
/**
* Determine whether the user can view any models.
*/
public function viewAny(User $user): bool
{
return $user->checkPermissionTo('view-any MfmReading');
}
/**
* Determine whether the user can view the model.
*/
public function view(User $user, MfmReading $mfmreading): bool
{
return $user->checkPermissionTo('view MfmReading');
}
/**
* Determine whether the user can create models.
*/
public function create(User $user): bool
{
return $user->checkPermissionTo('create MfmReading');
}
/**
* Determine whether the user can update the model.
*/
public function update(User $user, MfmReading $mfmreading): bool
{
return $user->checkPermissionTo('update MfmReading');
}
/**
* Determine whether the user can delete the model.
*/
public function delete(User $user, MfmReading $mfmreading): bool
{
return $user->checkPermissionTo('delete MfmReading');
}
/**
* Determine whether the user can delete any models.
*/
public function deleteAny(User $user): bool
{
return $user->checkPermissionTo('delete-any MfmReading');
}
/**
* Determine whether the user can restore the model.
*/
public function restore(User $user, MfmReading $mfmreading): bool
{
return $user->checkPermissionTo('restore MfmReading');
}
/**
* Determine whether the user can restore any models.
*/
public function restoreAny(User $user): bool
{
return $user->checkPermissionTo('restore-any MfmReading');
}
/**
* Determine whether the user can replicate the model.
*/
public function replicate(User $user, MfmReading $mfmreading): bool
{
return $user->checkPermissionTo('replicate MfmReading');
}
/**
* Determine whether the user can reorder the models.
*/
public function reorder(User $user): bool
{
return $user->checkPermissionTo('reorder MfmReading');
}
/**
* Determine whether the user can permanently delete the model.
*/
public function forceDelete(User $user, MfmReading $mfmreading): bool
{
return $user->checkPermissionTo('force-delete MfmReading');
}
/**
* Determine whether the user can permanently delete any models.
*/
public function forceDeleteAny(User $user): bool
{
return $user->checkPermissionTo('force-delete-any MfmReading');
}
}

View File

@@ -0,0 +1,106 @@
<?php
namespace App\Policies;
use Illuminate\Auth\Access\Response;
use App\Models\ModuleList;
use App\Models\User;
class ModuleListPolicy
{
/**
* Determine whether the user can view any models.
*/
public function viewAny(User $user): bool
{
return $user->checkPermissionTo('view-any ModuleList');
}
/**
* Determine whether the user can view the model.
*/
public function view(User $user, ModuleList $modulelist): bool
{
return $user->checkPermissionTo('view ModuleList');
}
/**
* Determine whether the user can create models.
*/
public function create(User $user): bool
{
return $user->checkPermissionTo('create ModuleList');
}
/**
* Determine whether the user can update the model.
*/
public function update(User $user, ModuleList $modulelist): bool
{
return $user->checkPermissionTo('update ModuleList');
}
/**
* Determine whether the user can delete the model.
*/
public function delete(User $user, ModuleList $modulelist): bool
{
return $user->checkPermissionTo('delete ModuleList');
}
/**
* Determine whether the user can delete any models.
*/
public function deleteAny(User $user): bool
{
return $user->checkPermissionTo('delete-any ModuleList');
}
/**
* Determine whether the user can restore the model.
*/
public function restore(User $user, ModuleList $modulelist): bool
{
return $user->checkPermissionTo('restore ModuleList');
}
/**
* Determine whether the user can restore any models.
*/
public function restoreAny(User $user): bool
{
return $user->checkPermissionTo('restore-any ModuleList');
}
/**
* Determine whether the user can replicate the model.
*/
public function replicate(User $user, ModuleList $modulelist): bool
{
return $user->checkPermissionTo('replicate ModuleList');
}
/**
* Determine whether the user can reorder the models.
*/
public function reorder(User $user): bool
{
return $user->checkPermissionTo('reorder ModuleList');
}
/**
* Determine whether the user can permanently delete the model.
*/
public function forceDelete(User $user, ModuleList $modulelist): bool
{
return $user->checkPermissionTo('force-delete ModuleList');
}
/**
* Determine whether the user can permanently delete any models.
*/
public function forceDeleteAny(User $user): bool
{
return $user->checkPermissionTo('force-delete-any ModuleList');
}
}

View File

@@ -0,0 +1,106 @@
<?php
namespace App\Policies;
use Illuminate\Auth\Access\Response;
use App\Models\TempLiveReading;
use App\Models\User;
class TempLiveReadingPolicy
{
/**
* Determine whether the user can view any models.
*/
public function viewAny(User $user): bool
{
return $user->checkPermissionTo('view-any TempLiveReading');
}
/**
* Determine whether the user can view the model.
*/
public function view(User $user, TempLiveReading $templivereading): bool
{
return $user->checkPermissionTo('view TempLiveReading');
}
/**
* Determine whether the user can create models.
*/
public function create(User $user): bool
{
return $user->checkPermissionTo('create TempLiveReading');
}
/**
* Determine whether the user can update the model.
*/
public function update(User $user, TempLiveReading $templivereading): bool
{
return $user->checkPermissionTo('update TempLiveReading');
}
/**
* Determine whether the user can delete the model.
*/
public function delete(User $user, TempLiveReading $templivereading): bool
{
return $user->checkPermissionTo('delete TempLiveReading');
}
/**
* Determine whether the user can delete any models.
*/
public function deleteAny(User $user): bool
{
return $user->checkPermissionTo('delete-any TempLiveReading');
}
/**
* Determine whether the user can restore the model.
*/
public function restore(User $user, TempLiveReading $templivereading): bool
{
return $user->checkPermissionTo('restore TempLiveReading');
}
/**
* Determine whether the user can restore any models.
*/
public function restoreAny(User $user): bool
{
return $user->checkPermissionTo('restore-any TempLiveReading');
}
/**
* Determine whether the user can replicate the model.
*/
public function replicate(User $user, TempLiveReading $templivereading): bool
{
return $user->checkPermissionTo('replicate TempLiveReading');
}
/**
* Determine whether the user can reorder the models.
*/
public function reorder(User $user): bool
{
return $user->checkPermissionTo('reorder TempLiveReading');
}
/**
* Determine whether the user can permanently delete the model.
*/
public function forceDelete(User $user, TempLiveReading $templivereading): bool
{
return $user->checkPermissionTo('force-delete TempLiveReading');
}
/**
* Determine whether the user can permanently delete any models.
*/
public function forceDeleteAny(User $user): bool
{
return $user->checkPermissionTo('force-delete-any TempLiveReading');
}
}

View File

@@ -0,0 +1,33 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
$sql1 = <<<'SQL'
ALTER TABLE alert_mail_rules
ADD plant BIGINT NOT NULL DEFAULT (0);
SQL;
DB::statement($sql1);
}
/**
* Reverse the migrations.
*/
public function down(): void
{
// Schema::table('alert_mail_rules', function (Blueprint $table) {
// //
// });
}
};

View File

@@ -0,0 +1,44 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
$sql = <<<'SQL'
CREATE TABLE module_lists (
id BIGINT GENERATED always AS IDENTITY PRIMARY KEY,
module_name TEXT NOT NULL,
dashboard_name TEXT NOT NULL,
filter_name TEXT NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW(),
deleted_at TIMESTAMP,
created_by TEXT NULL,
updated_by TEXT NULL,
UNIQUE (module_name, dashboard_name, filter_name)
);
SQL;
DB::statement($sql);
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('module_lists');
}
};

View File

@@ -0,0 +1,45 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
$sql = <<<'SQL'
CREATE TABLE mfm_meters (
id BIGINT GENERATED always AS IDENTITY PRIMARY KEY,
plant_id BIGINT NOT NULL,
sequence TEXT NOT NULL,
name TEXT NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW(),
deleted_at TIMESTAMP,
created_by TEXT NULL,
UNIQUE (plant_id, sequence),
UNIQUE (plant_id, name),
FOREIGN KEY (plant_id) REFERENCES plants (id)
);
SQL;
DB::statement($sql);
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('mfm_meters');
}
};

View File

@@ -0,0 +1,45 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
$sql = <<<'SQL'
CREATE TABLE temp_live_readings (
id BIGINT GENERATED always AS IDENTITY PRIMARY KEY,
plant_id BIGINT NOT NULL,
mfm_meter_id BIGINT NOT NULL,
register_data TEXT NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW(),
deleted_at TIMESTAMP,
created_by TEXT NULL,
UNIQUE (created_at, mfm_meter_id),
FOREIGN KEY (plant_id) REFERENCES plants (id),
FOREIGN KEY (mfm_meter_id) REFERENCES mfm_meters (id)
);
SQL;
DB::statement($sql);
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('temp_live_readings');
}
};

View File

@@ -0,0 +1,49 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
$sql = <<<'SQL'
CREATE TABLE mfm_parameters (
id BIGINT GENERATED always AS IDENTITY PRIMARY KEY,
plant_id BIGINT NOT NULL,
mfm_meter_id BIGINT NOT NULL,
name TEXT NOT NULL,
register_id TEXT NOT NULL,
identifier TEXT NOT NULL,
byte_to_convert INT NOT NULL,
type_to_convert TEXT NOT NULL,
decimal_to_display INT NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW(),
deleted_at TIMESTAMP,
UNIQUE (plant_id, mfm_meter_id, name),
UNIQUE (plant_id, mfm_meter_id, register_id),
FOREIGN KEY (plant_id) REFERENCES plants (id),
FOREIGN KEY (mfm_meter_id) REFERENCES mfm_meters (id)
);
SQL;
DB::statement($sql);
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('mfm_parameters');
}
};

View File

@@ -0,0 +1,65 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
$sql = <<<'SQL'
CREATE TABLE mfm_readings (
id BIGINT GENERATED always AS IDENTITY PRIMARY KEY,
plant_id BIGINT NOT NULL,
mfm_meter_id BIGINT NOT NULL,
apparent_energy_received TEXT DEFAULT NULL,
reactive_energy_received TEXT DEFAULT NULL,
active_energy_received TEXT DEFAULT NULL,
active_power_r TEXT DEFAULT NULL,
active_power_y TEXT DEFAULT NULL,
active_power_b TEXT DEFAULT NULL,
active_power_total TEXT DEFAULT NULL,
voltage_ry TEXT DEFAULT NULL,
voltage_yb TEXT DEFAULT NULL,
voltage_br TEXT DEFAULT NULL,
current_r TEXT DEFAULT NULL,
current_y TEXT DEFAULT NULL,
current_b TEXT DEFAULT NULL,
current_n TEXT DEFAULT NULL,
voltage_r_n TEXT DEFAULT NULL,
voltage_y_n TEXT DEFAULT NULL,
voltage_b_n TEXT DEFAULT NULL,
frequency TEXT DEFAULT NULL,
power_factor_r TEXT DEFAULT NULL,
power_factor_y TEXT DEFAULT NULL,
power_factor_b TEXT DEFAULT NULL,
power_factor_total TEXT DEFAULT NULL,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW(),
deleted_at TIMESTAMP,
UNIQUE (plant_id, created_at, mfm_meter_id),
FOREIGN KEY (plant_id) REFERENCES plants (id),
FOREIGN KEY (mfm_meter_id) REFERENCES mfm_meters (id)
);
SQL;
DB::statement($sql);
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('mfm_readings');
}
};

View File

@@ -124,6 +124,12 @@ class PermissionSeeder extends Seeder
Permission::updateOrCreate(['name' => 'create serial locator page']);
Permission::updateOrCreate(['name' => 'view reprint pallet number']);
Permission::updateOrCreate(['name' => 'view import mfm parameter']);
Permission::updateOrCreate(['name' => 'view export mfm parameter']);
Permission::updateOrCreate(['name' => 'view import mfm meter']);
Permission::updateOrCreate(['name' => 'view export mfm meter']);
//Dashboard Permissions
Permission::updateOrCreate(['name' => 'view invoice dashboard']); //invoice dashboard
Permission::updateOrCreate(['name' => 'view production hourly count dashboard']); //hourly production
@@ -134,6 +140,8 @@ class PermissionSeeder extends Seeder
Permission::updateOrCreate(['name' => 'view guard patrol day count dashboard']);
Permission::updateOrCreate(['name' => 'view guard patrol hourly count dashboard']);
Permission::updateOrCreate(['name' => 'view invoice serial quantity dashboard']);
Permission::updateOrCreate(['name' => 'create production sticker reprint page']);
//Send To Sap Permissions
Permission::updateOrCreate(['name' => 'view quality data send to sap']);

View File

@@ -0,0 +1,21 @@
<x-filament-panels::page>
{{ $this->form }}
<style>
.align-to-input {
align-self: center;
margin-top: 8mm; /* or 0.3rem */
}
</style>
<!-- Label for Quality Data Table -->
{{-- <div class="mb-4">
<h2 class="text-xl font-semibold text-gray-800">Quality Data Table</h2>
</div> --}}
<div class="bg-white shadow rounded-xl p-4 mt-6">
<livewire:sap-data />
</div>
</x-filament-panels::page>

View File

@@ -0,0 +1,22 @@
<x-filament-panels::page>
{{ $this->form }}
<style>
.align-to-input {
align-self: center;
margin-top: 8mm; /* or 0.3rem */
}
</style>
<!-- Label for Quality Data Table -->
{{-- <div class="mb-4">
<h2 class="text-xl font-semibold text-gray-800">Quality Data Table</h2>
</div> --}}
<div class="bg-white shadow rounded-xl p-4 mt-6">
<livewire:production-sap-data />
</div>
</x-filament-panels::page>

View File

@@ -7,10 +7,55 @@
{{ $this->form }}
</div>
{{-- <input
type="text"
id="qr-scan-input"
class="border border-gray-300 rounded px-4 py-2 text-sm w-full"
placeholder="Scan QR Code & Press Enter"
autocomplete="off"
autofocus
/> --}}
<div class="mb-4">
<label for="qr-scan-input" class="block text-sm font-medium text-gray-700 mb-2">
SCAN QR CODE
</label>
<input
type="text"
id="qr-scan-input"
class="border border-gray-300 rounded px-4 py-2 text-sm w-full"
placeholder="Scan QR Code & Press Enter"
autocomplete="off"
autofocus
/>
</div>
@push('scripts')
<script>
document.addEventListener('DOMContentLoaded', function () {
const scanInput = document.getElementById('qr-scan-input');
if (!scanInput) return;
scanInput.addEventListener('keydown', function (event) {
if (event.key === 'Enter') {
event.preventDefault();
const value = scanInput.value.trim();
if (value !== '') {
Livewire.dispatch('handleQrScan', { value: value });
scanInput.value = '';
}
}
});
});
</script>
@endpush
{{-- Render the chart widget below the form --}}
<div class="mt-6">
@livewire(\App\Filament\Widgets\ItemOverview::class)
</div>
</div>

View File

@@ -159,3 +159,28 @@
input.focus(); // Set focus to the input field
});
</script> --}}
<script>
window.addEventListener('focus-capacitor-input', () => {
setTimeout(() => {
const input = document.getElementById('capacitorInput');
if (input) {
input.focus();
input.select();
}
}, 50);
});
window.addEventListener('focus-serial-number', () => {
setTimeout(() => {
const container = document.getElementById('serial_number_input');
const input = container?.querySelector('input'); // gets the actual input inside
if (input) {
input.focus();
input.select();
}
}, 100);
});
</script>

View File

@@ -0,0 +1,40 @@
<div class="w-full px-2 py-2">
<table class="w-full divide-y divide-gray-200 border-1 rounded-lg overflow-hidden">
<thead class="bg-gray-100">
<tr>
<th class="px-2 py-2 text-center border text-xs font-bold text-gray-700 uppercase tracking-wider">No</th>
<th class="px-2 py-2 text-center border text-xs font-bold text-gray-700 uppercase tracking-wider">Item Code</th>
<th class="px-2 py-2 text-center border text-xs font-bold text-gray-700 uppercase tracking-wider">Serial Number</th>
<th class="px-2 py-2 text-center border text-xs font-bold text-gray-700 uppercase tracking-wider">Created At</th>
<th class="px-2 py-2 text-center border text-xs font-bold text-gray-700 uppercase tracking-wider">SAP Status</th>
<th class="px-2 py-2 text-center border text-xs font-bold text-gray-700 uppercase tracking-wider">SAP Description</th>
</tr>
</thead>
<tbody class="bg-white divide-y divide-gray-200">
@forelse($items as $index => $item)
<tr>
<td class="px-3 py-2 border text-center text-xs whitespace-nowrap">{{ $index + 1 }}</td>
<td class="px-3 py-2 border text-center text-xs whitespace-nowrap">{{ $item['item_code'] }}</td>
<td class="px-3 py-2 border text-center text-xs whitespace-nowrap">{{ $item['serial_number'] }}</td>
<td class="px-3 py-2 border text-center text-xs whitespace-nowrap">{{ $item['created_at'] }}</td>
<td class="px-3 py-2 border text-center text-xs whitespace-nowrap">{{ $item['sap_status'] }}</td>
<td class="px-3 py-2 border text-center text-xs whitespace-nowrap">{{ $item['sap_description'] }}</td>
</tr>
@empty
@if ($attempted)
<tr>
<td colspan="6" class="px-3 py-4 border text-center text-sm text-gray-500">
No data available for the selected plant and production order!
</td>
</tr>
@elseif ($refresh)
<tr>
<td colspan="6" class="px-3 py-4 border text-center text-sm text-gray-500">
Scan the valid production order and press enter!
</td>
</tr>
@endif
@endforelse
</tbody>
</table>
</div>

Some files were not shown because too many files have changed in this diff Show More