63 Commits

Author SHA1 Message Date
5bc51fa35b Merge pull request 'Chnaged logic in import transit mail' (#780) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 16s
Reviewed-on: #780
2026-06-19 11:00:31 +00:00
dhanabalan
b069f3dbe7 Chnaged logic in import transit mail
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 17s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 18s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 15s
Laravel Larastan / larastan (pull_request) Failing after 40s
Laravel Pint / pint (pull_request) Successful in 1m52s
2026-06-19 16:30:14 +05:30
4bebf31600 Merge pull request 'ranjith-dev' (#779) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 28s
Reviewed-on: #779
2026-06-19 10:54:57 +00:00
dhanabalan
c307d5bc6a Added options in remark and i make text input for status
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 18s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 17s
Laravel Pint / pint (pull_request) Successful in 1m48s
Laravel Larastan / larastan (pull_request) Failing after 4m27s
2026-06-19 16:22:08 +05:30
dhanabalan
99cb1eb7a0 Updated warning label
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 16s
2026-06-19 15:23:49 +05:30
3bdd7e0e73 Merge pull request 'Added na radio option in quality validation' (#778) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 30s
Reviewed-on: #778
2026-06-19 09:25:26 +00:00
dhanabalan
90876dda8d Added na radio option in quality validation
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 17s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 20s
Laravel Pint / pint (pull_request) Successful in 1m52s
Laravel Larastan / larastan (pull_request) Failing after 3m46s
2026-06-19 14:55:01 +05:30
b1b66b9aa8 Merge pull request 'Swapped column of remark and status column in import transit mail' (#777) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 41s
Reviewed-on: #777
2026-06-19 08:57:39 +00:00
dhanabalan
dc732016eb Swapped column of remark and status column in import transit mail
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 17s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 21s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 16s
Laravel Pint / pint (pull_request) Successful in 2m18s
Laravel Larastan / larastan (pull_request) Failing after 3m57s
2026-06-19 14:27:19 +05:30
64c5b87dee Merge pull request 'ranjith-dev' (#776) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 21s
Reviewed-on: #776
2026-06-18 15:50:01 +00:00
dhanabalan
16e4ce43bb Updated invoice_quantity value to trace scanned and pending quantity for the item code in livewire and blade file
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 20s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 19s
Laravel Pint / pint (pull_request) Successful in 2m48s
Laravel Larastan / larastan (pull_request) Failing after 3m58s
2026-06-18 21:18:53 +05:30
dhanabalan
f82c3fe390 Updated invoice_quantity value to trace scanned and pending quantity for the item code in create page
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
2026-06-18 21:17:06 +05:30
dhanabalan
8efd64545d Added invoice_quantity column in model
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 17s
2026-06-18 21:13:33 +05:30
dhanabalan
f0e218d279 Added invoice_quantity column in migration 2026-06-18 21:12:32 +05:30
9e13a120db Merge pull request 'changed logic in panel' (#775) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 24s
Reviewed-on: #775
2026-06-18 12:23:37 +00:00
dhanabalan
d756177bd9 changed logic in panel
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 36s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 25s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 15s
Laravel Pint / pint (pull_request) Successful in 1m47s
Laravel Larastan / larastan (pull_request) Failing after 3m12s
2026-06-18 17:53:14 +05:30
6169625b67 Merge pull request 'removed unwanted logic in panel box validation' (#774) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 25s
Reviewed-on: #774
2026-06-18 12:20:37 +00:00
dhanabalan
30ac265f71 removed unwanted logic in panel box validation
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 16s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 17s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 14s
Laravel Pint / pint (pull_request) Successful in 1m50s
Laravel Larastan / larastan (pull_request) Failing after 3m36s
2026-06-18 17:50:22 +05:30
fd73596c66 Merge pull request 'Chnaged schedule time of import transit mail' (#773) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 32s
Reviewed-on: #773
2026-06-18 12:14:15 +00:00
dhanabalan
9cf817e304 Chnaged schedule time of import transit mail
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 16s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 18s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 14s
Laravel Pint / pint (pull_request) Successful in 1m53s
Laravel Larastan / larastan (pull_request) Failing after 4m0s
2026-06-18 17:44:00 +05:30
9eeec6b3d2 Merge pull request 'Added logic in panel box' (#772) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 24s
Reviewed-on: #772
2026-06-18 11:45:16 +00:00
dhanabalan
b0f13d9b57 Added logic in panel box
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 16s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 18s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 14s
Laravel Pint / pint (pull_request) Successful in 1m47s
Laravel Larastan / larastan (pull_request) Failing after 3m15s
2026-06-18 17:15:01 +05:30
8385065c6c Merge pull request 'Issue solved in production characteristics' (#771) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 1m13s
Reviewed-on: #771
2026-06-18 11:17:06 +00:00
dhanabalan
8cb76196bc Issue solved in production characteristics
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 16s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 18s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 14s
Laravel Pint / pint (pull_request) Successful in 1m49s
Laravel Larastan / larastan (pull_request) Failing after 3m49s
2026-06-18 16:46:52 +05:30
abdfd362cc Merge pull request 'Solved issue in panel box validation' (#770) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 28s
Reviewed-on: #770
2026-06-18 10:59:39 +00:00
dhanabalan
c1f5d232ac Solved issue in panel box validation
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 16s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 17s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 15s
Laravel Pint / pint (pull_request) Successful in 1m43s
Laravel Larastan / larastan (pull_request) Failing after 3m29s
2026-06-18 16:29:26 +05:30
c07ad779a5 Merge pull request 'Added logic is in production characteristics page' (#769) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 23s
Reviewed-on: #769
2026-06-18 10:44:29 +00:00
dhanabalan
be4611d863 Added logic is in production characteristics page
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 16s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 16s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 14s
Laravel Pint / pint (pull_request) Successful in 1m43s
Laravel Larastan / larastan (pull_request) Failing after 3m29s
2026-06-18 16:14:17 +05:30
aa2a8cc6e9 Merge pull request 'Added logic in panel check list livewire page' (#768) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 20s
Reviewed-on: #768
2026-06-18 10:30:29 +00:00
dhanabalan
4301b4b19a Added logic in panel check list livewire page
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 16s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 19s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 13s
Laravel Larastan / larastan (pull_request) Failing after 33s
Laravel Pint / pint (pull_request) Successful in 3m29s
2026-06-18 16:00:13 +05:30
fb29da0bdd Merge pull request 'Added logic in guard patrol entry page' (#767) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 1m19s
Reviewed-on: #767
2026-06-18 09:30:30 +00:00
dhanabalan
82cfd81a8a Added logic in guard patrol entry page
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 17s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 17s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 21s
Laravel Pint / pint (pull_request) Successful in 1m59s
Laravel Larastan / larastan (pull_request) Failing after 4m58s
2026-06-18 15:00:11 +05:30
fabda51ef7 Merge pull request 'Added created by column in check panel list' (#766) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 21s
Reviewed-on: #766
2026-06-18 07:08:24 +00:00
dhanabalan
687f4367c4 Added created by column in check panel list
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 19s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 16s
Laravel Pint / pint (pull_request) Successful in 1m49s
Laravel Larastan / larastan (pull_request) Failing after 3m19s
2026-06-18 12:38:06 +05:30
9a54308441 Merge pull request 'ranjith-dev' (#765) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 18s
Reviewed-on: #765
2026-06-18 06:51:04 +00:00
dhanabalan
18cd1938a5 Added panel check list livewire file
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 17s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 20s
Laravel Pint / pint (pull_request) Successful in 3m23s
Laravel Larastan / larastan (pull_request) Failing after 3m44s
2026-06-18 12:20:23 +05:30
dhanabalan
66a35d2796 Added panel checklist wrapper blade file
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
2026-06-18 12:18:36 +05:30
dhanabalan
3e8ab512d6 Added panel box validation policy file
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
2026-06-18 12:17:58 +05:30
dhanabalan
fde2208c85 Added panel box validation resource pages
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
2026-06-18 12:15:18 +05:30
dhanabalan
c99aea0d3a Added panel box validation model file
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
2026-06-18 12:13:23 +05:30
dhanabalan
f7e5144484 Added panel box validation migration file
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
2026-06-18 12:12:32 +05:30
d61bcf4f6d Merge pull request 'Added filter logic in line resource page' (#764) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 17s
Reviewed-on: #764
2026-06-18 03:12:38 +00:00
dhanabalan
58bfd4cbf8 Added filter logic in line resource page
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 17s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 21s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 14s
Laravel Pint / pint (pull_request) Successful in 6m51s
Laravel Larastan / larastan (pull_request) Failing after 8m34s
2026-06-18 08:42:22 +05:30
bd722da07b Merge pull request 'Added logic to show only in time records in visiotr entries' (#763) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
Reviewed-on: #763
2026-06-17 12:04:17 +00:00
dhanabalan
a5f1432bfd Added logic to show only in time records in visiotr entries
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 25s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 28s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 20s
Laravel Larastan / larastan (pull_request) Failing after 2m57s
Laravel Pint / pint (pull_request) Successful in 3m47s
2026-06-17 17:34:00 +05:30
20583ee55b Merge pull request 'Change import transit time for mail' (#762) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #762
2026-06-17 12:01:36 +00:00
dhanabalan
02db70c0bd Change import transit time for mail
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 18s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 20s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 15s
Laravel Pint / pint (pull_request) Successful in 2m23s
Laravel Larastan / larastan (pull_request) Failing after 4m3s
2026-06-17 17:31:20 +05:30
c81769aeae Merge pull request 'Added filter logic in import transit resource page' (#761) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 23s
Reviewed-on: #761
2026-06-17 07:31:41 +00:00
dhanabalan
1d6a914c04 Added filter logic in import transit resource page
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 17s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 16s
Laravel Pint / pint (pull_request) Successful in 1m57s
Laravel Larastan / larastan (pull_request) Failing after 3m21s
2026-06-17 13:01:08 +05:30
841526e1cd Merge pull request 'Added mesage in import transit mail' (#760) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 25s
Reviewed-on: #760
2026-06-17 07:23:50 +00:00
dhanabalan
0e1d823581 Added mesage in import transit mail
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 18s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 16s
Laravel Pint / pint (pull_request) Successful in 2m3s
Laravel Larastan / larastan (pull_request) Failing after 3m21s
2026-06-17 12:53:32 +05:30
b39067d7f8 Merge pull request 'solved issue for shipped invoice date and eta date in import transit mail' (#759) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 16s
Reviewed-on: #759
2026-06-17 06:36:47 +00:00
dhanabalan
2a57b87bfa solved issue for shipped invoice date and eta date in import transit mail
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 10s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 15s
Laravel Larastan / larastan (pull_request) Failing after 1m20s
Laravel Pint / pint (pull_request) Failing after 1m19s
2026-06-17 12:06:29 +05:30
02990f1f5d Merge pull request 'Changed logic for eta date and etd date in import transit mail' (#758) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
Reviewed-on: #758
2026-06-17 05:49:47 +00:00
dhanabalan
8d8e433ce9 Changed logic for eta date and etd date in import transit mail
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 17s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 16s
Laravel Larastan / larastan (pull_request) Failing after 1m35s
Laravel Pint / pint (pull_request) Failing after 1m33s
2026-06-17 11:19:20 +05:30
7f773c6b92 Merge pull request 'Added item description in characteristic approval mail template' (#757) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 16s
Reviewed-on: #757
2026-06-17 04:18:20 +00:00
dhanabalan
afcbadaee0 Added item description in characteristic approval mail template
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 19s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 18s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 21s
Laravel Larastan / larastan (pull_request) Failing after 1m37s
Laravel Pint / pint (pull_request) Failing after 1m35s
2026-06-17 09:47:51 +05:30
838a1bb731 Merge pull request 'issue solved in sub assembly code in testing panel readings' (#756) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 29s
Reviewed-on: #756
2026-06-15 09:02:43 +00:00
dhanabalan
e5cb8241eb issue solved in sub assembly code in testing panel readings
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 18s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 18s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 15s
Laravel Pint / pint (pull_request) Successful in 1m57s
Laravel Larastan / larastan (pull_request) Failing after 3m29s
2026-06-15 14:32:28 +05:30
ecfda1b739 Merge pull request 'Changed time of import transit mail report' (#755) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Failing after 20s
Reviewed-on: #755
2026-06-15 04:16:44 +00:00
dhanabalan
75836e3159 Changed time of import transit mail report
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Failing after 16s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Failing after 4s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 19s
Laravel Pint / pint (pull_request) Successful in 1m57s
Laravel Larastan / larastan (pull_request) Failing after 3m46s
2026-06-15 09:46:31 +05:30
e616a66278 Merge pull request 'Added mail logic for to and cc for quality validation' (#754) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 25s
Reviewed-on: #754
2026-06-15 03:54:08 +00:00
dhanabalan
bfb8fcde29 Added mail logic for to and cc for quality validation
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 1m22s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 48s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 2m2s
Laravel Pint / pint (pull_request) Successful in 2m21s
Laravel Larastan / larastan (pull_request) Failing after 4m5s
2026-06-15 09:23:53 +05:30
32 changed files with 2935 additions and 164 deletions

View File

@@ -337,7 +337,7 @@ class Scheduler extends Command
}
break;
case 'Daily':
if (now()->format('H:i') == '11:30') {
if (now()->format('H:i') == '08:00') {
try {
\Artisan::call('send-import-transit', [
'schedule_type' => $rule->schedule_type,

View File

@@ -53,50 +53,12 @@ class SendImportTransit extends Command
return;
}
// $todayRecordExists = ImportTransit::whereDate('created_at', now()->toDateString())->first();
// if (!$todayRecordExists) {
// $this->info('No records created today. Mail not sent.');
// return;
// }
// $tableData = ImportTransit::select([
// 'cri_rfq_number',
// 'mail_received_date',
// 'pricol_ref_number',
// 'requester',
// 'shipper',
// 'shipper_location',
// 'shipper_invoice',
// 'shipper_invoice_date',
// 'customs_agent_name',
// 'eta_date',
// 'status',
// 'delivery_location',
// 'etd_date',
// 'mode',
// 'inco_terms',
// 'port_of_loading',
// 'port_of_discharge',
// 'delivery_city',
// 'packages',
// 'type_of_package',
// 'gross_weight',
// 'volume',
// 'bill_number',
// 'bill_received_date',
// 'vessel_number',
// 'remark',
// 'is_transit_identified',
// ])
// ->where('status', '!=', 'Delivered')
// ->get();
$tableData = ImportTransit::where('status', '!=', 'Delivered')->orderByRaw("
CAST(
regexp_replace(cri_rfq_number, '.*-([0-9]+).*', '\\1')
AS INTEGER
)
CASE
WHEN cri_rfq_number ~ '[0-9]+'
THEN CAST(regexp_replace(cri_rfq_number, '[^0-9]', '', 'g') AS INTEGER)
ELSE NULL
END NULLS LAST
")->get();

View File

@@ -359,7 +359,7 @@ class InvoiceValidationImporter extends Importer
$curPanelBoxSerialNumber = $record->panel_box_serial_number ?? null;
}
$warnMsg[] = 'Record Item ID : '.$record->sticker_master_id.' Master Item ID : '.$stickId;
$warnMsg[] = 'Invoice Record Item ID : '.$record->sticker_master_id.' Master Item ID : '.$stickId;
if ($record->invoice_number != $invoiceNumber) {
$stickId = null;
$warnMsg[] = 'Invoice number mismatch with existing record!';

View File

@@ -77,42 +77,48 @@ class GuardPatrolEntryResource extends Resource
])
->hint(fn ($get) => $get('gPePlantError') ? $get('gPePlantError') : null)
->hintColor('danger'),
Forms\Components\Select::make('guard_name_id')
// Forms\Components\Select::make('guard_name_id')
// ->label('Guard Name')
// // ->relationship('guardNames', 'name')
// ->options(function (callable $get) {
// $plantId = $get('plant_id');
// if (! $plantId) {
// return [];
// }
// return GuardName::where('plant_id', $plantId)
// ->pluck('name', 'id')
// ->toArray();
// })
// ->required()
// ->reactive()
// ->default(function () {
// return optional(GuardPatrolEntry::where('created_by', Filament::auth()->user()?->name)->latest()->first())->guard_name_id;
// })
// ->disabled(fn (Get $get) => ! empty($get('id')))
// ->afterStateUpdated(function ($state, callable $set, callable $get) {
// $guardName = $get('guard_name_id');
// if (! $guardName) {
// $set('gPeGuardNameError', 'Please select a guard name first.');
// return;
// } else {
// $set('patrol_time', now()->format('Y-m-d H:i:s'));
// $set('updated_by', Filament::auth()->user()?->name);
// $set('gPeGuardNameError', null);
// }
// })
// ->extraAttributes(fn ($get) => [
// 'class' => $get('gPeGuardNameError') ? 'border-red-500' : '',
// ])
// ->hint(fn ($get) => $get('gPeGuardNameError') ? $get('gPeGuardNameError') : null)
// ->hintColor('danger'),
Forms\Components\TextInput::make('guard_name')
->label('Guard Name')
// ->relationship('guardNames', 'name')
->options(function (callable $get) {
$plantId = $get('plant_id');
if (! $plantId) {
return [];
}
->default(fn () => Filament::auth()->user()?->name)
->readOnly()
->dehydrated(),
return GuardName::where('plant_id', $plantId)
->pluck('name', 'id')
->toArray();
})
->required()
->reactive()
->default(function () {
return optional(GuardPatrolEntry::where('created_by', Filament::auth()->user()?->name)->latest()->first())->guard_name_id;
})
->disabled(fn (Get $get) => ! empty($get('id')))
->afterStateUpdated(function ($state, callable $set, callable $get) {
$guardName = $get('guard_name_id');
if (! $guardName) {
$set('gPeGuardNameError', 'Please select a guard name first.');
return;
} else {
$set('patrol_time', now()->format('Y-m-d H:i:s'));
$set('updated_by', Filament::auth()->user()?->name);
$set('gPeGuardNameError', null);
}
})
->extraAttributes(fn ($get) => [
'class' => $get('gPeGuardNameError') ? 'border-red-500' : '',
])
->hint(fn ($get) => $get('gPeGuardNameError') ? $get('gPeGuardNameError') : null)
->hintColor('danger'),
Forms\Components\Hidden::make('check_point_name')// TextInput
->label('Check Point Name')
->reactive()
@@ -123,50 +129,88 @@ class GuardPatrolEntryResource extends Resource
->extraAttributes([
'x-on:keydown.enter.prevent' => '$wire.processCheckPointName()',
]),
Forms\Components\Select::make('check_point_name_id')
->label('Check Point Name')
// ->relationship('checkPointNames', 'name')
->options(function (callable $get) {
$plantId = $get('plant_id');
if (! $plantId) {
return [];
}
// Forms\Components\Select::make('check_point_name_id')
// ->label('Check Point Name')
// // ->relationship('checkPointNames', 'name')
// ->options(function (callable $get) {
// $plantId = $get('plant_id');
// if (! $plantId) {
// return [];
// }
return CheckPointName::where('plant_id', $plantId)
->pluck('name', 'id')
->toArray();
})
// return CheckPointName::where('plant_id', $plantId)
// ->pluck('name', 'id')
// ->toArray();
// })
// ->required()
// ->reactive()
// // ->default(function () {
// // return optional(GuardPatrolEntry::where('created_by', Filament::auth()->user()?->name)->latest()->first())->check_point_name_id;
// // })
// ->disabled(fn (Get $get) => ! empty($get('id')))
// ->afterStateUpdated(function ($state, callable $set, callable $get) {
// $checkPointName = $get('check_point_name_id');
// if (! $checkPointName) {
// $set('check_point_name_id', null);
// $set('gPeCheckPointNameError', 'Please select a check point name first.');
// return;
// } else {
// $set('patrol_time', now()->format('Y-m-d H:i:s'));
// $set('updated_by', Filament::auth()->user()?->name);
// $set('gPeCheckPointNameError', null);
// }
// })
// ->extraAttributes(fn ($get) => [
// 'class' => $get('gPeCheckPointNameError') ? 'border-red-500' : '',
// ])
// ->hint(fn ($get) => $get('gPeCheckPointNameError') ? $get('gPeCheckPointNameError') : null)
// ->hintColor('danger')
// ->rule(function (callable $get) {
// return Rule::unique('guard_patrol_entries', 'check_point_name_id')
// ->where('guard_name_id', $get('guard_name_id'))
// ->where('patrol_time', now())
// ->where('plant_id', $get('plant_id'))
// ->ignore($get('id'));
// }),
Forms\Components\Hidden::make('check_point_name_id')
->dehydrated(true),
Forms\Components\TextInput::make('check_point_name')
->label('Check Point Name')
->required()
->reactive()
// ->default(function () {
// return optional(GuardPatrolEntry::where('created_by', Filament::auth()->user()?->name)->latest()->first())->check_point_name_id;
// })
->disabled(fn (Get $get) => ! empty($get('id')))
->afterStateUpdated(function ($state, callable $set, callable $get) {
$checkPointName = $get('check_point_name_id');
if (! $checkPointName) {
if (blank($state)) {
$set('check_point_name_id', null);
$set('gPeCheckPointNameError', 'Please select a check point name first.');
$set('gPeCheckPointNameError', 'Please enter a check point name.');
return;
} else {
}
$checkPoint = CheckPointName::where('plant_id', $get('plant_id'))
->whereRaw('LOWER(name) = ?', [strtolower(trim($state))])
->first();
if (! $checkPoint) {
$set('check_point_name_id', null);
$set('gPeCheckPointNameError', 'Invalid check point name.');
return;
}
$set('check_point_name_id', $checkPoint->id);
$set('patrol_time', now()->format('Y-m-d H:i:s'));
$set('updated_by', Filament::auth()->user()?->name);
$set('gPeCheckPointNameError', null);
}
})
->extraAttributes(fn ($get) => [
'class' => $get('gPeCheckPointNameError') ? 'border-red-500' : '',
])
->hint(fn ($get) => $get('gPeCheckPointNameError') ? $get('gPeCheckPointNameError') : null)
->hintColor('danger')
->rule(function (callable $get) {
return Rule::unique('guard_patrol_entries', 'check_point_name_id')
->where('guard_name_id', $get('guard_name_id'))
->where('patrol_time', now())
->where('plant_id', $get('plant_id'))
->ignore($get('id'));
}),
->hint(fn ($get) => $get('gPeCheckPointNameError'))
->hintColor('danger'),
Forms\Components\TextInput::make('reader_code')
->label('Reader Code')
->hidden(fn (Get $get) => ! $get('id'))

View File

@@ -3,6 +3,10 @@
namespace App\Filament\Resources\GuardPatrolEntryResource\Pages;
use App\Filament\Resources\GuardPatrolEntryResource;
use App\Models\CheckPointName;
use App\Models\CheckPointTime;
use App\Models\GuardName;
use App\Models\GuardPatrolEntry;
use Filament\Actions;
use Filament\Facades\Filament;
use Filament\Notifications\Notification;
@@ -29,6 +33,100 @@ class CreateGuardPatrolEntry extends CreateRecord
// public ?array $data = null;
protected function mutateFormDataBeforeCreate(array $data): array
{
$guardId = GuardName::where(
'name',
Filament::auth()->user()?->name
)->value('id');
if (! $guardId) {
Notification::make()
->title('Guard Name Not Matched')
->body('Logged-in user name was not found in Guard Name Master.')
->danger()
->send();
$this->halt();
}
$data['guard_name_id'] = $guardId;
$checkPoint = CheckPointName::where('plant_id', $data['plant_id'])
->where('name', trim($data['check_point_name']))
->value('id');
if (! $checkPoint) {
Notification::make()
->title('Invalid Check Point')
->body('The entered check point name does not exist.')
->danger()
->send();
$this->halt();
}
// $lastScan = GuardPatrolEntry::where('plant_id', $data['plant_id'])
// ->where('guard_name_id', $guardId)
// ->latest('id')
// ->first();
// if ($lastScan) {
// $previousPoint = $lastScan->check_point_name_id;
// $route = CheckPointTime::where('plant_id', $data['plant_id'])
// ->where('check_point1_id', $previousPoint)
// ->where('check_point2_id', $checkPoint->id)
// ->first();
// if (! $route) {
// Notification::make()
// ->title('Wrong Check Point Order')
// ->body('This checkpoint is not the next allowed point.')
// ->danger()
// ->send();
// $this->halt();
// }
// } else {
// // First scan must start from sequence 1
// $firstRoute = CheckPointTime::where('plant_id', $data['plant_id'])
// ->where('check_point2_id', $checkPoint->id)
// ->where('sequence_number', 1)
// ->first();
// if (! $firstRoute) {
// Notification::make()
// ->title('Invalid Starting Point')
// ->body('Patrol must start from the first checkpoint.')
// ->danger()
// ->send();
// $this->halt();
// }
// }
$data['check_point_name_id'] = $checkPoint;
unset($data['check_point_name']);
return $data;
}
public function processCheckPointName()
{

View File

@@ -24,6 +24,10 @@ use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use Maatwebsite\Excel\Facades\Excel;
use Filament\Tables\Actions\ImportAction;
use Filament\Forms\Components\DateTimePicker;
use Filament\Forms\Components\Select;
use Filament\Tables\Filters\Filter;
use Filament\Forms\Components\TextInput;
// use PhpOffice\PhpSpreadsheet\IOFactory;
class ImportTransitResource extends Resource
@@ -95,16 +99,8 @@ class ImportTransitResource extends Resource
->afterStateUpdated(function (callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
}),
Forms\Components\Select::make('status')
Forms\Components\TextInput::make('status')
->label('Status')
->options([
'Under Service Provider Finalization' => 'Under Service Provider Finalization',
'Yet to pick up' => 'Yet to pick up',
'Awaiting Vessel Loading' => 'Awaiting Vessel Loading',
'In Transit' => 'In Transit',
'Under Import Customs Clearance in Destination' => 'Under Import Customs Clearance in Destination',
'Delivered' => 'Delivered',
])
->reactive()
->afterStateUpdated(function (callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
@@ -184,8 +180,17 @@ class ImportTransitResource extends Resource
->afterStateUpdated(function (callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
}),
Forms\Components\TextInput::make('remark')
Forms\Components\Select::make('remark')
->label('Remark')
->options([
'Under Service Provider Finalization' => 'Under Service Provider Finalization',
'Yet to pick up' => 'Yet to pick up',
'Awaiting Vessel Loading' => 'Awaiting Vessel Loading',
'In Transit' => 'In Transit',
'Under Import Customs Clearance in Destination' => 'Under Import Customs Clearance in Destination',
'Delivered' => 'Delivered',
])
->reactive()
->afterStateUpdated(function (callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
}),
@@ -402,7 +407,100 @@ class ImportTransitResource extends Resource
])
->filters([
Tables\Filters\TrashedFilter::make(),
Filter::make('advanced_filters')
->label('Advanced Filters')
->form([
TextInput::make('cri_rfq_number')
->label('CRI RFQ Number')
->reactive()
->placeholder('Enter Rfq Number')
->afterStateUpdated(function ($state, callable $set, callable $get): void {
$set('created_from', null);
$set('created_to', null);
}),
TextInput::make('status')
->label('Status')
->reactive()
->placeholder('Enter Status')
->afterStateUpdated(function ($state, callable $set, callable $get): void {
$set('created_from', null);
$set('created_to', null);
}),
Select::make('is_transit_identified')
->label('Is Transit Identified')
->reactive()
->options([
0 => 0,
1 => 1,
])
->afterStateUpdated(function ($state, callable $set, callable $get): void {
$set('created_from', null);
$set('created_to', null);
}),
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),
])
->query(function ($query, array $data) {
// Hide all records initially if no filters are applied
if (empty($data['cri_rfq_number']) && empty($data['status']) && ! isset($data['is_transit_identified']) && empty($data['created_from']) && empty($data['created_to'])) {
return $query;
}
if (! empty($data['cri_rfq_number'])) {
$query->where('cri_rfq_number', 'like', '%'.$data['cri_rfq_number'].'%');
}
if (! empty($data['status'])) {
$query->where('status', 'like', '%'.$data['status'].'%');
}
if (isset($data['is_transit_identified'])) {
$query->where('is_transit_identified', $data['is_transit_identified']);
}
if (! empty($data['created_from'])) {
$query->where('created_at', '>=', $data['created_from']);
}
if (! empty($data['created_to'])) {
$query->where('created_at', '<=', $data['created_to']);
}
})
->indicateUsing(function (array $data) {
$indicators = [];
if (! empty($data['cri_rfq_number'])) {
$indicators[] = 'CRI Rfq Number: '.$data['cri_rfq_number'];
}
if (! empty($data['status'])) {
$indicators[] = 'Status: '.$data['status'];
}
if (isset($data['is_transit_identified'])) {
$indicators[] = 'Is Transit Identified: '.$data['is_transit_identified'];
}
if (! empty($data['created_from'])) {
$indicators[] = 'From: '.$data['created_from'];
}
if (! empty($data['created_to'])) {
$indicators[] = 'To: '.$data['created_to'];
}
return $indicators;
}),
])
->filtersFormMaxHeight('280px')
->actions([
Tables\Actions\ViewAction::make(),
Tables\Actions\EditAction::make(),

View File

@@ -611,6 +611,7 @@ class CreateInvoiceValidation extends CreateRecord
'sticker_master_id' => $sticker->id,
'plant_id' => $plantId,
'invoice_number' => $invoiceNumber,
'invoice_quantity' => 1,
'quantity' => 1,
'operator_id' => $operatorName,
'created_by' => $operatorName,
@@ -653,6 +654,7 @@ class CreateInvoiceValidation extends CreateRecord
'sticker_master_id' => $sticker->id,
'plant_id' => $plantId,
'invoice_number' => $invoiceNumber,
'invoice_quantity' => $bundleQty,
'quantity' => $bundleQty,
'operator_id' => $operatorName,
'created_by' => $operatorName,
@@ -697,11 +699,13 @@ class CreateInvoiceValidation extends CreateRecord
// 8 = 3 + 5 // 8 = 5 + 3 // 8 = 0 + 8 // 8 = 8 + 0
// 8 = 3 + 5 // 8 = 5 + 3 // 8 = 0 + 8 // 8 = 8 + 0
// 0 = 0 + 0
// 4 = 1.5 + 2.5
$existQty = $existEmpQty + $existComQty;
// 8 <= 11 // 8 <= 8 // 8 <= 11 // 8 <= 9
// 8 <= 7 // 8 <= 7 // 8 <= 7 // 8 <= 7
// 0 <= 5
// 4 <= 2
if ($existQty <= $totalExcelQty) {
// 6 = 11 - 5 // 5 = 8 - 3 // 3 = 11 - 8 // 9 = 9 - 0
@@ -723,29 +727,46 @@ class CreateInvoiceValidation extends CreateRecord
'updated_by' => $operatorName,
'updated_at' => now(),
]);
InvoiceValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->where('sticker_master_id', $sticker->id)
->update([
'invoice_quantity' => $totalExcelQty,
]);
$newQuan--;
$inserted++;
} elseif ($newInsQty > 0) { // if ($sticker) // create
InvoiceValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->where('sticker_master_id', $sticker->id)
->update([
'invoice_quantity' => $totalExcelQty,
]);
InvoiceValidation::create([
'sticker_master_id' => $sticker->id,
'plant_id' => $plantId,
'invoice_number' => $invoiceNumber,
'invoice_quantity' => $totalExcelQty,
'quantity' => $newInsQty,
'operator_id' => $operatorName,
'created_by' => $operatorName,
'updated_by' => $operatorName,
]);
$inserted++;
}
}
// 8 > 7 // 8 > 7 // 8 > 7 // 8 > 7
// 4 > 2
else {
// 2 = 7 - 5 // 4 = 7 - 3 // -1 = 7 - 8 // 7 = 7 - 0
// -0.5 = 2 - 2.5 //
$newInsQty = $totalExcelQty - $existComQty;
// 3 > 0 // 5 > 0 // 0 > 0 // 8 > 0
if ($existEmpQty > 0) { // update
// 1.5 > 0 //
if ($newInsQty > 0 && $existEmpQty > 0) { // update
// 3 = 2 // 5 = 4 // 0 = -1 // 8 = 7
// 1.5 == -0.5 //
if ($existEmpQty == $newInsQty) {
continue;
}
@@ -756,6 +777,12 @@ class CreateInvoiceValidation extends CreateRecord
'updated_by' => $operatorName,
'updated_at' => now(),
]);
InvoiceValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->where('sticker_master_id', $sticker->id)
->update([
'invoice_quantity' => $totalExcelQty,
]);
$newQuan--;
$inserted++;
} elseif ($newInsQty > 0) { // create
@@ -763,11 +790,18 @@ class CreateInvoiceValidation extends CreateRecord
'sticker_master_id' => $sticker->id,
'plant_id' => $plantId,
'invoice_number' => $invoiceNumber,
'invoice_quantity' => $totalExcelQty,
'quantity' => $newInsQty,
'operator_id' => $operatorName,
'created_by' => $operatorName,
'updated_by' => $operatorName,
]);
InvoiceValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->where('sticker_master_id', $sticker->id)
->update([
'invoice_quantity' => $totalExcelQty,
]);
$inserted++;
}
}
@@ -1791,6 +1825,7 @@ class CreateInvoiceValidation extends CreateRecord
'sticker_master_id' => $sticker->id,
'plant_id' => $plantId,
'invoice_number' => $invoiceNumber,
'invoice_quantity' => 1,
'quantity' => 1,
'operator_id' => $operatorName,
'created_by' => $operatorName,
@@ -1826,6 +1861,7 @@ class CreateInvoiceValidation extends CreateRecord
'sticker_master_id' => $sticker->id,
'plant_id' => $plantId,
'invoice_number' => $invoiceNumber,
'invoice_quantity' => $bundleQty,
'quantity' => $bundleQty,
'operator_id' => $operatorName,
'created_by' => $operatorName,
@@ -1859,6 +1895,7 @@ class CreateInvoiceValidation extends CreateRecord
'sticker_master_id' => $sticker->id,
'plant_id' => $plantId,
'invoice_number' => $invoiceNumber,
'invoice_quantity' => $totalExcelQty,
'quantity' => $totalExcelQty,
'operator_id' => $operatorName,
'created_by' => $operatorName,
@@ -3347,6 +3384,7 @@ class CreateInvoiceValidation extends CreateRecord
$createdDt = $record->created_at;
$stickMasterId = $record->sticker_master_id;
$curExistQty = $record->quantity;
$curItemInvQty = $record->invoice_quantity;
// $curScanQty = 2;
if ($curExistQty > $curScanQty) { // 5 > 2
@@ -3362,6 +3400,7 @@ class CreateInvoiceValidation extends CreateRecord
'invoice_number' => $invoiceNumber,
'serial_number' => $serialNumber,
'batch_number' => $batchNumber,
'invoice_quantity' => $curItemInvQty,
'quantity' => $curScanQty,
'created_at' => $createdDt,
'operator_id' => $operatorName,
@@ -3545,6 +3584,7 @@ class CreateInvoiceValidation extends CreateRecord
$this->dispatch('refreshInvoiceData', invoiceNumber: $invoiceNumber, plantId: $plantId, onCapFocus: false);
}
// TN01/BOX22/SERIAL999 >> PANEL BOX QR
// /^([a-zA-Z0-9]{6,})\|([1-9][a-zA-Z0-9]{8,})(?:\/[MmPpCc])?\|?$/
if (! preg_match('/^([a-zA-Z0-9]{6,})\|([1-9][a-zA-Z0-9]{8,})(?:\/[MmPpCc])?\|?$/', $serNo, $matches)) {
Notification::make()

View File

@@ -6,6 +6,7 @@ use App\Filament\Exports\LineExporter;
use App\Filament\Imports\LineImporter;
use App\Filament\Resources\LineResource\Pages;
use App\Models\Block;
use App\Models\Item;
use App\Models\Line;
use App\Models\Plant;
use App\Models\WorkGroupMaster;
@@ -24,6 +25,11 @@ use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Illuminate\Validation\Rule;
use Illuminate\Validation\Rules\Unique;
use Filament\Forms\Components\DateTimePicker;
use Filament\Forms\Components\FileUpload;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Tables\Filters\Filter;
class LineResource extends Resource
{
@@ -1184,7 +1190,207 @@ class LineResource extends Resource
])
->filters([
Tables\Filters\TrashedFilter::make(),
Filter::make('advanced_filters')
->label('Advanced Filters')
->form([
Select::make('Plant')
->label('Search by Plant Name')
->nullable()
->options(function (callable $get) {
$userHas = Filament::auth()->user()->plant_id;
// return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::orderBy('code')->pluck('name', 'id')->toArray();
if ($userHas && strlen($userHas) > 0) {
return Plant::where('id', $userHas)->pluck('name', 'id')->toArray();
} else {
return Plant::whereHas('items', function ($query) {
$query->whereNotNull('id');
})->orderBy('code')->pluck('name', 'id')->toArray();
}
})
->searchable()
->reactive()
->afterStateUpdated(function ($state, callable $set, callable $get): void {
$set('code', null);
$set('operator_id', null);
}),
Select::make('name')
->label('Search by Line Name')
->nullable()
->options(function (callable $get) {
$plantId = $get('Plant');
return $plantId ? Line::where('plant_id', $plantId)->pluck('name', 'id') : [];
})
->searchable()
->reactive(),
Select::make('type')
->label('Search by Line Type')
->nullable()
->options(function (callable $get) {
$plantId = $get('Plant');
return $plantId ? Line::where('plant_id', $plantId)->distinct()->pluck('type', 'type')->toArray(): [];
})
->searchable()
->reactive(),
Select::make('work_group_id')
->label('Search by WorkGroupCenter')
->nullable()
->options(function (callable $get) {
$plantId = $get('Plant');
$workGroupIds = Line::where('plant_id', $plantId)
->get([
'work_group1_id',
'work_group2_id',
'work_group3_id',
'work_group4_id',
'work_group5_id',
'work_group6_id',
'work_group7_id',
'work_group8_id',
'work_group9_id',
'work_group10_id',
])
->flatMap(function ($line) {
return [
$line->work_group1_id,
$line->work_group2_id,
$line->work_group3_id,
$line->work_group4_id,
$line->work_group5_id,
$line->work_group6_id,
$line->work_group7_id,
$line->work_group8_id,
$line->work_group9_id,
$line->work_group10_id,
];
})
->filter()
->unique()
->values()
->toArray();
return WorkGroupMaster::whereIn('id', $workGroupIds)
->pluck('name', 'id')
->toArray();
})
->searchable()
->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),
])
->query(function ($query, array $data) {
// Hide all records initially if no filters are applied
if (empty($data['Plant']) && empty($data['name']) && empty($data['type']) && empty($data['work_group_id']) && empty($data['created_from']) && empty($data['created_to']) && 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']);
} else {
$userHas = Filament::auth()->user()->plant_id;
if ($userHas && strlen($userHas) > 0) {
return $query->whereRaw('1 = 0');
}
}
if (! empty($data['name'])) {
$query->where('id', $data['name']);
}
if (! empty($data['type'])) {
$query->where('type', $data['type']);
}
// if (! empty($data['work_group_id'])) {
// $query->where('name', $data['work_group_id']);
// }
if (! empty($data['work_group_id'])) {
$query->where(function ($q) use ($data) {
$q->where('work_group1_id', $data['work_group_id'])
->orWhere('work_group2_id', $data['work_group_id'])
->orWhere('work_group3_id', $data['work_group_id'])
->orWhere('work_group4_id', $data['work_group_id'])
->orWhere('work_group5_id', $data['work_group_id'])
->orWhere('work_group6_id', $data['work_group_id'])
->orWhere('work_group7_id', $data['work_group_id'])
->orWhere('work_group8_id', $data['work_group_id'])
->orWhere('work_group9_id', $data['work_group_id'])
->orWhere('work_group10_id', $data['work_group_id']);
});
}
if (! empty($data['created_from'])) {
$query->where('created_at', '>=', $data['created_from']);
}
if (! empty($data['created_to'])) {
$query->where('created_at', '<=', $data['created_to']);
}
})
->indicateUsing(function (array $data) {
$indicators = [];
if (! empty($data['Plant'])) {
$indicators[] = 'Plant: '.Plant::where('id', $data['Plant'])->value('name');
} else {
$userHas = Filament::auth()->user()->plant_id;
if ($userHas && strlen($userHas) > 0) {
return 'Plant: Choose plant to filter records.';
}
}
if (! empty($data['name'])) {
$indicators[] = 'Line Name: '.Line::where('id', $data['name'])->value('name');
}
if (! empty($data['type'])) {
$indicators[] = 'Line Type: '.Line::where('type', $data['type'])->value('type');
}
if (! empty($data['work_group_id'])) {
$indicators[] = 'Work Group: ' .
WorkGroupMaster::where('id', $data['work_group_id'])->value('name');
}
if (! empty($data['created_from'])) {
$indicators[] = 'From: '.$data['created_from'];
}
if (! empty($data['created_to'])) {
$indicators[] = 'To: '.$data['created_to'];
}
if (! empty($data['updated_from'])) {
$indicators[] = 'From: '.$data['updated_from'];
}
if (! empty($data['updated_to'])) {
$indicators[] = 'To: '.$data['updated_to'];
}
return $indicators;
}),
])
->filtersFormMaxHeight('280px')
->actions([
Tables\Actions\ViewAction::make(),
Tables\Actions\EditAction::make(),

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,269 @@
<?php
namespace App\Filament\Resources\PanelBoxValidationResource\Pages;
use App\Filament\Resources\PanelBoxValidationResource;
use App\Models\ProductCharacteristicsMaster;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
use Illuminate\Validation\ValidationException;
class CreatePanelBoxValidation extends CreateRecord {
protected static string $resource = PanelBoxValidationResource::class;
public $showChecklist = false;
public $checklist;
public $skipChecklistValidation = false;
public bool $shouldSkipChecklist = false;
public $existingRecords = [];
protected $listeners = [
'checklistUpdated' => 'setChecklist',
'checklist-cancelled' => 'handleChecklistCancel',
'checklist-saved' => 'checkListSaved',
];
public function setChecklist($checklist)
{
$this->data['checklist'] = $checklist;
}
public function doCreate()
{
$this->create();
}
public function mount(): void
{
parent::mount();
session()->forget([
'last_selected_plant_id',
'last_selected_line',
'last_selected_production',
]);
}
public function handleChecklistCancel()
{
$this->skipChecklistValidation = true;
$this->showChecklist = false;
}
protected function mutateFormDataBeforeCreate(array $data): array
{
// if ($this->shouldSkipChecklist) {
// return $data;
// }
if ($this->checkIfHasCharacteristics($data)) {
$this->showChecklist = true;
$this->halt();
}
return $data;
}
protected function checkIfHasCharacteristics(array $data)
{
$plantId = $data['plant_id'] ?? null;
$itemCode = $data['item_id'] ?? null;
$lineId = $data['line_id'] ?? null;
if (!$plantId || !$itemCode || !$lineId) {
return false;
}
$item = \App\Models\Item::where('code', $itemCode)
->where('plant_id', $plantId)
->first();
$categoryName = trim($item->category) ?? null;
if (!$item) {
$this->existingRecords = collect();
return false;
}
$this->existingRecords = ProductCharacteristicsMaster::where('plant_id', $plantId)
->where('category', $categoryName)
->where('line_id', $lineId)
->get();
return $this->existingRecords->isNotEmpty();
}
public function checkListSaved()
{
$this->showChecklist = false;
$plantId = $this->data['plant_id'] ?? null;
$lineId = $this->data['line_id'] ?? null;
$productionOrder = $this->data['production_order'] ?? null;
return redirect()->to(
static::getResource()::getUrl('create', [
'plant_id' => $this->data['plant_id'] ?? null,
'line_id' => $this->data['line_id'] ?? null,
'production_order' => $this->data['production_order'] ?? null,
])
);
}
protected function beforeCreate(): void
{
$errors = [];
if (!empty($this->data['validationError'])) {
$errors['validationError'] = ['Fix the errors before submitting.'];
}
if (!empty($this->data['serialPanelError'])) {
$errors['serialPanelError'] = ['Fix the errors before submitting.'];
}
if (!empty($this->data['packSlipPanelError'])) {
$errors['packSlipPanelError'] = ['Fix the errors before submitting.'];
}
if (!empty($this->data['namePlatePanelError'])) {
$errors['namePlatePanelError'] = ['Fix the errors before submitting.'];
}
//..name plate
if (!empty($this->data['tubeStickerPanelError'])) {
$errors['tubeStickerPanelError'] = ['Fix the errors before submitting.'];
}
if (!empty($this->data['warrantyCardPanelError'])) {
$errors['warrantyCardPanelError'] = ['Fix the errors before submitting.'];
}
//..part validations
if (!empty($this->data['part_validation1_error'])) {
$errors['part_validation1_error'] = ['Fix the errors before submitting.'];
}
if (!empty($this->data['part_validation2_error'])) {
$errors['part_validation2_error'] = ['Fix the errors before submitting.'];
}
if (!empty($this->data['part_validation3_error'])) {
$errors['part_validation3_error'] = ['Fix the errors before submitting.'];
}
if (!empty($this->data['part_validation4_error'])) {
$errors['part_validation4_error'] = ['Fix the errors before submitting.'];
}
if (!empty($this->data['part_validation5_error'])) {
$errors['part_validation5_error'] = ['Fix the errors before submitting.'];
}
if (!empty($errors)) {
throw ValidationException::withMessages($errors);
}
$this->checkExisting();
$checklist = $this->data['data']['checklist'] ?? [];
if (count($this->existingRecords) > 0){
$this->showChecklist = true;
$this->halt();
}
else{
$this->showChecklist = false;
}
}
public function checkExisting()
{
$plant_id = $this->data['plant_id'] ?? null;
$item_code = $this->data['item_id'] ?? null;
$line_id = $this->data['line_id'] ?? null;
$item = \App\Models\Item::where('code', $item_code)->where('plant_id', $plant_id)->first();
if (!$item) {
$this->existingRecords = collect();
return;
}
// $item_id = $item->id;
$categoryName = trim($item->category) ?? null;
$this->existingRecords = ProductCharacteristicsMaster::where('plant_id', $plant_id)
->where('category', $categoryName)
->where('line_id', $line_id)
->get();
}
protected function afterCreate(): void
{
// Get the value from the hidden field 'plant'
$plant = $this->form->getState()['plant'] ?? null;
$line = $this->form->getState()['line'] ?? null;
$production = $this->form->getState()['production'] ?? null;
// $this->skipChecklistValidation = false;
// $this->showChecklist = false;
// $this->checklist = [];
// $this->form->fill();
// reset checklist
$this->checklist = [];
$this->skipChecklistValidation = false;
$this->showChecklist = false;
$this->form->fill([]);
$this->data = [];
$this->resetValidation();
$this->resetErrorBag();
$this->form->fill([
'plant_id' => null,
'line_id' => null,
'production_order' => null,
]);
// $this->dispatch('focus-item-id');
session()->flash('focus_item_id_after_redirect', true);
logger('Focus flag set in session');
if ($plant) {
session(['last_selected_plant_id' => $plant]);
}
if ($line) {
session(['last_selected_line' => $line]);
}
if ($production) {
session(['last_selected_production' => $production]);
}
}
protected function getRedirectUrl(): string
{
//return $this->getResource()::getUrl('create'); // Stay on Create Page after savin
return $this->getResource()::getUrl('create', [
'plant_id' => $this->data['plant_id'] ?? null,
'line_id' => $this->data['line_id'] ?? null,
'production_order' => $this->data['production_order'] ?? null,
]);
}
}

View File

@@ -0,0 +1,22 @@
<?php
namespace App\Filament\Resources\PanelBoxValidationResource\Pages;
use App\Filament\Resources\PanelBoxValidationResource;
use Filament\Actions;
use Filament\Resources\Pages\EditRecord;
class EditPanelBoxValidation extends EditRecord
{
protected static string $resource = PanelBoxValidationResource::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\PanelBoxValidationResource\Pages;
use App\Filament\Resources\PanelBoxValidationResource;
use Filament\Actions;
use Filament\Resources\Pages\ListRecords;
class ListPanelBoxValidations extends ListRecords
{
protected static string $resource = PanelBoxValidationResource::class;
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
];
}
}

View File

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

View File

@@ -253,9 +253,9 @@ class ProductionCharacteristicResource extends Resource
->label('Spec. Value')
// ->searchable()
->formatStateUsing(function ($record) {
$specVal = ProductCharacteristicsMaster::where('plant_id', $record->plant_id)->where('item_id', $record->item_id)->where('line_id', $record->line_id)->where('machine_id', $record->machine_id)->first();
$specVal = ProductCharacteristicsMaster::where('plant_id', $record->plant_id)->where('item_id', $record->item_id)->where('line_id', $record->line_id)->where('machine_id', $record->machine_id)->where('name', $record->characteristic_name)->first();
// return $record?->plant_id.'-'.$record?->item_id.'-'.$record->line_id.'-'.$record?->machine_id;
return $specVal?->lower.' - '.$specVal?->upper;
})
->alignCenter()
@@ -276,7 +276,7 @@ class ProductionCharacteristicResource extends Resource
'Not Ok' => 'danger',
'NotOk' => 'danger',
'ConditionallyAccepted' => 'success',
default => 'gray',
default => 'black',
})
->alignCenter()
->sortable(),

View File

@@ -3529,14 +3529,80 @@ class QualityValidationResource extends Resource
$mPlantName = $mailData['plant_name'];
$emails = $mailData['emails'];
$ccEmails = $mailData['cc_emails'] ?? [];
$mUserName = Filament::auth()->user()->name;
// if (! empty($emails)) {
// if (is_array($emails)) {
// $emailList = collect($emails)
// ->flatMap(fn ($email) => explode(',', $email))
// ->map(fn ($email) => trim($email))
// ->filter()
// ->toArray();
// } else {
// $emailList = array_map('trim', explode(',', $emails));
// }
// $ccList = [];
// if (!empty($cc_emails)) {
// if (is_array($cc_emails)) {
// $ccList = collect($cc_emails)
// ->flatMap(fn ($email) => explode(',', $email))
// ->map(fn ($email) => trim($email))
// ->filter()
// ->toArray();
// } else {
// $ccList = collect(explode(',', $cc_emails))
// ->map(fn ($email) => trim($email))
// ->filter()
// ->toArray();
// }
// }
// Mail::to($emailList)
// ->cc($ccList)
// ->send(
// new InvalidQualityMail(
// $state,
// $mPorder,
// $mPlantName,
// $mLinePart,
// $mUserName,
// $mExpectedValue,
// 'InvalidPartNumber'
// )
// );
// }
if (!empty($emails)) {
// Mail::to($emails)->send(new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType));
Mail::to($emails)->send(
new InvalidQualityMail($state, $mPorder, $mPlantName, $mLinePart, $mUserName, $mExpectedValue, 'InvalidPartNumber')
$emailList = collect(is_array($emails) ? $emails : explode(',', $emails))
->flatMap(fn ($email) => explode(',', $email))
->map(fn ($email) => trim($email))
->filter()
->toArray();
$ccList = collect(is_array($ccEmails) ? $ccEmails : explode(',', $ccEmails))
->flatMap(fn ($email) => explode(',', $email))
->map(fn ($email) => trim($email))
->filter()
->toArray();
Mail::to($emailList)
->cc($ccList)
->send(
new InvalidQualityMail(
$state,
$mPorder,
$mPlantName,
$mLinePart,
$mUserName,
$mExpectedValue,
'InvalidPartNumber'
)
);
} else {
}
else {
\Log::warning("No recipients found for plant {$mPlantName}, module Serial, rule invalid_serial.");
}
$set('part_validation1', null);
@@ -3978,6 +4044,7 @@ class QualityValidationResource extends Resource
->where('module', 'QualityValidation')
->where('rule_name', 'QualityMail')
->where(fn ($q) => $q->whereNull('schedule_type')->orWhere('schedule_type', ''))
// ->get()
->pluck('email')
->toArray();
@@ -3995,13 +4062,16 @@ class QualityValidationResource extends Resource
->where('module', 'QualityValidation')
->where('rule_name', 'QualityMail')
->where(fn ($q) => $q->whereNull('schedule_type')->orWhere('schedule_type', ''))
->pluck('email')
->toArray();
->get(['email', 'cc_emails']);
// ->pluck('email')
// ->toArray();
return [
'plant_id' => $plantId,
'plant_name' => $mPlantName,
'emails' => $emails,
'emails' => $emails->pluck('email')->filter()->toArray(),
'cc_emails' => $emails->pluck('cc_emails')->filter()->toArray(),
// 'emails' => $emails,
];
}

View File

@@ -813,7 +813,7 @@ class TestingPanelReadingResource extends Resource
if ($plantId) {
return MotorTestingMaster::whereHas('testingPanelReadings', function ($query) {
$query->whereNotNull('id');
})->orderBy('subassembly_code')->pluck('subassembly_code', 'id');
})->whereNotNull('subassembly_code')->orderBy('subassembly_code')->pluck('subassembly_code', 'id');
} else {
return [];
// return Item::whereHas('motorTestingMasters')

View File

@@ -450,7 +450,9 @@ class VisitorEntryResource extends Resource
|| !empty($data['created_to']);
if (!$hasAnyFilter) {
$query->whereDate('created_at', today());
// $query->whereDate('created_at', today());
$query->whereDate('visitor_entries.created_at', today())
->whereNull('out_time');
return;
}

View File

@@ -581,6 +581,9 @@ class InvoiceDataTable extends Component
return [
'sticker_master_id' => $record->sticker_master_id,
// 'material_type' => StickerMaster::where('id', $record->sticker_master_id)->first()->material_type ?? '',
'invoice_quantity' => $record->invoice_quantity ?? 0,
'scanned_quantity' => ($record->invoice_quantity == null) ? 0 : ($record->invoice_quantity - $record->quantity) ?? 0,
// 'scanned_quantity' => number_format(($record->invoice_quantity == null ? 0 : ($record->invoice_quantity - $record->quantity)), 3, '.', ''),
'quantity' => $record->quantity ?? '',
'serial_number' => $record->serial_number ?? '',
'batch_number' => $record->batch_number ?? '',
@@ -597,12 +600,17 @@ class InvoiceDataTable extends Component
$matType = StickerMaster::where('id', $row['sticker_master_id'] ?? null)->first()->material_type ?? '';
if ($matType == 1) {
$row['material_type'] = 'Individual';
$row['invoice_quantity'] = $row['quantity'];
} elseif ($matType == 2) {
$row['material_type'] = 'Bundle';
$row['invoice_quantity'] = $row['quantity'];
} elseif ($matType == 3) {
$row['material_type'] = 'Quantity';
$row['invoice_quantity'] = number_format($row['invoice_quantity'], 3, '.', '');
$row['scanned_quantity'] = number_format($row['scanned_quantity'], 3, '.', '');
} elseif ($matType == 4) {
$row['material_type'] = 'Bundle Individual';
$row['invoice_quantity'] = $row['quantity'];
} else {
$row['material_type'] = 'N/A';
}

View File

@@ -0,0 +1,266 @@
<?php
namespace App\Livewire;
use App\Models\AlertMailRule;
use App\Models\Item;
use App\Models\Line;
use App\Models\PanelBoxValidation;
use App\Models\Plant;
use App\Models\ProductCharacteristicsMaster;
use App\Models\ProductionCharacteristic;
use Filament\Facades\Filament;
use Livewire\Component;
use Filament\Notifications\Notification;
use Illuminate\Support\Facades\Mail;
use App\Mail\InvalidQualityMail;
class PanelCheckList extends Component
{
public $records = [];
public $existingRecords = [];
// public bool $shouldSkipChecklist = false;
public array $checklist = [];
public $showChecklist = false;
// public $skipChecklistValidation = false;
// protected $listeners = ['focus-item-id' => 'handleFocus', 'trigger-create' => 'doCreate',];
public $data =
[
'item_id' => '',
'plant_id' => '',
];
public $data1 = [
'checklist' => [],
];
// public function doCreate()
// {
// $this->create();
// $this->shouldSkipChecklist = false;
// }
public function mount($records = [])
{
// $this->records = collect($records);
$this->records = $records;
// foreach ($records as $record) {
// $this->checklist[$record['id']] = 'ok';
// }
}
public function cancel()
{
$this->dispatch('checklist-cancelled');
}
public function saveChecklist()
{
if (empty($this->checklist) || count($this->checklist) != count($this->records)) {
Notification::make()
->title('Incomplete Checklist')
->body('Please complete all checklist fields before submitting.')
->danger()
->send();
return;
}
$item = Item::where('code', $this->data['item_id'])->first();
if (! $item) {
Notification::make()
->title('Invalid Item Code')
->body('Item not found for given code.')
->danger()
->send();
return;
}
$itemAgaPlant = Item::where('code', $this->data['item_id'])->where('plant_id', $this->data['plant_id'])->first();
$plant = Plant::find($this->data['plant_id']);
if (! $itemAgaPlant) {
Notification::make()
->title('Invalid Item Code')
->body("Item code '$this->data['item_id']' not found for given plant code '{$plant?->code}'.")
->danger()
->send();
return;
}
$itemId = $itemAgaPlant->id;
$exists = PanelBoxValidation::where('plant_id', $this->data['plant_id'] ?? null)
->where('serial_number', $this->data['serial_number'] ?? null)
->first();
$plan = Plant::find($this->data['plant_id']);
if ($exists) {
Notification::make()
->title('Duplicate Serial Number')
->body("serial number {$this->data['serial_number']} already exists for the selected plant $plan->code.")
->danger()
->send();
return;
}
$qualityValidation = PanelBoxValidation::create([
'plant_id' => $this->data['plant_id'] ?? null,
'line_id' => $this->data['line_id'] ?? null,
'sticker_master_id' => $this->data['sticker_master_id'] ?? null,
'production_order' => $this->data['production_order'] ?? null,
'serial_number' => $this->data['serial_number'] ?? null,
'serial_number_panel' => $this->data['serial_number_panel'] ?? null,
'pack_slip_panel' => $this->data['pack_slip_panel'] ?? null,
'name_plate_panel' => $this->data['name_plate_panel'] ?? null,
'tube_sticker_panel' => $this->data['tube_sticker_panel'] ?? null,
'warranty_card_panel' => $this->data['warranty_card_panel'] ?? null,
'part_validation1' => $this->data['part_validation1'] ?? null,
'part_validation2' => $this->data['part_validation2'] ?? null,
'part_validation3' => $this->data['part_validation3'] ?? null,
'part_validation4' => $this->data['part_validation4'] ?? null,
'part_validation5' => $this->data['part_validation5'] ?? null,
'created_by' => $this->data['created_by'] ?? null,
]);
if (! $qualityValidation || ! $qualityValidation->exists) {
Notification::make()
->title('Failed to save Panel Box Validation')
->body('Something went wrong while inserting data.')
->danger()
->send();
return;
}
foreach ($this->checklist as $characteristicId => $value) {
// $status = 'Ok';
$characteristic = ProductCharacteristicsMaster::find($characteristicId);
if (($characteristic?->inspection_type ?? null) === 'Value') {
if (
$characteristic &&
is_numeric($value) &&
$value >= $characteristic->lower &&
$value <= $characteristic->upper
) {
$status = 'Ok';
} else {
$status = 'NotOk';
}
}
else {
$status = $value;
}
ProductionCharacteristic::create([
'plant_id' => $this->data['plant_id'] ?? null,
'item_id' => $itemId ?? null,
'line_id' => $this->data['line_id'] ?? null,
'machine_id' => $characteristic?->machine_id ?? null,
'production_order' => $this->data['production_order'] ?? null,
'serial_number' => $this->data['serial_number'] ?? null,
'characteristic_name' => $characteristic?->name ?? null,
'observed_value' => $value ?? null,
'status' => $status,
'inspection_status' => $finalInspectionStatus ?? null,
'created_by' => $this->data['operator_id'] ?? null,
]);
}
$this->showChecklist = false;
$this->dispatch('checklist-saved');
}
public function canSaveChecklist(): bool
{
if (empty($this->checklist) || count($this->checklist) != count($this->records)) {
return false;
}
foreach ($this->checklist as $characteristicId => $value) {
if ($value == null || $value == '') {
return false;
}
$characteristic = ProductCharacteristicsMaster::find($characteristicId);
if (! $characteristic || ! is_numeric($value) || $value <= $characteristic->lower || $value >= $characteristic->upper){
return false;
}
}
return true;
}
public function getCharacteristicStatus($characteristicId): ?string
{
$value = $this->checklist[$characteristicId] ?? null;
if ($value == null || $value == '') {
return null;
}
$characteristic = ProductCharacteristicsMaster::find($characteristicId);
if (! $characteristic || ! is_numeric($value)) {
return 'Not Ok';
}
return ($value > $characteristic->lower && $value < $characteristic->upper) ? 'Ok' : 'Not Ok';
}
// public static function getMailData($plantId)
// {
// $globalEmails = AlertMailRule::where('plant', 0)
// ->where('module', 'QualityValidation')
// ->where('rule_name', 'QualityMail')
// ->where(fn ($q) => $q->whereNull('schedule_type')->orWhere('schedule_type', ''))
// ->pluck('email')
// ->toArray();
// if (! empty($globalEmails)) {
// return [
// 'plant_id' => 0,
// 'plant_name' => 'All Plants',
// 'emails' => $globalEmails,
// ];
// }
// $mPlantName = Plant::where('id', $plantId)->value('name');
// $emails = AlertMailRule::where('plant', $plantId)
// ->where('module', 'QualityValidation')
// ->where('rule_name', 'QualityMail')
// ->where(fn ($q) => $q->whereNull('schedule_type')->orWhere('schedule_type', ''))
// ->pluck('email')
// ->toArray();
// return [
// 'plant_id' => $plantId,
// 'plant_name' => $mPlantName,
// 'emails' => $emails,
// ];
// }
public function render()
{
return view('livewire.panel-check-list');
}
}

View File

@@ -176,7 +176,12 @@ class ProductionCheckList extends Component
'serial_number' => $this->data['serial_number'] ?? null,
'characteristic_name' => $characteristic?->name ?? null,
'observed_value' => $this->data['observed_value'] ?? null,
'status' => $value == 'ok' ? 'Ok' : 'NotOk',
// 'status' => $value == 'ok' ? 'Ok' : 'NotOk',
'status' => match (strtolower($value)) {
'ok' => 'Ok',
'na' => 'N/A',
'not_ok' => 'NotOk',
},
'inspection_status' => $finalInspectionStatus ?? null,
'created_by' => $this->data['operator_id'] ?? null,
]);

View File

@@ -51,7 +51,7 @@ class ImportTransitMail extends Mailable
{
$now = now();
$reportDate = $now->format('d/m/Y');
$greeting = '<b>Dear Sir/Madam</b>,<br>Kindly find attached the Pending Import Shipment Status Report as on ' . $reportDate . ' for your reference.<br>We request you to review the shipments highlighted in <span style="background-color: yellow; font-weight: bold;">yellow</span> and arrange for their clearance at the earliest to avoid further delays and additional charges.<br>Please note that for shipments pending under <b>Telex Release</b> and <b>Duty Payment</b>, CFS charges will be commenced post ETA. We therefore urge you to expedite the necessary actions at your end.';
$greeting = '<b>Dear Sir/Madam</b>,<br>Kindly find attached the Pending Import Shipment Status Report as on ' . $reportDate . ' for your reference.<br>We request you to review the shipments highlighted in <span style="background-color: yellow; font-weight: bold;">yellow</span> and arrange for their clearance at the earliest to avoid further delays and additional charges.<br>Please note that for shipments pending under <b>Telex Release</b> and <b>Duty Payment</b>, CFS charges will be commenced post ETA. We therefore urge you to expedite the necessary actions at your end.<br>FCL shipment will take 5-6 Days for clearance & LCL shipment will take 7-8 Days for clearance after arrival of the shipment @ destination Port.</br>';
//$greeting1 = 'Dear C.R.I Branch Team, <br><br> Please follow and ensure the same';

View File

@@ -30,6 +30,7 @@ class InvoiceValidation extends Model
'upload_status',
'batch_number',
'quantity',
'invoice_quantity',
'operator_id',
'created_by',
'updated_by',

View File

@@ -0,0 +1,46 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class PanelBoxValidation extends Model
{
use SoftDeletes;
protected $fillable = [
'plant_id',
'line_id',
'sticker_master_id',
'production_order',
'serial_number',
'serial_number_panel',
'pack_slip_panel',
'name_plate_panel',
'tube_sticker_panel',
'warranty_card_panel',
'part_validation1',
'part_validation2',
'part_validation3',
'part_validation4',
'part_validation5',
'created_by',
'updated_by'
];
public function plant(): BelongsTo
{
return $this->belongsTo(Plant::class);
}
public function line(): BelongsTo
{
return $this->belongsTo(Line::class);
}
public function stickerMaster(): BelongsTo
{
return $this->belongsTo(StickerMaster::class);
}
}

View File

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

View File

@@ -0,0 +1,56 @@
<?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 panel_box_validations (
id BIGINT GENERATED always AS IDENTITY PRIMARY KEY,
plant_id BIGINT NOT NULL,
line_id BIGINT NOT NULL,
sticker_master_id BIGINT NOT NULL,
production_order TEXT DEFAULT NULL,
serial_number TEXT DEFAULT NULL,
serial_number_panel TEXT DEFAULT NULL,
pack_slip_panel TEXT DEFAULT NULL,
name_plate_panel TEXT DEFAULT NULL,
tube_sticker_panel TEXT DEFAULT NULL,
warranty_card_panel TEXT DEFAULT NULL,
part_validation1 TEXT DEFAULT NULL,
part_validation2 TEXT DEFAULT NULL,
part_validation3 TEXT DEFAULT NULL,
part_validation4 TEXT DEFAULT NULL,
part_validation5 TEXT DEFAULT NULL,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP,
created_by TEXT DEFAULT NULL,
updated_by TEXT DEFAULT NULL,
deleted_at TIMESTAMP,
UNIQUE (plant_id, serial_number),
FOREIGN KEY (plant_id) REFERENCES plants (id),
FOREIGN KEY (line_id) REFERENCES lines (id),
FOREIGN KEY (sticker_master_id) REFERENCES sticker_masters (id)
);
SQL;
DB::statement($sql);
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('panel_box_validations');
}
};

View File

@@ -0,0 +1,29 @@
<?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
{
DB::statement(<<<'SQL'
ALTER TABLE invoice_validations
ADD COLUMN invoice_quantity NUMERIC(10,3) NULL;
SQL);
}
/**
* Reverse the migrations.
*/
public function down(): void
{
// Schema::table('invoice_validations', function (Blueprint $table) {
// //
// });
}
};

View File

@@ -0,0 +1,6 @@
<div>
@livewire('panel-check-list', [
'records' => $existingRecords,
'data' => $data
])
</div>

View File

@@ -229,7 +229,9 @@
<th class="border px-4 py-2">No</th>
<th class="border px-4 py-2">Material Code</th>
<th class="border px-4 py-2">Material Type</th>
<th class="border px-4 py-2">Material Quantity</th>
<th class="border px-4 py-2">Invoice Quantity</th>
<th class="border px-4 py-2">To Be Scanned</th>
<th class="border px-4 py-2">Scanned Quantity</th>
<th class="border px-4 py-2">Serial Number</th>
<th class="border px-4 py-2">Batch Number</th>
<th class="border px-4 py-2">TimeStamp</th>
@@ -242,6 +244,13 @@
<td class="border px-4 py-2">{{ $index + 1 }}</td>
<td class="border px-4 py-2">{{ $row['code'] ?? 'N/A' }}</td>
<td class="border px-4 py-2">{{ $row['material_type'] ?? 'N/A' }}</td>
<td class="border px-4 py-2">
@if(($row['material_type'] ?? '') == 'Individual' || ($row['material_type'] ?? '') == 'Bundle' || ($row['material_type'] ?? '') == 'Bundle Individual')
{{ number_format((float)($row['invoice_quantity'] ?? 0), 0) }}
@else
{{ $row['invoice_quantity'] ?? 'N/A' }}
@endif
</td>
<td class="border px-4 py-2">
@if(($row['material_type'] ?? '') == 'Individual' || ($row['material_type'] ?? '') == 'Bundle' || ($row['material_type'] ?? '') == 'Bundle Individual')
{{ number_format((float)($row['quantity'] ?? 0), 0) }}
@@ -249,6 +258,13 @@
{{ $row['quantity'] ?? 'N/A' }}
@endif
</td>
<td class="border px-4 py-2">
@if(($row['material_type'] ?? '') == 'Individual' || ($row['material_type'] ?? '') == 'Bundle' || ($row['material_type'] ?? '') == 'Bundle Individual')
{{ number_format((float)($row['scanned_quantity'] ?? 0), 0) }}
@else
{{ $row['scanned_quantity'] ?? 'N/A' }}
@endif
</td>
<td class="border px-4 py-2">{{ $row['serial_number'] ?? 'N/A' }}</td>
<td class="border px-4 py-2">{{ $row['batch_number'] ?? 'N/A' }}</td>
<td class="border px-4 py-2">{{ $row['created_at'] ?? 'N/A' }}</td>

View File

@@ -0,0 +1,141 @@
<div class="fixed inset-0 flex items-center justify-center z-50">
{{-- <div class="bg-white max-h-[80vh] overflow-hidden p-6 rounded-lg shadow-lg pointer-events-auto"
style="width:30vw !important; max-width:none !important;"> --}}
<div
class="bg-white rounded-lg shadow-lg pointer-events-auto
w-full max-w-2xl max-h-[90vh] flex flex-col">
{{-- @if($records && $records->count()) --}}
@if(!empty($records) && count($records))
<div style="max-height:250px; overflow-y:auto; border:1px solid #ccc;">
{{-- <table class="min-w-full border"> --}}
<table class="w-full table-fixed border text-sm">
<thead>
<tr class="bg-gray-100">
<th class="border px-2 py-1 w-2/3">Characteristics</th>
<th class="border px-2 py-1 w-1/3">Value</th>
</tr>
</thead>
<tbody>
@foreach($records as $record)
<tr>
<td class="border p-2">
{{ $record['name'] }}
</td>
{{-- <td class="border p-2">
<input
type="text"
wire:model.defer="checklist.{{ $record['id'] }}"
wire:model.live="checklist.{{ $record['id'] }}"
class="w-full border rounded px-2 py-1"
placeholder="Enter value"
>
</td> --}}
{{-- <td class="border p-2">
@php
$status = $this->getCharacteristicStatus($record['id']);
@endphp
<input
type="text"
wire:model.live="checklist.{{ $record['id'] }}"
class="w-full rounded px-2 py-1 border-2 transition-all duration-200"
style="
@if($status === 'Ok')
border-color: #22c55e;
box-shadow: 0 0 8px rgba(34, 197, 94, 0.8);
@elseif($status === 'Not Ok')
border-color: #ef4444;
box-shadow: 0 0 8px rgba(239, 68, 68, 0.8);
@else
border-color: #d1d5db;
@endif
"
placeholder="Enter value"
>
</td> --}}
<td class="border p-2">
@php
$status = $this->getCharacteristicStatus($record['id']);
@endphp
@if(($record['inspection_type'] ?? null) === 'Visual')
<div class="flex gap-4">
<label class="flex items-center gap-1">
<input
type="radio"
wire:model.live="checklist.{{ $record['id'] }}"
value="Ok"
>
Ok
</label>
<label class="flex items-center gap-1">
<input
type="radio"
wire:model.live="checklist.{{ $record['id'] }}"
value="NotOk"
>
Not Ok
</label>
</div>
@else
<input
type="text"
wire:model.live="checklist.{{ $record['id'] }}"
class="w-full rounded px-2 py-1 border-2 transition-all duration-200"
style="
@if($status === 'Ok')
border-color: #22c55e;
box-shadow: 0 0 8px rgba(34, 197, 94, 0.8);
@elseif($status === 'Not Ok')
border-color: #ef4444;
box-shadow: 0 0 8px rgba(239, 68, 68, 0.8);
@else
border-color: #d1d5db;
@endif
"
placeholder="Enter value"
>
@endif
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
@else
<p>No records found.</p>
@endif
<div class="border-t mt-6 pt-4 flex justify-end gap-3">
<button
type="button"
wire:click="cancel"
style="background-color:#dc2626; color:white;"
class="px-6 py-2 rounded-lg shadow-md"
>
Cancel
</button>
<button
type="button"
wire:click="saveChecklist"
style="background-color:#16a34a; color:white;"
{{-- @disabled(!$this->canSaveChecklist()) --}}
class="px-6 py-2 rounded-lg shadow-md disabled:opacity-50 disabled:cursor-not-allowed"
>
Save
</button>
</div>
</div>
</div>

View File

@@ -18,6 +18,7 @@
<th class="border px-2 py-1 w-2/3">Characteristics</th>
<th class="border px-2 py-1 w-1/6">OK</th>
<th class="border px-2 py-1 w-1/6">Not OK</th>
<th class="border px-2 py-1 w-1/6">N/A</th>
</tr>
</thead>
<tbody>
@@ -38,6 +39,12 @@
wire:model="checklist.{{ $record['id'] }}"
value="not_ok">
</td>
<td class="border text-center">
<input type="radio"
wire:model="checklist.{{ $record['id'] }}"
value="na">
</td>
</tr>
@endforeach
</tbody>

View File

@@ -29,6 +29,10 @@
<td>Item Code</td>
<td style="text-align: center;">{{ $request->item->code ?? $request->code }}</td>
</tr>
<tr>
<td>Description</td>
<td style="text-align: center;">{{ $request->item->description ?? $request->description }}</td>
</tr>
<tr>
<td>Job Number</td>
<td style="text-align: center;">{{ $request->aufnr }}</td>

View File

@@ -89,39 +89,30 @@
<tr style="{{ $row['is_transit_identified'] == 1 ? 'background-color:#FFFF00;' . 'font-weight: bold;' : '' }}">
<td>{{ $loop->iteration }}</td>
<td>{{ $row['cri_rfq_number'] }}</td>
{{-- <td>{{ $row['mail_received_date'] }}</td> --}}
{{-- <td>{{ \Carbon\Carbon::parse($row['mail_received_date'])->format('Y-m-d') }}</td> --}}
{{-- <td>{{ $row['pricol_ref_number'] }}</td> --}}
<td>{{ $row['requester'] }}</td>
<td>{{ $row['shipper'] }}</td>
<td>{{ $row['shipper_location'] }}</td>
<td>{{ $row['shipper_invoice'] }}</td>
{{-- <td>{{ $row['shipper_invoice_date'] }}</td> --}}
<td>{{ \Carbon\Carbon::parse($row['shipper_invoice_date'])->format('Y-m-d') }}</td>
{{-- <td>{{ \Carbon\Carbon::parse($row['shipper_invoice_date'])->format('Y-m-d') }}</td> --}}
<td>
{{ !empty($row['shipper_invoice_date']) ? \Carbon\Carbon::parse($row['shipper_invoice_date'])->format('Y-m-d') : '' }}
</td>
<td>{{ $row['customs_agent_name'] }}</td>
{{-- <td>{{ $row['eta_date'] }}</td> --}}
<td>{{ \Carbon\Carbon::parse($row['eta_date'])->format('Y-m-d') }}</td>
{{-- <td>{{ $row['status'] }}</td> --}}
{{-- <td>{{ \Carbon\Carbon::parse($row['eta_date'])->format('Y-m-d') }}</td> --}}
<td>
{{ !empty($row['eta_date']) ? \Carbon\Carbon::parse($row['eta_date'])->format('Y-m-d') : '' }}
</td>
<td class="status-column">
{{ $row['status'] }}
</td>
<td>{{ $row['delivery_location'] }}</td>
{{-- <td>{{ $row['etd_date'] }}</td> --}}
<td>{{ \Carbon\Carbon::parse($row['etd_date'])->format('Y-m-d') }}</td>
{{-- <td>{{ $row['mode'] }}</td>
<td>{{ $row['inco_terms'] }}</td>
<td>{{ $row['port_of_loading'] }}</td>
<td>{{ $row['port_of_discharge'] }}</td>
<td>{{ $row['delivery_city'] }}</td>
<td>{{ $row['packages'] }}</td>
<td>{{ $row['type_of_package'] }}</td>
<td>{{ $row['gross_weight'] }}</td>
<td>{{ $row['volume'] }}</td>
<td>{{ $row['bill_number'] }}</td> --}}
{{-- <td>{{ $row['bill_received_date'] }}</td> --}}
{{-- <td>{{ \Carbon\Carbon::parse($row['bill_received_date'])->format('Y-m-d') }}</td>
<td>{{ $row['vessel_number'] }}</td> --}}
<td>{{ $row['remark'] }}</td>
{{-- <td>{{ \Carbon\Carbon::parse($row['etd_date'])->format('Y-m-d') }}</td> --}}
<td>
{{ !empty($row['etd_date']) ? \Carbon\Carbon::parse($row['etd_date'])->format('Y-m-d') : '' }}
</td>
<td>
{{ $row['remark'] }}
</td>
</tr>
@endforeach
</tbody>