176 Commits

Author SHA1 Message Date
a52fc9580a Merge pull request 'ranjith-dev' (#123) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #123
2026-01-01 10:32:08 +00:00
dhanabalan
6cde9fc570 Item Description column added as Optional on view report and Invoice Types loaded based on user rights on report filter
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 9s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 35s
Laravel Pint / pint (pull_request) Successful in 2m35s
Laravel Larastan / larastan (pull_request) Failing after 3m4s
2026-01-01 15:56:04 +05:30
dhanabalan
ab1daa57e2 Export plant code instead of plant name and description column added in InvoiceValidationExporter
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
2026-01-01 15:48:12 +05:30
94819ccc4f Merge pull request 'removed logic submerisible motor and pump in sticker reprint' (#122) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
Reviewed-on: #122
2025-12-31 03:50:44 +00:00
dhanabalan
f0141c4f7e removed logic submerisible motor and pump in sticker reprint
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Gemini PR Review / review (pull_request) Failing after 24s
Laravel Pint / pint (pull_request) Successful in 2m29s
Laravel Larastan / larastan (pull_request) Failing after 3m6s
2025-12-31 09:20:15 +05:30
6e51b9fba8 Merge pull request 'Removed production plan logic in sticker reprint page' (#121) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 19s
Reviewed-on: #121
2025-12-27 10:57:00 +00:00
dhanabalan
3bcc351fa6 Removed production plan logic in sticker reprint page
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 31s
Laravel Pint / pint (pull_request) Successful in 3m6s
Laravel Larastan / larastan (pull_request) Failing after 3m51s
2025-12-27 16:26:43 +05:30
0a66526a63 Merge pull request 'Added uom in table column in process order resource page' (#120) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Reviewed-on: #120
2025-12-27 08:01:18 +00:00
dhanabalan
ea16763f33 Added uom in table column in process order resource page
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Gemini PR Review / review (pull_request) Failing after 44s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Laravel Pint / pint (pull_request) Successful in 2m14s
Laravel Larastan / larastan (pull_request) Failing after 3m13s
2025-12-27 13:31:06 +05:30
0398cd5262 Merge pull request 'Added uom in process order resource page' (#119) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #119
2025-12-27 07:59:17 +00:00
dhanabalan
94193d6a47 Added uom in process order resource page
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 9s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 9s
Gemini PR Review / review (pull_request) Failing after 26s
Laravel Pint / pint (pull_request) Successful in 2m24s
Laravel Larastan / larastan (pull_request) Failing after 3m28s
2025-12-27 13:29:03 +05:30
cca6fbe428 Merge pull request 'Added observed value in characteristic values resource page' (#118) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #118
2025-12-27 07:50:24 +00:00
dhanabalan
f4c89037f2 Added observed value in characteristic values resource page
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 33s
Laravel Pint / pint (pull_request) Successful in 2m27s
Laravel Larastan / larastan (pull_request) Failing after 3m27s
2025-12-27 13:20:02 +05:30
633c8c89ca Merge pull request 'Added observed value in api method in characteristics controller' (#117) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #117
2025-12-27 07:40:19 +00:00
dhanabalan
e2bb41d1d7 Added observed value in api method in characteristics controller
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Gemini PR Review / review (pull_request) Failing after 37s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Laravel Pint / pint (pull_request) Successful in 2m48s
Laravel Larastan / larastan (pull_request) Failing after 3m37s
2025-12-27 13:10:04 +05:30
543ab7f44f Merge pull request 'Added observed_value in characteritics model file' (#116) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #116
2025-12-27 07:36:35 +00:00
dhanabalan
c180e098a3 Added observed_value in characteritics model file
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 36s
Laravel Pint / pint (pull_request) Successful in 2m28s
Laravel Larastan / larastan (pull_request) Failing after 4m5s
2025-12-27 13:06:22 +05:30
09aeff2b96 Merge pull request 'Added observed value column in characteritics value table' (#115) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
Reviewed-on: #115
2025-12-27 07:32:58 +00:00
dhanabalan
b2a06caff0 Added observed value column in characteritics value table
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Gemini PR Review / review (pull_request) Failing after 35s
Laravel Pint / pint (pull_request) Successful in 2m37s
Laravel Larastan / larastan (pull_request) Failing after 3m29s
2025-12-27 13:02:32 +05:30
2f3973f6af Merge pull request 'solved issued for apache url path issue in production' (#114) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
Reviewed-on: #114
2025-12-26 07:11:50 +00:00
dhanabalan
bc1d3190d4 solved issued for apache url path issue in production
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 27s
Laravel Pint / pint (pull_request) Successful in 2m17s
Laravel Larastan / larastan (pull_request) Failing after 3m11s
2025-12-26 12:41:36 +05:30
7f76a604a3 Merge pull request 'Added proper logic in sticker reprint controller' (#113) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
Reviewed-on: #113
2025-12-26 06:57:16 +00:00
dhanabalan
0490516836 Added proper logic in sticker reprint controller
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 32s
Laravel Pint / pint (pull_request) Successful in 2m31s
Laravel Larastan / larastan (pull_request) Failing after 3m13s
2025-12-26 12:27:03 +05:30
837ac47120 Merge pull request 'Added api' (#112) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 16s
Reviewed-on: #112
2025-12-26 06:45:56 +00:00
dhanabalan
8d05164215 Added api
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 27s
Laravel Pint / pint (pull_request) Successful in 2m16s
Laravel Larastan / larastan (pull_request) Failing after 3m7s
2025-12-26 12:15:44 +05:30
e6fb2c1bae Merge pull request 'Added proper logic in production sticker reprint controller' (#111) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #111
2025-12-26 06:32:39 +00:00
dhanabalan
f38cc70537 Added proper logic in production sticker reprint controller
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 32s
Laravel Pint / pint (pull_request) Successful in 2m15s
Laravel Larastan / larastan (pull_request) Failing after 3m23s
2025-12-26 12:02:27 +05:30
a687b8af3b Merge pull request 'Added regex pattern for sticker reprint' (#110) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
Reviewed-on: #110
2025-12-26 06:06:11 +00:00
dhanabalan
5dd212422c Added regex pattern for sticker reprint
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 9s
Gemini PR Review / review (pull_request) Failing after 22s
Laravel Pint / pint (pull_request) Successful in 2m16s
Laravel Larastan / larastan (pull_request) Failing after 3m7s
2025-12-26 11:35:53 +05:30
cd45e6658a Merge pull request 'Added without over lapping for auto scheduler' (#109) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
Reviewed-on: #109
2025-12-22 08:58:03 +00:00
dhanabalan
574e244e2f Added without over lapping for auto scheduler
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 1m1s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 49s
Gemini PR Review / review (pull_request) Failing after 1m11s
Laravel Pint / pint (pull_request) Successful in 2m54s
Laravel Larastan / larastan (pull_request) Failing after 4m4s
2025-12-22 14:26:53 +05:30
0b221c5eae Merge pull request 'added labels in characteristic value exporter' (#108) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Reviewed-on: #108
2025-12-20 03:07:04 +00:00
dhanabalan
9d8388c221 added labels in characteristic value exporter
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 47s
Laravel Pint / pint (pull_request) Successful in 2m20s
Laravel Larastan / larastan (pull_request) Failing after 3m10s
2025-12-20 08:36:53 +05:30
8c062505c9 Merge pull request 'Added validation in characteristic value importer' (#107) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #107
2025-12-20 03:04:59 +00:00
dhanabalan
87fd2df0f4 Added validation in characteristic value importer
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Gemini PR Review / review (pull_request) Failing after 1m3s
Laravel Pint / pint (pull_request) Successful in 2m22s
Laravel Larastan / larastan (pull_request) Failing after 3m26s
2025-12-20 08:34:43 +05:30
9411d0b33b Merge pull request 'chnaged logic in sticker reprint logic' (#106) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #106
2025-12-18 10:51:29 +00:00
dhanabalan
7d5e02f491 chnaged logic in sticker reprint logic
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Gemini PR Review / review (pull_request) Failing after 23s
Laravel Pint / pint (pull_request) Successful in 2m23s
Laravel Larastan / larastan (pull_request) Failing after 3m49s
2025-12-18 16:21:10 +05:30
ab3a2047bb Merge pull request 'Added jwt qr code scanning functionality for invoice number' (#105) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
Reviewed-on: #105
2025-12-17 10:09:22 +00:00
dhanabalan
810c40b81b Added jwt qr code scanning functionality for invoice number
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 12s
Gemini PR Review / review (pull_request) Failing after 25s
Laravel Pint / pint (pull_request) Successful in 2m21s
Laravel Larastan / larastan (pull_request) Failing after 3m23s
2025-12-17 15:38:59 +05:30
f0ef2dda8e Merge pull request 'changed loadData method in invoice data tabele in livewire' (#102) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #102
2025-12-13 09:15:30 +00:00
dhanabalan
c43bc208b8 changed loadData method in invoice data tabele in livewire
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Gemini PR Review / review (pull_request) Failing after 31s
Laravel Pint / pint (pull_request) Successful in 3m46s
Laravel Larastan / larastan (pull_request) Failing after 4m50s
2025-12-13 14:45:14 +05:30
968d67d808 Merge pull request 'Changed plant name as plant code in item importer and exporter' (#101) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #101
2025-12-12 11:39:05 +00:00
dhanabalan
a1974ce78c Changed plant name as plant code in item importer and exporter
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 26s
Laravel Pint / pint (pull_request) Successful in 3m19s
Laravel Larastan / larastan (pull_request) Failing after 4m41s
2025-12-12 17:08:52 +05:30
2342c6003d Merge pull request 'Added pump and motor fg serial number regex pattern in sticker reprint' (#100) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 16s
Reviewed-on: #100
2025-12-12 04:25:33 +00:00
dhanabalan
151c563c4b Added pump and motor fg serial number regex pattern in sticker reprint
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Gemini PR Review / review (pull_request) Failing after 32s
Laravel Pint / pint (pull_request) Successful in 2m34s
Laravel Larastan / larastan (pull_request) Failing after 3m26s
2025-12-12 09:55:08 +05:30
290d218a0d Merge pull request 'Removed unneccessary arguments in part validation image route' (#99) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Reviewed-on: #99
2025-12-10 11:20:45 +00:00
dhanabalan
e4223e28be Removed unneccessary arguments in part validation image route
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 9s
Gemini PR Review / review (pull_request) Failing after 25s
Laravel Larastan / larastan (pull_request) Failing after 3m4s
Laravel Pint / pint (pull_request) Successful in 6m24s
2025-12-10 16:50:34 +05:30
c455c76715 Merge pull request 'changed part validation uploaded image logic in sticker master' (#98) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #98
2025-12-10 11:13:08 +00:00
dhanabalan
030013f914 changed part validation uploaded image logic in sticker master
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 9s
Gemini PR Review / review (pull_request) Failing after 25s
Laravel Pint / pint (pull_request) Successful in 2m52s
Laravel Larastan / larastan (pull_request) Failing after 3m46s
2025-12-10 16:42:41 +05:30
a1abe537c3 Merge pull request 'Removed image path logic in quality validation resource page' (#97) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #97
2025-12-10 11:11:49 +00:00
dhanabalan
750f8520f5 Removed image path logic in quality validation resource page
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 21s
Laravel Pint / pint (pull_request) Successful in 2m41s
Laravel Larastan / larastan (pull_request) Failing after 3m12s
2025-12-10 16:41:32 +05:30
c65265e68e Merge pull request 'changed numeric length in process order' (#96) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 9s
Reviewed-on: #96
2025-12-10 07:02:00 +00:00
dhanabalan
3b0eeda209 changed numeric length in process order
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 9s
Gemini PR Review / review (pull_request) Failing after 27s
Laravel Larastan / larastan (pull_request) Failing after 3m20s
Laravel Pint / pint (pull_request) Successful in 3m29s
2025-12-10 12:31:48 +05:30
3da016ae49 Merge pull request 'Added numeric length value for column order_quantity and received quantity in process order' (#95) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
Reviewed-on: #95
2025-12-10 06:58:10 +00:00
dhanabalan
1bc14aac38 Added numeric length value for column order_quantity and received quantity in process order
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 9s
Gemini PR Review / review (pull_request) Failing after 22s
Laravel Pint / pint (pull_request) Successful in 2m19s
Laravel Larastan / larastan (pull_request) Failing after 3m26s
2025-12-10 12:27:57 +05:30
ea17636670 Merge pull request 'Added characteristic values post method in chracracteristic controller' (#94) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
Reviewed-on: #94
2025-12-09 12:12:22 +00:00
dhanabalan
19b44a6705 Added characteristic values post method in chracracteristic controller
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 9s
Gemini PR Review / review (pull_request) Failing after 24s
Laravel Pint / pint (pull_request) Successful in 2m16s
Laravel Larastan / larastan (pull_request) Failing after 3m0s
2025-12-09 17:42:05 +05:30
31b56ae9b2 Merge pull request 'Added characteristics values post api in routes' (#93) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #93
2025-12-09 12:09:41 +00:00
dhanabalan
364fa1958e Added characteristics values post api in routes
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 9s
Gemini PR Review / review (pull_request) Failing after 20s
Laravel Pint / pint (pull_request) Successful in 4m11s
Laravel Larastan / larastan (pull_request) Failing after 4m36s
2025-12-09 17:39:30 +05:30
9517b38f9b Merge pull request 'Added sub group name in sticker printings' (#92) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Reviewed-on: #92
2025-12-09 11:45:00 +00:00
dhanabalan
587d91d790 Added sub group name in sticker printings
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
Gemini PR Review / review (pull_request) Failing after 21s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 9s
Laravel Pint / pint (pull_request) Successful in 2m16s
Laravel Larastan / larastan (pull_request) Failing after 3m12s
2025-12-09 17:14:50 +05:30
2c1caa40a3 Merge pull request 'Added sub group name of the product characteristics' (#91) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #91
2025-12-09 11:42:52 +00:00
dhanabalan
00b566a4ca Added sub group name of the product characteristics
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 32s
Laravel Pint / pint (pull_request) Successful in 3m50s
Laravel Larastan / larastan (pull_request) Failing after 4m31s
2025-12-09 17:12:40 +05:30
c3fef2f3a0 Merge pull request 'Added characteristic value policy file' (#90) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
Reviewed-on: #90
2025-12-09 08:02:13 +00:00
dhanabalan
a0d715c975 Added characteristic value policy file
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
Gemini PR Review / review (pull_request) Failing after 29s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Laravel Pint / pint (pull_request) Successful in 2m30s
Laravel Larastan / larastan (pull_request) Failing after 3m16s
2025-12-09 13:32:03 +05:30
904e18e63a Merge pull request 'Added characteristic value importer and exporter' (#89) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #89
2025-12-09 08:01:03 +00:00
dhanabalan
6c68f2baab Added characteristic value importer and exporter
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Gemini PR Review / review (pull_request) Failing after 34s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 12s
Laravel Pint / pint (pull_request) Successful in 2m6s
Laravel Larastan / larastan (pull_request) Failing after 3m10s
2025-12-09 13:30:53 +05:30
27dc2690ca Merge pull request 'Added characteristic values resource file' (#88) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #88
2025-12-09 07:59:56 +00:00
dhanabalan
27a6b2b5e3 Added characteristic values resource file
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Gemini PR Review / review (pull_request) Failing after 33s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 12s
Laravel Pint / pint (pull_request) Successful in 2m23s
Laravel Larastan / larastan (pull_request) Failing after 3m26s
2025-12-09 13:29:42 +05:30
8e1c4f46e8 Merge pull request 'Added characteristic value model file' (#87) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #87
2025-12-09 07:58:17 +00:00
dhanabalan
35d9419198 Added characteristic value model file
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Gemini PR Review / review (pull_request) Failing after 35s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Laravel Pint / pint (pull_request) Successful in 4m12s
Laravel Larastan / larastan (pull_request) Failing after 5m7s
2025-12-09 13:27:56 +05:30
d699c043d4 Merge pull request 'Added characteristics values migration file' (#86) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #86
2025-12-09 07:57:20 +00:00
dhanabalan
63d18fd785 Added characteristics values migration file
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 26s
Laravel Pint / pint (pull_request) Successful in 2m11s
Laravel Larastan / larastan (pull_request) Failing after 3m9s
2025-12-09 13:26:57 +05:30
1806f32a7b Merge pull request 'removed unwanted serial validation mail logic in invoice validation' (#85) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
Reviewed-on: #85
2025-12-09 05:21:01 +00:00
dhanabalan
84b6c45706 removed unwanted serial validation mail logic in invoice validation
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 34s
Laravel Pint / pint (pull_request) Successful in 2m21s
Laravel Larastan / larastan (pull_request) Failing after 3m22s
2025-12-09 10:50:40 +05:30
eb2ae19641 Merge pull request 'changed mail subject for quality validation' (#84) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #84
2025-12-09 03:11:37 +00:00
dhanabalan
84799678eb changed mail subject for quality validation
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 12s
Gemini PR Review / review (pull_request) Failing after 36s
Laravel Pint / pint (pull_request) Successful in 1m50s
Laravel Larastan / larastan (pull_request) Failing after 2m57s
2025-12-09 08:40:48 +05:30
2dbcc8b859 Merge pull request 'Added livewire changes in invoice validation' (#83) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #83
2025-12-07 08:33:05 +00:00
dhanabalan
db6af9863f Added livewire changes in invoice validation
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 1m2s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 42s
Gemini PR Review / review (pull_request) Failing after 1m45s
Laravel Pint / pint (pull_request) Successful in 1m52s
Laravel Larastan / larastan (pull_request) Failing after 3m1s
2025-12-07 14:02:34 +05:30
79e3427cdb Merge pull request 'removed extra attribute in invoice validation' (#80) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Reviewed-on: #80
2025-12-06 11:15:16 +00:00
dhanabalan
cdd746d5da removed extra attribute in invoice validation
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 22s
Laravel Pint / pint (pull_request) Successful in 3m8s
Laravel Larastan / larastan (pull_request) Failing after 4m45s
2025-12-06 16:44:52 +05:30
81a5fa16c4 Merge pull request 'solved quick scanning issue in invoice validation' (#79) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #79
2025-12-06 09:38:37 +00:00
dhanabalan
385103323a solved quick scanning issue in invoice validation
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Gemini PR Review / review (pull_request) Failing after 30s
Laravel Pint / pint (pull_request) Successful in 2m16s
Laravel Larastan / larastan (pull_request) Failing after 3m19s
2025-12-06 15:08:22 +05:30
6520c3ca87 Merge pull request 'ranjith-dev' (#78) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #78
2025-12-06 07:26:07 +00:00
dhanabalan
6ead4bce3d Commented drop unique constraint for plant and operation number on work_group_masters
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Gemini PR Review / review (pull_request) Failing after 31s
Laravel Larastan / larastan (pull_request) Failing after 4m33s
Laravel Pint / pint (pull_request) Successful in 41m32s
2025-12-06 12:54:18 +05:30
dhanabalan
5917ae4717 Add migration to drop unique constraint for plant and operation number on work_group_masters
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
2025-12-06 12:51:29 +05:30
2e167c75b0 Merge pull request 'Alter data type for order quantity for process orders table' (#77) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #77
2025-12-06 06:54:18 +00:00
dhanabalan
dbdb11b9cf Alter data type for order quantity for process orders table
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 25s
Laravel Larastan / larastan (pull_request) Failing after 3m39s
Laravel Pint / pint (pull_request) Successful in 12m22s
2025-12-06 12:24:06 +05:30
aca5d6c957 Merge pull request 'Added proper mail trigger for serial invoice' (#76) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #76
2025-12-06 06:39:07 +00:00
dhanabalan
764a14990b Added proper mail trigger for serial invoice
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 9s
Gemini PR Review / review (pull_request) Failing after 25s
Laravel Pint / pint (pull_request) Successful in 2m48s
Laravel Larastan / larastan (pull_request) Failing after 3m24s
2025-12-06 12:08:54 +05:30
9edbaf3d43 Merge pull request 'removed unwanted mail trigger for invoice validation error mail' (#75) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Reviewed-on: #75
2025-12-06 04:41:26 +00:00
dhanabalan
1905359179 removed unwanted mail trigger for invoice validation error mail
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 11s
Gemini PR Review / review (pull_request) Failing after 30s
Laravel Pint / pint (pull_request) Successful in 2m0s
Laravel Larastan / larastan (pull_request) Failing after 13m13s
2025-12-06 10:08:18 +05:30
a46aaa72a2 Merge pull request 'Added product characteristics master policy file' (#74) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
Reviewed-on: #74
2025-12-05 09:05:58 +00:00
dhanabalan
67961ff0f9 Added product characteristics master policy file
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 9s
Gemini PR Review / review (pull_request) Failing after 21s
Laravel Pint / pint (pull_request) Successful in 2m41s
Laravel Larastan / larastan (pull_request) Failing after 3m9s
2025-12-05 14:35:48 +05:30
d917aa530d Merge pull request 'Added product characteristics master importer and exporter' (#73) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #73
2025-12-05 09:04:44 +00:00
dhanabalan
34412da102 Added product characteristics master importer and exporter
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 1m21s
Laravel Larastan / larastan (pull_request) Failing after 2m53s
Laravel Pint / pint (pull_request) Successful in 2m5s
2025-12-05 14:34:31 +05:30
45944c5c25 Merge pull request 'Added product characteristics master resource pages' (#72) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #72
2025-12-05 09:03:20 +00:00
dhanabalan
ad55d30d78 Added product characteristics master resource pages
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 1m21s
Laravel Larastan / larastan (pull_request) Failing after 3m8s
Laravel Pint / pint (pull_request) Successful in 2m32s
2025-12-05 14:33:06 +05:30
fda672948b Merge pull request 'Added product characteristics model file' (#71) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #71
2025-12-05 09:01:39 +00:00
dhanabalan
04eb933997 Added product characteristics model file
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 1m22s
Laravel Larastan / larastan (pull_request) Failing after 3m14s
Laravel Pint / pint (pull_request) Successful in 2m22s
2025-12-05 14:31:08 +05:30
f15e6451ca Merge pull request 'removed two migartion file for product characteristics' (#70) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #70
2025-12-05 08:58:25 +00:00
dhanabalan
95ed717020 removed two migartion file for product characteristics
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 1m20s
Laravel Larastan / larastan (pull_request) Failing after 3m22s
Laravel Pint / pint (pull_request) Successful in 2m23s
2025-12-05 14:28:12 +05:30
c8aac9116d Merge pull request 'Added production characteristics migration file' (#69) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
Reviewed-on: #69
2025-12-05 08:45:49 +00:00
dhanabalan
e2b58a496c Added production characteristics migration file
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Gemini PR Review / review (pull_request) Failing after 26s
Laravel Pint / pint (pull_request) Successful in 2m14s
Laravel Larastan / larastan (pull_request) Failing after 3m14s
2025-12-05 14:15:24 +05:30
bcd107a8bc Merge pull request 'Added rout api fopr get char master for product charcteristics' (#68) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #68
2025-12-05 08:34:19 +00:00
dhanabalan
d9d0930e70 Added rout api fopr get char master for product charcteristics
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 9s
Gemini PR Review / review (pull_request) Failing after 24s
Laravel Pint / pint (pull_request) Successful in 2m9s
Laravel Larastan / larastan (pull_request) Failing after 3m4s
2025-12-05 14:04:05 +05:30
458e143b9a Merge pull request 'Added chracteristics master for product characterstics' (#67) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #67
2025-12-05 08:31:12 +00:00
dhanabalan
1f9bfdd6fe Added chracteristics master for product characterstics
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 22s
Laravel Pint / pint (pull_request) Successful in 2m13s
Laravel Larastan / larastan (pull_request) Failing after 3m10s
2025-12-05 14:00:52 +05:30
de2dda0dc5 Merge pull request 'removed notification sound in capacitor input box' (#66) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
Reviewed-on: #66
2025-12-04 11:00:49 +00:00
dhanabalan
2b2b0d8803 removed notification sound in capacitor input box
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 24s
Laravel Pint / pint (pull_request) Successful in 2m16s
Laravel Larastan / larastan (pull_request) Failing after 3m5s
2025-12-04 16:30:31 +05:30
7543f8a416 Merge pull request 'removed required for part validation type in quality validation' (#65) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
Reviewed-on: #65
2025-12-04 06:32:43 +00:00
dhanabalan
91d8a3441b removed required for part validation type in quality validation
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 23s
Laravel Pint / pint (pull_request) Successful in 2m9s
Laravel Larastan / larastan (pull_request) Failing after 3m16s
2025-12-04 12:02:31 +05:30
f76316ec91 Merge pull request 'Added validation for process order with item code' (#64) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
Reviewed-on: #64
2025-12-04 05:04:03 +00:00
dhanabalan
d719769fdd Added validation for process order with item code
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 23s
Laravel Pint / pint (pull_request) Successful in 2m34s
Laravel Larastan / larastan (pull_request) Failing after 3m9s
2025-12-04 10:33:50 +05:30
acea7b14a6 Merge pull request 'Added line name and employee code for quality validation mail' (#63) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #63
2025-12-03 05:05:30 +00:00
dhanabalan
154b689daf Added line name and employee code for quality validation mail
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 24s
Laravel Pint / pint (pull_request) Successful in 2m25s
Laravel Larastan / larastan (pull_request) Failing after 3m6s
2025-12-03 10:35:18 +05:30
87f49e8491 Merge pull request 'Added filter logic in process order screen' (#62) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #62
2025-12-03 04:34:48 +00:00
dhanabalan
eb7910c119 Added filter logic in process order screen
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Failing after 6s
Gemini PR Review / review (pull_request) Failing after 23s
Laravel Pint / pint (pull_request) Successful in 2m29s
Laravel Larastan / larastan (pull_request) Failing after 3m17s
2025-12-03 10:04:19 +05:30
f612551288 Merge pull request 'removed required option in alert mail for schedule type' (#61) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #61
2025-12-03 03:17:05 +00:00
dhanabalan
8d1e616777 removed required option in alert mail for schedule type
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Gemini PR Review / review (pull_request) Failing after 31s
Laravel Pint / pint (pull_request) Successful in 2m22s
Laravel Larastan / larastan (pull_request) Failing after 3m1s
2025-12-03 08:46:49 +05:30
4f84735eaf Merge pull request 'correction of alert mail rule logic for invoice data report' (#60) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Reviewed-on: #60
2025-12-03 03:05:35 +00:00
dhanabalan
534ac222fa correction of alert mail rule logic for invoice data report
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Gemini PR Review / review (pull_request) Failing after 51s
Laravel Larastan / larastan (pull_request) Failing after 3m1s
Laravel Pint / pint (pull_request) Successful in 2m47s
2025-12-03 08:35:03 +05:30
45b8c1fbb4 Merge pull request 'corrected logic for mail triggering' (#59) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Reviewed-on: #59
2025-12-02 11:13:56 +00:00
dhanabalan
005ea2cf87 corrected logic for mail triggering
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Laravel Pint / pint (pull_request) Failing after 13m36s
Laravel Larastan / larastan (pull_request) Failing after 3m16s
Gemini PR Review / review (pull_request) Failing after 23s
2025-12-02 16:42:37 +05:30
6015968043 Merge pull request 'Update .github/workflows/gemini-pr-review.yaml' (#58) from actions/gemini-pr-review-patch into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #58
2025-12-02 10:57:48 +00:00
2bc8584e7a Update .github/workflows/gemini-pr-review.yaml
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Successful in 29s
Laravel Pint / pint (pull_request) Has been cancelled
Laravel Larastan / larastan (pull_request) Has been cancelled
2025-12-02 10:55:46 +00:00
d126e931c8 Merge pull request 'decreased font size of the sticker printing table' (#56) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Reviewed-on: #56
2025-12-02 03:05:34 +00:00
dhanabalan
e525e3c526 decreased font size of the sticker printing table
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 38s
Laravel Larastan / larastan (pull_request) Failing after 2m18s
Laravel Pint / pint (pull_request) Has been cancelled
2025-12-02 08:35:17 +05:30
62bf68ad2e Merge pull request 'corrected logic in sticker printing page' (#55) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Reviewed-on: #55
2025-12-02 02:54:47 +00:00
dhanabalan
caf2f3c1e7 corrected logic in sticker printing page
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Gemini PR Review / review (pull_request) Failing after 38s
Laravel Larastan / larastan (pull_request) Failing after 2m24s
Laravel Pint / pint (pull_request) Failing after 2m7s
2025-12-02 08:24:22 +05:30
c6c63dcb35 Merge pull request 'Added ref no above the qr code in sticker printing' (#54) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Reviewed-on: #54
2025-12-01 12:20:43 +00:00
dhanabalan
2ceb76f008 Added ref no above the qr code in sticker printing
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 27s
Laravel Larastan / larastan (pull_request) Failing after 2m15s
Laravel Pint / pint (pull_request) Failing after 7m11s
2025-12-01 17:50:30 +05:30
d1663ae58a Merge pull request 'Added serial qr code validation in create page of sticker printing' (#53) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Reviewed-on: #53
2025-12-01 12:11:15 +00:00
dhanabalan
988d109acc Added serial qr code validation in create page of sticker printing
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 22s
Laravel Larastan / larastan (pull_request) Failing after 2m15s
Laravel Pint / pint (pull_request) Failing after 2m13s
2025-12-01 17:41:00 +05:30
deb46cdda2 Merge pull request 'chnaged indentation in item resource page' (#52) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #52
2025-12-01 12:10:12 +00:00
dhanabalan
bc8163a535 chnaged indentation in item resource page
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 21s
Laravel Pint / pint (pull_request) Failing after 2m22s
Laravel Larastan / larastan (pull_request) Failing after 2m29s
2025-12-01 17:39:58 +05:30
002bdc597d Merge pull request 'Added crt logic policy for sticker printing' (#51) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #51
2025-12-01 10:50:34 +00:00
dhanabalan
6834e37429 Added crt logic policy for sticker printing
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 12s
Gemini PR Review / review (pull_request) Failing after 24s
Laravel Larastan / larastan (pull_request) Failing after 2m20s
Laravel Pint / pint (pull_request) Failing after 2m25s
2025-12-01 16:20:19 +05:30
a406d1b58a Merge pull request 'commented logic for sticker prinitng policy' (#50) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Reviewed-on: #50
2025-12-01 10:26:58 +00:00
dhanabalan
a9012ffc05 commented logic for sticker prinitng policy
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 22s
Laravel Larastan / larastan (pull_request) Failing after 2m23s
Laravel Pint / pint (pull_request) Failing after 2m15s
2025-12-01 15:56:46 +05:30
58d0b9f0ae Merge pull request 'Added sticker printing policy' (#49) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #49
2025-12-01 10:12:17 +00:00
dhanabalan
c67bbc02b6 Added sticker printing policy
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 23s
Laravel Pint / pint (pull_request) Failing after 2m30s
Laravel Larastan / larastan (pull_request) Failing after 3m4s
2025-12-01 15:41:56 +05:30
c0d8ca7b1e Merge pull request 'commented all line sof cod ein sticker printing policy' (#48) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #48
2025-12-01 10:10:03 +00:00
dhanabalan
d71837f314 commented all line sof cod ein sticker printing policy
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Gemini PR Review / review (pull_request) Failing after 20s
Laravel Pint / pint (pull_request) Failing after 1m55s
Laravel Larastan / larastan (pull_request) Failing after 2m5s
2025-12-01 15:39:39 +05:30
f31ab62ec0 Merge pull request 'commented user model class in spatie page' (#47) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #47
2025-12-01 09:55:11 +00:00
dhanabalan
36a50815f9 commented user model class in spatie page
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Gemini PR Review / review (pull_request) Failing after 21s
Laravel Pint / pint (pull_request) Failing after 2m3s
Laravel Larastan / larastan (pull_request) Failing after 2m13s
2025-12-01 15:24:58 +05:30
4285a31f94 Merge pull request 'Added permissions for import and export for sticker printing' (#46) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Reviewed-on: #46
2025-12-01 09:30:07 +00:00
dhanabalan
11678dd846 Added permissions for import and export for sticker printing
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Gemini PR Review / review (pull_request) Failing after 23s
Laravel Larastan / larastan (pull_request) Failing after 2m4s
Laravel Pint / pint (pull_request) Failing after 2m5s
2025-12-01 14:59:54 +05:30
0c9228bfec Merge pull request 'Updated item selection logic in StickerMasterResource to return an empty array when no plant is selected' (#45) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #45
2025-12-01 09:23:49 +00:00
dhanabalan
035e6cd560 Updated item selection logic in StickerMasterResource to return an empty array when no plant is selected
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Gemini PR Review / review (pull_request) Failing after 27s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Laravel Larastan / larastan (pull_request) Failing after 2m6s
Laravel Pint / pint (pull_request) Failing after 2m7s
2025-12-01 14:53:15 +05:30
58b45c849d Merge pull request 'Added print button for sticker printing page' (#44) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #44
2025-12-01 09:20:43 +00:00
dhanabalan
91deb448ef Added print button for sticker printing page
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Gemini PR Review / review (pull_request) Failing after 25s
Laravel Larastan / larastan (pull_request) Failing after 2m9s
Laravel Pint / pint (pull_request) Failing after 2m25s
2025-12-01 14:50:31 +05:30
61a2e7ffad Merge pull request 'Added sticker printing create resource file' (#43) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #43
2025-12-01 09:18:30 +00:00
dhanabalan
c05b536253 Added sticker printing create resource file
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 14s
Gemini PR Review / review (pull_request) Failing after 24s
Laravel Pint / pint (pull_request) Failing after 2m4s
Laravel Larastan / larastan (pull_request) Failing after 2m19s
2025-12-01 14:48:17 +05:30
3779cf3e3b Merge pull request 'Added sticker printing livewire page for table' (#42) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #42
2025-12-01 09:15:31 +00:00
dhanabalan
10071413a1 Added sticker printing livewire page for table
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Gemini PR Review / review (pull_request) Failing after 23s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Laravel Pint / pint (pull_request) Failing after 2m19s
Laravel Larastan / larastan (pull_request) Failing after 2m24s
2025-12-01 14:45:17 +05:30
acf955dd94 Merge pull request 'Added pdf qr code for sticker print page' (#41) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #41
2025-12-01 09:14:11 +00:00
dhanabalan
624e18e18d Added pdf qr code for sticker print page
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Gemini PR Review / review (pull_request) Failing after 21s
Laravel Larastan / larastan (pull_request) Failing after 2m9s
Laravel Pint / pint (pull_request) Failing after 2m18s
2025-12-01 14:43:59 +05:30
0de49f14ce Merge pull request 'Added sticker printing policy page' (#40) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #40
2025-12-01 09:13:27 +00:00
dhanabalan
11bbad0cf8 Added sticker printing policy page
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Gemini PR Review / review (pull_request) Failing after 24s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Laravel Larastan / larastan (pull_request) Failing after 2m21s
Laravel Pint / pint (pull_request) Failing after 2m20s
2025-12-01 14:43:02 +05:30
0473ca33cf Merge pull request 'Added sticker prinitng import and export file' (#39) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #39
2025-12-01 09:12:15 +00:00
dhanabalan
6ac3c664dd Added sticker prinitng import and export file
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 27s
Laravel Larastan / larastan (pull_request) Failing after 2m3s
Laravel Pint / pint (pull_request) Failing after 2m16s
2025-12-01 14:42:01 +05:30
8a01033459 Merge pull request 'Added sticker printing resource file' (#38) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #38
2025-12-01 09:11:15 +00:00
dhanabalan
10f2909b0e Added sticker printing resource file
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Gemini PR Review / review (pull_request) Failing after 26s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Laravel Larastan / larastan (pull_request) Failing after 2m2s
Laravel Pint / pint (pull_request) Failing after 2m7s
2025-12-01 14:40:58 +05:30
0555f9faff Merge pull request 'Added sticker printing model file' (#37) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #37
2025-12-01 09:09:39 +00:00
dhanabalan
e8ed47a110 Added sticker printing model file
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Gemini PR Review / review (pull_request) Failing after 22s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Laravel Larastan / larastan (pull_request) Failing after 1m55s
Laravel Pint / pint (pull_request) Failing after 2m17s
2025-12-01 14:39:17 +05:30
8cbbaa4845 Merge pull request 'Added sticker printing migration file' (#36) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #36
2025-12-01 09:08:26 +00:00
dhanabalan
055d7707f4 Added sticker printing migration file
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Gemini PR Review / review (pull_request) Failing after 24s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Laravel Larastan / larastan (pull_request) Failing after 2m4s
Laravel Pint / pint (pull_request) Failing after 2m16s
2025-12-01 14:38:06 +05:30
cb6b201648 Merge pull request 'Added user model class in spatie' (#35) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #35
2025-12-01 09:06:52 +00:00
dhanabalan
55cf2f6924 Added user model class in spatie
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Gemini PR Review / review (pull_request) Failing after 27s
Laravel Pint / pint (pull_request) Failing after 2m0s
Laravel Larastan / larastan (pull_request) Failing after 2m14s
2025-12-01 14:36:13 +05:30
c3089a147c Merge pull request 'Refactor processSerialNumber method to improve package validation logic' (#34) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #34
2025-12-01 08:28:43 +00:00
dhanabalan
d389136223 Refactor processSerialNumber method to improve package validation logic
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Gemini PR Review / review (pull_request) Failing after 22s
Laravel Larastan / larastan (pull_request) Failing after 2m3s
Laravel Pint / pint (pull_request) Failing after 2m18s
2025-12-01 13:58:15 +05:30
45f0e39f73 Merge pull request 'Refactor plant selection logic in ItemResource and StickerMasterResource to order by code' (#33) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Reviewed-on: #33
2025-12-01 04:40:07 +00:00
dhanabalan
173638cd19 Refactor plant selection logic in ItemResource and StickerMasterResource to order by code
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 12s
Gemini PR Review / review (pull_request) Failing after 22s
Laravel Larastan / larastan (pull_request) Failing after 2m19s
Laravel Pint / pint (pull_request) Failing after 2m50s
2025-12-01 10:09:22 +05:30
fe1e1b9918 Merge pull request 'Added Quality mail alert in alert mail page' (#32) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #32
2025-12-01 04:30:07 +00:00
dhanabalan
c8c38a05f4 Added Quality mail alert in alert mail page
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 1m0s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 52s
Gemini PR Review / review (pull_request) Failing after 1m10s
Laravel Pint / pint (pull_request) Failing after 2m20s
Laravel Larastan / larastan (pull_request) Failing after 2m37s
2025-12-01 09:57:34 +05:30
65 changed files with 8453 additions and 2075 deletions

View File

@@ -36,8 +36,8 @@ jobs:
restore-keys: |
${{ runner.os }}-npm-global-
- name: Install Gemini CLI globally
run: npm install -g --loglevel=http @google/gemini-cli
# - name: Install Gemini CLI globally
# run: npm install -g --loglevel=http @google/gemini-cli
- name: Generate git diff and review with Gemini
id: review

View File

@@ -0,0 +1,202 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Console\Scheduling\Schedule;
use App\Models\AlertMailRule;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Log;
class Scheduler extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
// protected $signature = 'app:scheduler';
protected $signature = 'custom:scheduler';
/**
* The console command description.
*
* @var string
*/
// protected $description = 'Command description';
protected $description = 'Manually trigger scheduler logic';
/**
* Execute the console command.
*/
// public function handle()
// {
// //
// }
public function handle()
{
// --- Production Rules ---
$productionRules = AlertMailRule::where('module', 'ProductionQuantities')
->where('rule_name', 'ProductionMail')
->select('plant', 'schedule_type')
->distinct()
->get();
foreach ($productionRules as $rule) {
switch ($rule->schedule_type) {
case 'Live':
// Run every minute
\Artisan::call('send:production-report', [
'schedule_type' => $rule->schedule_type,
'plant' => $rule->plant,
]);
break;
case 'Hourly':
if (now()->minute == 0) {
\Artisan::call('send:production-report', [
'schedule_type' => $rule->schedule_type,
'plant' => $rule->plant,
]);
}
break;
case 'Daily':
if (now()->format('H:i') == '07:59') {
\Artisan::call('send:production-report', [
'schedule_type' => $rule->schedule_type,
'plant' => $rule->plant,
]);
}
break;
}
}
// --- Invoice Validation Rules ---
$invoiceRules = AlertMailRule::where('module', 'InvoiceValidation')
->where('rule_name', 'InvoiceMail')
->select('plant', 'schedule_type')
->distinct()
->get();
foreach ($invoiceRules as $rule) {
switch ($rule->schedule_type) {
case 'Live':
// Run every minute
\Artisan::call('send:invoice-report', [
'schedule_type' => $rule->schedule_type,
'plant' => $rule->plant,
]);
break;
case 'Hourly':
if (now()->minute == 0) {
\Artisan::call('send:invoice-report', [
'schedule_type' => $rule->schedule_type,
'plant' => $rule->plant,
]);
}
break;
case 'Daily':
if (now()->format('H:i') == '07:59') {
\Artisan::call('send:invoice-report', [
'schedule_type' => $rule->schedule_type,
'plant' => $rule->plant,
]);
}
break;
}
}
// foreach ($invoiceRules as $rule) {
// switch ($rule->schedule_type) {
// case 'Live':
// try {
// Artisan::call('send:invoice-report', [
// 'schedule_type' => $rule->schedule_type,
// 'plant' => $rule->plant,
// ]);
// Log::info('Invoice report sent | Plant: '.$rule->plant);
// } catch (\Throwable $e) {
// Log::error("Invoice Live Failed ({$rule->plant}): ".$e->getMessage());
// }
// break;
// case 'Hourly':
// if (now()->minute == 0) {
// Artisan::call('send:invoice-report', [
// 'schedule_type' => $rule->schedule_type,
// 'plant' => $rule->plant,
// ]);
// }
// break;
// case 'Daily':
// if (now()->format('H:i') == '07:59') {
// Artisan::call('send:invoice-report', [
// 'schedule_type' => $rule->schedule_type,
// 'plant' => $rule->plant,
// ]);
// }
// break;
// }
// }
// --- Invoice Data Report Rules ---
$invoiceDataRules = AlertMailRule::where('module', 'InvoiceDataReport')
->where('rule_name', 'InvoiceDataMail')
->select('plant', 'schedule_type')
->distinct()
->get();
foreach ($invoiceDataRules as $rule) {
switch ($rule->schedule_type) {
case 'Live':
// Run every minute
\Artisan::call('send:invoice-data-report', [
'schedule_type' => $rule->schedule_type,
'plant' => $rule->plant,
]);
break;
case 'Hourly':
if (now()->minute == 0) {
\Artisan::call('send:invoice-data-report', [
'schedule_type' => $rule->schedule_type,
'plant' => $rule->plant,
]);
}
break;
case 'Daily':
if (now()->format('H:i') == '10:00') {
\Artisan::call('send:invoice-data-report', [
'schedule_type' => $rule->schedule_type,
'plant' => $rule->plant,
]);
}
break;
}
}
}
/**
* Helper to call Artisan commands with parameters.
*/
protected function callArtisanCommand($commandName, $rule)
{
\Artisan::call($commandName, [
'schedule_type' => $rule->schedule_type,
'plant' => $rule->plant,
]);
$this->info("Executed {$commandName} for plant: {$rule->plant}");
\Log::info("Executed {$commandName} for plant: {$rule->plant}");
}
}

View File

@@ -2,11 +2,11 @@
namespace App\Console\Commands;
use App\Mail\test;
use App\Models\InvoiceValidation;
use App\Models\Plant;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Mail;
use App\Mail\test;
class SendInvoiceReport extends Command
{
@@ -15,9 +15,8 @@ class SendInvoiceReport extends Command
*
* @var string
*/
// protected $signature = 'app:send-invoice-report';
protected $signature = 'send:invoice-report{schedule_type} {plant}';
// protected $signature = 'app:send-invoice-report';
protected $signature = 'send:invoice-report {schedule_type} {plant}';
/**
* The console command description.
@@ -29,12 +28,10 @@ class SendInvoiceReport extends Command
/**
* Execute the console command.
*/
public function handle()
{
$schedule = $this->argument('schedule_type');
//$scheduleType = $this->argument('scheduleType');
// $scheduleType = $this->argument('scheduleType');
$plantIdArg = (int) $this->argument('plant'); // can be 0 for all plants
$mailRules = \App\Models\AlertMailRule::where('module', 'InvoiceValidation')->get()->groupBy('rule_name');
@@ -52,18 +49,14 @@ class SendInvoiceReport extends Command
: [$plantIdArg];
$no = 1;
if (strtolower($schedule) == 'daily')
{
if (strtolower($schedule) == 'daily') {
$startDate = now()->subDay()->setTime(8, 0, 0);
$endDate = now()->setTime(8, 0, 0);
}
else
{
} else {
$startDate = now()->setTime(8, 0, 0);
$endDate = now()->copy()->addDay()->setTime(8, 0, 0);
}
foreach ($plantIds as $plantId)
{
foreach ($plantIds as $plantId) {
$plant = Plant::find($plantId);
$plantName = $plant ? $plant->name : $plantId;
@@ -89,7 +82,7 @@ class SendInvoiceReport extends Command
$scannedInvoiceQuan = InvoiceValidation::where('plant_id', $plantId)
->where('scanned_status', 'Scanned')
->where(function($query) {
->where(function ($query) {
$query->whereNull('quantity')
->orWhere('quantity', 0);
})
@@ -128,7 +121,7 @@ class SendInvoiceReport extends Command
$scannedMatInvoiceQuan = InvoiceValidation::where('plant_id', $plantId)
->where('quantity', 1)
->whereNotNull('serial_number')
->where('serial_number','!=', '')
->where('serial_number', '!=', '')
->whereBetween('updated_at', [$startDate, $endDate])
->count();
@@ -164,7 +157,7 @@ class SendInvoiceReport extends Command
$scannedBundleInvoiceQuan = InvoiceValidation::where('plant_id', $plantId)
->where('quantity', '>', 1)
->whereNotNull('serial_number')
->where('serial_number','!=', '')
->where('serial_number', '!=', '')
->whereBetween('updated_at', [$startDate, $endDate])
->count();
@@ -193,7 +186,6 @@ class SendInvoiceReport extends Command
}
}
// Send to MaterialInvoiceMail recipients (material + bundle table)
if ($mailRules->has('MaterialInvoiceMail')) {
$emails = $mailRules['MaterialInvoiceMail']->pluck('email')->unique()->toArray();
@@ -212,16 +204,14 @@ class SendInvoiceReport extends Command
// Show preview in console
$this->info('--- Serial Invoice Table ---');
$this->table(['#', 'Plant', 'Total Invoice', 'Scanned Invoice','TotalInvoice Quantity', 'ScannedInvoice Quantity'], $serialTableData);
$this->table(['#', 'Plant', 'Total Invoice', 'Scanned Invoice', 'TotalInvoice Quantity', 'ScannedInvoice Quantity'], $serialTableData);
$this->info('--- Material Invoice Table ---');
$this->table(['#', 'Plant', 'Total Invoice', 'Scanned Invoice','TotalInvoice Quantity', 'ScannedInvoice Quantity'], $materialTableData);
$this->table(['#', 'Plant', 'Total Invoice', 'Scanned Invoice', 'TotalInvoice Quantity', 'ScannedInvoice Quantity'], $materialTableData);
$this->info('--- Bundle Invoice Table ---');
$this->table(['#', 'Plant', 'Total Invoice', 'Scanned Invoice','TotalInvoice Quantity', 'ScannedInvoice Quantity'], $bundleTableData);
$this->table(['#', 'Plant', 'Total Invoice', 'Scanned Invoice', 'TotalInvoice Quantity', 'ScannedInvoice Quantity'], $bundleTableData);
$this->info($contentVars['wishes'] ?? '');
}
}

View File

@@ -0,0 +1,63 @@
<?php
namespace App\Filament\Exports;
use App\Models\CharacteristicValue;
use Filament\Actions\Exports\ExportColumn;
use Filament\Actions\Exports\Exporter;
use Filament\Actions\Exports\Models\Export;
class CharacteristicValueExporter extends Exporter
{
protected static ?string $model = CharacteristicValue::class;
public static function getColumns(): array
{
static $rowNumber = 0;
return [
ExportColumn::make('no')
->label('NO')
->state(function ($record) use (&$rowNumber) {
// Increment and return the row number
return ++$rowNumber;
}),
ExportColumn::make('plant.code')
->label('PLANT CODE'),
ExportColumn::make('line.name')
->label('LINE NAME'),
ExportColumn::make('item.code')
->label('ITEM CODE'),
ExportColumn::make('machine.name')
->label('WORK CENTER'),
ExportColumn::make('process_order')
->label('PROCESS ORDER'),
ExportColumn::make('coil_number')
->label('COIL NUMBER'),
ExportColumn::make('status')
->label('STATUS'),
ExportColumn::make('created_at')
->label('CREATED AT'),
ExportColumn::make('updated_at')
->label('UPDATED AT'),
ExportColumn::make('created_by')
->label('CREATED BY'),
ExportColumn::make('updated_by')
->label('UPDATED BY'),
ExportColumn::make('deleted_at')
->enabledByDefault(false)
->label('DELETED AT'),
];
}
public static function getCompletedNotificationBody(Export $export): string
{
$body = 'Your characteristic value 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

@@ -24,14 +24,16 @@ class InvoiceValidationExporter extends Exporter
// Increment and return the row number
return ++$rowNumber;
}),
ExportColumn::make('plant.name')
->label('PLANT'),
ExportColumn::make('plant.code')
->label('PLANT CODE'),
ExportColumn::make('invoice_number')
->label('INVOICE NUMBER'),
ExportColumn::make('serial_number')
->label('SERIAL NUMBER'),
ExportColumn::make('stickerMaster.item.code')
->label('ITEM CODE'),
ExportColumn::make('stickerMaster.item.description')
->label('ITEM DESCRIPTION'),
ExportColumn::make('motor_scanned_status')
->label('MOTOR SCANNED STATUS'),
ExportColumn::make('pump_scanned_status')
@@ -58,23 +60,23 @@ class InvoiceValidationExporter extends Exporter
->label('OPERATOR ID'),
ExportColumn::make('created_at')
->label('CREATED AT'),
//->dateTimeFormat('d-m-Y H:i:s'),
// ->dateTimeFormat('d-m-Y H:i:s'),
ExportColumn::make('updated_at')
->label('UPDATED AT'),
//->dateTimeFormat('d-m-Y H:i:s'),
// ->dateTimeFormat('d-m-Y H:i:s'),
ExportColumn::make('deleted_at')
->enabledByDefault(false)
->label('DELETED AT'),
//->dateTimeFormat('d-m-Y H:i:s'),
// ->dateTimeFormat('d-m-Y H:i:s'),
];
}
public static function getCompletedNotificationBody(Export $export): string
{
$body = 'Your invoice validation export has completed and ' . number_format($export->successful_rows) . ' ' . str('row')->plural($export->successful_rows) . ' exported.';
$body = 'Your invoice validation 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.';
$body .= ' '.number_format($failedRowsCount).' '.str('row')->plural($failedRowsCount).' failed to export.';
}
return $body;

View File

@@ -24,8 +24,8 @@ class ItemExporter extends Exporter
// Increment and return the row number
return ++$rowNumber;
}),
ExportColumn::make('plant.name')
->label('PLANT'),
ExportColumn::make('plant.code')
->label('PLANT CODE'),
ExportColumn::make('category')
->label('CATEGORY'),
ExportColumn::make('code')

View File

@@ -0,0 +1,70 @@
<?php
namespace App\Filament\Exports;
use App\Models\ProductCharacteristicsMaster;
use Filament\Actions\Exports\ExportColumn;
use Filament\Actions\Exports\Exporter;
use Filament\Actions\Exports\Models\Export;
class ProductCharacteristicsMasterExporter extends Exporter
{
protected static ?string $model = ProductCharacteristicsMaster::class;
public static function getColumns(): array
{
static $rowNumber = 0;
return [
ExportColumn::make('no')
->label('NO')
->state(function ($record) use (&$rowNumber) {
// Increment and return the row number
return ++$rowNumber;
}),
ExportColumn::make('plant.name')
->label('PLANT'),
ExportColumn::make('item.code')
->label('ITEM CODE'),
ExportColumn::make('line.name')
->label('LINE NAME'), //machine.workGroupMaster.name
ExportColumn::make('machine.workGroupMaster.name')
->label('WORK GROUP MASTER'),
ExportColumn::make('machine.work_center')
->label('WORK CENTER'),
ExportColumn::make('characteristics_type')
->label('CHARACTERISTICS TYPE'),
ExportColumn::make('name')
->label('NAME'),
ExportColumn::make('inspection_type')
->label('INSPECTION TYPE'),
ExportColumn::make('upper')
->label('UPPER'),
ExportColumn::make('lower')
->label('LOWER'),
ExportColumn::make('middle')
->label('MIDDLE'),
ExportColumn::make('created_at')
->label('CREATED AT'),
ExportColumn::make('updated_at')
->label('UPDATED AT'),
ExportColumn::make('created_by')
->label('CREATED BY'),
ExportColumn::make('updated_by')
->label('UPDATED BY'),
ExportColumn::make('deleted_at')
->label('DELETED AT')
->enabledByDefault(false),
];
}
public static function getCompletedNotificationBody(Export $export): string
{
$body = 'Your product characteristics master 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

@@ -0,0 +1,54 @@
<?php
namespace App\Filament\Exports;
use App\Models\StickerPrinting;
use Filament\Actions\Exports\ExportColumn;
use Filament\Actions\Exports\Exporter;
use Filament\Actions\Exports\Models\Export;
class StickerPrintingExporter extends Exporter
{
protected static ?string $model = StickerPrinting::class;
public static function getColumns(): array
{
static $rowNumber = 0;
return [
ExportColumn::make('no')
->label('NO')
->state(function ($record) use (&$rowNumber) {
// Increment and return the row number
return ++$rowNumber;
}),
ExportColumn::make('plant.code')
->label('PLANT CODE'),
ExportColumn::make('reference_number')
->label('REFERENCE NUMBER'),
ExportColumn::make('serial_number')
->label('SERIAL NUMBER'),
ExportColumn::make('created_at')
->label('CREATED AT'),
ExportColumn::make('updated_at')
->label('UPDATED AT'),
ExportColumn::make('created_by')
->label('CREATED BY'),
ExportColumn::make('updated_by')
->label('UPDATED BY'),
ExportColumn::make('deleted_at')
->label('DELETED AT')
->enabledByDefault(false),
];
}
public static function getCompletedNotificationBody(Export $export): string
{
$body = 'Your sticker printing 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

@@ -0,0 +1,260 @@
<?php
namespace App\Filament\Imports;
use App\Models\CharacteristicValue;
use App\Models\Item;
use App\Models\Line;
use App\Models\Machine;
use App\Models\Plant;
use App\Models\ProcessOrder;
use Filament\Actions\Imports\Exceptions\RowImportFailedException;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
use Str;
class CharacteristicValueImporter extends Importer
{
protected static ?string $model = CharacteristicValue::class;
public static function getColumns(): array
{
return [
ImportColumn::make('plant')
->requiredMapping()
->exampleHeader('Plant Code')
->example('1000')
->label('Plant Code')
->relationship(resolveUsing: 'code')
->rules(['required']),
ImportColumn::make('line')
->requiredMapping()
->exampleHeader('Line Name')
->example('4 inch pump line')
->label('Line Name')
->relationship(resolveUsing: 'name')
->rules(['required']),
ImportColumn::make('item')
->requiredMapping()
->exampleHeader('Item Code')
->example('123456')
->label('Item Code')
->relationship(resolveUsing: 'code')
->rules(['required']),
ImportColumn::make('machine')
->requiredMapping()
->exampleHeader('Work Center')
->example('RMGS09745')
->label('Work Center')
->relationship(resolveUsing: 'work_center')
->rules(['required']),
ImportColumn::make('process_order')
->requiredMapping()
->exampleHeader('Process Order')
->example('23455256352')
->label('Process Order'),
ImportColumn::make('coil_number')
->requiredMapping()
->exampleHeader('Coil Number')
->example('0')
->label('Coil Number'),
ImportColumn::make('status')
->requiredMapping()
->exampleHeader('Status')
->example('Ok')
->label('Status'),
ImportColumn::make('created_by')
->requiredMapping()
->exampleHeader('Created By')
->example('RAW01234')
->label('Created By'),
];
}
public function resolveRecord(): ?CharacteristicValue
{
// return CharacteristicValue::firstOrNew([
// // Update existing records, matching them by `$this->data['column_name']`
// 'email' => $this->data['email'],
// ]);
$warnMsg = [];
$plantId = null;
$itemId = null;
$LineId = null;
$machineId = null;
$itemAgainstPlant = null;
$plantCode = $this->data['plant'];
$processOrder = trim($this->data['process_order'] ?? '');
$iCode = trim($this->data['item']);
$workCenter = trim($this->data['machine']);
$lineName = trim($this->data['line']);
$status = trim($this->data['status']);
$createdBy = trim($this->data['created_by']);
$coilNo = trim($this->data['coil_number']);
if ($plantCode == null || $plantCode == '') {
$warnMsg[] = 'Plant code cannot be empty';
} elseif ($iCode == null || $iCode == '') {
$warnMsg[] = 'Process Order cannot be empty';
} elseif ($workCenter == null || $workCenter == '') {
$warnMsg[] = 'Work center cannot be empty';
} elseif ($lineName == null || $lineName == '') {
$warnMsg[] = 'Line cannot be empty';
}
if (Str::length($plantCode) < 4 || ! is_numeric($plantCode) || ! preg_match('/^[1-9]\d{3,}$/', $plantCode)) {
$warnMsg[] = 'Invalid plant code found';
} else {
$plant = Plant::where('code', $plantCode)->first();
if (! $plant) {
$warnMsg[] = 'Plant not found';
} else {
$plantId = $plant->id;
}
}
if (Str::length($iCode) < 6 || ! ctype_alnum($iCode)) {
$warnMsg[] = 'Invalid item code found';
} else {
$itemCode = Item::where('code', $iCode)->first();
if (! $itemCode) {
$warnMsg[] = 'Item code not found';
} else {
if ($plantId) {
$itemAgainstPlant = Item::where('code', $iCode)->where('plant_id', $plantId)->first();
if (! $itemAgainstPlant) {
$warnMsg[] = 'Item code not found for the given plant';
} else {
$itemId = $itemAgainstPlant->id;
}
}
}
}
$lineExists = Line::where('name', $lineName)->first();
if (! $lineExists) {
$warnMsg[] = 'Line name not found';
} else {
if ($plantId) {
$lineAgainstPlant = Line::where('name', $lineName)->where('plant_id', $plantId)->first();
if (! $lineAgainstPlant) {
$warnMsg[] = 'Line name not found for the given plant';
} else {
$LineId = $lineAgainstPlant->id;
}
}
}
$workCenterExist = Machine::where('work_center', $workCenter)->first();
if (! $workCenterExist) {
$warnMsg[] = 'Work Center not found';
}
// $workCenterAgainstPlant = Machine::where('work_center', $workCenter)
// ->where('plant_id', $plantId)
// ->first();
// if (!$workCenterAgainstPlant) {
// $warnMsg[] = 'Work center not found for the given plant';
// } else {
// $MachineId = $workCenterAgainstPlant->id;
// }
if ($plantId != null && $LineId != null) {
$machineAgaPlantLine = Machine::where('plant_id', $plantId)
->where('line_id', $LineId)
->where('work_center', $workCenter)
->first();
if (! $machineAgaPlantLine) {
$warnMsg[] = 'Work center not found for the given plant and line';
} else {
$machineId = $machineAgaPlantLine->id;
}
}
if ($processOrder == null || $processOrder == '') {
$warnMsg[] = 'Process Order cannot be empty';
}
if ($coilNo == null || $coilNo == '') {
$warnMsg[] = 'Coil No cannot be empty';
} elseif (! is_numeric($coilNo)) {
$warnMsg[] = 'Coil number should contain only numeric values!';
}
if ($status == null || $status == '' || ! $status) {
$warnMsg[] = 'Status cannot be empty';
} elseif (! in_array($status, ['Ok', 'NotOk'], true)) {
$warnMsg[] = "Status must be either 'Ok' or 'NotOk'!";
}
if ($createdBy == null || $createdBy == '' || ! $createdBy) {
$warnMsg[] = 'Created By cannot be empty';
}
// $existing = CharacteristicValue::where('plant_id', $plantId)
// ->where('process_order', $processOrder)
// ->where('coil_number', $coilNo)
// ->first();
// if ($existing) {
// $warnMsg[] = "Process order '{$processOrder}' with coil number '{$coilNo}' already exist for the plant code '{$plantCode}'!";
// }
if ($plantId && $processOrder) {
$existing = CharacteristicValue::where('plant_id', $plantId)
->where('process_order', $processOrder)
->where('coil_number', $coilNo)
->first();
if ($existing) {
$warnMsg[] = "Coil number '{$coilNo}' already exists for Plant '{$plantCode}' and Process Order '{$processOrder}'.";
}
}
if ($plant && $itemCode && $processOrder != '') {
$existingOrder = ProcessOrder::where('plant_id', $plant->id)
->where('process_order', $processOrder)
->first();
if ($existingOrder && $existingOrder->item_id !== ($itemCode->id ?? null)) {
$warnMsg[] = 'Same Process Order already exists for this Plant with a different Item Code';
}
}
if (! empty($warnMsg)) {
throw new RowImportFailedException(implode(', ', $warnMsg));
}
return CharacteristicValue::create([
'plant_id' => $plantId,
'item_id' => $itemId,
'line_id' => $LineId,
'machine_id' => $machineId,
'process_order' => trim($this->data['process_order']),
'coil_number' => trim($this->data['coil_number']),
'status' => trim($this->data['status']),
'created_by' => trim($this->data['created_by']),
]);
// return null;
// return new CharacteristicValue;
}
public static function getCompletedNotificationBody(Import $import): string
{
$body = 'Your characteristic value 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

@@ -8,7 +8,8 @@ use Filament\Actions\Imports\Exceptions\RowImportFailedException;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
use Str;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str;
class ItemImporter extends Importer
{
@@ -48,10 +49,10 @@ class ItemImporter extends Importer
->label('Unit of Measure'),
ImportColumn::make('plant')
->requiredMapping()
->exampleHeader('Plant Name')
->example('Ransar Industries-I')
->label('Plant Name')
->relationship(resolveUsing: 'name')
->exampleHeader('Plant Code')
->example('1000')
->label('Plant Code')
->relationship(resolveUsing: 'code') // Lookup Plant by code column
->rules(['required']),
];
}
@@ -59,36 +60,46 @@ class ItemImporter extends Importer
public function resolveRecord(): ?Item
{
$warnMsg = [];
$plantCod = $this->data['plant'];
$plant = null;
Log::info('ResolveRecord triggered', $this->data);
$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($plantCod) < 4 || ! is_numeric($plantCod) || ! preg_match('/^[1-9]\d{3,}$/', $plantCod)) {
$warnMsg[] = 'Invalid plant code found';
} else {
$plant = Plant::where('code', $plantCod)->first();
if (! $plant) {
$warnMsg[] = 'Plant not found'; // '" . $plantCod . "'
}
}
if (Str::length($iCode) < 6 || !ctype_alnum($iCode)) {
$warnMsg[] = "Invalid item code found";
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($description) < 5) {
$warnMsg[] = "Invalid description found";
$warnMsg[] = 'Invalid description found';
}
if (Str::length($this->data['hourly_quantity']) < 0 || !is_numeric($this->data['hourly_quantity']) || $this->data['hourly_quantity'] <= 0) {
$warnMsg[] = "Invalid hourly quantity found";
if (Str::length($this->data['hourly_quantity']) < 0 || ! is_numeric($this->data['hourly_quantity']) || $this->data['hourly_quantity'] <= 0) {
$warnMsg[] = 'Invalid hourly quantity found';
}
if (!empty($warnMsg)) {
if (! empty($warnMsg)) {
throw new RowImportFailedException(implode(', ', $warnMsg));
}
return Item::updateOrCreate([
'code' => $iCode,
'plant_id' => $plant->id
],
'code' => $iCode,
'plant_id' => $plant->id,
],
[
'category' => trim($this->data['category']),
'description' => $description,
'hourly_quantity' => $this->data['hourly_quantity'],
'uom' => trim($this->data['uom'])
'uom' => trim($this->data['uom']),
]
);
// return new Item;

View File

@@ -0,0 +1,282 @@
<?php
namespace App\Filament\Imports;
use App\Models\Item;
use App\Models\Line;
use App\Models\Machine;
use App\Models\Plant;
use App\Models\ProductCharacteristicsMaster;
use App\Models\User;
use App\Models\WorkGroupMaster;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
use Str;
use Filament\Actions\Imports\Exceptions\RowImportFailedException;
use Illuminate\Support\Facades\Auth;
class ProductCharacteristicsMasterImporter extends Importer
{
protected static ?string $model = ProductCharacteristicsMaster::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('item')
->requiredMapping()
->exampleHeader('Item Code')
->example('630214')
->label('Item Code')
->relationship(resolveUsing:'code')
->rules(['required']),
ImportColumn::make('line')
->requiredMapping()
->exampleHeader('Line')
->example('4 inch pump line')
->label('Line')
->relationship(resolveUsing:'name')
->rules(['required']),
ImportColumn::make('work_group_master_id')
->label('Group Work Center')
->requiredMapping()
->exampleHeader('Group Work Center')
->example('RMGCGABC')
->relationship(resolveUsing:'name')
->rules(['required']),
ImportColumn::make('machine')
->requiredMapping()
->exampleHeader('Work Center')
->example('RMGCE001')
->label('Work Center')
->relationship(resolveUsing:'work_center')
->rules(['required']),
ImportColumn::make('characteristics_type')
->exampleHeader('Characteristics Type')
->example('Process or Product')
->label('Characteristics Type')
->rules(['required']),
ImportColumn::make('name')
->exampleHeader('Name')
->example('Body')
->label('Name')
->rules(['required']),
ImportColumn::make('inspection_type')
->exampleHeader('Inspection Type')
->example('Visual or Value')
->label('Inspection Type')
->rules(['required']),
ImportColumn::make('lower')
->exampleHeader('Lower')
->example('-0.2')
->label('Lower')
->rules(['numeric']),
ImportColumn::make('middle')
->exampleHeader('Middle')
->example('1')
->label('Middle')
->numeric()
->rules(['numeric']),
ImportColumn::make('upper')
->exampleHeader('Upper')
->example('0.2')
->label('Upper')
->rules(['numeric']),
ImportColumn::make('created_by')
->exampleHeader('Created By')
->example('Admin')
->label('Created By'),
//ImportColumn::make('updated_by'),
];
}
public function resolveRecord(): ?ProductCharacteristicsMaster
{
$warnMsg = [];
$plant = Plant::where('name', $this->data['plant'])->first();
if (!$plant) {
$warnMsg[] = "Plant not found";
}
$itemExists = Item::where('code', $this->data['item'])->first();
if (!$itemExists) {
$warnMsg[] = "Item not found";
}
$itemAgainstPlant = Item::where('code', $this->data['item'])
->where('plant_id', $plant->id)
->first();
if (!$itemAgainstPlant) {
$warnMsg[] = "Item code not found for the given plant";
}
else {
$itemId = $itemAgainstPlant->id;
}
$lineExists = Line::where('name', $this->data['line'])->first();
if (!$lineExists) {
$warnMsg[] = "Line not found";
}
$lineAgainstPlant = Line::where('name', $this->data['line'])
->where('plant_id', $plant->id)
->first();
if (!$lineAgainstPlant) {
$warnMsg[] = "Line not found for the given plant";
}
else
{
$LineId = $lineAgainstPlant->id;
}
$WorkgroupMaster = WorkGroupMaster::where('name', $this->data['work_group_master_id'])->where('plant_id', $plant->id)->first();
if (!$WorkgroupMaster) {
$warnMsg[] = "Work Group Master value not found";
}
else {
$workGroupMasterId = $WorkgroupMaster->id;
// 2. Now check if this WorkGroupMaster id exists in ANY of the 10 columns
$existsInLine = Line::where('plant_id', $plant->id)
->where(function ($q) use ($workGroupMasterId) {
for ($i = 1; $i <= 10; $i++) {
$q->orWhere("work_group{$i}_id", $workGroupMasterId);
}
})
->exists();
if (!$existsInLine) {
$warnMsg[] = "Work Group Master '{$WorkgroupMaster->name}' is not mapped to any line in this plant";
}
else {
$workGroupMasterId = $WorkgroupMaster->id;
}
}
$machine = Machine::where('work_center', $this->data['machine'])->first();
if (!$machine) {
$warnMsg[] = "Work Center not found";
}
else {
$machineId = $machine->id;
}
$machineAgainstPlant = Machine::where('work_center', $this->data['machine'])
->where('plant_id', $plant->id)
->first();
if (!$machineAgainstPlant) {
$warnMsg[] = "Work Center not found for the given plant";
}
else
{
$machineId = $machineAgainstPlant->id;
}
$user = User::where('name', $this->data['created_by'])->first();
if (!$user) {
$warnMsg[] = "Operator ID not found";
}
if (($this->data['inspection_type'] ?? null) == 'Value') {
$upper = $this->data['upper'] ?? null;
$lower = $this->data['lower'] ?? null;
$middle = $this->data['middle'] ?? null;
if (is_null($upper) || is_null($lower) || is_null($middle)) {
$warnMsg[] = "For 'Value' inspection type, Upper, Lower, and Middle values are required.";
} elseif (!is_numeric($upper) || !is_numeric($lower) || !is_numeric($middle)) {
$warnMsg[] = "Upper, Lower, and Middle values must be numeric.";
} elseif (!($lower <= $middle && $middle <= $upper)) {
$warnMsg[] = "For 'Value' inspection type, values must satisfy: Lower ≤ Middle ≤ Upper.";
}
}
if (!empty($warnMsg)) {
throw new RowImportFailedException(implode(', ', $warnMsg));
}
else
{
$record = ProductCharacteristicsMaster::firstOrNew([
'plant_id' => $plant->id,
'item_id' => $itemId,
'line_id' => $LineId,
'work_group_master_id' => $workGroupMasterId,
'machine_id' => $machineId,
]);
$currentUser = Auth::check() ? Auth::user()->name : ($this->data['created_by'] ?? 'System');
// If record is new, fill all fields
if (!$record->exists) {
$record->name = $this->data['name'];
$record->characteristics_type = $this->data['characteristics_type'];
$record->inspection_type = $this->data['inspection_type'];
$record->upper = $this->data['upper'] ?? null;
$record->lower = $this->data['lower'] ?? null;
$record->middle = $this->data['middle'] ?? null;
$record->created_by = $currentUser;
} else {
// Record exists → update only updated_by and updated_at
$record->updated_by = $currentUser;
$record->touch();
}
$record->save();
return null;
}
// else
// {
// ProductCharacteristicsMaster::updateOrCreate(
// [
// 'plant_id' => $plant->id,
// 'item_id' => $itemId,
// 'line_id' => $LineId,
// 'work_group_master_id' => $workGroupMasterId,
// 'machine_id'=> $machineId,
// ],
// [
// 'name' => $this->data['name'],
// 'characteristics_type' => $this->data['characteristics_type'],
// 'inspection_type' => $this->data['inspection_type'],
// 'upper' => $this->data['upper'] ?? null,
// 'lower' => $this->data['lower'] ?? null,
// 'middle' => $this->data['middle'] ?? null,
// //'created_by' => user ?? $this->data['created_by'],
// 'created_by' => Auth::check() ? Auth::user()->name :($this->data['created_by'] ?? null)
// ]
// );
// return null;
// }
//return new WorkGroupMaster();
// return new ProductCharacteristicsMaster();
}
public static function getCompletedNotificationBody(Import $import): string
{
$body = 'Your product characteristics master 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

@@ -0,0 +1,106 @@
<?php
namespace App\Filament\Imports;
use App\Models\StickerPrinting;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
use Filament\Actions\Imports\Exceptions\RowImportFailedException;
use App\Models\Plant;
use App\Models\User;
use Str;
use Filament\Facades\Filament;
class StickerPrintingImporter extends Importer
{
protected static ?string $model = StickerPrinting::class;
public static function getColumns(): array
{
return [
ImportColumn::make('plant')
->requiredMapping()
->exampleHeader('PLANT CODE')
->example('1000')
->label('PLANT CODE')
->relationship(resolveUsing: 'code')
->rules(['required']),
ImportColumn::make('reference_number')
->exampleHeader('REFERENCE NUMBER')
->example('REF123456')
->label('REFERENCE NUMBER'),
ImportColumn::make('serial_number')
->exampleHeader('SERIAL NUMBER')
->example('135245325212')
->label('SERIAL NUMBER'),
// ImportColumn::make('created_by')
// ->exampleHeader('CREATED BY')
// ->example('RAW01234')
// ->label('CREATED BY'),
];
}
public function resolveRecord(): ?StickerPrinting
{
// return StickerPrinting::firstOrNew([
// // Update existing records, matching them by `$this->data['column_name']`
// 'email' => $this->data['email'],
// ]);
$warnMsg = [];
$plant = Plant::where('code', $this->data['plant'])->first();
if (Str::length($this->data['serial_number']) < 9 || !ctype_alnum($this->data['serial_number'])) {
$warnMsg[] = "Invalid serial number found";
}
$existing = StickerPrinting::where('plant_id', $plant->id)
->where('serial_number', $this->data['serial_number'])
->first();
if ($existing) {
$warnMsg[] = "Serial number already exists for this plant!";//throw new RowImportFailedException("Serial number already exists for this plant!");
}
$serial = $this->data['serial_number'];
// --- Check duplicate in DB ---
$existsInDB = StickerPrinting::where('plant_id', $plant->id)
->where('serial_number', $serial)
->first();
if ($existsInDB) {
//throw new RowImportFailedException("Serial number '{$serial}' already exists in DB for this plant!");
$warnMsg[] = "Serial number '{$serial}' already exists in DB for this plant!";
}
if (!empty($warnMsg)) {
throw new RowImportFailedException(implode(', ', $warnMsg));
}
StickerPrinting::Create([
'plant_id' => $plant->id,
'reference_number' => $this->data['reference_number'],
'serial_number' => $this->data['serial_number'],
'created_at' => now(),
'updated_at' =>now(),
'created_by' => Filament::auth()->user()?->name,
]);
return null;
//return new StickerPrinting();
}
public static function getCompletedNotificationBody(Import $import): string
{
$body = 'Your sticker printing 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

@@ -641,322 +641,322 @@ class StickerReprint extends Page implements HasForms
// ********************************
$exists = \App\Models\ProductionPlan::where('plant_id', $this->pId)
->where('shift_id', $this->sId)
->where('line_id', $this->lId)
->whereDate('created_at', today())
->latest()
->exists();
// $exists = \App\Models\ProductionPlan::where('plant_id', $this->pId)
// ->where('shift_id', $this->sId)
// ->where('line_id', $this->lId)
// ->whereDate('created_at', today())
// ->latest()
// ->exists();
if ($exists)
{
$currentDate = date('Y-m-d');
// if ($exists)
// {
// $currentDate = date('Y-m-d');
$shiftId = Shift::where('id', $this->sId)
->first();
// $shiftId = Shift::where('id', $this->sId)
// ->first();
[$hRs, $miNs] = explode('.', $shiftId->duration) + [0, 0];
$hRs = (int) $hRs;
//$miNs = (int) $miNs;-*/
// [$hRs, $miNs] = explode('.', $shiftId->duration) + [0, 0];
// $hRs = (int) $hRs;
// //$miNs = (int) $miNs;-*/
$totalMinutes = $hRs * 60 + $miNs;
// $totalMinutes = $hRs * 60 + $miNs;
$from_dt = $currentDate . ' ' . $shiftId->start_time;
// $from_dt = $currentDate . ' ' . $shiftId->start_time;
$to_dt = date('Y-m-d H:i:s', strtotime($from_dt . " + $totalMinutes minutes"));
// $to_dt = date('Y-m-d H:i:s', strtotime($from_dt . " + $totalMinutes minutes"));
$currentDateTime = date('Y-m-d H:i:s');
// $currentDateTime = date('Y-m-d H:i:s');
// Check if current date time is within the range
if (!($currentDateTime >= $from_dt && $currentDateTime < $to_dt)) {
//echo "Choosed a valid shift...";
// $set('ppLineError', 'Valid (From: '.$from_dt.', To: '.$to_dt.')');
// // Check if current date time is within the range
// if (!($currentDateTime >= $from_dt && $currentDateTime < $to_dt)) {
// //echo "Choosed a valid shift...";
// // $set('ppLineError', 'Valid (From: '.$from_dt.', To: '.$to_dt.')');
$this->form->fill([
'plant_id'=> $this->pId,
'block_name'=> $this->bId,
'shift_id'=> $this->sId,
'line_id'=> $this->lId,
'item_id'=> null,
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> $this->prodOrder,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
Notification::make()
->title('Invalid Shift')
->body("Please select a valid shift.")
->danger()
->send();
//$set('validationError', 'Curr.'.$currentDateTime.' (From: '.$from_dt.', To: '.$to_dt.')');
return;
}
else
{
$this->form->fill([
'plant_id'=> $this->pId,
'block_name'=> $this->bId,
'shift_id'=> $this->sId,
'line_id'=> $this->lId,
'item_id'=> null,
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> $this->prodOrder,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
}
}
else
{
$existShifts = \App\Models\ProductionPlan::where('plant_id', $this->pId)
->where('shift_id', $this->sId)
->where('line_id', $this->lId)
->whereDate('created_at', Carbon::yesterday())
->latest()
->exists();
// $this->form->fill([
// 'plant_id'=> $this->pId,
// 'block_name'=> $this->bId,
// 'shift_id'=> $this->sId,
// 'line_id'=> $this->lId,
// 'item_id'=> null,
// 'serial_number'=> null,
// 'success_msg'=> null,
// 'production_order'=> $this->prodOrder,
// 'sap_msg_status' => null,
// 'sap_msg_description' => null,
// 'operator_id'=> $operatorName,
// 'recent_qr' => $this->recQr,
// ]);
// Notification::make()
// ->title('Invalid Shift')
// ->body("Please select a valid shift.")
// ->danger()
// ->send();
// //$set('validationError', 'Curr.'.$currentDateTime.' (From: '.$from_dt.', To: '.$to_dt.')');
// return;
// }
// else
// {
// $this->form->fill([
// 'plant_id'=> $this->pId,
// 'block_name'=> $this->bId,
// 'shift_id'=> $this->sId,
// 'line_id'=> $this->lId,
// 'item_id'=> null,
// 'serial_number'=> null,
// 'success_msg'=> null,
// 'production_order'=> $this->prodOrder,
// 'sap_msg_status' => null,
// 'sap_msg_description' => null,
// 'operator_id'=> $operatorName,
// 'recent_qr' => $this->recQr,
// ]);
// }
// }
// else
// {
// $existShifts = \App\Models\ProductionPlan::where('plant_id', $this->pId)
// ->where('shift_id', $this->sId)
// ->where('line_id', $this->lId)
// ->whereDate('created_at', Carbon::yesterday())
// ->latest()
// ->exists();
if ($existShifts) //if ($existShifts->count() > 0)
{ // record exist on yesterday
//$currentDate = date('Y-m-d');
$yesterday = date('Y-m-d', strtotime('-1 days'));
// if ($existShifts) //if ($existShifts->count() > 0)
// { // record exist on yesterday
// //$currentDate = date('Y-m-d');
// $yesterday = date('Y-m-d', strtotime('-1 days'));
$shiftId = Shift::where('id', $this->sId)
->first();
// $shiftId = Shift::where('id', $this->sId)
// ->first();
[$hRs, $miNs] = explode('.', $shiftId->duration) + [0, 0];
$hRs = (int) $hRs;
// $miNs = (int) $miNs;-*/
// [$hRs, $miNs] = explode('.', $shiftId->duration) + [0, 0];
// $hRs = (int) $hRs;
// // $miNs = (int) $miNs;-*/
$totalMinutes = $hRs * 60 + $miNs;
// $totalMinutes = $hRs * 60 + $miNs;
$from_dt = $yesterday . ' ' . $shiftId->start_time;
// $from_dt = $yesterday . ' ' . $shiftId->start_time;
$to_dt = date('Y-m-d H:i:s', strtotime($from_dt . " + $totalMinutes minutes"));
// $to_dt = date('Y-m-d H:i:s', strtotime($from_dt . " + $totalMinutes minutes"));
$currentDateTime = date('Y-m-d H:i:s');
// $currentDateTime = date('Y-m-d H:i:s');
// Check if current date time is within the range
if ($currentDateTime >= $from_dt && $currentDateTime < $to_dt) {
$this->form->fill([
'plant_id'=> $this->pId,
'block_name'=> $this->bId,
'shift_id'=> $this->sId,
'line_id'=> $this->lId,
'item_id'=> null,
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> $this->prodOrder,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
}
else
{
$currentDate = date('Y-m-d');
// // Check if current date time is within the range
// if ($currentDateTime >= $from_dt && $currentDateTime < $to_dt) {
// $this->form->fill([
// 'plant_id'=> $this->pId,
// 'block_name'=> $this->bId,
// 'shift_id'=> $this->sId,
// 'line_id'=> $this->lId,
// 'item_id'=> null,
// 'serial_number'=> null,
// 'success_msg'=> null,
// 'production_order'=> $this->prodOrder,
// 'sap_msg_status' => null,
// 'sap_msg_description' => null,
// 'operator_id'=> $operatorName,
// 'recent_qr' => $this->recQr,
// ]);
// }
// else
// {
// $currentDate = date('Y-m-d');
$shiftId = Shift::where('id', $this->sId)
->first();
// $shiftId = Shift::where('id', $this->sId)
// ->first();
[$hRs, $miNs] = explode('.', $shiftId->duration) + [0, 0];
$hRs = (int) $hRs;
// $miNs = (int) $miNs;-*/
// [$hRs, $miNs] = explode('.', $shiftId->duration) + [0, 0];
// $hRs = (int) $hRs;
// // $miNs = (int) $miNs;-*/
$totalMinutes = $hRs * 60 + $miNs;
// $totalMinutes = $hRs * 60 + $miNs;
$from_dt = $currentDate . ' ' . $shiftId->start_time;
// $from_dt = $currentDate . ' ' . $shiftId->start_time;
$to_dt = date('Y-m-d H:i:s', strtotime($from_dt . " + $totalMinutes minutes"));
// $to_dt = date('Y-m-d H:i:s', strtotime($from_dt . " + $totalMinutes minutes"));
$currentDateTime = date('Y-m-d H:i:s');
// $currentDateTime = date('Y-m-d H:i:s');
// Check if current date time is within the range
if ($currentDateTime >= $from_dt && $currentDateTime < $to_dt) {
//echo "Choosed a valid shift...";
// $set('ppLineError', 'Valid (From: '.$from_dt.', To: '.$to_dt.')');
// // Check if current date time is within the range
// if ($currentDateTime >= $from_dt && $currentDateTime < $to_dt) {
// //echo "Choosed a valid shift...";
// // $set('ppLineError', 'Valid (From: '.$from_dt.', To: '.$to_dt.')');
$this->form->fill([
'plant_id'=> $this->pId,
'block_name'=> $this->bId,
'shift_id'=> $this->sId,
'line_id'=> $this->lId,
'item_id'=> null,
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> $this->prodOrder,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
Notification::make()
->title('Plan Not Found')
->body("Please set production plan first.")
->danger()
->send();
//$set('validationError', 'Curr.'.$currentDateTime.' (From: '.$from_dt.', To: '.$to_dt.')');
return;
}
else
{
//echo "Choosed a valid shift...";
// $set('ppLineError', 'Valid (From: '.$from_dt.', To: '.$to_dt.')');
// $this->form->fill([
// 'plant_id'=> $this->pId,
// 'block_name'=> $this->bId,
// 'shift_id'=> $this->sId,
// 'line_id'=> $this->lId,
// 'item_id'=> null,
// 'serial_number'=> null,
// 'success_msg'=> null,
// 'production_order'=> $this->prodOrder,
// 'sap_msg_status' => null,
// 'sap_msg_description' => null,
// 'operator_id'=> $operatorName,
// 'recent_qr' => $this->recQr,
// ]);
// Notification::make()
// ->title('Plan Not Found')
// ->body("Please set production plan first.")
// ->danger()
// ->send();
// //$set('validationError', 'Curr.'.$currentDateTime.' (From: '.$from_dt.', To: '.$to_dt.')');
// return;
// }
// else
// {
// //echo "Choosed a valid shift...";
// // $set('ppLineError', 'Valid (From: '.$from_dt.', To: '.$to_dt.')');
$this->form->fill([
'plant_id'=> $this->pId,
'block_name'=> $this->bId,
'shift_id'=> $this->sId,
'line_id'=> $this->lId,
'item_id'=> null,
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> $this->prodOrder,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
Notification::make()
->title('Invalid Shift')
->body("Please select a valid shift.")
->danger()
->send();
//$set('validationError', 'Curr.'.$currentDateTime.' (From: '.$from_dt.', To: '.$to_dt.')');
return;
}
}
}
else
{ // record not exist on yesterday
// $this->form->fill([
// 'plant_id'=> $this->pId,
// 'block_name'=> $this->bId,
// 'shift_id'=> $this->sId,
// 'line_id'=> $this->lId,
// 'item_id'=> null,
// 'serial_number'=> null,
// 'success_msg'=> null,
// 'production_order'=> $this->prodOrder,
// 'sap_msg_status' => null,
// 'sap_msg_description' => null,
// 'operator_id'=> $operatorName,
// 'recent_qr' => $this->recQr,
// ]);
// Notification::make()
// ->title('Invalid Shift')
// ->body("Please select a valid shift.")
// ->danger()
// ->send();
// //$set('validationError', 'Curr.'.$currentDateTime.' (From: '.$from_dt.', To: '.$to_dt.')');
// return;
// }
// }
// }
// else
// { // record not exist on yesterday
//$currentDate = date('Y-m-d');
$yesterday = date('Y-m-d', strtotime('-1 days'));
// //$currentDate = date('Y-m-d');
// $yesterday = date('Y-m-d', strtotime('-1 days'));
$shiftId = Shift::where('id', $this->sId)
->first();
// $shiftId = Shift::where('id', $this->sId)
// ->first();
[$hRs, $miNs] = explode('.', $shiftId->duration) + [0, 0];
$hRs = (int) $hRs;
// $miNs = (int) $miNs;-*/
// [$hRs, $miNs] = explode('.', $shiftId->duration) + [0, 0];
// $hRs = (int) $hRs;
// // $miNs = (int) $miNs;-*/
$totalMinutes = $hRs * 60 + $miNs;
// $totalMinutes = $hRs * 60 + $miNs;
$from_dt = $yesterday . ' ' . $shiftId->start_time;
// $from_dt = $yesterday . ' ' . $shiftId->start_time;
$to_dt = date('Y-m-d H:i:s', strtotime($from_dt . " + $totalMinutes minutes"));
// $to_dt = date('Y-m-d H:i:s', strtotime($from_dt . " + $totalMinutes minutes"));
$currentDateTime = date('Y-m-d H:i:s');
// $currentDateTime = date('Y-m-d H:i:s');
// Check if current date time is within the range
if ($currentDateTime >= $from_dt && $currentDateTime < $to_dt) {
//echo "Choosed a valid shift...";
// $set('ppLineError', 'Valid (From: '.$from_dt.', To: '.$to_dt.')');
// // Check if current date time is within the range
// if ($currentDateTime >= $from_dt && $currentDateTime < $to_dt) {
// //echo "Choosed a valid shift...";
// // $set('ppLineError', 'Valid (From: '.$from_dt.', To: '.$to_dt.')');
$this->form->fill([
'plant_id'=> $this->pId,
'block_name'=> $this->bId,
'shift_id'=> $this->sId,
'line_id'=> $this->lId,
'item_id'=> null,
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> $this->prodOrder,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
Notification::make()
->title('Plan Not Found')
->body("Please set production plan first.")
->danger()
->send();
//$set('validationError', 'Curr.'.$currentDateTime.' (From: '.$from_dt.', To: '.$to_dt.')');
return;
}
else
{
$currentDate = date('Y-m-d');
// $this->form->fill([
// 'plant_id'=> $this->pId,
// 'block_name'=> $this->bId,
// 'shift_id'=> $this->sId,
// 'line_id'=> $this->lId,
// 'item_id'=> null,
// 'serial_number'=> null,
// 'success_msg'=> null,
// 'production_order'=> $this->prodOrder,
// 'sap_msg_status' => null,
// 'sap_msg_description' => null,
// 'operator_id'=> $operatorName,
// 'recent_qr' => $this->recQr,
// ]);
// Notification::make()
// ->title('Plan Not Found')
// ->body("Please set production plan first.")
// ->danger()
// ->send();
// //$set('validationError', 'Curr.'.$currentDateTime.' (From: '.$from_dt.', To: '.$to_dt.')');
// return;
// }
// else
// {
// $currentDate = date('Y-m-d');
$shiftId = Shift::where('id', $this->sId)
->first();
// $shiftId = Shift::where('id', $this->sId)
// ->first();
[$hRs, $miNs] = explode('.', $shiftId->duration) + [0, 0];
$hRs = (int) $hRs;
// $miNs = (int) $miNs;-*/
// [$hRs, $miNs] = explode('.', $shiftId->duration) + [0, 0];
// $hRs = (int) $hRs;
// // $miNs = (int) $miNs;-*/
$totalMinutes = $hRs * 60 + $miNs;
// $totalMinutes = $hRs * 60 + $miNs;
$from_dt = $currentDate . ' ' . $shiftId->start_time;
// $from_dt = $currentDate . ' ' . $shiftId->start_time;
$to_dt = date('Y-m-d H:i:s', strtotime($from_dt . " + $totalMinutes minutes"));
// $to_dt = date('Y-m-d H:i:s', strtotime($from_dt . " + $totalMinutes minutes"));
$currentDateTime = date('Y-m-d H:i:s');
// $currentDateTime = date('Y-m-d H:i:s');
// Check if current date time is within the range
if ($currentDateTime >= $from_dt && $currentDateTime < $to_dt) {
//echo "Choosed a valid shift...";
// $set('ppLineError', 'Valid (From: '.$from_dt.', To: '.$to_dt.')');
// // Check if current date time is within the range
// if ($currentDateTime >= $from_dt && $currentDateTime < $to_dt) {
// //echo "Choosed a valid shift...";
// // $set('ppLineError', 'Valid (From: '.$from_dt.', To: '.$to_dt.')');
$this->form->fill([
'plant_id'=> $this->pId,
'block_name'=> $this->bId,
'shift_id'=> $this->sId,
'line_id'=> $this->lId,
'item_id'=> null,
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> $this->prodOrder,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
Notification::make()
->title('Plan Not Found')
->body("Please set production plan first.")
->danger()
->send();
//$set('validationError', 'Curr.'.$currentDateTime.' (From: '.$from_dt.', To: '.$to_dt.')');
return;
}
else
{
//echo "Choosed a valid shift...";
// $set('ppLineError', 'Valid (From: '.$from_dt.', To: '.$to_dt.')');
// $this->form->fill([
// 'plant_id'=> $this->pId,
// 'block_name'=> $this->bId,
// 'shift_id'=> $this->sId,
// 'line_id'=> $this->lId,
// 'item_id'=> null,
// 'serial_number'=> null,
// 'success_msg'=> null,
// 'production_order'=> $this->prodOrder,
// 'sap_msg_status' => null,
// 'sap_msg_description' => null,
// 'operator_id'=> $operatorName,
// 'recent_qr' => $this->recQr,
// ]);
// Notification::make()
// ->title('Plan Not Found')
// ->body("Please set production plan first.")
// ->danger()
// ->send();
// //$set('validationError', 'Curr.'.$currentDateTime.' (From: '.$from_dt.', To: '.$to_dt.')');
// return;
// }
// else
// {
// //echo "Choosed a valid shift...";
// // $set('ppLineError', 'Valid (From: '.$from_dt.', To: '.$to_dt.')');
$this->form->fill([
'plant_id'=> $this->pId,
'block_name'=> $this->bId,
'shift_id'=> $this->sId,
'line_id'=> $this->lId,
'item_id'=> null,
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> $this->prodOrder,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
Notification::make()
->title('Invalid Shift')
->body("Please select a valid shift.")
->danger()
->send();
//$set('validationError', 'Curr.'.$currentDateTime.' (From: '.$from_dt.', To: '.$to_dt.')');
return;
}
}
}
}
// $this->form->fill([
// 'plant_id'=> $this->pId,
// 'block_name'=> $this->bId,
// 'shift_id'=> $this->sId,
// 'line_id'=> $this->lId,
// 'item_id'=> null,
// 'serial_number'=> null,
// 'success_msg'=> null,
// 'production_order'=> $this->prodOrder,
// 'sap_msg_status' => null,
// 'sap_msg_description' => null,
// 'operator_id'=> $operatorName,
// 'recent_qr' => $this->recQr,
// ]);
// Notification::make()
// ->title('Invalid Shift')
// ->body("Please select a valid shift.")
// ->danger()
// ->send();
// //$set('validationError', 'Curr.'.$currentDateTime.' (From: '.$from_dt.', To: '.$to_dt.')');
// return;
// }
// }
// }
// }
// ********************************
@@ -976,7 +976,9 @@ class StickerReprint extends Page implements HasForms
]);
}
if (!preg_match('/^[a-zA-Z0-9]{6,}+\|[1-9][a-zA-Z0-9]{8,}+(\|)?$/', $formQRData)) {
// if (!preg_match('/^[a-zA-Z0-9]{6,}+\|[1-9][a-zA-Z0-9]{8,}+(\|)?$/', $formQRData))
// {
if (!preg_match('/^[A-Za-z0-9]{6,}\|[1-9][A-Za-z0-9]{7,}(\/[A-Za-z0-9]*)?(\|)?$/', $formQRData)) {
if (strpos($formQRData, '|') === false) {
$this->form->fill([
'plant_id'=> $this->pId,
@@ -1004,7 +1006,14 @@ class StickerReprint extends Page implements HasForms
{
$splits = explode('|', $formQRData);
$iCode = trim($splits[0]);
$sNumber = isset($splits[1]) ? trim($splits[1]) : null;
$sNumberRaw = isset($splits[1]) ? trim($splits[1]) : null;
if ($sNumberRaw !== null) {
$sNumber = preg_replace('/\/.*/', '', $sNumberRaw);
$sNumber = trim($sNumber);
} else {
$sNumber = null;
}
if (!ctype_alnum($iCode)) {
$this->form->fill([
@@ -1052,6 +1061,7 @@ class StickerReprint extends Page implements HasForms
->send();
return;
}
else if (!ctype_alnum($sNumber)) {
$this->form->fill([
'plant_id'=> $this->pId,
@@ -1145,9 +1155,33 @@ class StickerReprint extends Page implements HasForms
// Only search when all parent IDs are selected
$parts = explode('|', $formQRData);
$itemCode = trim($parts[0]);
$serialNumber = isset($parts[1]) ? trim($parts[1]) : null;
$serialNumberRaw = isset($parts[1]) ? trim($parts[1]) : null;
// // Remove slash and everything after it
// if ($serialNumberRaw != null) {
// $serialNumber = preg_replace('/\/.*/', '', $serialNumberRaw);
// $serialNumber = trim($serialNumber);
// } else {
// $serialNumber = null;
// }
if ($serialNumberRaw != null) {
if (strpos($serialNumberRaw, '/') !== false) {
$serialNumber = strstr($serialNumberRaw, '/', true); // gets text before slash
} else {
$serialNumber = $serialNumberRaw; // keep original
}
$serialNumber = trim($serialNumber);
} else {
$serialNumber = null;
}
$item = Item::where('code', $itemCode)->first();
if (!$item) {
// Handle unknown item code
$this->form->fill([
@@ -1250,86 +1284,86 @@ class StickerReprint extends Page implements HasForms
return;
}
$line = Line::find($this->lId);
$lineName = $line ? $line->name : null;
//$line = Line::find($this->lId);
//$lineName = $line ? $line->name : null;
$categoryName = (Str::length($item->category) > 0) ? $item->category : "";
// $categoryName = (Str::length($item->category) > 0) ? $item->category : "";
if ($categoryName == 'Submersible Motor')
{
if ($lineName != '6 inch motor line')
{
$this->form->fill([
'plant_id'=> $this->pId,
'block_name'=> $this->bId,
'shift_id'=> $this->sId,
'line_id'=> $this->lId,
'item_id'=> null,
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> $this->prodOrder,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
Notification::make()
->title('Invalid Line Found')
->body("Choose '6 inch motor line' to proceed..!")
->danger()
->send();
return;
}
}
else if ($categoryName == 'Submersible Pump')
{
if ($lineName != '6 inch pump line')
{
$this->form->fill([
'plant_id'=> $this->pId,
'block_name'=> $this->bId,
'shift_id'=> $this->sId,
'line_id'=> $this->lId,
'item_id'=> null,
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> $this->prodOrder,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
Notification::make()
->title('Invalid Line Found')
->body("Choose '6 inch pump line' to proceed..!")
->danger()
->send();
return;
}
}
else
{
$this->form->fill([
'plant_id'=> $this->pId,
'block_name'=> $this->bId,
'shift_id'=> $this->sId,
'line_id'=> $this->lId,
'item_id'=> null,
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> $this->prodOrder,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
Notification::make()
->title('Invalid Category Found')
->body("Set proper category to proceed..!")
->danger()
->send();
return;
}
// if ($categoryName == 'Submersible Motor')
// {
// if ($lineName != '6 inch motor line')
// {
// $this->form->fill([
// 'plant_id'=> $this->pId,
// 'block_name'=> $this->bId,
// 'shift_id'=> $this->sId,
// 'line_id'=> $this->lId,
// 'item_id'=> null,
// 'serial_number'=> null,
// 'success_msg'=> null,
// 'production_order'=> $this->prodOrder,
// 'sap_msg_status' => null,
// 'sap_msg_description' => null,
// 'operator_id'=> $operatorName,
// 'recent_qr' => $this->recQr,
// ]);
// Notification::make()
// ->title('Invalid Line Found')
// ->body("Choose '6 inch motor line' to proceed..!")
// ->danger()
// ->send();
// return;
// }
// }
// else if ($categoryName == 'Submersible Pump')
// {
// if ($lineName != '6 inch pump line')
// {
// $this->form->fill([
// 'plant_id'=> $this->pId,
// 'block_name'=> $this->bId,
// 'shift_id'=> $this->sId,
// 'line_id'=> $this->lId,
// 'item_id'=> null,
// 'serial_number'=> null,
// 'success_msg'=> null,
// 'production_order'=> $this->prodOrder,
// 'sap_msg_status' => null,
// 'sap_msg_description' => null,
// 'operator_id'=> $operatorName,
// 'recent_qr' => $this->recQr,
// ]);
// Notification::make()
// ->title('Invalid Line Found')
// ->body("Choose '6 inch pump line' to proceed..!")
// ->danger()
// ->send();
// return;
// }
// }
// else
// {
// $this->form->fill([
// 'plant_id'=> $this->pId,
// 'block_name'=> $this->bId,
// 'shift_id'=> $this->sId,
// 'line_id'=> $this->lId,
// 'item_id'=> null,
// 'serial_number'=> null,
// 'success_msg'=> null,
// 'production_order'=> $this->prodOrder,
// 'sap_msg_status' => null,
// 'sap_msg_description' => null,
// 'operator_id'=> $operatorName,
// 'recent_qr' => $this->recQr,
// ]);
// Notification::make()
// ->title('Invalid Category Found')
// ->body("Set proper category to proceed..!")
// ->danger()
// ->send();
// return;
// }
if ($this->succId == null) {
$this->form->fill([
@@ -1364,6 +1398,42 @@ class StickerReprint extends Page implements HasForms
$itemCode = trim($parts[0]);
$this->sNoId = isset($parts[1]) ? trim($parts[1]) : null;
$originalQR = $this->qrData;
if (strpos($originalQR, '/') != false)
{
// Allowed endings
$allowed = ['/m', '/M', '/p', '/P', '/m|', '/M|', '/p|', '/P|'];
$foundValidEnding = false;
foreach ($allowed as $end) {
if (str_ends_with($originalQR, $end)) {
$foundValidEnding = true;
break;
}
}
if (!$foundValidEnding) {
Notification::make()
->title('Invalid QR Code')
->body("Invalid QR format: '$originalQR'")
->danger()
->send();
return;
}
}
if ($this->sNoId != null) {
$this->sNoId = preg_replace('/\/.*/', '', $serialNumberRaw);
$this->sNoId = trim($this->sNoId);
} else {
$this->sNoId = null;
}
//$this->qrData = preg_replace('/\/.*/', '', $this->qrData);
ProductionQuantity::create([
'plant_id'=> $this->pId,
'shift_id'=> $this->sId,
@@ -1378,7 +1448,6 @@ class StickerReprint extends Page implements HasForms
// after success insertion
$this->form->fill([
'plant_id'=> $this->pId,
'block_name'=> $this->bId,
'shift_id'=> $this->sId,
@@ -1401,7 +1470,7 @@ class StickerReprint extends Page implements HasForms
->duration(1000)
->send();
$url = route('download-qr1-pdf', ['palletNo' => $this->qrData]);
$url = route('download-qr1-pdf', ['palletNo' => urlencode($originalQR)]);
$this->js(<<<JS
window.dispatchEvent(new CustomEvent('open-pdf', {
detail: {
@@ -1418,11 +1487,16 @@ class StickerReprint extends Page implements HasForms
// Save the form data to the database or perform other operations
// For example:
$model = ProductionQuantity::create($formValues);
// $formValues['serial_number'] = $this->serialNumber;
// ProductionQuantity::create($formValues);
// 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);
}

View File

@@ -50,7 +50,7 @@ class AlertMailRuleResource extends Resource
'InvoiceValidation' => 'InvoiceValidation',
'InvoiceDataReport' => 'InvoiceDataReport',
'ProductionQuantities' => 'ProductionQuantities',
//'Calibration' => 'Calibration',
'QualityValidation' => 'QualityValidation',
]),
Forms\Components\Select::make('rule_name')
->label('Rule Name')
@@ -60,7 +60,7 @@ class AlertMailRuleResource extends Resource
'MaterialInvoiceMail' => 'Material Invoice Mail',
'ProductionMail' => 'Production Mail',
'InvoiceDataMail' => 'Invoice Data Mail',
//'CalibrationMail' => 'Calibration Mail',
'QualityMail' => 'Quality Mail',
])
->required(),
Forms\Components\TextInput::make('email')
@@ -70,7 +70,6 @@ class AlertMailRuleResource extends Resource
->label('CC Emails'),
Forms\Components\Select::make('schedule_type')
->label('Schedule Type')
->required()
->options([
'Live' => 'Live',
'Hourly' => 'Hourly',

View File

@@ -0,0 +1,525 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Exports\CharacteristicValueExporter;
use App\Filament\Imports\CharacteristicValueImporter;
use App\Filament\Resources\CharacteristicValueResource\Pages;
use App\Filament\Resources\CharacteristicValueResource\RelationManagers;
use App\Models\CharacteristicValue;
use App\Models\Item;
use App\Models\Line;
use App\Models\Machine;
use App\Models\Plant;
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\Facades\Filament;
use Filament\Forms\Components\DateTimePicker;
use Filament\Tables\Filters\Filter;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Tables\Actions\ExportAction;
use Filament\Tables\Actions\ImportAction;
class CharacteristicValueResource extends Resource
{
protected static ?string $model = CharacteristicValue::class;
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
protected static ?string $navigationGroup = 'Process Order';
public static function form(Form $form): Form
{
return $form
->schema([
Forms\Components\Select::make('plant_id')
->label('Plant')
->relationship('plant', 'name')
->options(function (callable $get) {
$userHas = Filament::auth()->user()->plant_id;
return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::pluck('name', 'id')->toArray();
})
->reactive()
->afterStateUpdated(function ($state, $set, callable $get) {
$plantId = $get('plant_id');
$set('item_id', null);
$set('line_id', null);
$set('machine_id', null);
if (! $plantId) {
$set('poPlantError', 'Please select a plant first.');
}
})
->extraAttributes(fn ($get) => [
'class' => $get('poPlantError') ? 'border-red-500' : '',
])
->hint(fn ($get) => $get('poPlantError') ? $get('poPlantError') : null)
->hintColor('danger')
->required(),
Forms\Components\Select::make('line_id')
->label('Line')
->options(function (callable $get) {
if (!$get('plant_id')) {
return [];
}
return Line::where('plant_id', $get('plant_id'))
->pluck('name', 'id')
->toArray();
})
->afterStateUpdated(function ($state, $set, callable $get) {
$plantId = $get('plant_id');
$set('item_id', null);
$set('machine_id', null);
if (! $plantId) {
$set('poPlantError', 'Please select a plant first.');
}
})
->reactive()
->required(),
Forms\Components\Select::make('item_id')
->label('Item')
->options(function (callable $get) {
if (!$get('plant_id') || !$get('line_id')) {
return [];
}
return Item::where('plant_id', $get('plant_id'))
->pluck('code', 'id')
->toArray();
})
->afterStateUpdated(function ($state, $set, callable $get) {
$plantId = $get('plant_id');
$set('machine_id', null);
if (! $plantId) {
$set('poPlantError', 'Please select a plant first.');
}
})
->reactive()
->required()
->searchable(),
Forms\Components\Select::make('machine_id')
->label('Machine')
->options(function (callable $get) {
if (!$get('plant_id') || !$get('line_id') || !$get('item_id')) {
return [];
}
return Machine::where('plant_id', $get('plant_id'))
->where('line_id', $get('line_id'))
->pluck('work_center', 'id')
->toArray();
})
->afterStateUpdated(function ($state, $set, callable $get) {
$plantId = $get('plant_id');
$set('process_order', null);
$set('coil_number', null);
$set('status', null);
if (! $plantId) {
$set('poPlantError', 'Please select a plant first.');
}
})
->reactive()
->required(),
Forms\Components\TextInput::make('process_order')
->label('Process Order')
->reactive()
->afterStateUpdated(function ($state, $set, callable $get) {
$plantId = $get('plant_id');
$set('coil_number', null);
$set('status', null);
if (! $plantId) {
$set('poPlantError', 'Please select a plant first.');
}
})
->required(),
Forms\Components\TextInput::make('coil_number')
->label('Coil Number')
// ->reactive()
// ->afterStateUpdated(function ($state, $set, callable $get) {
// $plantId = $get('plant_id');
// $set('status', null);
// if (! $plantId) {
// $set('poPlantError', 'Please select a plant first.');
// }
// })
// ->required(),
->label('Coil Number')
->default('0')
->reactive()
->afterStateUpdated(function ($state, $set, callable $get, $livewire) {
$plantId = $get('plant_id');
$processOrder = $get('process_order');
$coilNo = $get('coil_number');
if (! $plantId) {
$set('poPlantError', 'Please select a plant first.');
} elseif (! $processOrder) {
$set('coil_number', null);
$set('poPlantError', null);
} elseif ($coilNo || $coilNo == '0') {
$existing = CharacteristicValue::where('plant_id', $plantId)
->where('process_order', $processOrder)
->where('coil_number', $coilNo)
->first();
if ($existing) {
$set('poPlantError', null);
$set('coil_number', null);
$set('coilNumberError', "Duplicate Coil : '{$coilNo}' found!");
} else {
$set('poPlantError', null);
$set('coilNumberError', null);
}
}
})
->extraAttributes(fn ($get) => [
'class' => $get('coilNumberError') ? 'border-red-500' : '',
])
->hint(fn ($get) => $get('coilNumberError') ? $get('coilNumberError') : null)
->hintColor('danger')
->required(),
Forms\Components\TextInput::make('observed_value')
->label('Observed Value')
->reactive()
->required(),
Forms\Components\Select::make('status')
->label('Status')
->options([
'Ok' => 'OK',
'NotOk' => 'Not Ok'
])
->reactive()
->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),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('No.')
->label('No.')
->getStateUsing(function ($record, $livewire, $column, $rowLoop) {
$paginator = $livewire->getTableRecords();
$perPage = method_exists($paginator, 'perPage') ? $paginator->perPage() : 10;
$currentPage = method_exists($paginator, 'currentPage') ? $paginator->currentPage() : 1;
return ($currentPage - 1) * $perPage + $rowLoop->iteration;
}),
Tables\Columns\TextColumn::make('plant.name')
->label('Plant')
->searchable()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('line.name')
->label('Line')
->searchable()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('item.code')
->label('Item')
->searchable()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('machine.work_center')
->label('Machine')
->searchable()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('process_order')
->label('Process Order')
->searchable()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('coil_number')
->label('Coil Number')
->searchable()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('observed_value')
->label('Observed value')
->searchable()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('status')
->label('Status')
->searchable()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('created_by')
->label('Created By')
->searchable()
->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(),
// ])
->filters([
Tables\Filters\TrashedFilter::make(),
Filter::make('advanced_filters')
->label('Advanced Filters')
->form([
Select::make('Plant')
->label('Select Plant')
->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::pluck('name', 'id')->toArray();
})
->reactive()
->afterStateUpdated(function ($state, callable $set, callable $get) {
$set('Item', null);
}),
Select::make('Line')
->label('Select Line')
->nullable()
->options(function (callable $get) {
$plantId = $get('Plant');
if(empty($plantId)) {
return [];
}
return Line::where('plant_id', $plantId)->pluck('name', 'id');
//return $plantId ? Item::where('plant_id', $plantId)->pluck('code', 'id') : [];
})
->reactive()
->afterStateUpdated(function ($state, callable $set, callable $get) {
$set('Item', null);
}),
Select::make('Item')
->label('Item Code')
->nullable()
->searchable()
->options(function (callable $get) {
$plantId = $get('Plant');
if(empty($plantId)) {
return [];
}
return Item::where('plant_id', $plantId)->pluck('code', 'id');
//return $plantId ? Item::where('plant_id', $plantId)->pluck('code', 'id') : [];
})
->reactive()
->afterStateUpdated(function ($state, callable $set, callable $get) {
$set('process_order', null);
}),
Select::make('Machine')
->label('Select Machine')
->nullable()
->options(function (callable $get) {
$plantId = $get('Plant');
$lineId = $get('Line');
if(empty($plantId) || empty($lineId)) {
return [];
}
return Machine::where('plant_id', $plantId)->where('line_id', $lineId)->pluck('work_center', 'id');
//return $plantId ? Item::where('plant_id', $plantId)->pluck('code', 'id') : [];
})
->reactive()
->afterStateUpdated(function ($state, callable $set, callable $get) {
$set('process_order', null);
}),
TextInput::make('process_order')
->label('Process Order')
->placeholder('Enter Process Order'),
TextInput::make('coil_number')
->label('Coil Number')
->placeholder(placeholder: 'Enter Coil Number'),
Select::make('status')
->label('Status')
->options([
'Ok' => 'OK',
'NotOk' => 'Not Ok'
]),
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['Line']) && empty($data['Item']) && empty($data['Machine']) && empty($data['process_order']) && empty($data['coil_number']) && empty($data['status']) && empty($data['created_from']) && empty($data['created_to'])) {
return $query->whereRaw('1 = 0');
}
if (!empty($data['Plant'])) {
$query->where('plant_id', $data['Plant']);
}
if (!empty($data['Line'])) {
$query->where('line_id', $data['Line']);
}
if (!empty($data['Item'])) {
$query->where('item_id', $data['Item']);
}
if (!empty($data['Machine'])) {
$query->where('machine_id', $data['Machine']);
}
if (!empty($data['process_order'])) {
$query->where('process_order', $data['process_order']);
}
if (!empty($data['coil_number'])) {
$query->where('coil_number', $data['coil_number']);
}
if (!empty($data['status'])) {
$query->where('status', $data['status']);
}
if (!empty($data['created_from'])) {
$query->where('created_at', '>=', $data['created_from']);
}
if (!empty($data['created_to'])) {
$query->where('created_at', '<=', $data['created_to']);
}
//$query->orderBy('created_at', 'asc');
})
->indicateUsing(function (array $data) {
$indicators = [];
if (!empty($data['Plant'])) {
$indicators[] = 'Plant: ' . Plant::where('id', $data['Plant'])->value('name');
}
if (!empty($data['Line'])) {
$indicators[] = 'Line: ' . Line::where('id', $data['Line'])->value('name');
}
if (!empty($data['Item'])) {
$indicators[] = 'Item: ' . Item::where('id', $data['Item'])->value('code');
}
if (!empty($data['Machine'])) {
$indicators[] = 'Machine: ' . Machine::where('id', $data['Machine'])->value('work_center');
}
if (!empty($data['process_order'])) {
$indicators[] = 'Process Order: ' . $data['process_order'];
}
if (!empty($data['coil_number'])) {
$indicators[] = 'Coil Number: ' . $data['coil_number'];
}
if (!empty($data['status'])) {
$indicators[] = 'Status: ' . $data['status'];
}
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(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
Tables\Actions\ForceDeleteBulkAction::make(),
Tables\Actions\RestoreBulkAction::make(),
]),
])
->headerActions([
ImportAction::make()
->importer(CharacteristicValueImporter::class)
->label('Import Characteristic Value')
->color('warning')
->visible(function () {
return Filament::auth()->user()->can('view import characteristic value');
}),
ExportAction::make()
->exporter(CharacteristicValueExporter::class)
->label('Export Characteristic Value')
->color('warning')
->visible(function () {
return Filament::auth()->user()->can('view export characteristic value');
}),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListCharacteristicValues::route('/'),
'create' => Pages\CreateCharacteristicValue::route('/create'),
'view' => Pages\ViewCharacteristicValue::route('/{record}'),
'edit' => Pages\EditCharacteristicValue::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\CharacteristicValueResource\Pages;
use App\Filament\Resources\CharacteristicValueResource;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
class CreateCharacteristicValue extends CreateRecord
{
protected static string $resource = CharacteristicValueResource::class;
}

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

@@ -19,6 +19,7 @@ use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Storage;
use Maatwebsite\Excel\Facades\Excel;
use Str;
use Livewire\Attributes\On;
class CreateInvoiceValidation extends CreateRecord
{
@@ -52,6 +53,7 @@ class CreateInvoiceValidation extends CreateRecord
public bool $showCapacitorInput = false;
public $excel_file;
public $mInvoiceNo;
public function getFormActions(): array
{
@@ -69,7 +71,7 @@ class CreateInvoiceValidation extends CreateRecord
$totQuan = InvoiceValidation::where('invoice_number', $this->invoiceNumber)->where('plant_id', $this->plantId)->count();
$scanSQuan = InvoiceValidation::where('invoice_number', $this->invoiceNumber)->where('scanned_status', 'Scanned')->where('plant_id', $this->plantId)->count();
$this->dispatch('playNotificationSound');
// $this->dispatch('playNotificationSound');
if ($totQuan == $scanSQuan) {
$this->form->fill([
'plant_id' => $this->plantId,
@@ -102,6 +104,8 @@ class CreateInvoiceValidation extends CreateRecord
{
$invoiceNumber = trim($invoiceNumber);
$parts = explode('.', $invoiceNumber);
$this->showCapacitorInput = false;
$user = Filament::auth()->user();
@@ -117,6 +121,62 @@ class CreateInvoiceValidation extends CreateRecord
// ..GET SERIAL INVOICE API
if(strlen($invoiceNumber) > 15)
{
$payloadJson = base64_decode(strtr($parts[1], '-_', '+/'));
if (empty($payloadJson)) {
Notification::make()
->title('Invalid payload for scanned qr code.')
->danger()
->seconds(1)
->send();
return;
}
$payload = json_decode($payloadJson, true);
if (!isset($payload['data'])) {
Notification::make()
->title('Invalid payload for scanned qr code.')
->info()
->seconds(1)
->send();
return;
}
$documentData = $payload['data'];
if($documentData == '' || $documentData == ''){
Notification::make()
->title('Invalid payload for scanned qr code.')
->info()
->seconds(1)
->send();
return;
}
// Extract DocNo
preg_match('/"DocNo"\s*:\s*"([^"]+)"/', $documentData, $matches);
if (!isset($matches[1])) {
Notification::make()
->title('Invoice number not found.')
->info()
->seconds(1)
->send();
return;
}
if (isset($matches[1])) {
$invoiceNumber = $matches[1];
}
}
//dd($invoiceNumber);
// ..
$updateStatus = $this->form->getState()['update_invoice'] ?? null;
@@ -2260,7 +2320,7 @@ class CreateInvoiceValidation extends CreateRecord
];
}
public function processSerialNumber($serNo)
public function processSer($serNo)
{
$serNo = trim($serNo);
$mSerNo = $serNo;
@@ -2370,18 +2430,18 @@ class CreateInvoiceValidation extends CreateRecord
// .Mail
$mailData = $this->getMail();
$mPlantName = $mailData['plant_name'];
$emails = $mailData['emails'];
$mInvoiceType = 'Material';
// $mailData = $this->getMail();
// $mPlantName = $mailData['plant_name'];
// $emails = $mailData['emails'];
// $mInvoiceType = 'Material';
if (! empty($emails)) {
Mail::to($emails)->send(
new InvalidSerialMail($mSerNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode, 'InvalidMaterialFormat')
);
} else {
\Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
}
// if (! empty($emails)) {
// Mail::to($emails)->send(
// new InvalidSerialMail($mSerNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode, 'InvalidMaterialFormat')
// );
// } else {
// \Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
// }
$this->form->fill([
'plant_id' => $plantId,
@@ -2404,19 +2464,19 @@ class CreateInvoiceValidation extends CreateRecord
// .Mail
$mailData = $this->getMail();
$mPlantName = $mailData['plant_name'];
$emails = $mailData['emails'];
$mInvoiceType = 'Material';
// $mailData = $this->getMail();
// $mPlantName = $mailData['plant_name'];
// $emails = $mailData['emails'];
// $mInvoiceType = 'Material';
if (! empty($emails)) {
// Mail::to($emails)->send(new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType));
Mail::to($emails)->send(
new InvalidSerialMail($mSerNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode, 'InvalidMaterialFormat')
);
} else {
\Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
}
// if (! empty($emails)) {
// // Mail::to($emails)->send(new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType));
// Mail::to($emails)->send(
// new InvalidSerialMail($mSerNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode, 'InvalidMaterialFormat')
// );
// } else {
// \Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
// }
$this->form->fill([
'plant_id' => $plantId,
@@ -2439,19 +2499,19 @@ class CreateInvoiceValidation extends CreateRecord
// .Mail
$mailData = $this->getMail();
$mPlantName = $mailData['plant_name'];
$emails = $mailData['emails'];
$mInvoiceType = 'Material';
// $mailData = $this->getMail();
// $mPlantName = $mailData['plant_name'];
// $emails = $mailData['emails'];
// $mInvoiceType = 'Material';
if (! empty($emails)) {
// Mail::to($emails)->send(new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType));
Mail::to($emails)->send(
new InvalidSerialMail($mSerNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode, 'InvalidMaterialFormat')
);
} else {
\Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
}
// if (! empty($emails)) {
// // Mail::to($emails)->send(new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType));
// Mail::to($emails)->send(
// new InvalidSerialMail($mSerNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode, 'InvalidMaterialFormat')
// );
// } else {
// \Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
// }
$this->form->fill([
'plant_id' => $plantId,
@@ -2481,18 +2541,18 @@ class CreateInvoiceValidation extends CreateRecord
$this->dispatch('playWarnSound');
// .Mail
$mailData = $this->getMail();
$mPlantName = $mailData['plant_name'];
$emails = $mailData['emails'];
$mInvoiceType = 'Material';
// $mailData = $this->getMail();
// $mPlantName = $mailData['plant_name'];
// $emails = $mailData['emails'];
// $mInvoiceType = 'Material';
if (! empty($emails)) {
Mail::to($emails)->send(
new InvalidSerialMail($mSerNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode, 'InvalidMaterialFormat')
);
} else {
\Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
}
// if (! empty($emails)) {
// Mail::to($emails)->send(
// new InvalidSerialMail($mSerNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode, 'InvalidMaterialFormat')
// );
// } else {
// \Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
// }
$this->form->fill([
'plant_id' => $plantId,
@@ -2513,18 +2573,18 @@ class CreateInvoiceValidation extends CreateRecord
->send();
$this->dispatch('playWarnSound');
$mailData = $this->getMail();
$mPlantName = $mailData['plant_name'];
$emails = $mailData['emails'];
$mInvoiceType = 'Material';
// $mailData = $this->getMail();
// $mPlantName = $mailData['plant_name'];
// $emails = $mailData['emails'];
// $mInvoiceType = 'Material';
if (! empty($emails)) {
Mail::to($emails)->send(
new InvalidSerialMail($mSerNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode, 'InvalidMaterialFormat')
);
} else {
\Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
}
// if (! empty($emails)) {
// Mail::to($emails)->send(
// new InvalidSerialMail($mSerNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode, 'InvalidMaterialFormat')
// );
// } else {
// \Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
// }
$this->form->fill([
'plant_id' => $plantId,
@@ -2555,18 +2615,18 @@ class CreateInvoiceValidation extends CreateRecord
// .Mail
$mailData = $this->getMail();
$mPlantName = $mailData['plant_name'];
$emails = $mailData['emails'];
$mInvoiceType = 'Material';
// $mailData = $this->getMail();
// $mPlantName = $mailData['plant_name'];
// $emails = $mailData['emails'];
// $mInvoiceType = 'Material';
if (! empty($emails)) {
Mail::to($emails)->send(
new InvalidSerialMail($mSerNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode, 'InvalidMaterialFormat')
);
} else {
\Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
}
// if (! empty($emails)) {
// Mail::to($emails)->send(
// new InvalidSerialMail($mSerNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode, 'InvalidMaterialFormat')
// );
// } else {
// \Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
// }
$this->form->fill([
'plant_id' => $plantId,
@@ -2588,18 +2648,18 @@ class CreateInvoiceValidation extends CreateRecord
$this->dispatch('playWarnSound');
// .Mail
$mailData = $this->getMail();
$mPlantName = $mailData['plant_name'];
$emails = $mailData['emails'];
$mInvoiceType = 'Material';
// $mailData = $this->getMail();
// $mPlantName = $mailData['plant_name'];
// $emails = $mailData['emails'];
// $mInvoiceType = 'Material';
if (! empty($emails)) {
Mail::to($emails)->send(
new InvalidSerialMail($mSerNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode, 'InvalidMaterialFormat')
);
} else {
\Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
}
// if (! empty($emails)) {
// Mail::to($emails)->send(
// new InvalidSerialMail($mSerNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode, 'InvalidMaterialFormat')
// );
// } else {
// \Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
// }
$this->form->fill([
'plant_id' => $plantId,
@@ -2630,18 +2690,18 @@ class CreateInvoiceValidation extends CreateRecord
// .Mail
$mailData = $this->getMail();
$mPlantName = $mailData['plant_name'];
$emails = $mailData['emails'];
$mInvoiceType = 'Material';
// $mailData = $this->getMail();
// $mPlantName = $mailData['plant_name'];
// $emails = $mailData['emails'];
// $mInvoiceType = 'Material';
if (! empty($emails)) {
Mail::to($emails)->send(
new InvalidSerialMail($mSerNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode, 'InvalidMaterialFormat')
);
} else {
\Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
}
// if (! empty($emails)) {
// Mail::to($emails)->send(
// new InvalidSerialMail($mSerNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode, 'InvalidMaterialFormat')
// );
// } else {
// \Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
// }
$this->form->fill([
'plant_id' => $plantId,
@@ -2668,18 +2728,18 @@ class CreateInvoiceValidation extends CreateRecord
->send();
$this->dispatch('playWarnSound');
$mailData = $this->getMail();
$mPlantName = $mailData['plant_name'];
$emails = $mailData['emails'];
$mInvoiceType = 'Material';
// $mailData = $this->getMail();
// $mPlantName = $mailData['plant_name'];
// $emails = $mailData['emails'];
// $mInvoiceType = 'Material';
if (! empty($emails)) {
Mail::to($emails)->send(
new InvalidSerialMail($mSerNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode, 'ItemNotFound')
);
} else {
\Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
}
// if (! empty($emails)) {
// Mail::to($emails)->send(
// new InvalidSerialMail($mSerNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode, 'ItemNotFound')
// );
// } else {
// \Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
// }
$this->form->fill([
'plant_id' => $plantId,
@@ -2705,18 +2765,18 @@ class CreateInvoiceValidation extends CreateRecord
->send();
$this->dispatch('playWarnSound');
$mailData = $this->getMail();
$mPlantName = $mailData['plant_name'];
$emails = $mailData['emails'];
$mInvoiceType = 'Material';
// $mailData = $this->getMail();
// $mPlantName = $mailData['plant_name'];
// $emails = $mailData['emails'];
// $mInvoiceType = 'Material';
if (! empty($emails)) {
Mail::to($emails)->send(
new InvalidSerialMail($mSerNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode, 'ItemNotFoundDB')
);
} else {
\Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
}
// if (! empty($emails)) {
// Mail::to($emails)->send(
// new InvalidSerialMail($mSerNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode, 'ItemNotFoundDB')
// );
// } else {
// \Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
// }
$this->form->fill([
'plant_id' => $plantId,
@@ -2741,19 +2801,6 @@ class CreateInvoiceValidation extends CreateRecord
->send();
$this->dispatch('playWarnSound');
$mailData = $this->getMail();
$mPlantName = $mailData['plant_name'];
$emails = $mailData['emails'];
$mInvoiceType = 'Material';
if (! empty($emails)) {
Mail::to($emails)->send(
new InvalidSerialMail($mSerNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode, 'ItemNotValidMaterialType')
);
} else {
\Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
}
$this->form->fill([
'plant_id' => $plantId,
'invoice_number' => $invoiceNumber,
@@ -2783,19 +2830,6 @@ class CreateInvoiceValidation extends CreateRecord
->send();
$this->dispatch('playWarnSound');
$mailData = $this->getMail();
$mPlantName = $mailData['plant_name'];
$emails = $mailData['emails'];
$mInvoiceType = 'Material';
if (! empty($emails)) {
Mail::to($emails)->send(
new InvalidSerialMail($mSerNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode, 'ItemNotInvoice')
);
} else {
\Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
}
$this->form->fill([
'plant_id' => $plantId,
'invoice_number' => $invoiceNumber,
@@ -2824,19 +2858,6 @@ class CreateInvoiceValidation extends CreateRecord
->send();
$this->dispatch('playWarnSound');
$mailData = $this->getMail();
$mPlantName = $mailData['plant_name'];
$emails = $mailData['emails'];
$mInvoiceType = 'Material';
if (! empty($emails)) {
Mail::to($emails)->send(
new InvalidSerialMail($mSerNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode, 'Item')
);
} else {
\Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
}
$this->form->fill([
'plant_id' => $plantId,
'invoice_number' => $invoiceNumber,
@@ -3098,22 +3119,6 @@ class CreateInvoiceValidation extends CreateRecord
$this->dispatch('playWarnSound');
// ..Mail
$mInvoiceType = 'Serial';
$mailData = $this->getMail();
$mPlantName = $mailData['plant_name'];
$emails = $mailData['emails'];
if (! empty($emails)) {
// Mail::to($emails)->send(new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType));
Mail::to($emails)->send(
new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType, 'InvalidFormat')
);
} else {
\Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
}
$this->form->fill([
'plant_id' => $plantId,
'invoice_number' => $invoiceNumber,
@@ -3155,23 +3160,6 @@ class CreateInvoiceValidation extends CreateRecord
$this->dispatch('play-warn-sound');
// ..Mail
$mInvoiceType = 'Serial';
$mailData = $this->getMail();
$mPlantName = $mailData['plant_name'];
$emails = $mailData['emails'];
if (! empty($emails)) {
Mail::to($emails)->send(
new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode, 'NotFound')
);
} else {
\Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
}
// ..
$this->form->fill([
'plant_id' => $plantId,
'invoice_number' => $invoiceNumber,
@@ -3203,9 +3191,11 @@ class CreateInvoiceValidation extends CreateRecord
$mPlantName = $mailData['plant_name'];
$emails = $mailData['emails'];
$mUserName = Filament::auth()->user()->name;
if (! empty($emails)) {
Mail::to($emails)->send(
new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode, 'NotFoundInvoice')
new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode,$mUserName,'NotFoundInvoice')
);
} else {
\Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
@@ -3240,19 +3230,6 @@ class CreateInvoiceValidation extends CreateRecord
$this->dispatch('playWarnSound');
$mInvoiceType = 'Serial';
$mailData = $this->getMail();
$mPlantName = $mailData['plant_name'];
$emails = $mailData['emails'];
if (! empty($emails)) {
Mail::to($emails)->send(
new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode, 'NotFoundItemS')
);
} else {
\Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
}
$this->form->fill([
'plant_id' => $plantId,
'invoice_number' => $invoiceNumber,
@@ -3265,6 +3242,8 @@ class CreateInvoiceValidation extends CreateRecord
return;
}
$invalidPackage = false;
$hasMotorQr = $record->stickerMasterRelation->tube_sticker_motor ?? null;
$hasPumpQr = $record->stickerMasterRelation->tube_sticker_pump ?? null;
$hasPumpSetQr = $record->stickerMasterRelation->tube_sticker_pumpset ?? null;
@@ -3274,17 +3253,18 @@ class CreateInvoiceValidation extends CreateRecord
$hasMotorQr = $record->stickerMasterRelation->pack_slip_motor ?? null;
$hasPumpQr = $record->stickerMasterRelation->pack_slip_pump ?? null;
$hasPumpSetQr = $record->stickerMasterRelation->pack_slip_pumpset ?? null;
} elseif (! $hasPumpSetQr && ! $hasPumpQr) {
$hasPumpQr = $record->stickerMasterRelation->pack_slip_pump ?? null;
}
} else {
if (! $hasPumpSetQr && ! $hasPumpQr) {
$hasPumpQr = $record->stickerMasterRelation->pack_slip_pump ?? null;
}
$invalidPackage = false;
$hasTubeMotorQr = $record->stickerMasterRelation->tube_sticker_motor ?? null;
$hasPackMotorQr = $record->stickerMasterRelation->pack_slip_motor ?? null;
$hasTubePumpSetQr = $record->stickerMasterRelation->tube_sticker_pumpset ?? null;
$hasPackPumpSetQr = $record->stickerMasterRelation->pack_slip_pumpset ?? null;
if ($hasTubeMotorQr != $hasPackMotorQr || $hasTubePumpSetQr != $hasPackPumpSetQr) {
$invalidPackage = true;
$hasTubeMotorQr = $record->stickerMasterRelation->tube_sticker_motor ?? null;
$hasPackMotorQr = $record->stickerMasterRelation->pack_slip_motor ?? null;
$hasTubePumpSetQr = $record->stickerMasterRelation->tube_sticker_pumpset ?? null;
$hasPackPumpSetQr = $record->stickerMasterRelation->pack_slip_pumpset ?? null;
if ($hasTubeMotorQr != $hasPackMotorQr || $hasTubePumpSetQr != $hasPackPumpSetQr) {
$invalidPackage = true;
}
}
$hadMotorQr = $record->motor_scanned_status ?? null;
@@ -3302,19 +3282,6 @@ class CreateInvoiceValidation extends CreateRecord
$this->dispatch('playWarnSound');
$mInvoiceType = 'Serial';
$mailData = $this->getMail();
$mPlantName = $mailData['plant_name'];
$emails = $mailData['emails'];
if (! empty($emails)) {
Mail::to($emails)->send(
new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode, 'NotValidPackage')
);
} else {
\Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
}
$this->form->fill([
'plant_id' => $plantId,
'invoice_number' => $invoiceNumber,
@@ -3353,18 +3320,6 @@ class CreateInvoiceValidation extends CreateRecord
->seconds(3)
->send();
$this->dispatch('playWarnSound');
$mInvoiceType = 'Serial';
$mailData = $this->getMail();
$mPlantName = $mailData['plant_name'];
$emails = $mailData['emails'];
if (! empty($emails)) {
Mail::to($emails)->send(
new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode, 'NotMotorQR')
);
} else {
\Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
}
$this->form->fill([
'plant_id' => $plantId,
@@ -3386,21 +3341,6 @@ class CreateInvoiceValidation extends CreateRecord
$this->dispatch('playWarnSound');
// ..Mail
$mInvoiceType = 'Serial';
$mailData = $this->getMail();
$mPlantName = $mailData['plant_name'];
$emails = $mailData['emails'];
if (! empty($emails)) {
Mail::to($emails)->send(
new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode, 'DuplicateMotorQR')
);
} else {
\Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
}
$this->form->fill([
'plant_id' => $plantId,
'invoice_number' => $invoiceNumber,
@@ -3461,19 +3401,6 @@ class CreateInvoiceValidation extends CreateRecord
->send();
$this->dispatch('playNotificationSound');
$mInvoiceType = 'Serial';
$mailData = $this->getMail();
$mPlantName = $mailData['plant_name'];
$emails = $mailData['emails'];
if (! empty($emails)) {
Mail::to($emails)->send(
new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode, 'CompletedSerialInvoice')
);
} else {
\Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
}
$filename = $invoiceNumber.'.xlsx';
$directory = 'uploads/temp';
$disk = Storage::disk('local');
@@ -3511,20 +3438,6 @@ class CreateInvoiceValidation extends CreateRecord
$this->dispatch('playWarnSound');
$mInvoiceType = 'Serial';
$mailData = $this->getMail();
$mPlantName = $mailData['plant_name'];
$emails = $mailData['emails'];
if (! empty($emails)) {
// Mail::to($emails)->send(new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType));
Mail::to($emails)->send(
new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode, 'NotPumpQR')
);
} else {
\Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
}
$this->form->fill([
'plant_id' => $plantId,
'invoice_number' => $invoiceNumber,
@@ -3544,20 +3457,6 @@ class CreateInvoiceValidation extends CreateRecord
->send();
$this->dispatch('playWarnSound');
$mInvoiceType = 'Serial';
$mailData = $this->getMail();
$mPlantName = $mailData['plant_name'];
$emails = $mailData['emails'];
if (! empty($emails)) {
// Mail::to($emails)->send(new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType));
Mail::to($emails)->send(
new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode, 'DuplicatePumpQR')
);
} else {
\Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
}
$this->form->fill([
'plant_id' => $plantId,
'invoice_number' => $invoiceNumber,
@@ -3619,20 +3518,6 @@ class CreateInvoiceValidation extends CreateRecord
$this->dispatch('playNotificationSound');
$mInvoiceType = 'Serial';
$mailData = $this->getMail();
$mPlantName = $mailData['plant_name'];
$emails = $mailData['emails'];
if (! empty($emails)) {
// Mail::to($emails)->send(new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType));
Mail::to($emails)->send(
new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode, 'CSerialInvoice')
);
} else {
\Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
}
$filename = $invoiceNumber.'.xlsx';
$directory = 'uploads/temp';
$disk = Storage::disk('local');
@@ -3672,20 +3557,6 @@ class CreateInvoiceValidation extends CreateRecord
$this->dispatch('playWarnSound');
$mInvoiceType = 'Serial';
$mailData = $this->getMail();
$mPlantName = $mailData['plant_name'];
$emails = $mailData['emails'];
if (! empty($emails)) {
// Mail::to($emails)->send(new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType));
Mail::to($emails)->send(
new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode, 'MissingPanelBox')
);
} else {
\Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
}
$this->form->fill([
'plant_id' => $plantId,
'invoice_number' => $invoiceNumber,
@@ -3706,20 +3577,6 @@ class CreateInvoiceValidation extends CreateRecord
$this->dispatch('playWarnSound');
$mInvoiceType = 'Serial';
$mailData = $this->getMail();
$mPlantName = $mailData['plant_name'];
$emails = $mailData['emails'];
if (! empty($emails)) {
// Mail::to($emails)->send(new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType));
Mail::to($emails)->send(
new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode, 'DuplicateCapacitorQR')
);
} else {
\Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
}
$this->form->fill([
'plant_id' => $plantId,
'invoice_number' => $invoiceNumber,
@@ -3762,20 +3619,6 @@ class CreateInvoiceValidation extends CreateRecord
$this->dispatch('playWarnSound');
$mInvoiceType = 'Serial';
$mailData = $this->getMail();
$mPlantName = $mailData['plant_name'];
$emails = $mailData['emails'];
if (! empty($emails)) {
// Mail::to($emails)->send(new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType));
Mail::to($emails)->send(
new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode, 'UnknownPumpsetQR')
);
} else {
\Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
}
$this->form->fill([
'plant_id' => $plantId,
'invoice_number' => $invoiceNumber,
@@ -3796,20 +3639,6 @@ class CreateInvoiceValidation extends CreateRecord
$this->dispatch('playWarnSound');
$mInvoiceType = 'Serial';
$mailData = $this->getMail();
$mPlantName = $mailData['plant_name'];
$emails = $mailData['emails'];
if (! empty($emails)) {
// Mail::to($emails)->send(new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType));
Mail::to($emails)->send(
new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode, 'DuplicatePumpsetQR')
);
} else {
\Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
}
$this->form->fill([
'plant_id' => $plantId,
'invoice_number' => $invoiceNumber,
@@ -3871,19 +3700,19 @@ class CreateInvoiceValidation extends CreateRecord
$this->dispatch('playNotificationSound');
$mInvoiceType = 'Serial';
$mailData = $this->getMail();
$mPlantName = $mailData['plant_name'];
$emails = $mailData['emails'];
// $mInvoiceType = 'Serial';
// $mailData = $this->getMail();
// $mPlantName = $mailData['plant_name'];
// $emails = $mailData['emails'];
if (! empty($emails)) {
// Mail::to($emails)->send(new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType));
Mail::to($emails)->send(
new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode, 'ComSerInv')
);
} else {
\Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
}
// if (! empty($emails)) {
// // Mail::to($emails)->send(new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType));
// Mail::to($emails)->send(
// new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType, $itemCode, 'ComSerInv')
// );
// } else {
// \Log::warning("No recipients found for plant {$plantId}, module Serial, rule invalid_serial.");
// }
$filename = $invoiceNumber.'.xlsx';
$directory = 'uploads/temp';
@@ -3917,6 +3746,12 @@ class CreateInvoiceValidation extends CreateRecord
}
}
#[On('process-scan')]
public function processSerial($serial)
{
$this->processSer($serial);
}
public function getHeading(): string
{
return 'Scan Invoice Validation';

View File

@@ -237,9 +237,6 @@ class ItemResource extends Resource
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
// ->filters([
// Tables\Filters\TrashedFilter::make(),
// ])
->filters([
Tables\Filters\TrashedFilter::make(),
Filter::make('advanced_filters')
@@ -251,11 +248,11 @@ class ItemResource extends Resource
->options(function (callable $get) {
$userHas = Filament::auth()->user()->plant_id;
return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::pluck('name', 'id')->toArray();
return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->orderBy('code')->pluck('name', 'id')->toArray() : Plant::orderBy('code')->pluck('name', 'id')->toArray();
})
->reactive()
->afterStateUpdated(function ($state, callable $set, callable $get): void {
$set('item_id', null);
$set('code', null);
$set('operator_id', null);
}),
Select::make('code')
@@ -270,9 +267,7 @@ class ItemResource extends Resource
->options(function (callable $get) {
$plantId = $get('Plant');
return $plantId
? Item::where('plant_id', $plantId)->pluck('code', 'id')
: [];
return $plantId ? Item::where('plant_id', $plantId)->pluck('code', 'id') : [];
})
->searchable()
->reactive(),
@@ -300,7 +295,7 @@ class ItemResource extends Resource
// Hide all records initially if no filters are applied
if (
empty($data['Plant']) &&
empty($data['item_id']) &&
empty($data['code']) &&
empty($data['description']) &&
empty($data['uom']) &&
empty($data['category']) &&
@@ -314,8 +309,8 @@ class ItemResource extends Resource
$query->where('plant_id', $data['Plant']);
}
if (! empty($data['item_id'])) {
$query->where('item_id', $data['item_id']);
if (! empty($data['code'])) {
$query->where('id', $data['code']);
}
if (! empty($data['description'])) {
@@ -337,7 +332,6 @@ class ItemResource extends Resource
if (! empty($data['created_to'])) {
$query->where('created_at', '<=', $data['created_to']);
}
})
->indicateUsing(function (array $data) {
$indicators = [];
@@ -346,8 +340,8 @@ class ItemResource extends Resource
$indicators[] = 'Plant: '.Plant::where('id', $data['Plant'])->value('name');
}
if (! empty($data['item_id'])) {
$indicators[] = 'Item Code: '.$data['item_id'];
if (! empty($data['code'])) {
$indicators[] = 'Item Code: '.Item::where('id', $data['code'])->value('code');
}
if (! empty($data['description'])) {
@@ -621,10 +615,10 @@ class ItemResource extends Resource
}),
// ->maxRows(100000),
ExportAction::make()
// ->columnMapping(true)
// ->columnMapping(true)
->label('Export Items')
->color('warning')
// ->fileName("Items Report " . date('Y-m-d H:i:s'))
// ->fileName("Items Report " . date('Y-m-d H:i:s'))
->exporter(ItemExporter::class)
->visible(function () {
return Filament::auth()->user()->can('view export item');

View File

@@ -24,6 +24,14 @@ use Illuminate\Database\Eloquent\SoftDeletingScope;
use Livewire\Features\SupportFileUploads\TemporaryUploadedFile;
use Smalot\PdfParser\Parser;
use Storage;
use Filament\Forms\Components\DateTimePicker;
use Filament\Tables\Filters\Filter;
use Filament\Forms\Components\Select;
use App\Models\Line;
use Filament\Forms\Components\TextInput;
use App\Models\Item;
// use App\Models\PalletValidation;
// use Dom\Text;
class ProcessOrderResource extends Resource
{
@@ -75,7 +83,7 @@ class ProcessOrderResource extends Resource
return [];
}
return \App\Models\Item::where('plant_id', $plantId)->pluck('code', 'id');
return Item::where('plant_id', $plantId)->pluck('code', 'id');
})
->afterStateUpdated(function (callable $set, callable $get, ?string $state) {
$plantId = $get('plant_id');
@@ -84,20 +92,23 @@ class ProcessOrderResource extends Resource
if ($plantId && $itemId) {
// Get the item code using item_id
$itemCode = \App\Models\Item::where('id', $itemId)->value('code');
$itemCode = Item::where('id', $itemId)->value('code');
if ($itemCode) {
// Now get the item description using plant_id + code
$item = \App\Models\Item::where('plant_id', $plantId)
$item = Item::where('plant_id', $plantId)
->where('code', $itemCode)
->first();
$set('item_description', $item?->description);
$set('item_uom', $item?->uom);
} else {
$set('item_description', null);
$set('item_uom', null);
}
} else {
$set('item_description', null);
$set('item_uom', null);
}
})
->required(),
@@ -109,7 +120,7 @@ class ProcessOrderResource extends Resource
->afterStateHydrated(function ($component, $state, Get $get, Set $set) {
$itemId = $get('item_id');
if ($get('id')) {
$item = \App\Models\Item::where('id', $itemId)->first()?->description;
$item = Item::where('id', $itemId)->first()?->description;
if ($item) {
$set('item_description', $item);
} else {
@@ -118,10 +129,27 @@ class ProcessOrderResource extends Resource
}
}),
Forms\Components\TextInput::make('item_uom')
->label('UOM')
->required()
->reactive()
->afterStateHydrated(function ($component, $state, Get $get, Set $set) {
$itemId = $get('item_id');
if ($get('id')) {
$item = Item::where('id', $itemId)->first()?->uom;
if ($item) {
$set('item_uom', $item);
} else {
$set('item_uom', null);
}
}
}),
Forms\Components\TextInput::make('id')
->hidden()
->readOnly(),
// ->readOnly(true),
Forms\Components\TextInput::make('process_order')
->label('Process Order')
->reactive()
@@ -137,6 +165,34 @@ class ProcessOrderResource extends Resource
$set('sfgNumberError', null);
}
})
->rule(function (callable $get) {
return function (string $attribute, $value, \Closure $fail) use ($get) {
$plantId = $get('plant_id');
$itemId = $get('item_id');
$processOrder = $value;
//$currentId = $get('id'); // current editing record id
if (! $plantId || ! $processOrder) {
return;
}
$existing = ProcessOrder::where('plant_id', $plantId)
->where('process_order', $processOrder)
->where('item_id', '!=', $itemId)
->first();
if ($existing) {
Notification::make()
->title('Duplicate Process Order!')
->body("Process Order '{$value}' is already exist with item code '{$existing->item->code}'.")
->danger()
->send();
$fail("process order already exists for this plant and item code '{$existing->item->code}'.");
}
};
})
->required(),
Forms\Components\TextInput::make('coil_number')
->label('Coil Number')
@@ -415,7 +471,6 @@ class ProcessOrderResource extends Resource
$paginator = $livewire->getTableRecords();
$perPage = method_exists($paginator, 'perPage') ? $paginator->perPage() : 10;
$currentPage = method_exists($paginator, 'currentPage') ? $paginator->currentPage() : 1;
return ($currentPage - 1) * $perPage + $rowLoop->iteration;
}),
Tables\Columns\TextColumn::make('plant.name')
@@ -433,6 +488,11 @@ class ProcessOrderResource extends Resource
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('item.uom')
->label('Uom')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('process_order')
->label('Process Order')
->alignCenter()
@@ -490,9 +550,135 @@ class ProcessOrderResource extends Resource
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
// ->filters([
// Tables\Filters\TrashedFilter::make(),
// ])
->filters([
Tables\Filters\TrashedFilter::make(),
Tables\Filters\TrashedFilter::make(),
Filter::make('advanced_filters')
->label('Advanced Filters')
->form([
Select::make('Plant')
->label('Select Plant')
->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::pluck('name', 'id')->toArray();
})
->reactive()
->afterStateUpdated(function ($state, callable $set, callable $get) {
$set('Item', null);
}),
Select::make('Item')
->label('Item Code')
->nullable()
->searchable()
->options(function (callable $get) {
$plantId = $get('Plant');
if(empty($plantId)) {
return [];
}
return Item::where('plant_id', $plantId)->pluck('code', 'id');
//return $plantId ? Item::where('plant_id', $plantId)->pluck('code', 'id') : [];
})
->reactive()
->afterStateUpdated(function ($state, callable $set, callable $get) {
$set('process_order', null);
}),
TextInput::make('process_order')
->label('Process Order')
->placeholder('Enter Process Order'),
TextInput::make('sfg_number')
->label('Sfg Number')
->placeholder(placeholder: 'Enter Sfg Number'),
TextInput::make('machine_name')
->label('Machine Name')
->placeholder(placeholder: 'Enter Machine Name'),
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['Item']) && empty($data['process_order']) && empty($data['sfg_number']) && empty($data['created_from']) && empty($data['created_to']) && empty($data['machine_name'])) {
return $query->whereRaw('1 = 0');
}
if (!empty($data['Plant'])) {
$query->where('plant_id', $data['Plant']);
}
if (!empty($data['Item'])) {
$query->where('item_id', $data['Item']);
}
if (!empty($data['process_order'])) {
$query->where('process_order', $data['process_order']);
}
if (!empty($data['sfg_number'])) {
$query->where('sfg_number', $data['sfg_number']);
}
if (!empty($data['machine_name'])) {
// $query->where('machine_name', $data['machine_name']);
$query->where('machine_name', 'like', '%' . $data['machine_name'] . '%');
}
if (!empty($data['created_from'])) {
$query->where('created_at', '>=', $data['created_from']);
}
if (!empty($data['created_to'])) {
$query->where('created_at', '<=', $data['created_to']);
}
//$query->orderBy('created_at', 'asc');
})
->indicateUsing(function (array $data) {
$indicators = [];
if (!empty($data['Plant'])) {
$indicators[] = 'Plant: ' . Plant::where('id', $data['Plant'])->value('name');
}
if (!empty($data['Item'])) {
$indicators[] = 'Item: ' . Item::where('id', $data['Item'])->value('code');
}
if (!empty($data['process_order'])) {
$indicators[] = 'Process Order: ' . $data['process_order'];
}
if (!empty($data['sfg_number'])) {
$indicators[] = 'Sfg Number: ' . $data['sfg_number'];
}
if (!empty($data['machine_name'])) {
$indicators[] = 'Machine Name: ' . $data['machine_name'];
}
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(),
@@ -505,6 +691,130 @@ class ProcessOrderResource extends Resource
]),
])
->headerActions([
Tables\Actions\Action::make('reprint_process')
->label('Re-Print Process Order')
->form([
Forms\Components\Section::make()
->schema([
Forms\Components\Select::make('plant')
->label('Select Plant')
// ->options(Plant::pluck('name', 'id')->toArray())
->options(function (callable $get) {
$userHas = Filament::auth()->user()->plant_id;
return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::pluck('name', 'id')->toArray();
})
->required()
->reactive()
->afterStateUpdated(function ($state, callable $set, callable $get) {
$set('Item', null);
$set('process_order', null);
$set('coil_number', null);
$set('received_quantity', null);
$set('machine_name', null);
}),
Select::make('Item')
->label('Item Code')
->nullable()
->required()
->searchable()
->options(function (callable $get) {
$plantId = $get('plant');
if(empty($plantId)) {
return [];
}
return Item::where('plant_id', $plantId)->pluck('code', 'id');
//return $plantId ? Item::where('plant_id', $plantId)->pluck('code', 'id') : [];
})
->reactive()
->afterStateUpdated(function ($state, callable $set, callable $get) {
$set('process_order', null);
$set('coil_number', null);
$set('received_quantity', null);
$set('machine_name', null);
}),
TextInput::make('process_order')
->label('Process Order')
->required()
->placeholder('Enter Process Order')
->reactive()
->afterStateUpdated(function ($state, callable $set, callable $get) {
$set('coil_number', null);
$set('received_quantity', null);
$set('machine_name', null);
}),
Select::make('coil_number')
->label('Coil Number')
->nullable()
->required()
->searchable()
->options(function (callable $get) {
$plantId = $get('plant');
$itemId = $get('Item');
$processOrder = $get('process_order');
if(empty($plantId) || empty($itemId) || empty($processOrder)) {
return [];
}
return ProcessOrder::where('plant_id', $plantId)
->where('item_id', $itemId)
->where('process_order', $processOrder)
->pluck('coil_number', 'coil_number');
//return $plantId ? Item::where('plant_id', $plantId)->pluck('code', 'id') : [];
})
->reactive()
->afterStateUpdated(function ($state, callable $set, callable $get) {
$plantId = $get('plant');
$itemId = $get('Item');
$processOrder = $get('process_order');
if(!$plantId || !$itemId || !$processOrder || !$state) {
$set('received_quantity', null);
$set('machine_name', null);
return;
}
$processOrderData = ProcessOrder::where('plant_id', $plantId)
->where('item_id', $itemId)
->where('process_order', $processOrder)
->where('coil_number', $state)
->first();
$set('received_quantity', $processOrderData?->received_quantity);
$set('machine_name', $processOrderData?->machine_name);
}),
TextInput::make('received_quantity')
->label('Received Quantity')
->readOnly(),
TextInput::make('machine_name')
->label('Machine ID')
->readOnly(),
])
->columns(['default' => 1, 'sm' => 3]),
])
// ->action(function (array $data) {
// $selectedPalletNumber = $data['pallet_list'];
// return redirect()->route('download-reprint-qr-pdf', ['palletNo' => $selectedPalletNumber]);
// })
->action(function (array $data) {
$username = Filament::auth()->user()->name;
return redirect()->route('download-reprint-process-pdf', [
'plant' => $data['plant'],
'item' => $data['Item'],
'process_order' => $data['process_order'],
'coil_number' => $data['coil_number'],
'name' => $username,
]);
})
->visible(function () {
return Filament::auth()->user()->can('view reprint process order');
}),
ImportAction::make()
->label('Import Process Order')
->color('warning')

View File

@@ -0,0 +1,366 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Exports\ProductCharacteristicsMasterExporter;
use App\Filament\Imports\ProductCharacteristicsMasterImporter;
use App\Filament\Resources\ProductCharacteristicsMasterResource\Pages;
use App\Filament\Resources\ProductCharacteristicsMasterResource\RelationManagers;
use App\Models\Line;
use App\Models\Machine;
use App\Models\Plant;
use App\Models\ProductCharacteristicsMaster;
use App\Models\WorkGroupMaster;
use Filament\Facades\Filament;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Forms\Get;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Tables\Actions\ImportAction;
use Filament\Tables\Actions\ExportAction;
class ProductCharacteristicsMasterResource extends Resource
{
protected static ?string $model = ProductCharacteristicsMaster::class;
protected static ?string $navigationGroup = 'Process Order';
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
public static function form(Form $form): Form
{
return $form
->schema([
Forms\Components\Select::make('plant_id')
->label('Plant')
->relationship('plant', 'name')
->options(function (callable $get) {
$userHas = Filament::auth()->user()->plant_id;
return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::pluck('name', 'id')->toArray();
})
->reactive()
->required(),
Forms\Components\Select::make('item_id')
->label('Item Code')
//->relationship('item', 'code')
->searchable()
->reactive()
->options(function (callable $get) {
$plantId = $get('plant_id');
if (empty($plantId)) {
return [];
}
return \App\Models\Item::where('plant_id', $plantId)->pluck('code', 'id');
})
->required(),
Forms\Components\Select::make('line_id')
->label('Line')
->reactive()
->options(function (callable $get) {
$plantId = $get('plant_id');
if (empty($plantId)) {
return [];
}
return Line::where('plant_id', $plantId)->pluck('name', 'id');
})
->afterStateUpdated(function ($state, callable $set, callable $get) {
$set('machine_id', null);
if (!$get('work_group_master_id')) {
$set('machine_id', null);
}
})
->required(),
// ->relationship('line', 'name'),
Forms\Components\Select::make('work_group_master_id')
->label('Group Work Center')
->required()
->reactive()
->options(function (callable $get) {
if (!$get('plant_id') || !$get('line_id')) {
return [];
}
$line = Line::find($get('line_id'));
$workGroupIds = [];
for ($i = 1; $i <= $line->no_of_operation; $i++) {
$column = "work_group{$i}_id";
if (!empty($line->$column)) {
$workGroupIds[] = $line->$column;
}
}
return WorkGroupMaster::where('plant_id', $get('plant_id'))->whereIn('id', $workGroupIds)->pluck('name', 'id')->toArray();
})
->disabled(fn (Get $get) => !empty($get('id')))
->afterStateUpdated(function ($state, callable $set, callable $get) {
$lineId = $get('line_id');
if (!$lineId) {
$set('mGroupWorkError', 'Please select a line first.');
$set('machine_id', null);
return;
}
else
{
// $grpWrkCnr = Line::find($lineId)->group_work_center;
// if (!$grpWrkCnr || Str::length($grpWrkCnr) < 1)
// {
// $set('mGroupWorkError', 'Please select a group work center line.');
// $set('line_id', null);
// return;
// }
$set('mGroupWorkError', null);
$set('machine_id', null);
}
})
->extraAttributes(fn ($get) => [
'class' => $get('mGroupWorkError') ? 'border-red-500' : '',
])
// ->dehydrateStateUsing(fn ($state) => null)
->hint(fn ($get) => $get('mGroupWorkError') ? $get('mGroupWorkError') : null)
->hintColor('danger'),
Forms\Components\Select::make('machine_id')
->label('Work Center')
//->relationship('machine', 'name'),
->searchable()
->reactive()
->options(function (callable $get) {
$plantId = $get('plant_id');
$lineId = $get('line_id');
$workGroupId = $get('work_group_master_id');
if (empty($plantId) || empty($lineId) || empty($workGroupId)) {
return [];
}
return Machine::where('plant_id', $plantId)
->where('line_id', $lineId)
->where('work_group_master_id', $workGroupId)
->pluck('work_center', 'id');
})
->afterStateUpdated(function ($state, callable $set, callable $get) {
if (!$get('plant_id') || !$get('line_id') || !$get('work_group_master_id')) {
$set('machine_id', null);
}
})
->required(),
Forms\Components\Select::make('characteristics_type')
->label('Characteristics Type')
->options([
'Product' => 'Product',
'Process' => 'Process',
])
->reactive()
->required(),
Forms\Components\TextInput::make('name')
->label('Name'),
Forms\Components\Select::make('inspection_type')
->label('Inspection Type')
->options([
'Visual' => 'Visual',
'Value' => 'Value',
])
->reactive()
->required(),
// Forms\Components\Select::make('result')
// ->label('Visual Type')
// ->reactive()
// ->options(function (callable $get) {
// if ($get('inspection_type') == 'Visual') {
// return [
// 'Ok' => 'OK',
// 'NotOk' => 'Not Ok',
// ];
// }
// return []; //empty options if type ≠ Visual
// })
// ->afterStateUpdated(function ($state, $set) {
// $set('result', $state); // store in form state only
// session()->put('temp_result', $state);
// })
// ->hidden(fn (callable $get) => $get('inspection_type') != 'Visual'),
Forms\Components\TextInput::make('upper')
->label('Upper')
->numeric()
->default(0.0)
->visible(fn (callable $get) => $get('inspection_type') == 'Value'),
Forms\Components\TextInput::make('lower')
->label('Lower')
->numeric()
->default(0.0)
->visible(fn (callable $get) => $get('inspection_type') == 'Value'),
Forms\Components\TextInput::make('middle')
->label('Middle')
->numeric()
->visible(fn (callable $get) => $get('inspection_type') == 'Value')
->rule(function (callable $get) {
return function (string $attribute, $value, \Closure $fail) use ($get) {
$lower = $get('lower');
$upper = $get('upper');
$middle = $value;
if (!is_null($lower) && !is_null($upper) && !is_null($middle)) {
if (!($lower <= $middle && $middle <= $upper)) {
$fail("Middle must be between Lower and Upper (Lower ≤ Middle ≤ Upper).");
}
}
};
}),
Forms\Components\Hidden::make('created_by')
->label('Created By')
->default(Filament::auth()->user()?->name),
Forms\Components\Hidden::make('updated_by')
->label('Updated By'),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('No.')
->label('No.')
->getStateUsing(function ($record, $livewire, $column, $rowLoop) {
$paginator = $livewire->getTableRecords();
$perPage = method_exists($paginator, 'perPage') ? $paginator->perPage() : 10;
$currentPage = method_exists($paginator, 'currentPage') ? $paginator->currentPage() : 1;
return ($currentPage - 1) * $perPage + $rowLoop->iteration;
}),
Tables\Columns\TextColumn::make('plant.name')
->label('Plant')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('item.code')
->label('Item Code')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('line.name')
->label('Line')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('characteristics_type')
->label('Characteristics Type')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('workGroupMaster.name')
->label('Group Work Center')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('machine.work_center')
->label('Work Center')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('machine.work_center')
->label('Work Center')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('inspection_type')
->label('Inspection Type')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('upper')
->label('Upper')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('lower')
->label('Lower')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('middle')
->label('Middle')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('created_at')
->label('Created At')
->alignCenter()
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('created_by')
->label('Created By')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('updated_at')
->label('Updated At')
->alignCenter()
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('updated_by')
->label('Updated By')
->alignCenter()
->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(),
]),
])
->headerActions([
ImportAction::make()
->label('Import Product Characteristics Masters')
->color('warning')
->importer(ProductCharacteristicsMasterImporter::class)
->visible(function() {
return Filament::auth()->user()->can('view import product characteristics master');
}),
ExportAction::make()
->label('Export Product Characteristics Masters')
->color('warning')
->exporter(ProductCharacteristicsMasterExporter::class)
->visible(function() {
return Filament::auth()->user()->can('view export product characteristics master');
}),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListProductCharacteristicsMasters::route('/'),
'create' => Pages\CreateProductCharacteristicsMaster::route('/create'),
'view' => Pages\ViewProductCharacteristicsMaster::route('/{record}'),
'edit' => Pages\EditProductCharacteristicsMaster::route('/{record}/edit'),
];
}
public static function getNavigationLabel(): string
{
return 'Characteristics';
}
public static function getEloquentQuery(): Builder
{
return parent::getEloquentQuery()
->withoutGlobalScopes([
SoftDeletingScope::class,
]);
}
}

View File

@@ -0,0 +1,23 @@
<?php
namespace App\Filament\Resources\ProductCharacteristicsMasterResource\Pages;
use App\Filament\Resources\ProductCharacteristicsMasterResource;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
class CreateProductCharacteristicsMaster extends CreateRecord
{
protected static string $resource = ProductCharacteristicsMasterResource::class;
public function getTitle(): string
{
return 'Create Characteristics'; // This will replace the "New product characteristics master"
}
// public function getHeading(): string
// {
// return 'Characteristics';
// }
}

View File

@@ -0,0 +1,49 @@
<?php
namespace App\Filament\Resources\ProductCharacteristicsMasterResource\Pages;
use App\Filament\Resources\ProductCharacteristicsMasterResource;
use Filament\Actions;
use Filament\Resources\Pages\EditRecord;
class EditProductCharacteristicsMaster extends EditRecord
{
protected static string $resource = ProductCharacteristicsMasterResource::class;
public function getTitle(): string
{
return 'Edit Characteristics'; // This will replace the "New product characteristics master"
}
public function mount(int|string $record): void
{
parent::mount($record);
$model = $this->getRecord(); // actual model instance
// Step 1: Fill the actual saved fields first
$this->form->fill([
'plant_id' => $model->plant_id,
'line_id' => $model->line_id,
'item_id' => $model->item_id,
'machine_id' => $model->machine_id,
'name' => $model->name,
'type' => $model->type,
'upper' => $model->upper,
'lower' => $model->lower,
'middle' => $model->middle,
'work_group_master_id' => optional($model->machine)->work_group_master_id,
]);
}
protected function getHeaderActions(): array
{
return [
Actions\ViewAction::make(),
Actions\DeleteAction::make(),
Actions\ForceDeleteAction::make(),
Actions\RestoreAction::make(),
];
}
}

View File

@@ -0,0 +1,24 @@
<?php
namespace App\Filament\Resources\ProductCharacteristicsMasterResource\Pages;
use App\Filament\Resources\ProductCharacteristicsMasterResource;
use Filament\Actions;
use Filament\Resources\Pages\ListRecords;
class ListProductCharacteristicsMasters extends ListRecords
{
protected static string $resource = ProductCharacteristicsMasterResource::class;
public function getTitle(): string
{
return 'Characteristics'; // This will replace the "New product characteristics master"
}
protected function getHeaderActions(): array
{
return [
Actions\CreateAction::make(),
];
}
}

View File

@@ -0,0 +1,24 @@
<?php
namespace App\Filament\Resources\ProductCharacteristicsMasterResource\Pages;
use App\Filament\Resources\ProductCharacteristicsMasterResource;
use Filament\Actions;
use Filament\Resources\Pages\ViewRecord;
class ViewProductCharacteristicsMaster extends ViewRecord
{
protected static string $resource = ProductCharacteristicsMasterResource::class;
public function getTitle(): string
{
return 'View Characteristics';
}
protected function getHeaderActions(): array
{
return [
Actions\EditAction::make(),
];
}
}

View File

@@ -6,6 +6,7 @@ use App\Filament\Exports\QualityValidationExporter;
use App\Filament\Imports\QualityValidationImporter;
use App\Filament\Resources\QualityValidationResource\Pages;
use App\Filament\Resources\QualityValidationResource\RelationManagers;
// use App\Jobs\SendInvalidQualityMailJob;
use App\Mail\InvalidQualityMail;
use App\Models\AlertMailRule;
use App\Models\Item;
@@ -13,6 +14,8 @@ use App\Models\Line;
use App\Models\Plant;
use App\Models\QualityValidation;
use App\Models\StickerMaster;
// use App\Models\User;
// use App\Notifications\StatusUpdated;
use Carbon\Carbon;
use Closure;
use Filament\Facades\Filament;
@@ -45,6 +48,7 @@ class QualityValidationResource extends Resource
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
protected static ?string $navigationGroup = 'Display';
public $isSubmitted = false;
public $data = [];
@@ -654,7 +658,6 @@ class QualityValidationResource extends Resource
->label('Select Validation')
->reactive()
->options(fn (callable $get) => $get('part_validation_type_options') ?? [])
->required()
->afterStateUpdated(function ($state, callable $set) {
// when user selects something new, hide the image
$set('show_validation_image', false);
@@ -707,7 +710,6 @@ class QualityValidationResource extends Resource
$fileName = "{$value}.png";
$imageUrl = route('part.validation.image', [
'plant' => $plantCode1,
'filename' => $fileName
]);
@@ -1732,6 +1734,17 @@ class QualityValidationResource extends Resource
$set('tube_sticker_motor_error', null);
// $mPorder = $get('production_order');
// $mPlantId = $get('plant_id');
//$plant = Plant::find($mPlantId);
// $plantCodePart4 = $plant?->code;
// $mlineId = $get('line_id');
// $mLine = Line::find($mlineId);
// $mLinePart = $mLine?->name;
if (empty($state)) {
$set('tube_sticker_motor_error', null);
return;
@@ -1833,6 +1846,24 @@ class QualityValidationResource extends Resource
if (!$isMatch)
{
$set('tube_sticker_motor_error', 'Serial number does not match.');
// $mailData = \App\Filament\Resources\QualityValidationResource::getMailData($mPlantId);
// $mPlantName = $mailData['plant_name'];
// $emails = $mailData['emails'];
// $mUserName = Filament::auth()->user()->name;
// if (!empty($emails))
// {
// //Mail::to($emails)->send(new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType));
// Mail::to($emails)->send(
// new InvalidQualityMail($state, $mPorder, $mPlantName,$mLinePart, $mUserName, 'InvalidTubeStickerMotor')
// );
// }
// else
// {
// \Log::warning("No recipients found for plant {$mPlantName}, module Serial, rule invalid_serial.");
// }
$set('tube_sticker_motor_qr', null);
return;
}
@@ -1857,10 +1888,32 @@ class QualityValidationResource extends Resource
->default('')
->required()
->reactive()
->afterStateUpdated(function (callable $set, callable $get, ?string $state) {
->afterStateUpdated(function (callable $set, callable $get, ?string $state, $livewire) {
$set('tube_sticker_pump_error', null);
// $mPorder = $get('production_order');
// $mPlantId = $get('plant_id');
// $plant = Plant::find($mPlantId);
// $mPlantName = $plant?->name;
// $mlineId = $get('line_id');
// $mLine = Line::find($mlineId);
// $mLinePart = $mLine?->name;
// $mPorder = $get('production_order');
// $mPlantId = $get('plant_id');
// $mlineId = $get('line_id');
// $mUserName = Filament::auth()->user()?->name ?? 'Unknown';
// $mailData = \App\Filament\Resources\QualityValidationResource::getMailData($mPlantId);
// $mPlantName = $mailData['plant_name'];
// $emails = $mailData['emails'];
//$mUserName = Filament::auth()->user()->name;
if (empty($state)) {
$set('tube_sticker_pump_error', null);
return;
@@ -1942,14 +1995,14 @@ class QualityValidationResource extends Resource
// ]);
$visibleSerialNumber = $get('serial_number');
$expectedItemCode = trim((string) $get('item_id'));
$expectedItemCode = trim((string) $get('item_id'));
if ($itemCode != $expectedItemCode) {
$set('tube_sticker_pump_error', 'Item code does not match.');
return;
}
if ($itemCode != $expectedItemCode) {
$set('tube_sticker_pump_error', 'Item code does not match.');
return;
}
$set('tube_sticker_pump_error', $serialNumber);
$set('tube_sticker_pump_error', $serialNumber);
// $isMatch = in_array($serialNumber, $visibleSerialNumbers, true);
$isMatch = ($visibleSerialNumber == $serialNumber);
@@ -1963,6 +2016,62 @@ class QualityValidationResource extends Resource
{
$set('tube_sticker_pump_error', 'Serial number does not match.');
$set('tube_sticker_pump_qr', null);
// $user = User::where('name', $mUserName)->first();
// if ($user) {
// $user->notify(new StatusUpdated($state));
// }
// $currentUser = Filament::auth()->user();
// if ($currentUser) {
// $currentUser->notify(new StatusUpdated($state)); // standard Laravel DB notification
// // refresh Filament bell
// $livewire->dispatch('refreshFilamentNotifications');
// }
// Notification::make()
// ->title('Status Updated')
// ->body("Serial number scanned: $state")
// ->danger()
// ->sendToDatabase($currentUser);
//$user->notify(new StatusUpdated($state));
//Notification::send($user, new StatusUpdated($state));
//dd($user);
// $user->notify(new StatusUpdated($state));
// Inside a Filament page or resource
//$this->notify('success', "Serial number scanned: $state");
// dispatch(new SendInvalidQualityMailJob(
// $state, $mPorder, $mPlantId, $mlineId, $mUserName, 'InvalidTubeStickerPump'
// ))->afterResponse();
// $mailData = \App\Filament\Resources\QualityValidationResource::getMailData($mPlantId);
// $mPlantName = $mailData['plant_name'];
// $emails = $mailData['emails'];
// $mUserName = Filament::auth()->user()->name;
// if (!empty($emails))
// {
// //Mail::to($emails)->send(new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType));
// Mail::to($emails)->queue(
// new InvalidQualityMail($state, $mPorder, $mPlantName,$mLinePart, $mUserName, 'InvalidTubeStickerPumpset')
// );
// }
// else
// {
// \Log::warning("No recipients found for plant {$mPlantName}, module Serial, rule invalid_serial.");
// }
return;
}
else {
@@ -1990,6 +2099,17 @@ class QualityValidationResource extends Resource
$set('tube_sticker_pumpset_error', null);
$mPorder = $get('production_order');
$mPlantId = $get('plant_id');
//$plant = Plant::find($mPlantId);
// $plantCodePart4 = $plant?->code;
$mlineId = $get('line_id');
$mLine = Line::find($mlineId);
$mLinePart = $mLine?->name;
if (empty($state)) {
$set('tube_sticker_pumpset_error', null);
return;
@@ -2093,6 +2213,23 @@ class QualityValidationResource extends Resource
if (!$isMatch)
{
$set('tube_sticker_pumpset_error', 'Serial number does not match.');
// $mailData = \App\Filament\Resources\QualityValidationResource::getMailData($mPlantId);
// $mPlantName = $mailData['plant_name'];
// $emails = $mailData['emails'];
// $mUserName = Filament::auth()->user()->name;
// if (!empty($emails))
// {
// //Mail::to($emails)->send(new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType));
// Mail::to($emails)->send(
// new InvalidQualityMail($state, $mPorder, $mPlantName,$mLinePart, $mUserName, 'InvalidTubeStickerPumpset')
// );
// }
// else
// {
// \Log::warning("No recipients found for plant {$mPlantName}, module Serial, rule invalid_serial.");
// }
$set('tube_sticker_pumpset_qr', null);
return;
}
@@ -2250,9 +2387,15 @@ class QualityValidationResource extends Resource
$mPlantId = $get('plant_id');
$mlineId = $get('line_id');
$plant = Plant::find($mPlantId);
$plantCodePart1 = $plant?->code;
$mLine = Line::find($mlineId);
$mLinePart = $mLine?->name;
$stickerMasterId = $get('sticker_master_id');
if (!$stickerMasterId) {
return;
@@ -2284,12 +2427,13 @@ class QualityValidationResource extends Resource
$mPlantName = $mailData['plant_name'];
$emails = $mailData['emails'];
$mUserName = Filament::auth()->user()->name;
if (!empty($emails))
{
//Mail::to($emails)->send(new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType));
Mail::to($emails)->send(
new InvalidQualityMail($state, $mPorder, $mPlantName, 'InvalidPartNumber')
new InvalidQualityMail($state, $mPorder, $mPlantName, $mLinePart, $mUserName, 'InvalidPartNumber')
);
}
else
@@ -2299,7 +2443,7 @@ class QualityValidationResource extends Resource
$set('part_validation1', null);
$fileName = $expectedValue . ".png"; // or .jpg based on your file
$fullPath = storage_path("app/private/uploads/PartValidation/{$plantCodePart1}/{$fileName}");
$fullPath = storage_path("app/private/uploads/PartValidation/{$fileName}");
// dd($fullPath);
@@ -2310,7 +2454,7 @@ class QualityValidationResource extends Resource
// ]);
if (file_exists($fullPath)) {
$imageUrl = route('part.validation.image', [
'plant' => $plantCodePart1,
// 'plant' => $plantCodePart1,
'filename' => $fileName
]);
} else {
@@ -2348,6 +2492,11 @@ class QualityValidationResource extends Resource
$plant = Plant::find($mPlantId);
$plantCodePart2 = $plant?->code;
$mlineId = $get('line_id');
$mLine = Line::find($mlineId);
$mLinePart = $mLine?->name;
$stickerMasterId = $get('sticker_master_id');
if (!$stickerMasterId) {
return;
@@ -2376,12 +2525,13 @@ class QualityValidationResource extends Resource
$mPlantName = $mailData['plant_name'];
$emails = $mailData['emails'];
$mUserName = Filament::auth()->user()->name;
if (!empty($emails))
{
//Mail::to($emails)->send(new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType));
Mail::to($emails)->send(
new InvalidQualityMail($state, $mPorder, $mPlantName, 'InvalidPartNumber2')
new InvalidQualityMail($state, $mPorder, $mPlantName,$mLinePart, $mUserName, 'InvalidPartNumber2')
);
}
else
@@ -2441,6 +2591,12 @@ class QualityValidationResource extends Resource
$plant = Plant::find($mPlantId);
$plantCodePart3 = $plant?->code;
$mlineId = $get('line_id');
$mLine = Line::find($mlineId);
$mLinePart = $mLine?->name;
if (!$stickerMasterId) {
return;
}
@@ -2469,12 +2625,13 @@ class QualityValidationResource extends Resource
$mPlantName = $mailData['plant_name'];
$emails = $mailData['emails'];
$mUserName = Filament::auth()->user()->name;
if (!empty($emails))
{
//Mail::to($emails)->send(new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType));
Mail::to($emails)->send(
new InvalidQualityMail($state, $mPorder, $mPlantName, 'InvalidPartNumber3')
new InvalidQualityMail($state, $mPorder, $mPlantName,$mLinePart, $mUserName, 'InvalidPartNumber3')
);
}
else
@@ -2532,6 +2689,11 @@ class QualityValidationResource extends Resource
$plant = Plant::find($mPlantId);
$plantCodePart4 = $plant?->code;
$mlineId = $get('line_id');
$mLine = Line::find($mlineId);
$mLinePart = $mLine?->name;
if (!$stickerMasterId) {
return;
}
@@ -2560,12 +2722,13 @@ class QualityValidationResource extends Resource
$mPlantName = $mailData['plant_name'];
$emails = $mailData['emails'];
$mUserName = Filament::auth()->user()->name;
if (!empty($emails))
{
//Mail::to($emails)->send(new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType));
Mail::to($emails)->send(
new InvalidQualityMail($state, $mPorder, $mPlantName, 'InvalidPartNumber4')
new InvalidQualityMail($state, $mPorder, $mPlantName,$mLinePart, $mUserName, 'InvalidPartNumber4')
);
}
else
@@ -2582,7 +2745,7 @@ class QualityValidationResource extends Resource
'filename' => $fileName
]);
$set('part_validation2_error_image', $imageUrl);
$set('part_validation4_error_image', $imageUrl);
return;
}
@@ -2679,22 +2842,22 @@ class QualityValidationResource extends Resource
else
{
$set('part_validation5_error', "Invalid input for part validation 5.");
$mailData = \App\Filament\Resources\QualityValidationResource::getMailData($mPlantId);
// $mailData = \App\Filament\Resources\QualityValidationResource::getMailData($mPlantId);
$mPlantName = $mailData['plant_name'];
$emails = $mailData['emails'];
// $mPlantName = $mailData['plant_name'];
// $emails = $mailData['emails'];
if (!empty($emails))
{
//Mail::to($emails)->send(new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType));
Mail::to($emails)->send(
new InvalidQualityMail($state, $mPorder, $mPlantName, 'InvalidPartNumber5')
);
}
else
{
\Log::warning("No recipients found for plant {$mPlantName}, module Serial, rule invalid_serial.");
}
// if (!empty($emails))
// {
// //Mail::to($emails)->send(new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType));
// Mail::to($emails)->send(
// new InvalidQualityMail($state, $mPorder, $mPlantName, 'InvalidPartNumber5')
// );
// }
// else
// {
// \Log::warning("No recipients found for plant {$mPlantName}, module Serial, rule invalid_serial.");
// }
$set('part_validation5', null);
return;
}
@@ -2715,6 +2878,21 @@ class QualityValidationResource extends Resource
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)
@@ -2731,34 +2909,6 @@ class QualityValidationResource extends Resource
];
}
// public function getMail(){
// //$plantId = $this->form->getState()['plant_id'];
// $plantId = $this->data['plant_id'] ?? null;
// //$this->plantId = $plantId;
// dd($plantId);
// $mInvoiceType = 'Serial';
// $mPlantName = Plant::where('id', $plantId)->value('name');
// $emails = AlertMailRule::where('plant', $plantId)
// //->where('plant', $plantName)
// ->where('module', 'InvoiceValidation')
// ->where('rule_name', 'InvoiceMail')
// ->where(function ($query) {
// $query->whereNull('schedule_type')
// ->orWhere('schedule_type', '');
// })
// ->pluck('email')
// ->toArray();
// return [
// 'plant_id' => $plantId,
// 'plant_name' => $mPlantName,
// 'invoice_type' => $mInvoiceType,
// 'emails' => $emails,
// ];
// }
public static function table(Table $table): Table
{
return $table

View File

@@ -601,7 +601,7 @@ class StickerMasterResource extends Resource
->options(function (callable $get) {
$userHas = Filament::auth()->user()->plant_id;
return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::pluck('name', 'id')->toArray();
return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->orderBy('code')->pluck('name', 'id')->toArray() : Plant::orderBy('code')->pluck('name', 'id')->toArray();
})
->reactive()
->afterStateUpdated(function ($state, callable $set, callable $get): void {
@@ -620,9 +620,7 @@ class StickerMasterResource extends Resource
->options(function (callable $get) {
$plantId = $get('Plant');
return $plantId
? Item::where('plant_id', $plantId)->pluck('code', 'id')
: Item::pluck('code', 'id');
return $plantId ? Item::where('plant_id', $plantId)->pluck('code', 'id') : [];
})
->searchable()
->reactive(),
@@ -846,50 +844,56 @@ class StickerMasterResource extends Resource
$plantCode = $plant->code;
$sticker = StickerMaster::where('plant_id', $plantId)
->where('item_id', $itemId)
->first();
// $sticker = StickerMaster::where('plant_id', $plantId)
// ->where('item_id', $itemId)
// ->first();
if (! $sticker) {
Notification::make()
->title('Unknown Sticker Master')
->body('Sticker Master data not found.')
->danger()
->seconds(2)
->send();
}
// if (! $sticker) {
// Notification::make()
// ->title('Unknown Sticker Master')
// ->body('Sticker Master data not found.')
// ->danger()
// ->seconds(2)
// ->send();
// }
$value = $sticker->{$column};
// $value = $sticker->{$column};
if (empty($value)) {
Notification::make()
->title('Unknown Part validation')
->body("Selected validation '$column' has no value.")
->danger()
->seconds(2)
->send();
}
// if (empty($value)) {
// Notification::make()
// ->title('Unknown Part validation')
// ->body("Selected validation '$column' has no value.")
// ->danger()
// ->seconds(2)
// ->send();
// }
$newFileName = $value.'.png';
// $newFileName = $value.'.png';
$directory = "uploads/PartValidation/{$plantCode}";
$originalName = $uploadedFile->getClientOriginalName();
$directory = 'uploads/PartValidation';
$disk = Storage::disk('local');
if (! $disk->exists($directory)) {
$disk->makeDirectory($directory, 0755, true);
}
// $fullPath = Storage::disk('local')->path($directory);
// $directory = "uploads/PartValidation/{$plantCode}";
// $disk = Storage::disk('local');
// if (! $disk->exists($directory)) {
// $disk->makeDirectory($directory, 0755, true);
// }
// $path = $uploadedFile->storeAs(
// $directory,
// $newFileName,
// 'local'
// );
try {
$path = $uploadedFile->storeAs(
$directory,
$newFileName,
'local'
);
$path = $disk->putFileAs($directory, $uploadedFile, $originalName);
} catch (\Exception $e) {
Notification::make()
->title('Upload Failed')

View File

@@ -0,0 +1,200 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Resources\StickerPrintingResource\Pages;
use App\Models\Plant;
use App\Models\StickerPrinting;
use Filament\Facades\Filament;
use Filament\Forms;
use Filament\Forms\Components\Section;
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\Tables\Actions\ExportAction;
use Filament\Tables\Actions\ImportAction;
use App\Filament\Exports\StickerPrintingExporter;
use App\Filament\Imports\StickerPrintingImporter;
use Filament\Forms\Components\Actions\Action;
class StickerPrintingResource extends Resource
{
protected static ?string $model = StickerPrinting::class;
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
protected static ?string $navigationGroup = 'Sticker Reprint';
public static function form(Form $form): Form
{
return $form
->schema([
Section::make('')
->schema([
Forms\Components\Select::make('plant_id')
->label('Plant')
->reactive()
->relationship('plant', 'name')
->options(function (callable $get) {
$userHas = Filament::auth()->user()->plant_id;
return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::pluck('name', 'id')->toArray();
})
->required()
->afterStateUpdated(function ($state, callable $set, callable $get) {
$plantId = $get('plant_id');
if (!$plantId) {
$set('reference_number', null);
$set('serial_number', null);
$set('ivPlantError', 'Please select a plant first.');
} else {
$set('ivPlantError', null);
$set('reference_number', null);
$set('serial_number', null);
}
})
->extraAttributes(fn ($get) => [
'class' => $get('ivPlantError') ? 'border-red-500' : '',
])
->hint(fn ($get) => $get('ivPlantError') ? $get('ivPlantError') : null)
->hintColor('danger'),
Forms\Components\TextInput::make('reference_number')
->label('Reference Number')
->reactive()
->readOnly(fn (callable $get) => !empty($get('serial_number')))
->extraAttributes([
'id' => 'invoice_number_input',
'x-data' => '{ value: "" }',
'x-model' => 'value',
'wire:keydown.enter.prevent' => 'processRef(value)',
])
->required(),
Forms\Components\TextInput::make('serial_number')
->label('Serial Number')
->reactive()
// ->required()
->readOnly(fn (callable $get) => empty($get('reference_number')))
->extraAttributes([
'id' => 'serial_number_input',
'x-data' => '{ value: "" }',
'x-model' => 'value',
'wire:keydown.enter.prevent' => 'processSno(value)',
//'x-on:keydown.enter.prevent' => '$wire.processInvoice(value)',
]),
//->required(),
Forms\Components\View::make('forms.components.print-button'),
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(4),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('No.')
->label('No.')
->getStateUsing(function ($record, $livewire, $column, $rowLoop) {
$paginator = $livewire->getTableRecords();
$perPage = method_exists($paginator, 'perPage') ? $paginator->perPage() : 10;
$currentPage = method_exists($paginator, 'currentPage') ? $paginator->currentPage() : 1;
return ($currentPage - 1) * $perPage + $rowLoop->iteration;
}),
Tables\Columns\TextColumn::make('plant.name')
->label('Plant')
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('reference_number')
->label('Reference Number')
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('serial_number')
->label('Serial Number')
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('created_by')
->label('Created By')
->searchable()
->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(),
]),
])
->headerActions([
ImportAction::make()
->importer(StickerPrintingImporter::class)
->label('Import Sticker Printing')
->color('warning')
->visible(function () {
return Filament::auth()->user()->can('view import sticker printing');
}),
ExportAction::make()
->exporter(StickerPrintingExporter::class)
->label('Export Sticker Printing')
->color('warning')
->visible(function () {
return Filament::auth()->user()->can('view export sticker printing');
}),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListStickerPrintings::route('/'),
'create' => Pages\CreateStickerPrinting::route('/create'),
'view' => Pages\ViewStickerPrinting::route('/{record}'),
'edit' => Pages\EditStickerPrinting::route('/{record}/edit'),
];
}
public static function getEloquentQuery(): Builder
{
return parent::getEloquentQuery()
->withoutGlobalScopes([
SoftDeletingScope::class,
]);
}
}

View File

@@ -0,0 +1,244 @@
<?php
namespace App\Filament\Resources\StickerPrintingResource\Pages;
use App\Filament\Resources\StickerPrintingResource;
use Filament\Resources\Pages\CreateRecord;
use PDF;
use SimpleSoftwareIO\QrCode\Facades\QrCode;
use Filament\Facades\Filament;
use App\Models\StickerPrinting;
use Filament\Notifications\Notification;
use Str;
class CreateStickerPrinting extends CreateRecord
{
protected static string $resource = StickerPrintingResource::class;
protected static string $view = 'filament.resources.sticker-printing-resource.pages.create-sticker-printing';
public $plantId;
public $ref_number;
public $ref;
public $serial_number;
public function getFormActions(): array
{
return [
$this->getCancelFormAction(),
];
}
protected function getRedirectUrl(): string
{
return $this->getResource()::getUrl('create');
}
public function loadRecords()
{
$this->records = StickerPrinting::where('reference_number', $this->refNumber)
->where('plant_id', $this->plantId)
->latest()
->get();
}
public function processRef($value)
{
//$this->ref_number = $value;
$ref = $this->form->getState()['reference_number'] ?? null;
$user = Filament::auth()->user();
$operatorName = $user->name;
$plantId = $this->form->getState()['plant_id'];
$this->plantId = $plantId;
$this->dispatch('refreshEmptySticker', $plantId, $ref);
$this->dispatch('focus-serial-number');
}
public function processSno($value)
{
$this->serial_number = $value;
$plant = $this->form->getState()['plant_id'] ?? null;
$ref = $this->form->getState()['reference_number'] ?? null;
$sNumber = $this->form->getState()['serial_number'] ?? null;
$pattern1 = '/^(?<item_code>[^|]+)\|(?<serial_number>[^|]+)\|?$/i';
$pattern2 = '/^(?<item_code>[^|]+)\|(?<serial_number>[^|]+)\|(?<batch_number>.+)$/i';
$pattern3 = '/^(?<serial_number>[^|]+)$/i';
if (preg_match($pattern1, $sNumber, $matches) || preg_match($pattern2, $sNumber, $matches) || preg_match($pattern3, $sNumber, $matches)) {
$serial = $matches['serial_number'];
if (Str::length($serial) < 9) {
Notification::make()
->title('Invalid Serial Number')
->body("Serial number should conatin minimum 9 digits '$serial'.")
->warning()
->send();
$this->form->fill([
'plant_id' => $plant,
'reference_number' => $ref,
'serial_number' => '',
]);
return;
}
else if(!ctype_alnum($serial)) {
Notification::make()
->title('Invalid Serial Number')
->body("Serial number should be alphanumeric '$serial'.")
->warning()
->send();
$this->form->fill([
'plant_id' => $plant,
'reference_number' => $ref,
'serial_number' => '',
]);
return;
}
$extractedSerialNumber = $matches['serial_number'];
$sNumber = $extractedSerialNumber;
}
else
{
Notification::make()
->title('Invalid Format')
->body("Serial number must be in the format 'itemcode|serialnumber' or 'itemcode|serialnumber|batchnumber'. or just 'serialnumber'.")
->warning()
->send();
// Reset only serial number field
$this->form->fill([
'plant_id' => $plant,
'reference_number' => $ref,
'serial_number' => '',
]);
return;
}
if ($plant == null || trim($plant) == '' || $ref == null || trim($ref) == '' || $sNumber == null || trim($sNumber) == '')
{
Notification::make()
->title('Unknown: Incomplete Data!')
->body("Please ensure Plant, Reference Number, and Serial Number are provided.")
->danger()
->seconds(3)
->send();
return;
}
$exists = StickerPrinting::where('plant_id', $plant)
->where('serial_number', $sNumber)
->first();
if ($exists) {
Notification::make()
->title('Duplicate Serial Number!')
->body("Serial Number {$sNumber} already exists for this plant.")
->danger()
->seconds(3)
->send();
// Reset only serial number field
$this->form->fill([
'plant_id' => $plant,
'reference_number' => $ref,
'serial_number' => '',
]);
return;
}
StickerPrinting::create([
'plant_id' => $plant,
'reference_number' => $ref,
'serial_number' => $sNumber,
'created_by' => Filament::auth()->user()->name,
]);
$this->dispatch('addStickerToList', $plant, $ref, $sNumber);
$this->form->fill([
'plant_id' => $plant,
'reference_number' => $ref,
'serial_number' => '',
]);
}
public function printSticker() {
$plantId = $this->form->getState()['plant_id'];
$plantId = trim($plantId) ?? null;
$refNumber = trim($this->form->getState()['reference_number'])?? null;
$refNumber = trim($refNumber) ?? null;
$serialNumber = trim($this->form->getState()['serial_number'])?? null;
$serialNumber = trim($serialNumber) ?? null;
// dd($plantId, $refNumber, $serialNumber);
$serialNumbers = StickerPrinting::where('plant_id', $plantId)
->where('reference_number', $refNumber)
->pluck('serial_number')
->toArray();
if (empty($serialNumbers))
{
Notification::make()
->title('No Serial Numbers found!')
->body('Please check the selected Plant & Reference Number.')
->danger()
->send();
return;
}
// Encode as JSON string in QR Code
// $qrData = json_encode([
// 'serial_numbers' => $serialNumbers,
// ]);
//$qrData = implode(',', $serialNumbers);
$qrData = implode("\n", $serialNumbers);
$qrCode = base64_encode(
QrCode::format('png')
->size(1200) // smaller, still high res
->margin(6) // white border
->errorCorrection('Q')// medium-high correction
->generate($qrData)
);
// Send data to Pdf view
$pdf = PDF::loadView('pdf.qrcode', [
'qrCode' => $qrCode,
'referenceNumber' => $refNumber,
]);
return response()->streamDownload(function () use ($pdf) {
echo $pdf->output();
}, "qr-sticker.pdf");
}
}

View File

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

View File

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

View File

@@ -5,21 +5,19 @@ namespace App\Filament\Resources;
use App\Filament\Exports\WorkGroupMasterExporter;
use App\Filament\Imports\WorkGroupMasterImporter;
use App\Filament\Resources\WorkGroupMasterResource\Pages;
use App\Filament\Resources\WorkGroupMasterResource\RelationManagers;
use App\Models\Line;
use App\Models\Plant;
use App\Models\WorkGroupMaster;
use Filament\Facades\Filament;
use Filament\Forms;
use Filament\Forms\Components\Section;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Actions\ExportAction;
use Filament\Tables\Actions\ImportAction;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Forms\Components\Section;
use Filament\Facades\Filament;
use Filament\Tables\Actions\ImportAction;
use Filament\Tables\Actions\ExportAction;
use Illuminate\Validation\Rule;
class WorkGroupMasterResource extends Resource
@@ -37,68 +35,70 @@ class WorkGroupMasterResource extends Resource
return $form
->schema([
Section::make('')
->schema([
Forms\Components\Select::make('plant_id')
->label('Plant')
->relationship('plant', 'name')
->reactive()
->columnSpan(1)
->required()
->options(function (callable $get) {
$userHas = Filament::auth()->user()->plant_id;
return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::pluck('name', 'id')->toArray();
})
->afterStateUpdated(function ($state, $set, callable $get) {
$plantId = $get('plant_id');
->schema([
Forms\Components\Select::make('plant_id')
->label('Plant')
->relationship('plant', 'name')
->reactive()
->columnSpan(1)
->required()
->options(function (callable $get) {
$userHas = Filament::auth()->user()->plant_id;
if (!$plantId) {
$set('pqPlantError', 'Please select a plant first.');
$set('name', null);
$set('description', null);
$set('operation_number', null);
return;
}
return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::pluck('name', 'id')->toArray();
})
->afterStateUpdated(function ($state, $set, callable $get) {
$plantId = $get('plant_id');
$set('validationError', null);
$set('pqPlantError', null);
$set('name', null);
$set('description', null);
$set('operation_number', null);
})
->hint(fn ($get) => $get('pqPlantError') ? $get('pqPlantError') : null)
->hintColor('danger'),
Forms\Components\TextInput::make('name')
->label('Name')
->required()
->minLength(6)
->columnSpan(1)
->reactive()
->rule(function (callable $get) {
return Rule::unique('work_group_masters', 'name')
->where('plant_id', $get('plant_id'))
->ignore($get('id'));
}),
Forms\Components\TextInput::make('operation_number')
->label('Operation Number')
->numeric()
->columnSpan(1)
->reactive()
->required()
->rule(function (callable $get) {
return Rule::unique('work_group_masters', 'operation_number')
->where('plant_id', $get('plant_id'))
->ignore($get('id'));
}),
Forms\Components\TextInput::make('description')
->label('Description')
->required()
->minLength(5)
->reactive()
->columnSpan(['default' => 1, 'sm' => 3]),
Forms\Components\Hidden::make('created_by')
->default(Filament::auth()->user()?->name),
])
->columns(['default' => 1, 'sm' => 3]),
if (! $plantId) {
$set('pqPlantError', 'Please select a plant first.');
$set('name', null);
$set('description', null);
$set('operation_number', null);
return;
}
$set('validationError', null);
$set('pqPlantError', null);
$set('name', null);
$set('description', null);
$set('operation_number', null);
})
->hint(fn ($get) => $get('pqPlantError') ? $get('pqPlantError') : null)
->hintColor('danger'),
Forms\Components\TextInput::make('name')
->label('Name')
->required()
->minLength(6)
->columnSpan(1)
->reactive()
->rule(function (callable $get) {
return Rule::unique('work_group_masters', 'name')
->where('plant_id', $get('plant_id'))
->ignore($get('id'));
}),
Forms\Components\TextInput::make('operation_number')
->label('Operation Number')
->numeric()
->columnSpan(1)
->reactive()
->required(),
// ->rule(function (callable $get) {
// return Rule::unique('work_group_masters', 'operation_number')
// ->where('plant_id', $get('plant_id'))
// ->ignore($get('id'));
// }),
Forms\Components\TextInput::make('description')
->label('Description')
->required()
->minLength(5)
->reactive()
->columnSpan(['default' => 1, 'sm' => 3]),
Forms\Components\Hidden::make('created_by')
->default(Filament::auth()->user()?->name),
])
->columns(['default' => 1, 'sm' => 3]),
]);
}
@@ -112,6 +112,7 @@ class WorkGroupMasterResource extends Resource
$paginator = $livewire->getTableRecords();
$perPage = method_exists($paginator, 'perPage') ? $paginator->perPage() : 10;
$currentPage = method_exists($paginator, 'currentPage') ? $paginator->currentPage() : 1;
return ($currentPage - 1) * $perPage + $rowLoop->iteration;
}),
Tables\Columns\TextColumn::make('plant.name')
@@ -177,14 +178,14 @@ class WorkGroupMasterResource extends Resource
->label('Import Work Group Masters')
->color('warning')
->importer(WorkGroupMasterImporter::class)
->visible(function() {
->visible(function () {
return Filament::auth()->user()->can('view import work group master');
}),
ExportAction::make()
->label('Export Work Group Masters')
->color('warning')
->exporter(WorkGroupMasterExporter::class)
->visible(function() {
->visible(function () {
return Filament::auth()->user()->can('view export work group master');
}),
]);

File diff suppressed because it is too large Load Diff

View File

@@ -22,189 +22,27 @@ class ProductionStickerReprintController extends Controller
// public function downloadQrPdf($palletNo)
// {
// $parts = explode('|', $palletNo);
// $itemCode = trim($parts[0]);
// $serial = isset($parts[1]) ? trim($parts[1]) : null;
// // Retrieve the item record by item code
// $item = Item::where('code', $itemCode)->first();
// if (!$item) {
// abort(404, "Item with code {$itemCode} not found.");
// }
// $itemId = $item->id;
// $production = ProductionQuantity::where('item_id', $itemId)
// ->where('serial_number', $serial)
// ->first();
// if (!$production) {
// abort(404, "Production data for item code '{$itemCode}' with serial '{$serial}' not found.");
// }
// $productionOrder = $production->production_order;
// $qrCode = new QrCode($palletNo);
// $output = new Output\Png();
// $qrBinary = $output->output($qrCode, 100);
// $qrBase64 = base64_encode($qrBinary);
// $sticker = StickerMaster::where('item_id', $itemId)->first();
// // Decide number of copies
// $copies = 1;
// if ($sticker) {
// if ($sticker->serial_number_pump == 1) {
// // If pump is selected (regardless of motor), 2 copies
// $copies = 2;
// } elseif ($sticker->serial_number_motor == 1) {
// // Only motor selected, 1 copy
// $copies = 1;
// }
// }
// return '
// <html>
// <head>
// <style>
// body {
// margin: 0;
// padding: 0;
// width: 100mm;
// height: 14mm;
// font-size: 10pt;
// font-family: Arial Narrow, Arial, sans-serif;
// }
// .sticker-table {
// width: 100mm;
// height: 14mm;
// }
// .text-cell {
// margin: 0;
// padding: 0;
// text-align: left;
// font-size: 14pt;
// font-weight: normal;
// line-height: 1.2;
// }
// .text-row {
// font-weight: bold;
// font-size: 9pt;
// }
// .serial {
// text-align: left;
// }
// .po-number {
// text-align: right;
// white-space: nowrap;
// }
// .desc-row {
// font-weight: normal;
// font-size: 8pt;
// }
// .qr-cell {
// width: 14mm;
// text-align: left;
// padding-left: 0mm;
// padding-top: 0mm;
// }
// img.qr {
// width: 20mm;
// height: 20mm;
// }
// </style>
// </head>
// <body>
// <div id="print-container"></div>
// <script>
// const copies = ' . $copies . ';
// const htmlBlock = `
// <table class="sticker-table">
// <tr>
// <td class="qr-cell">
// <img class="qr" src="data:image/png;base64,' . $qrBase64 . '" alt="QR" />
// </td>
// <td class="text-cell">
// <div class="text-row">
// <pre><span class="serial">' . htmlspecialchars($serial) . '</span> <span class="po-number">' . htmlspecialchars($productionOrder) . '</span></pre>
// </div>
// <div class="desc-row">
// ' . htmlspecialchars($item->description) . '
// </div>
// </td>
// </tr>
// </table>
// `;
// const container = document.getElementById("print-container");
// for (let i = 0; i < copies; i++) {
// container.insertAdjacentHTML("beforeend", htmlBlock);
// }
// window.onload = function () {
// window.print();
// setTimeout(function () {
// window.close();
// }, 500);
// };
// </script>
// </body>
// </html>
// ';
// //Get sticker master data
// // $sticker = StickerMaster::where('item_id', $itemId)->first();
// // //Decide number of copies
// // $copies = 1; // default
// // if ($sticker) {
// // if ($sticker->serial_number_motor == 1) {
// // $copies = 1;
// // } elseif (is_null($sticker->serial_number_motor) && $sticker->serial_number_pump == 1) {
// // $copies = 2;
// // }
// // }
// // $mpdf = new Mpdf([
// // 'mode' => 'utf-8',
// // 'format' => [60, 14],
// // 'margin_left' => 0,
// // 'margin_right' => 0,
// // 'margin_top' => 0,
// // 'margin_bottom' => 0,
// // ]);
// // for ($i = 0; $i < $copies; $i++) {
// // $mpdf->WriteHTML($html);
// // if ($i < $copies - 1) {
// // $mpdf->AddPage();
// // }
// // }
// // $mpdf->Output('qr-label.pdf', 'I');
// // exit;
// }
/**
* Store a newly created resource in storage.
*/
public function downloadQrPdf($palletNo)
public function downloadQrPdf(Request $request)
{
// $palletNo = urldecode($palletNo);
$palletNo = urldecode($request->query('palletNo'));
if (!$palletNo) {
abort(400, 'palletNo is required');
}
$parts = explode('|', $palletNo);
$itemCode = trim($parts[0]);
$serial = isset($parts[1]) ? trim($parts[1]) : null;
$serialNumberRaw = isset($parts[1]) ? trim($parts[1]) : null;
// dd($serialNumberRaw);
if ($serialNumberRaw != null) {
$serial = preg_replace('/\/.*/', '', $serialNumberRaw);
$serial = trim($serial);
} else {
$serial = null;
}
$item = Item::where('code', $itemCode)->first();
$itemId= $item->id;
@@ -223,14 +61,42 @@ class ProductionStickerReprintController extends Controller
$productionOrder = $production->production_order ?? '';
if ($item->category == 'Submersible Motor')
if(!preg_match('/\//', $palletNo)){
if ($item->category == 'Submersible Motor')
{
$copies = 1;
}
elseif ($item->category == 'Submersible Pump')
{
$copies = 2;
}
}
else
{
// if ($item->category == 'Submersible Motor')
// {
// $copies = 1;
// }
// elseif ($item->category == 'Submersible Pump')
// {
// $copies = 1;
// }
$copies = 1;
if ($serialNumberRaw) {
// Check if serial ends with /m or /M, optionally followed by |
if (preg_match('/\/[mM](\|)?$/', $serialNumberRaw)) {
$copies = 1;
}
// Check if serial ends with /p or /P, optionally followed by |
elseif (preg_match('/\/[pP](\|)?$/', $serialNumberRaw)) {
$copies = 1;
}
}
}
elseif ($item->category == 'Submersible Pump')
{
$copies = 2;
}
// $palletNo = preg_replace('/\/.*/', '', $palletNo);
// 5. Generate QR Code (base64)
$qrCode = new QrCode($palletNo);
$output = new Output\Png();
@@ -246,6 +112,8 @@ class ProductionStickerReprintController extends Controller
'copies'=> $copies,
]);
}
public function store(Request $request)
{
//

View File

@@ -83,7 +83,100 @@ class InvoiceDataTable extends Component
// $this->showCapacitorInput = false;
}
public function loadData($invoiceNumber, $plantId, $onCapFocus)
// public function loadData($invoiceNumber, $plantId, $onCapFocus)
// {
// $this->plantId = $plantId;
// $this->invoiceNumber = $invoiceNumber;
// $this->completedInvoice = false;
// $this->isSerial = true;
// $this->onCapFocus = $onCapFocus;
// $this->emptyInvoice = false;
// $this->hasSearched = true;
// $this->materialInvoice = false;
// // $this->showCapacitorInput = false;
// // ->where('serial_number', '!=', '')
// $this->invoiceData = InvoiceValidation::where('invoice_number', $this->invoiceNumber)
// ->where('plant_id', $plantId)->where('scanned_status', null)
// ->get()
// ->map(function ($record) {
// return [
// 'sticker_master_id' => $record->sticker_master_id,
// 'serial_number' => $record->serial_number,
// 'motor_scanned_status' => $record->motor_scanned_status ?? '',
// 'pump_scanned_status' => $record->pump_scanned_status ?? '',
// 'capacitor_scanned_status' => $record->capacitor_scanned_status ?? '',
// 'scanned_status_set' => $record->scanned_status_set ?? '',
// 'scanned_status' => $record->scanned_status ?? '',
// 'panel_box_supplier' => $record->panel_box_supplier ?? '',
// 'panel_box_serial_number' => $record->panel_box_serial_number ?? '',
// 'created_at' => $record->created_at,
// 'operator_id' => $record->operator_id,
// ];
// })
// ->toArray();
// $this->packageCount = 0;
// // Loop through and replace 'code' using related StickerMaster > Item > code
// foreach ($this->invoiceData as &$row) {
// $stickCount = 0;
// $scannedCount = 0;
// // $stickerMaster = \App\Models\StickerMaster::with('item')->find($row['sticker_master_id'] ?? null);
// $row['code'] = StickerMaster::with('item')->find($row['sticker_master_id'] ?? null)?->item?->code ?? 'N/A';
// $curStick = StickerMaster::where('id', $row['sticker_master_id'])->first();
// if ($curStick) {
// if (Str::length($curStick->panel_box_code) > 0) {
// $stickCount++;
// }
// if ($curStick->tube_sticker_motor == 1 || $curStick->tube_sticker_pump == 1 || $curStick->tube_sticker_pumpset == 1) {
// if ($curStick->tube_sticker_motor == 1) {
// $stickCount++;
// }
// if ($curStick->tube_sticker_pump == 1 || ($curStick->tube_sticker_pumpset != 1 && $curStick->tube_sticker_pump != 1 && $curStick->pack_slip_pump == 1)) {
// $stickCount++;
// }
// if ($curStick->tube_sticker_pumpset == 1) {
// $stickCount++;
// }
// } elseif ($curStick->pack_slip_motor == 1 || $curStick->pack_slip_pump == 1 || $curStick->pack_slip_pumpset == 1) {
// if ($curStick->pack_slip_motor == 1) {
// $stickCount++;
// }
// if ($curStick->pack_slip_pump == 1) {
// $stickCount++;
// }
// if ($curStick->pack_slip_pumpset == 1) {
// $stickCount++;
// }
// }
// }
// if ($row['motor_scanned_status'] == 1) {
// $scannedCount++;
// }
// if ($row['pump_scanned_status'] == 1) {
// $scannedCount++;
// }
// if ($row['capacitor_scanned_status'] == 1) {
// $scannedCount++;
// }
// if ($row['scanned_status_set'] == 1) {
// $scannedCount++;
// }
// $this->packageCount += $stickCount - $scannedCount;
// }
// if ($onCapFocus) {
// $this->dispatch('focus-capacitor-input');
// } else {
// $this->dispatch('focus-serial-number');
// }
// }
public function loadData($invoiceNumber, $plantId, $onCapFocus = false)
{
$this->plantId = $plantId;
$this->invoiceNumber = $invoiceNumber;
@@ -93,80 +186,70 @@ class InvoiceDataTable extends Component
$this->emptyInvoice = false;
$this->hasSearched = true;
$this->materialInvoice = false;
// $this->showCapacitorInput = false;
// ->where('serial_number', '!=', '')
$this->invoiceData = InvoiceValidation::where('invoice_number', $this->invoiceNumber)
->where('plant_id', $plantId)->where('scanned_status', null)
->get()
->map(function ($record) {
return [
'sticker_master_id' => $record->sticker_master_id,
'serial_number' => $record->serial_number,
'motor_scanned_status' => $record->motor_scanned_status ?? '',
'pump_scanned_status' => $record->pump_scanned_status ?? '',
'capacitor_scanned_status' => $record->capacitor_scanned_status ?? '',
'scanned_status_set' => $record->scanned_status_set ?? '',
'scanned_status' => $record->scanned_status ?? '',
'panel_box_supplier' => $record->panel_box_supplier ?? '',
'panel_box_serial_number' => $record->panel_box_serial_number ?? '',
'created_at' => $record->created_at,
'operator_id' => $record->operator_id,
];
})
->toArray();
// Eager load stickerMasterRelation and item
$invoiceRecords = InvoiceValidation::with('stickerMasterRelation.item')
->where('invoice_number', $invoiceNumber)
->where('plant_id', $plantId)
->whereNull('scanned_status')
->get();
$this->invoiceData = [];
$this->packageCount = 0;
// Loop through and replace 'code' using related StickerMaster > Item > code
foreach ($this->invoiceData as &$row) {
foreach ($invoiceRecords as $record) {
$sm = $record->stickerMasterRelation;
// Compute code
$rowCode = $sm?->item?->code ?? 'N/A';
$stickCount = 0;
$scannedCount = 0;
// $stickerMaster = \App\Models\StickerMaster::with('item')->find($row['sticker_master_id'] ?? null);
$row['code'] = StickerMaster::with('item')->find($row['sticker_master_id'] ?? null)?->item?->code ?? 'N/A';
$curStick = StickerMaster::where('id', $row['sticker_master_id'])->first();
if ($curStick) {
if (Str::length($curStick->panel_box_code) > 0) {
if ($sm) {
// Panel box code
if (Str::length($sm->panel_box_code) > 0) {
$stickCount++;
}
if ($curStick->tube_sticker_motor == 1 || $curStick->tube_sticker_pump == 1 || $curStick->tube_sticker_pumpset == 1) {
if ($curStick->tube_sticker_motor == 1) {
$stickCount++;
}
if ($curStick->tube_sticker_pump == 1 || ($curStick->tube_sticker_pumpset != 1 && $curStick->tube_sticker_pump != 1 && $curStick->pack_slip_pump == 1)) {
$stickCount++;
}
if ($curStick->tube_sticker_pumpset == 1) {
$stickCount++;
}
} elseif ($curStick->pack_slip_motor == 1 || $curStick->pack_slip_pump == 1 || $curStick->pack_slip_pumpset == 1) {
if ($curStick->pack_slip_motor == 1) {
$stickCount++;
}
if ($curStick->pack_slip_pump == 1) {
$stickCount++;
}
if ($curStick->pack_slip_pumpset == 1) {
$stickCount++;
}
// Tube stickers logic
if ($sm->tube_sticker_motor == 1 || $sm->tube_sticker_pump == 1 || $sm->tube_sticker_pumpset == 1) {
if ($sm->tube_sticker_motor == 1) $stickCount++;
if ($sm->tube_sticker_pump == 1 || ($sm->tube_sticker_pumpset != 1 && $sm->tube_sticker_pump != 1 && $sm->pack_slip_pump == 1)) $stickCount++;
if ($sm->tube_sticker_pumpset == 1) $stickCount++;
}
// Pack slip logic (only if tube sticker block didn't apply)
elseif ($sm->pack_slip_motor == 1 || $sm->pack_slip_pump == 1 || $sm->pack_slip_pumpset == 1) {
if ($sm->pack_slip_motor == 1) $stickCount++;
if ($sm->pack_slip_pump == 1) $stickCount++;
if ($sm->pack_slip_pumpset == 1) $stickCount++;
}
}
if ($row['motor_scanned_status'] == 1) {
$scannedCount++;
}
if ($row['pump_scanned_status'] == 1) {
$scannedCount++;
}
if ($row['capacitor_scanned_status'] == 1) {
$scannedCount++;
}
if ($row['scanned_status_set'] == 1) {
$scannedCount++;
}
// Count already scanned
$scannedCount += ($record->motor_scanned_status == 1) ? 1 : 0;
$scannedCount += ($record->pump_scanned_status == 1) ? 1 : 0;
$scannedCount += ($record->capacitor_scanned_status == 1) ? 1 : 0;
$scannedCount += ($record->scanned_status_set == 1) ? 1 : 0;
$this->packageCount += $stickCount - $scannedCount;
// Increment packageCount
$this->packageCount += max($stickCount - $scannedCount, 0);
$this->invoiceData[] = [
'sticker_master_id' => $record->sticker_master_id,
'serial_number' => $record->serial_number,
'motor_scanned_status' => $record->motor_scanned_status ?? '',
'pump_scanned_status' => $record->pump_scanned_status ?? '',
'capacitor_scanned_status' => $record->capacitor_scanned_status ?? '',
'scanned_status_set' => $record->scanned_status_set ?? '',
'scanned_status' => $record->scanned_status ?? '',
'panel_box_supplier' => $record->panel_box_supplier ?? '',
'panel_box_serial_number' => $record->panel_box_serial_number ?? '',
'created_at' => $record->created_at,
'operator_id' => $record->operator_id,
'code' => $rowCode,
'stickCount' => $stickCount,
];
}
if ($onCapFocus) {

View File

@@ -0,0 +1,55 @@
<?php
namespace App\Livewire;
use Livewire\Component;
use App\Models\StickerPrinting;
class StickerPrintData extends Component
{
public $plantId;
public $refNumber;
public $serialNumber;
public bool $materialInvoice = false;
public $records = [];
protected $listeners = [
'refreshEmptySticker' => 'loadStickerData',
'addStickerToList' => 'loadSticker'
];
public function loadStickerData($plantId, $refNumber)
{
$this->plantId = $plantId;
$this->refNumber = $refNumber;
$this->materialInvoice = true;
$this->records = StickerPrinting::where('plant_id', $plantId)
->where('reference_number', $refNumber)
->orderBy('created_at', 'asc')
->get(['serial_number', 'created_by']);
}
public function loadSticker($plantId, $refNumber, $serialNumber)
{
$this->plantId = $plantId;
$this->refNumber = $refNumber;
$this->materialInvoice = true;
$this->records = StickerPrinting::where('plant_id', $plantId)
->where('reference_number', $refNumber)
->orderBy('created_at', 'asc')
->get(['serial_number', 'created_by']);
}
public function render()
{
return view('livewire.sticker-print-data');
}
}

View File

@@ -20,17 +20,24 @@ class InvalidQualityMail extends Mailable
public $invoiceNumber;
public $mplantName;
public $mProdOrder;
public $mUserName;
public $mPartNo;
public $mailType;
public $greeting;
public $subjectLine;
public $mLinePart;
public $itemCode;
public function __construct($parNo, $mProdOrder, $mplantName, $mailType = 'InvalidPartNumber')
public function __construct($parNo, $mProdOrder, $mplantName, $mLinePart, $mUserName, $mailType = 'InvalidPartNumber')
{
$this->mPartNo = $parNo;
$this->mProdOrder = $mProdOrder;
$this->mplantName = $mplantName;
$this->mLinePart = $mLinePart;
$this->mUserName = $mUserName;
$this->mailType = $mailType;
}
@@ -39,20 +46,20 @@ class InvalidQualityMail extends Mailable
// dynamic subject based on mail type
switch ($this->mailType) {
case 'InvalidPartNumber2':
$this->subjectLine = "Invalid Part Number 2 Scanned ({$this->mplantName})";
$this->subjectLine = "Quality Part Validation ({$this->mplantName})";
break;
case 'InvalidPartNumber3':
$this->subjectLine = "Invalid Part Number 3 Scanned ({$this->mplantName})";
$this->subjectLine = "Quality Part Validation ({$this->mplantName})";
break;
case 'InvalidPartNumber4':
$this->subjectLine = "Invalid Part Number 4 Scanned ({$this->mplantName})";
$this->subjectLine = "Quality Part Validation ({$this->mplantName})";
break;
case 'InvalidPartNumber5':
$this->subjectLine = "Invalid Part Number 5 Scanned ({$this->mplantName})";
$this->subjectLine = "Quality Part Validation ({$this->mplantName})";
break;
case 'InvalidPartNumber':
default:
$this->subjectLine = "Invalid Part Number 1 Scanned ({$this->mplantName})";
$this->subjectLine = "Quality Part Validation ({$this->mplantName})";
break;
}
@@ -70,8 +77,10 @@ class InvalidQualityMail extends Mailable
Dear Sir/Madam,<br><br>
Please note that the scanned part number appears to be incorrect.<br>
<b>Plant:</b> {$this->mplantName}<br>
<b>Line Name:</b> {$this->mLinePart}<br>
<b>Production Order:</b> {$this->mProdOrder}<br>
<b>Scanned Part Number 2:</b> {$this->mPartNo}<br>
<b>Employee Code:</b> {$this->mUserName}<br>
";
break;
case 'InvalidPartNumber3':
@@ -79,8 +88,10 @@ class InvalidQualityMail extends Mailable
Dear Sir/Madam,<br><br>
Please note that the scanned part number appears to be incorrect.<br>
<b>Plant:</b> {$this->mplantName}<br>
<b>Line Name:</b> {$this->mLinePart}<br>
<b>Production Order:</b> {$this->mProdOrder}<br>
<b>Scanned Part Number 3:</b> {$this->mPartNo}<br>
<b>Employee Code:</b> {$this->mUserName}<br>
";
break;
case 'InvalidPartNumber4':
@@ -88,8 +99,10 @@ class InvalidQualityMail extends Mailable
Dear Sir/Madam,<br><br>
Please note that the scanned part number appears to be incorrect.<br>
<b>Plant:</b> {$this->mplantName}<br>
<b>Line Name:</b> {$this->mLinePart}<br>
<b>Production Order:</b> {$this->mProdOrder}<br>
<b>Scanned Part Number 4:</b> {$this->mPartNo}<br>
<b>Employee Code:</b> {$this->mUserName}<br>
";
break;
case 'InvalidPartNumber5':
@@ -97,8 +110,10 @@ class InvalidQualityMail extends Mailable
Dear Sir/Madam,<br><br>
Please note that the scanned part number appears to be incorrect.<br>
<b>Plant:</b> {$this->mplantName}<br>
<b>Line Name:</b> {$this->mLinePart}<br>
<b>Production Order:</b> {$this->mProdOrder}<br>
<b>Scanned Part Number 5:</b> {$this->mPartNo}<br>
<b>Employee Code:</b> {$this->mUserName}<br>
";
break;
case 'InvalidPartNumber':
@@ -107,8 +122,10 @@ class InvalidQualityMail extends Mailable
Dear Sir/Madam,<br><br>
Please note that the scanned part number appears to be incorrect.<br>
<b>Plant:</b> {$this->mplantName}<br>
<b>Line Name:</b> {$this->mLinePart}<br>
<b>Production Order:</b> {$this->mProdOrder}<br>
<b>Scanned Part Number 1:</b> {$this->mPartNo}<br>
<b>Employee Code:</b> {$this->mUserName}<br>
";
break;
}

View File

@@ -82,12 +82,14 @@ class InvalidSerialMail extends Mailable
public $greeting;
public $subjectLine;
public $mUserName;
public $itemCode;
/**
* Create a new message instance.
*/
public function __construct($serial, $invoiceNumber, $mplantName, $mInvoiceType, $itemCode, $mailType = 'InvalidFormat')
public function __construct($serial, $invoiceNumber, $mplantName, $mInvoiceType, $itemCode, $mUserName, $mailType = 'InvalidFormat')
{
$this->serial = $serial;
$this->invoiceNumber = $invoiceNumber;
@@ -95,6 +97,7 @@ class InvalidSerialMail extends Mailable
$this->mInvoiceType = $mInvoiceType;
$this->mailType = $mailType;
$this->itemCode = $itemCode;
$this->mUserName = $mUserName;
}
/**
@@ -104,58 +107,24 @@ class InvalidSerialMail extends Mailable
{
// dynamic subject based on mail type
switch ($this->mailType) {
case 'NotFound':
$this->subjectLine = "Serial Number Not Found ({$this->mplantName})";
break;
case 'NotFoundInvoice':
$this->subjectLine = "Serial Number Not Found in Invoice ({$this->mplantName})";
break;
case 'NotFoundItemS':
$this->subjectLine = "Item Code Not Found ({$this->mplantName})";
break;
case 'NotValidPackage':
$this->subjectLine = "Not Valid Package ({$this->mplantName})";
break;
case 'InvalidMaterialFormat':
$this->subjectLine = "Invalid Qr code format Found material ({$this->mplantName})";
break;
case 'DuplicateMotorQR':
$this->subjectLine = "Duplicate Serial Number ({$this->mplantName})";
break;
case 'NotMotorQR':
$this->subjectLine = "Item Code doesn't have Motor QR ({$this->mplantName})";
break;
case 'CompletedSerialInvoice':
$this->subjectLine = "Completed Serial Invoice ({$this->mplantName})";
break;
case 'NotPumpQR':
$this->subjectLine = "Item Code doesn't have Pump QR ({$this->mplantName})";
break;
case 'DuplicatePumpQR':
$this->subjectLine = "Duplicate Serial Number ({$this->mplantName})";
break;
case 'CSerialInvoice':
$this->subjectLine = "Completed Serial Invoice ({$this->mplantName})";
break;
case 'MissingPanelBox':
$this->subjectLine = "Missing Panel Box ({$this->mplantName})";
$this->subjectLine = "Invoice - Second Scanning({$this->mplantName})";
break;
case 'DuplicateCapacitorQR':
$this->subjectLine = "Duplicate Capacitor QR ({$this->mplantName})";
$this->subjectLine = "Invoice - Second Scanning({$this->mplantName})";
break;
case 'UnknownPumpsetQR':
$this->subjectLine = "Unknown PumpSet QR ({$this->mplantName})";
break;
case 'DuplicatePumpsetQR':
$this->subjectLine = "Duplicate PumpSet QR ({$this->mplantName})";
break;
case 'ComSerInv':
$this->subjectLine = "Completed Serial Invoice ({$this->mplantName})";
break;
case 'InvalidFormat':
default:
$this->subjectLine = "Invalid Serial Format Found ({$this->mplantName})";
case 'InvalidPanelBox':
$this->subjectLine = "Invoice - Second Scanning({$this->mplantName})";
break;
// case 'CompletedSerialInvoice':
// $this->subjectLine = "Invoice - Second Scanning({$this->mplantName})";
// break;
// case 'CSerialInvoice':
// $this->subjectLine = "Invoice - Second Scanning({$this->mplantName})";
// break;
// case 'ComSerInv':
// $this->subjectLine = "Invoice - Second Scanning({$this->mplantName})";
// break;
}
return new Envelope(
@@ -170,224 +139,28 @@ class InvalidSerialMail extends Mailable
{
// dynamic greeting/message body
switch ($this->mailType) {
case 'NotFound':
$this->greeting = "
Dear Sir/Madam,<br><br>
The scanned Serial Number <b>{$this->serial}</b> was not found in the database
for the plant <b>{$this->mplantName}</b>.<br><br>
<b>Invoice Number:</b> {$this->invoiceNumber}<br>
<b>Invoice Type:</b> {$this->mInvoiceType}<br><br>
Please verify the serial number.
";
break;
case 'NotFoundInvoice':
$this->greeting = "
Dear Sir/Madam,<br><br>
The scanned Serial Number <b>'{$this->serial}'</b> was not found in the Invoice Number <b>'{$this->invoiceNumber}'</b>
for the plant <b>{$this->mplantName}</b>.<br><br>
<b>Invoice Type:</b> {$this->mInvoiceType}<br><br>
Please verify the serial number.
";
break;
case 'NotFoundItemS':
$this->greeting = "
Dear Sir/Madam,<br><br>
Item Code <b>'{$this->itemCode}'</b> with Serial Number<b>'{$this->serial}'</b> not found in sticker master
for the plant <b>{$this->mplantName}</b>.<br><br>
<b>Invoice Number:</b> {$this->invoiceNumber}<br><br>
<b>Invoice Type:</b> {$this->mInvoiceType}<br><br>
Please verify the Item Code.
";
break;
case 'NotValidPackage':
$this->greeting = "
Dear Sir/Madam,<br><br>
Scanned Item Code<b>'{$this->itemCode}'</b> doesn't have valid package type to proceed!
for the plant <b>{$this->mplantName}</b>.<br><br>
<b>Invoice Number:</b> {$this->invoiceNumber}<br><br>
<b>Invoice Type:</b> {$this->mInvoiceType}<br><br>
Please verify the Item Code.
";
break;
case 'InvalidMaterialFormat':
$this->greeting = "
Dear Sir/Madam,<br><br>
Please note that the scanned serial number format appears to be incorrect.<br>
The scanned serial number could not be found in the given invoice.<br><br>
<b>Plant:</b> {$this->mplantName}<br>
<b>Invoice Type:</b> {$this->mInvoiceType}<br>
<b>Invoice Number:</b> {$this->invoiceNumber}<br>
<b>Scanned QR Code:</b> {$this->serial}<br>
<b>Employee Code:</b> {$this->mUserName}<br>
";
break;
case 'DuplicateMotorQR':
$this->greeting = "
Dear Sir/Madam,<br><br>
Scanned 'Motor' serial number <b>{$this->serial}</b> already completed the scanning process.<br>
<b>Plant:</b> {$this->mplantName}<br>
<b>Invoice Type:</b> {$this->mInvoiceType}
<b>Invoice Number:</b> {$this->invoiceNumber}<br>
<b>Scanned QR Code:</b> {$this->serial}<br>
";
break;
case 'NotMotorQR':
$this->greeting = "
Dear Sir/Madam,<br><br>
Scanned Item Code <b>{$this->itemCode}</b> doesn't have 'Motor' QR to proceed!<br>
<b>Plant:</b> {$this->mplantName}<br>
<b>Invoice Type:</b> {$this->mInvoiceType}<br>
<b>Invoice Number:</b> {$this->invoiceNumber}<br>
<b>Scanned QR Code:</b> {$this->serial}<br>
";
break;
case 'CompletedSerialInvoice':
$this->greeting = "
Dear Sir/Madam,<br><br>
Serial invoice <b>'{$this->invoiceNumber}'</b> completed the scanning process.<br>
<b>Plant:</b> {$this->mplantName}<br>
<b>Invoice Type:</b> {$this->mInvoiceType}<br>
<b>Scanned QR Code:</b> {$this->serial}<br>
";
break;
case 'NotPumpQR':
$this->greeting = "
Dear Sir/Madam,<br><br>
Scanned Item Code <b>'{$this->itemCode}'</b> doesn't have 'Pump' QR to proceed!<br>
<b>Plant:</b> {$this->mplantName}<br>
<b>Invoice Type:</b> {$this->mInvoiceType}<br>
<b>Invoice Number:</b> {$this->invoiceNumber}<br>
<b>Scanned QR Code:</b> {$this->serial}<br>
";
break;
case 'DuplicatePumpQR':
$this->greeting = "
Dear Sir/Madam,<br><br>
Scanned 'Pump' serial number already completed the scanning process.<br>
<b>Plant:</b> {$this->mplantName}<br>
<b>Invoice Type:</b> {$this->mInvoiceType}<br>
<b>Invoice Number:</b> {$this->invoiceNumber}<br>
<b>Scanned QR Code:</b> {$this->serial}<br>
";
break;
case 'CSerialInvoice':
$this->greeting = "
Dear Sir/Madam,<br><br>
Serial invoice <b>'{$this->invoiceNumber}'</b> completed the scanning process.<br>
<b>Plant:</b> {$this->mplantName}<br>
<b>Invoice Type:</b> {$this->mInvoiceType}<br>
<b>Scanned QR Code:</b> {$this->serial}<br>
";
break;
case 'MissingPanelBox':
$this->greeting = "
Dear Sir/Madam,<br><br>
Scanned Item Code <b>'{$this->itemCode}'</b> doesn't have 'Panel Box Code' to proceed!<br>
<b>Plant:</b> {$this->mplantName}<br>
<b>Invoice Type:</b> {$this->mInvoiceType}<br>
<b>Invoice Number:</b> {$this->invoiceNumber}<br>
<b>Scanned QR Code:</b> {$this->serial}<br>
";
break;
case 'DuplicateCapacitorQR':
$this->greeting = "
Dear Sir/Madam,<br><br>
Scanned 'Capacitor' serial number already completed the scanning process.<br>
<b>Plant:</b> {$this->mplantName}<br>
<b>Invoice Type:</b> {$this->mInvoiceType}<br>
<b>Invoice Number:</b> {$this->invoiceNumber}<br>
<b>Scanned QR Code:</b> {$this->serial}<br>
";
break;
case 'UnknownPumpsetQR':
$this->greeting = "
Dear Sir/Madam,<br><br>
Scanned Item Code <b>'{$this->itemCode}'</b> doesn't have 'Pump Set' QR to proceed!<br>
<b>Plant:</b> {$this->mplantName}<br>
<b>Invoice Type:</b> {$this->mInvoiceType}<br>
<b>Invoice Number:</b> {$this->invoiceNumber}<br>
<b>Scanned QR Code:</b> {$this->serial}<br>
";
break;
case 'DuplicatePumpsetQR':
$this->greeting = "
Dear Sir/Madam,<br><br>
Scanned 'Pump Set' serial number already completed the scanning process.<br>
<b>Plant:</b> {$this->mplantName}<br>
<b>Invoice Type:</b> {$this->mInvoiceType}<br>
<b>Invoice Number:</b> {$this->invoiceNumber}<br>
<b>Scanned QR Code:</b> {$this->serial}<br>
";
break;
case 'ComSerInv':
$this->greeting = "
Dear Sir/Madam,<br><br>
Serial invoice <b>'{$this->invoiceNumber}'</b> completed the scanning process.<br>
<b>Plant:</b> {$this->mplantName}<br>
<b>Invoice Type:</b> {$this->mInvoiceType}<br>
<b>Invoice Number:</b> {$this->invoiceNumber}<br>
<b>Scanned QR Code:</b> {$this->serial}<br>
";
break;
case 'ItemNotFound':
$this->greeting = "
Dear Sir/Madam,<br><br>
Item code <b>'{$this->itemCode}'</b> not found in database.<br>
<b>Plant:</b> {$this->mplantName}<br>
<b>Invoice Type:</b> {$this->mInvoiceType}<br>
<b>Invoice Number:</b> {$this->invoiceNumber}<br>
<b>Scanned QR Code:</b> {$this->serial}<br>
";
break;
case 'ItemNotFoundDB':
$this->greeting = "
Dear Sir/Madam,<br><br>
Item code <b>'{$this->itemCode}'</b> not found in database for choosed plant.<br>
<b>Plant:</b> {$this->mplantName}<br>
<b>Invoice Type:</b> {$this->mInvoiceType}<br>
<b>Invoice Number:</b> {$this->invoiceNumber}<br>
<b>Scanned QR Code:</b> {$this->serial}<br>
";
break;
case 'ItemNotValidMaterialType':
$this->greeting = "
Dear Sir/Madam,<br><br>
Item code <b>'{$this->itemCode}'</b> doesn't have a valid material type.<br>
<b>Plant:</b> {$this->mplantName}<br>
<b>Invoice Type:</b> {$this->mInvoiceType}<br>
<b>Invoice Number:</b> {$this->invoiceNumber}<br>
<b>Scanned QR Code:</b> {$this->serial}<br>
";
break;
case 'ItemNotInvoice':
$this->greeting = "
Dear Sir/Madam,<br><br>
Item code <b>'{$this->itemCode}'</b> doesn't exist in invoice.<br>
<b>Plant:</b> {$this->mplantName}<br>
<b>Invoice Type:</b> {$this->mInvoiceType}<br>
<b>Invoice Number:</b> {$this->invoiceNumber}<br>
<b>Scanned QR Code:</b> {$this->serial}<br>
";
break;
case 'ItemNotInvoice':
$this->greeting = "
Dear Sir/Madam,<br><br>
Item code <b>'{$this->itemCode}'</b> doesn't exist in invoice.<br>
<b>Plant:</b> {$this->mplantName}<br>
<b>Invoice Type:</b> {$this->mInvoiceType}<br>
<b>Invoice Number:</b> {$this->invoiceNumber}<br>
<b>Scanned QR Code:</b> {$this->serial}<br>
";
break;
case 'InvalidFormat':
default:
$this->greeting = "
Dear Sir/Madam,<br><br>
Please note that the scanned serial number format appears to be incorrect.<br>
<b>Plant:</b> {$this->mplantName}<br>
<b>Invoice Type:</b> {$this->mInvoiceType}
<b>Invoice Number:</b> {$this->invoiceNumber}<br>
<b>Scanned QR Code:</b> {$this->serial}<br>
";
break;
// case 'DuplicateCapacitorQR':
// $this->greeting = "
// Dear Sir/Madam,<br><br>
// The scanned <b>Capacitor</b> serial number has already completed the scanning process.<br><br>
// <b>Plant:</b> {$this->mplantName}<br>
// <b>Invoice Type:</b> {$this->mInvoiceType}<br>
// <b>Invoice Number:</b> {$this->invoiceNumber}<br>
// <b>Scanned QR Code:</b> {$this->serial}<br>
// <b>Employee Code:</b> {$this->mUserName}<br>
// ";
// break;
}
return new Content(

View File

@@ -0,0 +1,48 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class CharacteristicValue extends Model
{
use SoftDeletes;
protected $fillable = [
'plant_id',
'line_id',
'item_id',
'machine_id',
'process_order',
'coil_number',
'status',
'observed_value',
'created_at',
'updated_at',
'created_by',
'updated_by',
];
public function plant(): BelongsTo
{
return $this->belongsTo(Plant::class);
}
public function line(): BelongsTo
{
return $this->belongsTo(Line::class);
}
public function item(): BelongsTo
{
return $this->belongsTo(Item::class);
}
public function machine(): BelongsTo
{
return $this->belongsTo(Machine::class);
}
}

View File

@@ -0,0 +1,60 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Database\Eloquent\Factories\HasFactory;
class ProductCharacteristicsMaster extends Model
{
use SoftDeletes;
protected $fillable = [
'plant_id',
'line_id',
'item_id',
'work_group_master_id',
'machine_id',
'name',
'inspection_type',
'characteristics_type',
'upper',
'lower',
'middle',
'created_at',
'updated_at',
'created_by',
'updated_by',
];
public function plant(): BelongsTo
{
return $this->belongsTo(Plant::class);
}
public function line(): BelongsTo
{
return $this->belongsTo(Line::class);
}
public function workGroupMaster(): BelongsTo
{
return $this->belongsTo(WorkGroupMaster::class);
}
public function machine(): BelongsTo
{
return $this->belongsTo(Machine::class);
}
// public function machine()
// {
// return $this->belongsTo(\App\Models\Machine::class, 'machine_id');
// }
public function item(): BelongsTo
{
return $this->belongsTo(Item::class);
}
}

View File

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

View File

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

View File

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

View File

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

View File

@@ -213,6 +213,8 @@ return [
'user_model' => \App\Models\User::class,
// 'user_model_class' => \App\Models\User::class,
'policies_namespace' => 'App\Policies',
],
];

View File

@@ -0,0 +1,53 @@
<?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 product_characteristics_masters(
id BIGINT GENERATED always AS IDENTITY PRIMARY KEY,
plant_id BIGINT NOT NULL,
item_id BIGINT NOT NULL,
line_id BIGINT DEFAULT NULL,
work_group_master_id BIGINT DEFAULT NULL,
machine_id BIGINT DEFAULT NULL,
name TEXT DEFAULT NULL,
inspection_type TEXT DEFAULT NULL,
characteristics_type TEXT DEFAULT NULL
upper DOUBLE PRECISION DEFAULT 0.0,
lower DOUBLE PRECISION DEFAULT 0.0,
middle DOUBLE PRECISION DEFAULT NULL,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW(),
created_by TEXT DEFAULT NULL,
updated_by TEXT DEFAULT NULL,
deleted_at TIMESTAMP,
FOREIGN KEY (plant_id) REFERENCES plants (id),
FOREIGN KEY (line_id) REFERENCES lines (id),
FOREIGN KEY (item_id) REFERENCES items(id),
FOREIGN KEY (work_group_master_id) REFERENCES work_group_masters(id),
FOREIGN KEY (machine_id) REFERENCES machines(id)
);
SQL;
DB::statement($sql);
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('product_characteristics_masters');
}
};

View File

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

View File

@@ -0,0 +1,32 @@
<?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'
ALTER TABLE process_orders
ALTER COLUMN order_quantity TYPE NUMERIC
USING order_quantity::NUMERIC;
SQL;
DB::statement($sql);
}
/**
* Reverse the migrations.
*/
public function down(): void
{
// Schema::table('process_orders', function (Blueprint $table) {
// //
// });
}
};

View File

@@ -0,0 +1,35 @@
<?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
{
Schema::table('work_group_masters', function (Blueprint $table) {
$table->dropUnique('work_group_masters_plant_id_operation_number_key');
});
// $sql = <<<'SQL'
// ALTER TABLE work_group_masters
// DROP INDEX work_group_masters_plant_id_operation_number_key;
// SQL;
// DB::statement($sql);
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('work_group_masters', function (Blueprint $table) {
//
});
}
};

View File

@@ -0,0 +1,48 @@
<?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 characteristic_values (
id BIGINT GENERATED always AS IDENTITY PRIMARY KEY,
plant_id BIGINT NOT NULL,
line_id BIGINT NOT NULL,
item_id BIGINT NOT NULL,
machine_id BIGINT NOT NULL,
process_order TEXT DEFAULT NULL,
coil_number TEXT DEFAULT NULL,
status TEXT DEFAULT NULL,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW(),
created_by TEXT DEFAULT NULL,
updated_by TEXT DEFAULT NULL,
deleted_at TIMESTAMP,
FOREIGN KEY (plant_id) REFERENCES plants (id),
FOREIGN KEY (line_id) REFERENCES lines (id),
FOREIGN KEY (item_id) REFERENCES items (id),
FOREIGN KEY (machine_id) REFERENCES machines (id)
);
SQL;
DB::statement($sql);
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('characteristic_values');
}
};

View File

@@ -0,0 +1,40 @@
<?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
{
// received_quantity → NUMERIC(10,6)
DB::statement(<<<SQL
ALTER TABLE process_orders
ALTER COLUMN received_quantity TYPE NUMERIC(10,6)
USING received_quantity::NUMERIC(10,6);
SQL);
// order_quantity → NUMERIC(10,6)
DB::statement(<<<SQL
ALTER TABLE process_orders
ALTER COLUMN order_quantity TYPE NUMERIC(10,6)
USING order_quantity::NUMERIC(10,6);
SQL);
}
/**
* Reverse the migrations.
*/
public function down(): void
{
// Schema::table('process_orders', function (Blueprint $table) {
// //
// });
}
};

View File

@@ -0,0 +1,38 @@
<?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 process_orders
ALTER COLUMN received_quantity TYPE NUMERIC(10,3)
USING received_quantity::NUMERIC(10,3);
SQL);
// order_quantity → NUMERIC(10,6)
DB::statement(<<<SQL
ALTER TABLE process_orders
ALTER COLUMN order_quantity TYPE NUMERIC(10,3)
USING order_quantity::NUMERIC(10,3);
SQL);
}
/**
* Reverse the migrations.
*/
public function down(): void
{
// Schema::table('process_orders', function (Blueprint $table) {
// //
// });
}
};

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 characteristic_values
ADD COLUMN observed_value NUMERIC(10,3);
SQL);
}
/**
* Reverse the migrations.
*/
public function down(): void
{
// Schema::table('characteristic_values', function (Blueprint $table) {
// //
// });
}
};

View File

@@ -169,6 +169,7 @@ class PermissionSeeder extends Seeder
Permission::updateOrCreate(['name' => 'view import process order']);
Permission::updateOrCreate(['name' => 'view export process order']);
Permission::updateOrCreate(['name' => 'view import sticker printing']);
Permission::updateOrCreate(['name' => 'view export sticker printing']);
}
}

View File

@@ -0,0 +1,24 @@
<x-filament::page>
<form wire:submit.prevent="create" class="space-y-6">
{{-- Form Section --}}
<div class="filament-form space-y-6">
{{ $this->form }}
</div>
{{-- <livewire:notification-sound /> --}}
{{-- Livewire Component (Invoice Table) --}}
<div class="bg-white shadow rounded-xl p-4">
<livewire:sticker-print-data :ref-data="$ref_number" />
</div>
{{-- Actions --}}
<div class="filament-actions mt-6">
<x-filament::actions>
@foreach ($this->getFormActions() as $action)
{{ $action }}
@endforeach
</x-filament::actions>
</div>
</form>
</x-filament::page>

View File

@@ -0,0 +1,23 @@
{{-- <div class="flex flex-col items-start space-y-2">
<button
type="button"
wire:click="printSticker"
class="mt-15 px-2 py-1 border border-primary-500 text-primary-600 rounded hover:bg-primary-50 hover:border-primary-700 transition text-sm"
>
Print
</button>
</div> --}}
<div class="flex flex-col items-start space-y-2">
<button
type="button"
wire:click="printSticker"
class="px-2 py-1 border border-primary-500 text-primary-600 bg-white rounded hover:bg-primary-50 hover:border-primary-700 transition text-sm"
style="margin-top: 10mm;"
>
Print
</button>
</div>

View File

@@ -0,0 +1,81 @@
{{-- <div class="overflow-x-auto overflow-y-visible" style="height: 385px;">
<table class="table-auto w-full border-collapse border">
<thead class="bg-gray-100">
<tr>
<th class="border p-2">No</th>
<th class="border p-2">Reference No</th>
<th class="border p-2">Serial Number</th>
<th class="border p-2">Created By</th>
</tr>
</thead>
<tbody>
@forelse($records as $index => $record)
<tr>
<td class="border p-2 text-center">{{ $index + 1 }}</td>
<td class="border p-2 text-center">{{ $refNumber }}</td>
<td class="border p-2 text-center">{{ $record['serial_number'] }}</td>
<td class="border p-2 text-center">{{ $record->created_by }}</td>
</tr>
@empty
<tr>
<td class="border p-2 text-center" colspan="4">No serial numbers found.</td>
</tr>
@endforelse
</tbody>
</table>
</div> --}}
<div>
<h3 class="text-lg font-semibold mb-2">Sticker Printing Table</h3>
<div
wire:loading.remove
@if(!$materialInvoice) style="display:none" @endif
class="overflow-x-auto overflow-y-visible"
style="height: 385px;"
>
<table class="table-auto w-full border-collapse border">
{{-- <thead class="bg-gray-100"> --}}
<thead class="bg-gray-100 text-xs">
<tr>
<th class="border p-2">No</th>
<th class="border p-2">Reference No</th>
<th class="border p-2">Serial Number</th>
<th class="border p-2">Created By</th>
</tr>
</thead>
{{-- <tbody> --}}
<tbody class="text-xs">
@forelse($records as $index => $record)
<tr>
<td class="border p-2 text-center">{{ $index + 1 }}</td>
<td class="border p-2 text-center">{{ $refNumber }}</td>
<td class="border p-2 text-center">{{ $record['serial_number'] }}</td>
<td class="border p-2 text-center">{{ $record->created_by }}</td>
</tr>
@empty
<tr>
<td class="border p-2 text-center" colspan="4">No serial numbers found.</td>
</tr>
@endforelse
</tbody>
</table>
</div>
<script>
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();
}
}, 50);
});
</script>

View File

@@ -0,0 +1,92 @@
{{-- <!DOCTYPE html>
<html>
<head>
<style>
body { text-align: center; font-family: Arial, sans-serif; }
.qr-container { margin-top: 30px; }
</style>
</head>
<body>
<div class="qr-container">
<img src="data:image/png;base64,{{ $qrCode }}" width="250" height="250">
</div>
</body>
</html> --}}
{{-- <!DOCTYPE html>
<html>
<head>
<style>
@page {
margin: 0;
size: 100mm 100mm;
}
body {
margin: 0;
padding: 0;
width: 100mm;
height: 100mm;
display: flex;
justify-content: center;
align-items: center;
}
img {
width: 100mm;
height: 100mm;
}
</style>
</head>
<body>
<img src="data:image/png;base64,{{ $qrCode }}" />
</body>
</html> --}}
<!DOCTYPE html>
<html>
<head>
<style>
@page {
margin: 0;
size: 100mm 100mm;
}
body {
margin: 0;
padding: 0;
width: 100mm;
height: 100mm;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
text-align: center;
font-size: 12px;
font-family: Arial, sans-serif;
}
img {
width: 90mm; /* QR CODE REDUCED TO FIT TEXT */
height: 90mm;
}
.ref-text {
margin-top: 3mm;
font-size: 16px; /* Increased Font Size */
font-weight: bold;
}
</style>
</head>
<body>
<div class="ref-text">
{{ $referenceNumber }}
</div>
<img src="data:image/png;base64,{{ $qrCode }}" />
</body>
</html>

View File

@@ -1,8 +1,6 @@
<?php
//use App\Http\Controllers\CharacteristicsController;
// use App\Http\Controllers\CharacteristicsController;
use App\Http\Controllers\CharacteristicsController;
use App\Http\Controllers\EquipmentMasterController;
use App\Http\Controllers\InvoiceValidationController;
use App\Http\Controllers\MachineController;
@@ -45,7 +43,6 @@ use Illuminate\Support\Facades\Route;
// return $item;
// });
// Route::post('/user/update', function (Request $request) {
// // Return the request data as JSON
@@ -56,7 +53,6 @@ use Illuminate\Support\Facades\Route;
// ]);
// });
// Route::middleware('auth.basic')->post('/user/update', function (Request $request) {
// return response()->json([
// 'message' => 'Authenticated via Basic Auth',
@@ -65,7 +61,6 @@ use Illuminate\Support\Facades\Route;
// ]);
// });
Route::post('obd/store-data', [ObdController::class, 'store']);
Route::get('obd/get-test-datas', [ObdController::class, 'get_test']);
@@ -80,9 +75,13 @@ Route::get('/download-qr-pdf/{palletNo}', [PalletController::class, 'downloadQrP
Route::get('/download-reprint-qr-pdf/{palletNo}', [PalletController::class, 'downloadReprintQrPdf'])->name('download-reprint-qr-pdf');
Route::get('/download-qr1-pdf/{palletNo}', [ProductionStickerReprintController::class, 'downloadQrPdf'])->name('download-qr1-pdf');
// Route::get('/download-reprint-process-pdf/{plant}/{item}/{process_order}/{coil_number}/{name}', [PalletController::class, 'downloadReprintProcess'])->name('download-reprint-process-pdf');
//Production Dashboard Controller
//Route::get('/download-qr1-pdf/{palletNo}', [ProductionStickerReprintController::class, 'downloadQrPdf'])->where('palletNo', '.*')->name('download-qr1-pdf');
Route::get('/download-qr1-pdf', [ProductionStickerReprintController::class, 'downloadQrPdf'])
->name('download-qr1-pdf');
// Production Dashboard Controller
Route::get('get/module-name/data', [ModuleController::class, 'get_module']);
@@ -104,7 +103,7 @@ Route::get('get/module-production-order/data', [ModuleProductionOrderDataControl
Route::get('get/module-production-linestop/data', [ModuleProductionLineStopController::class, 'get_moduleProductionLineStop']);
//Invoice Dashboard Controller
// Invoice Dashboard Controller
Route::get('get/module-invoice-type/data', [ModuleInvoiceDataController::class, 'get_invoiceData']);
@@ -114,7 +113,7 @@ Route::get('get/module-invoice-count/data', [ModuleInvoiceTypeController::class,
Route::get('get/module-invoice-quantity/data', [ModuleInvoiceQuantityController::class, 'get_invoiceQuantityData']);
//Guard Dashboard Controller
// Guard Dashboard Controller
Route::get('get/module-guard-day/data', [ModuleGuardDayCountController::class, 'get_guardDay_countData']);
@@ -122,19 +121,19 @@ Route::get('get/module-guard-hourly/data', [ModuleGuardHourlyCountController::cl
Route::get('get/module-guard-name/data', [ModuleGuardNameController::class, 'get_guard_name_Data']);
//Power house controller
// Power house controller
Route::get('get/mfm-parameter/data', [MfmParameterController::class, 'get_mfm_parameter']);
Route::get('get/mfm-parameterid/data', [MfmParameterController::class, 'get_mfm_parameterid']);
//Invoice Validation Controller
// Invoice Validation Controller
Route::post('serial-invoice/store-data', [InvoiceValidationController::class, 'serialInvoice']);
Route::post('material-invoice/store-data', [InvoiceValidationController::class, 'materialInvoice']);
//Testing panel Controller
// Testing panel Controller
Route::get('testing/user/get-data', [UserController::class, 'get_testing_data']);
@@ -154,28 +153,39 @@ Route::get('process-order/details', [PdfController::class, 'getProcessOrderData'
Route::post('process-order', [PdfController::class, 'storeProcessOrderData']);
Route::get('sap/files', [SapFileController::class, 'readFiles']);
//..Laser Marking - Characteristics
// ..Laser Marking - Characteristics
Route::get('laser/item/get-master-data', [StickerMasterController::class, 'get_master']);
// Route::post('laser/route/data', [CharacteristicsController::class, 'test']);//->withoutMiddleware(VerifyCsrfToken::class)
Route::post('laser/route/data', [CharacteristicsController::class, 'test']); // ->withoutMiddleware(VerifyCsrfToken::class)
// ..Part Validation - Characteristics
// Route::get('get-characteristics/master-data', [CharacteristicsController::class, 'getCharacteristicsMaster']);
// //..
// Route::post('laser/characteristics/data', [CharacteristicsController::class, 'storeClassChar']);
// Route::post('laser/characteristics/status', [CharacteristicsController::class, 'storeLaserStatus']);
// ..Serial or job
// Route::get('laser/characteristics/get', [CharacteristicsController::class, 'getClassChar']);
// Route::get('laser/characteristics/check', [CharacteristicsController::class, 'checkClassChar']);
//GR Master PDF and Serial Number
// ..Job or Master - Characteristics
// Route::post('laser/characteristics/data', [CharacteristicsController::class, 'storeClassChar']);
// ..serial auto or manual
// Route::post('laser/characteristics/status', [CharacteristicsController::class, 'storeLaserStatus']);
// ..Product Characteristics
Route::get('characteristics/get/master', [CharacteristicsController::class, 'getCharMaster']);
Route::post('characteristics/values', [CharacteristicsController::class, 'storeCharValues']);
// GR Master PDF and Serial Number
Route::get('grNumber-pdf', [PdfController::class, 'getGRPdf']);
@@ -183,7 +193,7 @@ Route::get('grmaster-sno', [PdfController::class, 'getGRSerial']);
Route::post('grmaster-sno-update', [PdfController::class, 'updateGR']);
// Route::post('file/store', [SapFileController::class, 'store'])->name('file.store');
Route::post('file/store', [SapFileController::class, 'store'])->name('file.store');
// Route::post('send-telegram', [TelegramController::class, 'sendMessage']);

View File

@@ -2,8 +2,6 @@
use Illuminate\Foundation\Inspiring;
use Illuminate\Support\Facades\Artisan;
use App\Models\AlertMailRule;
use Illuminate\Console\Scheduling\Schedule;
@@ -11,87 +9,88 @@ Artisan::command('inspire', function () {
$this->comment(Inspiring::quote());
})->purpose('Display an inspiring quote');
// Schedule::command('send:invoice-report');
// Schedule::command('send:production-report');
Artisan::command('auto:scheduler', function () {
$this->call('custom:scheduler');
})->everyMinute()->withoutOverlapping();
app()->booted(function () {
$schedule = app(Schedule::class);
// app()->booted(function () {
// $schedule = app(Schedule::class);
// $schedule->command('report:send-daily-production')->dailyAt('07:59');
// Production report scheduling
$productionRules = AlertMailRule::where('module', 'ProductionQuantities')
->where('rule_name', 'ProductionMail')
->select('plant', 'schedule_type')
->distinct()
->get();
// // $schedule->command('report:send-daily-production')->dailyAt('07:59');
// // Production report scheduling
// $productionRules = AlertMailRule::where('module', 'ProductionQuantities')
// ->where('rule_name', 'ProductionMail')
// ->select('plant', 'schedule_type')
// ->distinct()
// ->get();
foreach ($productionRules as $rule) {
$type = $rule->schedule_type;
$plantId = $rule->plant;
// foreach ($productionRules as $rule) {
// $type = $rule->schedule_type;
// $plantId = $rule->plant;
$command = $schedule->command('send:production-report', [$type, $plantId]);
// ->appendOutputTo(storage_path('logs/scheduler.log'));
// $command = $schedule->command('send:production-report', [$type, $plantId]);
// // ->appendOutputTo(storage_path('logs/scheduler.log'));
switch ($type) {
case 'Live':
$command->everyMinute();
break;
case 'Hourly':
$command->hourly();
break;
case 'Daily':
$command->dailyAt('07:59');
break;
}
}
// switch ($type) {
// case 'Live':
// $command->everyMinute();
// break;
// case 'Hourly':
// $command->hourly();
// break;
// case 'Daily':
// $command->dailyAt('07:59');
// break;
// }
// }
// Invoice report scheduling
$invoiceRules = AlertMailRule::where('module', 'InvoiceValidation')
->select('plant', 'schedule_type')
->distinct()
->get();
// // Invoice report scheduling
// $invoiceRules = AlertMailRule::where('module', 'InvoiceValidation')
// ->select('plant', 'schedule_type')
// ->distinct()
// ->get();
foreach ($invoiceRules as $rule) {
$type = $rule->schedule_type;
$plantId = $rule->plant;
// foreach ($invoiceRules as $rule) {
// $type = $rule->schedule_type;
// $plantId = $rule->plant;
$command = $schedule->command('send:invoice-report', [$type, $plantId]);
// $command = $schedule->command('send:invoice-report', [$type, $plantId]);
switch ($type) {
case 'Live':
$command->everyMinute();
break;
case 'Hourly':
$command->hourly();
break;
case 'Daily':
$command->dailyAt('07:59');
break;
}
}
// switch ($type) {
// case 'Live':
// $command->everyMinute();
// break;
// case 'Hourly':
// $command->hourly();
// break;
// case 'Daily':
// $command->dailyAt('07:59');
// break;
// }
// }
// Invoice Data Report Scheduling
$invoiceDataRules = AlertMailRule::where('module', 'InvoiceDataReport')
->select('plant', 'schedule_type')
->distinct()
->get();
// // Invoice Data Report Scheduling
// $invoiceDataRules = AlertMailRule::where('module', 'InvoiceDataReport')
// ->select('plant', 'schedule_type')
// ->distinct()
// ->get();
foreach ($invoiceDataRules as $rule) {
$type = $rule->schedule_type;
$plantId = $rule->plant;
// foreach ($invoiceDataRules as $rule) {
// $type = $rule->schedule_type;
// $plantId = $rule->plant;
$command = $schedule->command('send:invoice-data-report', [$type, $plantId]);
// $command = $schedule->command('send:invoice-data-report', [$type, $plantId]);
switch ($type) {
case 'Live':
$command->everyMinute();
break;
case 'Hourly':
$command->hourly();
break;
case 'Daily':
$command->dailyAt('10:00');
break;
}
}
});
// switch ($type) {
// case 'Live':
// $command->everyMinute();
// break;
// case 'Hourly':
// $command->hourly();
// break;
// case 'Daily':
// $command->dailyAt('10:00');
// break;
// }
// }
// });

View File

@@ -10,7 +10,7 @@ use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Route;
use Illuminate\Http\Request;
use thiagoalessio\TesseractOCR\TesseractOCR;
use App\Filament\Pages\CustomLogin;
Route::get('/', function () {
return redirect('/admin');
@@ -25,8 +25,8 @@ use App\Filament\Pages\CustomLogin;
]);
});
Route::get('/part-validation-image/{plant}/{filename}', function ($plant, $filename) {
$path = storage_path("app/private/uploads/PartValidation/{$plant}/{$filename}");
Route::get('/part-validation-image/{filename}', function ($filename) {
$path = storage_path("app/private/uploads/PartValidation/{$filename}");
if (!file_exists($path)) {
abort(404, 'Image not found');