190 Commits

Author SHA1 Message Date
9a7b42dea5 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 9s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 16s
Laravel Pint / pint (pull_request) Successful in 2m33s
Laravel Larastan / larastan (pull_request) Failing after 3m38s
2026-01-13 09:18:16 +00:00
0ce59ebe22 Merge pull request 'changed time in scheduler for invoice in transit' (#178) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
Reviewed-on: #178
2026-01-08 04:26:24 +00:00
dhanabalan
053c07bcfb changed time in scheduler for invoice in transit
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 37s
Laravel Pint / pint (pull_request) Successful in 2m15s
Laravel Larastan / larastan (pull_request) Failing after 3m20s
2026-01-08 09:56:12 +05:30
c032cdc58d Merge pull request 'changed time in invoice in transit' (#177) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #177
2026-01-07 04:59:13 +00:00
dhanabalan
b09ed3481a changed time in invoice in transit
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 2m40s
Laravel Larastan / larastan (pull_request) Failing after 3m38s
2026-01-07 10:29:01 +05:30
4074374614 Merge pull request 'Added logic for columns missing invoice in transit' (#176) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 17s
Reviewed-on: #176
2026-01-07 03:59:10 +00:00
dhanabalan
c2d840d772 Added logic for columns missing invoice in transit
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 42s
Laravel Pint / pint (pull_request) Successful in 2m37s
Laravel Larastan / larastan (pull_request) Failing after 3m49s
2026-01-07 09:28:57 +05:30
15712c44b6 Merge pull request 'changed report time for invoice in transit' (#175) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
Reviewed-on: #175
2026-01-07 02:52:28 +00:00
dhanabalan
119262405c changed report time for invoice in transit
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 33s
Laravel Pint / pint (pull_request) Successful in 2m5s
Laravel Larastan / larastan (pull_request) Failing after 3m11s
2026-01-07 08:21:52 +05:30
99f7450e5e Merge pull request 'changed logic in testing temp resource page' (#174) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
Reviewed-on: #174
2026-01-06 13:48:37 +00:00
dhanabalan
84748c5e3d changed logic in testing temp resource 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 23s
Laravel Pint / pint (pull_request) Successful in 3m49s
Laravel Larastan / larastan (pull_request) Failing after 4m51s
2026-01-06 19:18:22 +05:30
f6f6f0924e Merge pull request 'Added testing temp policy file' (#173) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
Reviewed-on: #173
2026-01-06 13:28:27 +00:00
dhanabalan
4ec781b942 Added testing temp policy file
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
Gemini PR Review / review (pull_request) Failing after 26s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Laravel Pint / pint (pull_request) Successful in 2m33s
Laravel Larastan / larastan (pull_request) Failing after 3m35s
2026-01-06 18:58:16 +05:30
3bab0310a1 Merge pull request 'Added testing temp resource files' (#172) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #172
2026-01-06 13:26:55 +00:00
dhanabalan
f0f7bffe74 Added testing temp resource files
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Gemini PR Review / review (pull_request) Failing after 28s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 15s
Laravel Pint / pint (pull_request) Successful in 2m25s
Laravel Larastan / larastan (pull_request) Failing after 3m26s
2026-01-06 18:56:45 +05:30
6924990ace Merge pull request 'Added testing temp model file' (#171) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #171
2026-01-06 13:25:41 +00:00
dhanabalan
40889f8802 Added testing temp 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 30s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 15s
Laravel Pint / pint (pull_request) Successful in 2m9s
Laravel Larastan / larastan (pull_request) Failing after 3m28s
2026-01-06 18:55:30 +05:30
ba0b2c2709 Merge pull request 'Added Testing temp migration file' (#170) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #170
2026-01-06 13:24:52 +00:00
dhanabalan
62272df783 Added Testing temp 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 12s
Gemini PR Review / review (pull_request) Failing after 26s
Laravel Pint / pint (pull_request) Successful in 2m19s
Laravel Larastan / larastan (pull_request) Failing after 3m24s
2026-01-06 18:54:39 +05:30
51416cdf37 Merge pull request 'Added 10 am for mauil trigger invoice in transit' (#169) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #169
2026-01-06 12:25:35 +00:00
dhanabalan
53d55555d8 Added 10 am for mauil trigger invoice in transit
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 19s
Gemini PR Review / review (pull_request) Failing after 22m14s
Laravel Larastan / larastan (pull_request) Failing after 27m34s
Laravel Pint / pint (pull_request) Successful in 7m16s
2026-01-06 17:54:50 +05:30
a8ff5b5120 Merge pull request 'modified logic for proper pending days in invoice in transit' (#168) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #168
2026-01-06 07:16:55 +00:00
dhanabalan
8c0a404665 modified logic for proper pending days in invoice in transit
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 25s
Laravel Larastan / larastan (pull_request) Failing after 3m19s
Laravel Pint / pint (pull_request) Successful in 3m28s
2026-01-06 12:46:41 +05:30
4ca965ccb1 Merge pull request 'chnaged time for invoice in transit' (#167) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Reviewed-on: #167
2026-01-06 06:36:03 +00:00
dhanabalan
def447e12b chnaged time for invoice in transit
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 31s
Laravel Pint / pint (pull_request) Successful in 3m31s
Laravel Larastan / larastan (pull_request) Failing after 13m46s
2026-01-06 12:05:52 +05:30
22cbb6c4d3 Merge pull request 'changed time for invoice transit' (#166) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
Reviewed-on: #166
2026-01-06 04:28:11 +00:00
dhanabalan
f0b80554d2 changed time for invoice transit
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 26s
Laravel Pint / pint (pull_request) Successful in 2m35s
Laravel Larastan / larastan (pull_request) Failing after 3m26s
2026-01-06 09:57:58 +05:30
6db07e1825 Merge pull request 'Added delete logic inside the invoice in transits resource page' (#165) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Reviewed-on: #165
2026-01-04 10:37:33 +00:00
dhanabalan
469e0e1bbe Added delete logic inside the invoice in transits 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 52s
Laravel Pint / pint (pull_request) Successful in 2m10s
Laravel Larastan / larastan (pull_request) Failing after 2m55s
2026-01-04 16:07:21 +05:30
1bc0a4b01d Merge pull request 'chnaged logic for lr aw br date for pending days' (#164) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #164
2026-01-04 10:30:47 +00:00
dhanabalan
d03b803bae chnaged logic for lr aw br date for pending days
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 50s
Laravel Larastan / larastan (pull_request) Failing after 2m59s
Laravel Pint / pint (pull_request) Successful in 2m35s
2026-01-04 16:00:26 +05:30
dc77a51c3c Merge pull request 'Added permissions to view process order upload and download button' (#163) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
Reviewed-on: #163
2026-01-04 09:59:05 +00:00
dhanabalan
5be689a9c1 Added permissions to view process order upload and download button
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 33s
Laravel Pint / pint (pull_request) Successful in 2m30s
Laravel Larastan / larastan (pull_request) Failing after 3m15s
2026-01-04 15:28:51 +05:30
b07a9596e5 Merge pull request 'Added order quantity in process order importer' (#162) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
Reviewed-on: #162
2026-01-04 09:26:15 +00:00
dhanabalan
59b94b2b26 Added order quantity in process order 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 55s
Laravel Pint / pint (pull_request) Successful in 2m8s
Laravel Larastan / larastan (pull_request) Failing after 2m56s
2026-01-04 14:56:03 +05:30
b96a54aae5 Merge pull request 'Added alert mail rule exporter file' (#161) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Reviewed-on: #161
2026-01-04 06:07:42 +00:00
dhanabalan
09b756b35b Added alert mail rule exporter file
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 16s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Failing after 1m24s
Laravel Larastan / larastan (pull_request) Failing after 3m3s
Laravel Pint / pint (pull_request) Successful in 2m14s
2026-01-04 11:37:30 +05:30
fe0e1e139e Merge pull request 'Added alert mail rule importer file' (#160) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #160
2026-01-04 06:06:52 +00:00
dhanabalan
ed26b4c705 Added alert mail rule importer 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 12s
Gemini PR Review / review (pull_request) Failing after 1m7s
Laravel Pint / pint (pull_request) Successful in 2m18s
Laravel Larastan / larastan (pull_request) Failing after 2m56s
2026-01-04 11:36:41 +05:30
a95766fd45 Merge pull request 'Added import and export inside the alert mail resource page' (#159) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #159
2026-01-04 06:06:04 +00:00
dhanabalan
9789f2828f Added import and export inside the alert mail 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 1m47s
Laravel Larastan / larastan (pull_request) Failing after 3m2s
Laravel Pint / pint (pull_request) Successful in 2m14s
2026-01-04 11:35:51 +05:30
d5d5a6d193 Merge pull request 'Added logic for invoice rule empty invoice in transit' (#158) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #158
2026-01-04 04:24:30 +00:00
dhanabalan
f27ba80475 Added logic for invoice rule empty invoice in transit
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 38s
Laravel Pint / pint (pull_request) Successful in 2m6s
Laravel Larastan / larastan (pull_request) Failing after 3m12s
2026-01-04 09:54:18 +05:30
25125cfead Merge pull request 'chnaged report timing to acctual time of invoice in transit' (#157) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #157
2026-01-04 04:23:23 +00:00
dhanabalan
1f657a626a chnaged report timing to acctual time of invoice in transit
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 37s
Laravel Larastan / larastan (pull_request) Failing after 3m3s
Laravel Pint / pint (pull_request) Successful in 2m44s
2026-01-04 09:53:09 +05:30
d6c6cf0c69 Merge pull request 'changed report time for invoice in transit' (#156) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
Reviewed-on: #156
2026-01-04 04:17:22 +00:00
dhanabalan
ca9261d75a changed report time for invoice in transit
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 1m5s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 44s
Gemini PR Review / review (pull_request) Failing after 2m43s
Laravel Larastan / larastan (pull_request) Failing after 3m4s
Laravel Pint / pint (pull_request) Successful in 2m22s
2026-01-04 09:47:10 +05:30
99a95dc150 Merge pull request 'removed manual trigger of invoice data report button from alert mail resource' (#155) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
Reviewed-on: #155
2026-01-03 11:13:49 +00:00
dhanabalan
99afa82c75 removed manual trigger of invoice data report button from alert mail resource
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 48s
Laravel Pint / pint (pull_request) Successful in 1m58s
Laravel Larastan / larastan (pull_request) Failing after 3m16s
2026-01-03 16:43:35 +05:30
6d26307c4a Merge pull request 'Added invoice master id in alert mail rules' (#154) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Reviewed-on: #154
2026-01-03 11:07:06 +00:00
dhanabalan
efaf876df3 Added invoice master id in alert mail rules
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 46s
Laravel Pint / pint (pull_request) Successful in 2m16s
Laravel Larastan / larastan (pull_request) Failing after 2m51s
2026-01-03 16:36:54 +05:30
8703aec73e Merge pull request 'changed sub group name of all pages for invoice management' (#153) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
Reviewed-on: #153
2026-01-03 10:41:58 +00:00
dhanabalan
d3166eacf5 changed sub group name of all pages for invoice management
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 1m58s
Laravel Larastan / larastan (pull_request) Failing after 2m58s
2026-01-03 16:11:44 +05:30
f8691500cf Merge pull request 'Added export permissions for invoice in transit' (#152) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #152
2026-01-03 10:23:58 +00:00
dhanabalan
cada0added Added export permissions for invoice in transit
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Gemini PR Review / review (pull_request) Failing after 50s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Laravel Pint / pint (pull_request) Successful in 2m10s
Laravel Larastan / larastan (pull_request) Failing after 2m47s
2026-01-03 15:53:46 +05:30
12f9cb683f Merge pull request 'Added import and export permissions for invoice in transit' (#151) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #151
2026-01-03 10:22:55 +00:00
dhanabalan
eb62b3a38b Added import and export permissions for invoice in transit
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 Pint / pint (pull_request) Successful in 2m14s
Laravel Larastan / larastan (pull_request) Failing after 3m36s
2026-01-03 15:52:40 +05:30
73c26a649a Merge pull request 'removed report period in invoice in transit' (#150) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Reviewed-on: #150
2026-01-03 09:48:21 +00:00
dhanabalan
e0d34fbc7b removed report period in invoice in transit
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 42s
Laravel Larastan / larastan (pull_request) Failing after 3m4s
Laravel Pint / pint (pull_request) Successful in 6m57s
2026-01-03 15:18:08 +05:30
80f6aeb3d6 Merge pull request 'remove searchable in alert mail resource' (#149) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Reviewed-on: #149
2026-01-03 09:25:07 +00:00
dhanabalan
cffb86cde2 remove searchable in alert mail resource
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 Pint / pint (pull_request) Successful in 2m18s
Laravel Larastan / larastan (pull_request) Failing after 2m55s
2026-01-03 14:54:55 +05:30
f633285a57 Merge pull request 'Changed logic for to mail and cc mail for production report' (#148) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Reviewed-on: #148
2026-01-03 09:12:44 +00:00
dhanabalan
6acdfc30fa Changed logic for to mail and cc mail for production report
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 1m2s
Laravel Larastan / larastan (pull_request) Failing after 3m9s
Laravel Pint / pint (pull_request) Successful in 2m34s
2026-01-03 14:42:33 +05:30
841922a4b3 Merge pull request 'changed content in invoice transit and table column structure' (#147) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #147
2026-01-03 09:01:29 +00:00
dhanabalan
0852712dd9 changed content in invoice transit and table column structure
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 41s
Laravel Pint / pint (pull_request) Successful in 2m55s
Laravel Larastan / larastan (pull_request) Failing after 3m58s
2026-01-03 14:31:17 +05:30
3a819737cb Merge pull request 'chnage dposition of lower and middle in table section of product characteritics master' (#146) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #146
2026-01-03 07:37:11 +00:00
dhanabalan
ad91c848e5 chnage dposition of lower and middle in table section of product characteritics master
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 50s
Laravel Pint / pint (pull_request) Successful in 2m11s
Laravel Larastan / larastan (pull_request) Failing after 2m49s
2026-01-03 13:07:00 +05:30
18f60ec336 Merge pull request 'changed to plant code for product characteritics master importer and exporter' (#145) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Reviewed-on: #145
2026-01-03 07:32:56 +00:00
dhanabalan
3b11781132 changed to plant code for product characteritics master 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 30s
Laravel Pint / pint (pull_request) Successful in 2m30s
Laravel Larastan / larastan (pull_request) Failing after 3m9s
2026-01-03 13:02:44 +05:30
4ab7be97bb Merge pull request 'Added characteristics type in product characteristics master filter' (#144) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #144
2026-01-03 07:25:21 +00:00
dhanabalan
454e6ee431 Added characteristics type in product characteristics master filter
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 30s
Laravel Pint / pint (pull_request) Successful in 2m2s
Laravel Larastan / larastan (pull_request) Failing after 3m9s
2026-01-03 12:55:09 +05:30
a643bce1c2 Merge pull request 'Added searchable in product characteristics resource page' (#143) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
Reviewed-on: #143
2026-01-03 07:12:10 +00:00
dhanabalan
aa958eaa2e Added searchable in product characteristics resource page
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 10s
Gemini PR Review / review (pull_request) Failing after 49s
Laravel Pint / pint (pull_request) Successful in 2m20s
Laravel Larastan / larastan (pull_request) Failing after 2m56s
2026-01-03 12:41:59 +05:30
45392419cd Merge pull request 'Added filter options in product characteristics master resource' (#142) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #142
2026-01-03 07:09:49 +00:00
dhanabalan
779ed6a7d6 Added filter options in product characteristics master resource
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 31s
Laravel Pint / pint (pull_request) Successful in 2m15s
Laravel Larastan / larastan (pull_request) Failing after 3m25s
2026-01-03 12:39:24 +05:30
7b300f63d2 Merge pull request 'added label in invoice in transit exporter' (#141) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Reviewed-on: #141
2026-01-03 06:44:27 +00:00
dhanabalan
d35e35748f added label in invoice in transit exporter
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Gemini PR Review / review (pull_request) Failing after 28s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Laravel Pint / pint (pull_request) Successful in 2m7s
Laravel Larastan / larastan (pull_request) Failing after 3m12s
2026-01-03 12:14:11 +05:30
650314a435 Merge pull request 'Added receiving plant name and transport name in alert mail resource page' (#140) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #140
2026-01-03 06:32:00 +00:00
dhanabalan
dd0d429b3a Added receiving plant name and transport name in alert mail resource 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 35s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 9s
Laravel Pint / pint (pull_request) Successful in 1m52s
Laravel Larastan / larastan (pull_request) Failing after 2m56s
2026-01-03 12:01:46 +05:30
eaefffd51b Merge pull request 'Added send invoice in transit in scheduler' (#139) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #139
2026-01-03 06:30:36 +00:00
dhanabalan
fe03e30aa7 Added send invoice in transit in scheduler
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 12s
Laravel Pint / pint (pull_request) Successful in 2m18s
Laravel Larastan / larastan (pull_request) Failing after 2m52s
2026-01-03 12:00:26 +05:30
084d9b04f1 Merge pull request 'Added mail pages for invoice in transit' (#138) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #138
2026-01-03 06:29:15 +00:00
dhanabalan
d959a5d4a7 Added mail pages for invoice in transit
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Gemini PR Review / review (pull_request) Failing after 43s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Laravel Pint / pint (pull_request) Successful in 1m57s
Laravel Larastan / larastan (pull_request) Failing after 2m52s
2026-01-03 11:59:01 +05:30
75a3a8641c Merge pull request 'Added send invoice transit report command page' (#137) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #137
2026-01-03 06:27:29 +00:00
dhanabalan
c48bb2aaa9 Added send invoice transit report command 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 44s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Laravel Pint / pint (pull_request) Successful in 2m26s
Laravel Larastan / larastan (pull_request) Failing after 3m22s
2026-01-03 11:57:04 +05:30
f7f1d3a855 Merge pull request 'Added foreign key invoice_master_id in alert mail rules table' (#136) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #136
2026-01-03 06:25:41 +00:00
dhanabalan
11ce78b664 Added foreign key invoice_master_id in alert mail rules 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 42s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Laravel Pint / pint (pull_request) Successful in 1m49s
Laravel Larastan / larastan (pull_request) Failing after 3m5s
2026-01-03 11:55:25 +05:30
f00fc8b4d7 Merge pull request 'Added invoice in transit policy file' (#135) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #135
2026-01-03 06:23:10 +00:00
dhanabalan
aec52493f5 Added invoice in transit policy 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
Laravel Larastan / larastan (pull_request) Failing after 4m36s
Gemini PR Review / review (pull_request) Failing after 5m41s
Laravel Pint / pint (pull_request) Successful in 2m0s
2026-01-03 11:53:00 +05:30
73eb79a8d0 Merge pull request 'Added invoice in transit exporter' (#134) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #134
2026-01-03 06:21:36 +00:00
dhanabalan
71dad18036 Added invoice in transit 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 43s
Laravel Pint / pint (pull_request) Successful in 2m21s
Laravel Larastan / larastan (pull_request) Failing after 2m44s
2026-01-03 11:51:25 +05:30
5856fe64c1 Merge pull request 'Added invoice in transit resource pages' (#133) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #133
2026-01-03 06:20:13 +00:00
dhanabalan
cc59f4548c Added invoice in transit resource pages
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Gemini PR Review / review (pull_request) Failing after 25s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 14s
Laravel Pint / pint (pull_request) Successful in 2m17s
Laravel Larastan / larastan (pull_request) Failing after 2m53s
2026-01-03 11:50:04 +05:30
4615e45c74 Merge pull request 'Added invoice in transit model file' (#132) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #132
2026-01-03 06:18:53 +00:00
dhanabalan
7f20aa1c99 Added invoice in transit 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 46s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Laravel Pint / pint (pull_request) Successful in 2m1s
Laravel Larastan / larastan (pull_request) Failing after 3m6s
2026-01-03 11:48:43 +05:30
486b94bb79 Merge pull request 'Added invoice in transit migration file' (#131) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #131
2026-01-03 06:18:07 +00:00
dhanabalan
abd639e73f Added invoice in transit 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 37s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Laravel Larastan / larastan (pull_request) Failing after 2m55s
Laravel Pint / pint (pull_request) Successful in 2m56s
2026-01-03 11:47:55 +05:30
71eda460bd Merge pull request 'Added invoice master policy file' (#130) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #130
2026-01-03 06:14:32 +00:00
dhanabalan
a8c144ae5b Added invoice master policy 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 34s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Laravel Pint / pint (pull_request) Successful in 2m1s
Laravel Larastan / larastan (pull_request) Failing after 3m43s
2026-01-03 11:44:22 +05:30
938f9b9fdf Merge pull request 'Added invoice master exporter' (#129) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #129
2026-01-03 06:12:19 +00:00
dhanabalan
e130e35f40 Added invoice master 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 11s
Laravel Larastan / larastan (pull_request) Failing after 2m43s
Gemini PR Review / review (pull_request) Failing after 5m33s
Laravel Pint / pint (pull_request) Successful in 2m17s
2026-01-03 11:42:07 +05:30
648551c619 Merge pull request 'Added invoice master resource pages' (#128) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #128
2026-01-03 06:11:15 +00:00
dhanabalan
0d3163165d Added invoice 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 40s
Laravel Pint / pint (pull_request) Successful in 1m59s
Laravel Larastan / larastan (pull_request) Failing after 2m57s
2026-01-03 11:41:04 +05:30
308e68b79a Merge pull request 'Added invoice master model file' (#127) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #127
2026-01-03 06:09:07 +00:00
dhanabalan
0ec98d2f9f Added invoice master 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 43s
Laravel Pint / pint (pull_request) Successful in 2m8s
Laravel Larastan / larastan (pull_request) Failing after 2m57s
2026-01-03 11:38:55 +05:30
5b9cb33a63 Merge pull request 'Added invoice master migration file' (#126) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #126
2026-01-03 06:08:16 +00:00
dhanabalan
fdd9dbbfb2 Added invoice master migration file
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 34s
Laravel Larastan / larastan (pull_request) Failing after 2m22s
Laravel Pint / pint (pull_request) Failing after 2m18s
2026-01-03 11:37:51 +05:30
8b57518408 Merge pull request 'Updated password for the admin user' (#125) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #125
2026-01-02 04:49:08 +00:00
dhanabalan
723c3c1ebf Updated password for the admin user
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 22s
Laravel Pint / pint (pull_request) Successful in 2m17s
Laravel Larastan / larastan (pull_request) Failing after 3m12s
2026-01-02 10:17:24 +05:30
4b68133bf1 Merge pull request 'Updated email and password for the admin user' (#124) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
Reviewed-on: #124
2026-01-02 04:34:01 +00:00
dhanabalan
24b4c14aaf Updated email and password for the admin user
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 2m6s
Laravel Larastan / larastan (pull_request) Failing after 3m6s
2026-01-02 09:48:09 +05:30
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
78 changed files with 6676 additions and 1666 deletions

View File

@@ -5,15 +5,20 @@ name: Gemini PR Review
on:
pull_request:
types: [opened, reopened, synchronize]
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
review:
gemini-pr-review:
runs-on: ubuntu-latest
name: Gemini PR Review
steps:
- name: Checkout code
uses: actions/checkout@v5
uses: actions/checkout@v6
with:
fetch-depth: 0 # This fetches the full history
@@ -22,7 +27,6 @@ jobs:
with:
node-version: '24'
- name: Get npm cache directory
id: npm-cache-dir
run: |
@@ -36,8 +40,14 @@ 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 (if not already installed)
run: |
if ! command -v gemini &> /dev/null; then
echo "Gemini CLI not found, installing..."
npm install -g --loglevel=http @google/gemini-cli
else
echo "Gemini CLI already installed."
fi
- name: Generate git diff and review with Gemini
id: review
@@ -52,7 +62,6 @@ jobs:
cat /tmp/gemini-client-error*.json || true
- name: Post output to PR comment
id: post_comment
run: |

View File

@@ -183,8 +183,42 @@ class Scheduler extends Command
break;
}
}
}
$invoiceTransitRules = AlertMailRule::where('module', 'InvoiceTransit')
->where('rule_name', 'InvoiceTransitMail')
->select('plant', 'schedule_type')
->distinct()
->get();
foreach ($invoiceTransitRules as $rule) {
switch ($rule->schedule_type) {
case 'Live':
// Run every minute
\Artisan::call('send:invoice-transit-report', [
'schedule_type' => $rule->schedule_type,
'plant' => $rule->plant,
]);
break;
case 'Hourly':
if (now()->minute == 0) {
\Artisan::call('send:invoice-transit-report', [
'schedule_type' => $rule->schedule_type,
'plant' => $rule->plant,
]);
}
break;
case 'Daily':
if (now()->format('H:i') == '10:00') {
\Artisan::call('send:invoice-transit-report', [
'schedule_type' => $rule->schedule_type,
'plant' => $rule->plant,
]);
}
break;
}
}
}
/**
* Helper to call Artisan commands with parameters.

View File

@@ -0,0 +1,161 @@
<?php
namespace App\Console\Commands;
use App\Mail\InvoiceTransitMail;
use App\Models\AlertMailRule;
use App\Models\InvoiceMaster;
use App\Models\Plant;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
class SendInvoiceTransitReport extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'send:invoice-transit-report {schedule_type} {plant}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Command description';
/**
* Execute the console command.
*/
public function handle()
{
$scheduleType = $this->argument('schedule_type');
$plantId = (int) $this->argument('plant');
$mailRules = AlertMailRule::where('module', 'InvoiceTransit')
->where('rule_name', 'InvoiceTransitMail')
->where('schedule_type', $scheduleType)
->where('plant', $plantId)
->get();
$plants = ($plantId == 0)
? Plant::all()
: Plant::where('id', $plantId)->get();
$plantCodes = $plants->pluck('name', 'id');
if ($plants->isEmpty()) {
$this->error('No valid plant(s) found.');
return;
}
if (strtolower($scheduleType) == 'daily')
{
$results = DB::table('invoice_in_transits as it')
->join('invoice_masters as im', function ($join) {
$join->on('im.receiving_plant_name', '=', 'it.receiving_plant_name')->on('im.transport_name', '=', 'it.transport_name');
})
->select(
'it.invoice_number',
'it.receiving_plant',
'it.plant_id',
'it.receiving_plant_name',
'it.lr_bl_aw_date',
'it.lr_bl_aw_number',
'im.id as invoice_master_id',
'im.transport_name',
DB::raw('CAST(im.transit_days AS INTEGER) as transit_days'),
// DB::raw('(CURRENT_DATE - CAST(it.lr_bl_aw_date AS DATE)) as delayed_days')
DB::raw('
GREATEST(
0,
(CURRENT_DATE - CAST(it.lr_bl_aw_date AS DATE) - 1)
- CAST(im.transit_days AS INTEGER)
) AS delayed_days
')
)
->when($plantId != 0, fn($q) => $q->where('it.plant_id', $plantId))
->whereNotNull('it.lr_bl_aw_date')
->whereRaw('
(CURRENT_DATE - CAST(it.lr_bl_aw_date AS DATE))
- CAST(im.transit_days AS INTEGER) > 0
')
->get();
if ($results->isEmpty()) {
$this->info('No invoice transit records found for today.');
return;
}
$tableData = [];
foreach ($mailRules as $rule) {
$ruleInvoices = $results->where('invoice_master_id', $rule->invoice_master_id);
//$ruleInvoices = $results->filter(fn($item) => $item->invoice_master_id == (int)$rule->invoice_master_id);
if ($ruleInvoices->isEmpty()) {
$this->info("Skipping rule {$rule->id} — no invoice transit data.");
continue; // ❌ DO NOT SEND MAIL
}
$invoiceMaster = InvoiceMaster::find($rule->invoice_master_id);
$mailSubject = $invoiceMaster
? "Despatch Invoice In Transit ({$invoiceMaster->receiving_plant_name} - {$invoiceMaster->transport_name})"
: "Despatch Invoice In Transit";
if ($ruleInvoices->isEmpty()) {
$tableData = [];
$this->info("No despatch invoices in transit found for rule {$rule->id}.");
} else {
$tableData = $ruleInvoices->values()->map(function ($item, $index) use ($plantCodes) {
return [
'no' => $index + 1,
'plant' => $plantCodes[$item->plant_id],
'receiving_plant' => $item->receiving_plant,
'receiving_plant_name' => $item->receiving_plant_name,
'invoice_number' => $item->invoice_number,
'transport_name' => $item->transport_name,
'lr_bl_aw_date' => $item->lr_bl_aw_date,
'lr_bl_aw_number' => $item->lr_bl_aw_number,
'transit_days' => $item->transit_days,
'status' => $item->delayed_days . ' Days',
];
})->toArray();
}
$mail = new InvoiceTransitMail($scheduleType, $tableData, $mailSubject);
$toEmails = collect(explode(',', $rule->email))
->map(fn ($e) => trim($e))
->filter()
->unique()
->values()
->toArray();
$ccEmails = collect(explode(',', $rule->cc_emails))
->map(fn ($e) => trim($e))
->filter()
->unique()
->values()
->toArray();
if (empty($toEmails)) {
$this->warn("Skipping rule {$rule->id} — no To emails.");
continue;
}
\Mail::to($toEmails)->cc($ccEmails)->send($mail);
$this->info(
"Mail sent → Rule {$rule->id} | Invoice Master ID: {$rule->invoice_master_id} | To: " . implode(', ', $toEmails)
);
}
}
}
}

View File

@@ -2,15 +2,13 @@
namespace App\Console\Commands;
use App\Models\InvoiceValidation;
use App\Models\Plant;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Mail;
use App\Mail\ProductionMail;
use App\Models\Line;
use App\Models\Plant;
use App\Models\ProductionPlan;
use App\Models\ProductionQuantity;
use DB;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Mail;
class SendProductionReport extends Command
{
@@ -19,7 +17,7 @@ class SendProductionReport extends Command
*
* @var string
*/
//protected $signature = 'send:production-report';
// protected $signature = 'send:production-report';
protected $signature = 'send:production-report {schedule_type} {plant}';
/**
@@ -32,11 +30,10 @@ class SendProductionReport extends Command
/**
* Execute the console command.
*/
public function handle()
{
ini_set('max_execution_time', 0); // disable limit
set_time_limit(0);
// ini_set('max_execution_time', 0); // disable limit
// set_time_limit(0);
$scheduleType = $this->argument('schedule_type');
$plantId = (int) $this->argument('plant'); // cast to int for safety
@@ -55,33 +52,30 @@ class SendProductionReport extends Command
: Plant::where('id', $plantId)->get();
if ($plants->isEmpty()) {
$this->error("No valid plant(s) found.");
$this->error('No valid plant(s) found.');
return;
}
// $startDate = now()->setTime(8, 0, 0);
// $endDate = now()->copy()->addDay()->setTime(8, 0, 0);
if (strtolower($scheduleType) == 'daily')
{
if (strtolower($scheduleType) == '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);
}
$PlanstartDate = now()->setTime(8, 0, 0);
$planendDate = now()->copy()->addDay()->setTime(7, 59, 0);
$PlanstartDate = now()->subDay()->setTime(8, 0, 0);
$planendDate = now()->setTime(7, 59, 0);
$tableData = [];
$no = 1;
//.
// .
foreach ($plants as $plant)
{
foreach ($plants as $plant) {
$lines = Line::where('plant_id', $plant->id)->get();
foreach ($lines as $line) {
@@ -90,6 +84,7 @@ class SendProductionReport extends Command
->whereBetween('created_at', [$PlanstartDate, $planendDate])
->sum('plan_quantity');
/** @phpstan-ignore property.notFound */
if (strtolower($line->type) == 'fg line') {
$productionQuantity = \App\Models\QualityValidation::where('plant_id', $plant->id)
->where('line_id', $line->id)
@@ -113,9 +108,7 @@ class SendProductionReport extends Command
}
}
//$this->table(['No', 'Plant', 'Line', 'Target Quantity', 'Production Quantity'], $fgTableData);
// $this->table(['No', 'Plant', 'Line', 'Target Quantity', 'Production Quantity'], $fgTableData);
// $this->table(['No', 'Plant', 'Line', 'Target Quantity', 'Production Quantity'], $tableData);
@@ -128,7 +121,7 @@ class SendProductionReport extends Command
// }
// $this->info("Production report sent to " . count($emails) . " recipient(s).");
// Preview in console
// Preview in console
$mail = new ProductionMail($scheduleType, $tableData);
$contentVars = $mail->content()->with;
@@ -140,13 +133,39 @@ class SendProductionReport extends Command
$this->info($contentVars['wishes'] ?? '');
// Send mails
if (!empty($emails)) {
foreach ($emails as $email) {
Mail::to($email)->send(new ProductionMail($scheduleType, $tableData));
// if (! empty($emails)) {
// foreach ($emails as $email) {
// Mail::to($email)->send(new ProductionMail($scheduleType, $tableData));
// }
// $this->info('Production report sent to '.count($emails).' recipient(s).');
// } else {
// $this->warn('No recipients found for ProductionMailAlert.');
// }
foreach ($mailRules as $rule)
{
$toEmails = collect(explode(',', $rule->email))
->map(fn ($e) => trim($e))
->filter()
->unique()
->values()
->toArray();
$ccEmails = collect(explode(',', $rule->cc_emails))
->map(fn ($e) => trim($e))
->filter()
->unique()
->values()
->toArray();
if (empty($toEmails)) {
$this->warn("Skipping rule ID {$rule->id} — no valid To emails found.");
continue;
}
$this->info("Production report sent to " . count($emails) . " recipient(s).");
} else {
$this->warn('No recipients found for ProductionMailAlert.');
\Mail::to($toEmails)->cc($ccEmails)->send($mail);
$this->info("Mail sent for rule ID {$rule->id} → To: ".implode(', ', $toEmails).($ccEmails ? ' | CC: '.implode(', ', $ccEmails) : ''));
}
}
}

View File

@@ -0,0 +1,73 @@
<?php
namespace App\Filament\Exports;
use App\Models\AlertMailRule;
use App\Models\Plant;
use Filament\Actions\Exports\ExportColumn;
use Filament\Actions\Exports\Exporter;
use Filament\Actions\Exports\Models\Export;
class AlertMailRuleExporter extends Exporter
{
protected static ?string $model = AlertMailRule::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('module')
->label('MODULE'),
ExportColumn::make('rule_name')
->label('RULE NAME'),
ExportColumn::make('email')
->label('EMAIL'),
ExportColumn::make('schedule_type')
->label('SCHEDULE TYPE'),
ExportColumn::make('plant')
->label('PLANT CODE')
->formatStateUsing(function ($state) {
// $state is the plant ID from the database
if ($state == 0) {
return 'All Plants';
}
$plant = Plant::find($state);
return $plant ? $plant->code : 'Unknown';
}),
ExportColumn::make('cc_emails')
->label('CC EMAILS'),
ExportColumn::make('invoiceMaster.receiving_plant_name')
->label('RECEIVING PLANT NAME'),
ExportColumn::make('invoiceMaster.transport_name')
->label('TRANSPORT NAME'),
ExportColumn::make('created_at')
->label('CREATED AT'),
ExportColumn::make('created_by')
->label('CREATED BY'),
ExportColumn::make('updated_at')
->label('UPDATED AT'),
ExportColumn::make('deleted_at')
->label('DELETED AT')
->enabledByDefault(false),
];
}
public static function getCompletedNotificationBody(Export $export): string
{
$body = 'Your alert mail rule 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,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

@@ -0,0 +1,92 @@
<?php
namespace App\Filament\Exports;
use App\Models\InvoiceInTransit;
use Filament\Actions\Exports\ExportColumn;
use Filament\Actions\Exports\Exporter;
use Filament\Actions\Exports\Models\Export;
class InvoiceInTransitExporter extends Exporter
{
protected static ?string $model = InvoiceInTransit::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'),
ExportColumn::make('receiving_plant')
->label('RECEIVING PLANT'),
ExportColumn::make('receiving_plant_name')
->label('RECEIVING PLANT NAME'),
ExportColumn::make('invoice_number')
->label('INVOICE NUMBER'),
ExportColumn::make('invoice_date')
->label('INVOICE DATE'),
ExportColumn::make('item_code')
->label('ITEM CODE'),
ExportColumn::make('description')
->label('DESCRIPTION'),
ExportColumn::make('quantity')
->label('QUANTITY'),
ExportColumn::make('transport_name')
->label('TRANSPORT NAME'),
ExportColumn::make('lr_bl_aw_number')
->label('LR_BL_AW NUMBER'),
ExportColumn::make('lr_bl_aw_date')
->label('LR_BL_AW DATE'),
ExportColumn::make('pending_days')
->label('PENDING DAYS'),
ExportColumn::make('obd_number')
->label('OBD NUMBER'),
ExportColumn::make('obd_date')
->label('OBD DATE'),
ExportColumn::make('shipment_weight')
->label('SHIPMENT WEIGHT'),
ExportColumn::make('unit_price')
->label('UNIT PRICE'),
ExportColumn::make('net_value')
->label('NET VALUE'),
ExportColumn::make('total_item_amount')
->label('TOTAL ITEM AMOUNT'),
ExportColumn::make('tax_amount')
->label('TAX AMOUNT'),
ExportColumn::make('transport_mode')
->label('TRANSPORT MODE'),
ExportColumn::make('vehicle_number')
->label('VEHICLE NUMBER'),
ExportColumn::make('e_waybill_number')
->label('E_WAYBILL 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 invoice in transit 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,57 @@
<?php
namespace App\Filament\Exports;
use App\Models\InvoiceMaster;
use Filament\Actions\Exports\ExportColumn;
use Filament\Actions\Exports\Exporter;
use Filament\Actions\Exports\Models\Export;
class InvoiceMasterExporter extends Exporter
{
protected static ?string $model = InvoiceMaster::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('receiving_plant')
->label('Receiving Plant'),
ExportColumn::make('receiving_plant_name')
->label('Receiving Plant Name'),
ExportColumn::make('transit_days')
->label('Transit Days'),
ExportColumn::make('transport_name')
->label('Transport Name'),
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 invoice 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

@@ -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

@@ -14,6 +14,7 @@ class ProductCharacteristicsMasterExporter extends Exporter
public static function getColumns(): array
{
static $rowNumber = 0;
return [
ExportColumn::make('no')
->label('NO')
@@ -21,12 +22,12 @@ class ProductCharacteristicsMasterExporter 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('item.code')
->label('ITEM CODE'),
ExportColumn::make('line.name')
->label('LINE NAME'), //machine.workGroupMaster.name
->label('LINE NAME'), // machine.workGroupMaster.name
ExportColumn::make('machine.workGroupMaster.name')
->label('WORK GROUP MASTER'),
ExportColumn::make('machine.work_center')
@@ -34,15 +35,15 @@ class ProductCharacteristicsMasterExporter extends Exporter
ExportColumn::make('characteristics_type')
->label('CHARACTERISTICS TYPE'),
ExportColumn::make('name')
->label('NAME'),
->label('CHARACTERISTICS 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('upper')
->label('UPPER'),
ExportColumn::make('created_at')
->label('CREATED AT'),
ExportColumn::make('updated_at')
@@ -59,10 +60,10 @@ class ProductCharacteristicsMasterExporter extends Exporter
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.';
$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.';
$body .= ' '.number_format($failedRowsCount).' '.str('row')->plural($failedRowsCount).' failed to export.';
}
return $body;

View File

@@ -0,0 +1,141 @@
<?php
namespace App\Filament\Imports;
use App\Models\AlertMailRule;
use App\Models\Plant;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
use Filament\Actions\Imports\Exceptions\RowImportFailedException;
use Filament\Facades\Filament;
use Str;
class AlertMailRuleImporter extends Importer
{
protected static ?string $model = AlertMailRule::class;
public static function getColumns(): array
{
return [
ImportColumn::make('module')
->requiredMapping()
->exampleHeader('Module')
->example('ProductionQuantities/InvoiceValidation/QualityValidation/InvoiceDataReport/InvoiceTransit')
->label('Module')
->rules(['required']),
ImportColumn::make('rule_name')
->requiredMapping()
->exampleHeader('Rule Name')
->example('ProductionMail/InvoiceMail/QualityMail/InvoiceDataMail/InvoiceTransitMail')
->label('Rule Name')
->rules(['required']),
ImportColumn::make('email')
->requiredMapping()
->exampleHeader('Email')
->example('admin@cripumps.com,ranjith.bala@cripumps.com')
->label('Email')
->rules(['required']),
ImportColumn::make('schedule_type')
->exampleHeader('Schedule Type')
->example('Daily/Live/Hourly')
->label('Schedule Type'),
ImportColumn::make('plant')
->requiredMapping()
->exampleHeader('Plant Code')
->example('1000 or All Plants')
->label('Plant Code')
->rules(['required']),
ImportColumn::make('cc_emails')
->exampleHeader('CC Email')
->example('admin@cripumps.com,ranjith.bala@cripumps.com')
->label('CC Email')
->rules(['nullable', 'string']),
//->rules(['cc_emails']),
// ImportColumn::make('invoiceMaster')
// ->relationship(),
ImportColumn::make('receiving_plant_name')
->exampleHeader('Receiving Plant Name')
->example('BANGALORE')
->label('Receiving Plant Name')
->requiredMapping(),
ImportColumn::make('transporter_name')
->exampleHeader('Transporter Name')
->example('SAFEXPRESS PRIVATE LIMITED')
->label('Transporter Name')
->requiredMapping(),
];
}
public function resolveRecord(): ?AlertMailRule
{
$warnMsg = [];
$user = Filament::auth()->user();
$operatorName = $user->name;
if (strtolower($this->data['plant']) == 'all plants') {
$this->data['plant'] = 0;
} else {
$plant = Plant::where('code', $this->data['plant'])->first();
if (!$plant) {
$warnMsg[] = "Plant code '{$this->data['plant']}' not found.";
$this->data['plant'] = null;
} else {
$this->data['plant'] = $plant->id;
}
}
$receivingPlantName = $this->data['receiving_plant_name'] ?? null;
$transporterName = $this->data['transporter_name'] ?? null;
if (!$receivingPlantName || !$transporterName)
{
$warnMsg [] = 'Both Receiving Plant Name and Transporter Name are required.';
}
$invoiceMaster = \App\Models\InvoiceMaster::where('receiving_plant_name', $receivingPlantName)
->where('transport_name', $transporterName)
->first();
if (!$invoiceMaster) {
$warnMsg [] = "Invoice Master not found for Receiving Plant '{$receivingPlantName}' and Transporter '{$transporterName}'.";
}
$this->data['invoice_master_id'] = $invoiceMaster->id;
unset($this->data['receiving_plant_name'], $this->data['transporter_name']);
if(! empty($warnMsg)){
throw new RowImportFailedException(implode(', ', $warnMsg));
}
return AlertMailRule::Create([
'module' => $this->data['module'],
'rule_name' => $this->data['rule_name'],
'email' => $this->data['email'],
'schedule_type' => $this->data['schedule_type'],
'plant' => $this->data['plant'],
'cc_emails' => $this->data['cc_emails'] ?? null,
'invoice_master_id' => $invoiceMaster->id,
'created_by' => $operatorName,
'updated_by' => $operatorName,
]);
//return new AlertMailRule();
}
public static function getCompletedNotificationBody(Import $import): string
{
$body = 'Your alert mail rule 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,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

@@ -10,6 +10,7 @@ use Filament\Actions\Imports\Exceptions\RowImportFailedException;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
use Filament\Facades\Filament;
use Str;
class ProcessOrderImporter extends Importer
@@ -38,41 +39,57 @@ class ProcessOrderImporter extends Importer
->example('202500123456')
->label('PROCESS ORDER')
->rules(['required']),
ImportColumn::make('created_by')
->exampleHeader('CREATED BY')
->example('RAW01234')
->label('CREATED BY')
ImportColumn::make('order_quantity')
->exampleHeader('ORDER QUANTITY')
->example('100')
->label('ORDER QUANTITY')
->rules(['required']),
// ImportColumn::make('created_by')
// ->exampleHeader('CREATED BY')
// ->example('RAW01234')
// ->label('CREATED BY')
// ->rules(['required']),
];
}
public function resolveRecord(): ?ProcessOrder
{
$warnMsg = [];
$plant = Plant::where('code', $this->data['plant'])->first();
$itemCode = Item::where('code', $this->data['item'])->first();
$plantCod = $this->data['plant'];
$plant = null;
$iCode = trim($this->data['item']);
$processOrder = trim($this->data['process_order'] ?? '');
$user = Filament::auth()->user();
$operatorName = $user->name;
if (! $plant) {
$warnMsg[] = 'Plant not found';
} elseif (Str::length($iCode) < 6 || ! ctype_alnum($iCode)) {
$warnMsg[] = 'Invalid item code found';
} elseif (! $itemCode) {
$warnMsg[] = 'Item Code not found';
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';
}
}
$processOrder = trim($this->data['process_order'] ?? '');
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';
}
}
if ($processOrder == '') {
$warnMsg[] = 'Process Order cannot be empty';
}
$user = User::where('name', $this->data['created_by'])->first();
if (! $user) {
$warnMsg[] = 'User not found';
}
// $user = User::where('name', $this->data['created_by'])->first();
// if (! $user) {
// $warnMsg[] = 'User not found';
// }
if ($plant && $processOrder != '') {
if ($plant && $itemCode && $processOrder != '') {
$existingOrder = ProcessOrder::where('plant_id', $plant->id)
->where('process_order', $processOrder)
@@ -94,7 +111,7 @@ class ProcessOrderImporter extends Importer
'coil_number' => '0',
'order_quantity' => 0,
'received_quantity' => 0,
'created_by' => $user->name,
'created_by' => $operatorName,
]);
// return new ProcessOrder();

View File

@@ -9,12 +9,12 @@ use App\Models\Plant;
use App\Models\ProductCharacteristicsMaster;
use App\Models\User;
use App\Models\WorkGroupMaster;
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 Filament\Actions\Imports\Exceptions\RowImportFailedException;
use Illuminate\Support\Facades\Auth;
use Str;
class ProductCharacteristicsMasterImporter extends Importer
{
@@ -25,38 +25,38 @@ class ProductCharacteristicsMasterImporter extends Importer
return [
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')
->rules(['required']),
ImportColumn::make('item')
->requiredMapping()
->exampleHeader('Item Code')
->example('630214')
->label('Item Code')
->relationship(resolveUsing:'code')
->relationship(resolveUsing: 'code')
->rules(['required']),
ImportColumn::make('line')
->requiredMapping()
->exampleHeader('Line')
->exampleHeader('Line Name')
->example('4 inch pump line')
->label('Line')
->relationship(resolveUsing:'name')
->label('Line Name')
->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')
->relationship(resolveUsing: 'name')
->rules(['required']),
ImportColumn::make('machine')
->requiredMapping()
->exampleHeader('Work Center')
->example('RMGCE001')
->label('Work Center')
->relationship(resolveUsing:'work_center')
->relationship(resolveUsing: 'work_center')
->rules(['required']),
ImportColumn::make('characteristics_type')
->exampleHeader('Characteristics Type')
@@ -64,9 +64,9 @@ class ProductCharacteristicsMasterImporter extends Importer
->label('Characteristics Type')
->rules(['required']),
ImportColumn::make('name')
->exampleHeader('Name')
->exampleHeader('Characteristics Name')
->example('Body')
->label('Name')
->label('Characteristics Name')
->rules(['required']),
ImportColumn::make('inspection_type')
->exampleHeader('Inspection Type')
@@ -93,7 +93,7 @@ class ProductCharacteristicsMasterImporter extends Importer
->exampleHeader('Created By')
->example('Admin')
->label('Created By'),
//ImportColumn::make('updated_by'),
// ImportColumn::make('updated_by'),
];
}
@@ -102,132 +102,127 @@ class ProductCharacteristicsMasterImporter extends Importer
{
$warnMsg = [];
$plant = Plant::where('name', $this->data['plant'])->first();
if (!$plant) {
$warnMsg[] = "Plant not found";
}
$plantCod = $this->data['plant'];
$plant = null;
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';
} else {
$itemExists = Item::where('code', $this->data['item'])->first();
if (! $itemExists) {
$warnMsg[] = 'Item 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;
}
$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';
}
$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();
$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;
}
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 {
$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;
$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();
// 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);
if (! $existsInLine) {
$warnMsg[] = "Work Group Master '{$WorkgroupMaster->name}' is not mapped to any line in this plant";
} else {
$workGroupMasterId = $WorkgroupMaster->id;
}
})
->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.";
}
}
}
}
$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)) {
if (! empty($warnMsg)) {
throw new RowImportFailedException(implode(', ', $warnMsg));
}
else
{
} else {
$record = ProductCharacteristicsMaster::firstOrNew([
'plant_id' => $plant->id,
'item_id' => $itemId,
'line_id' => $LineId,
'plant_id' => $plant->id,
'item_id' => $itemId,
'line_id' => $LineId,
'work_group_master_id' => $workGroupMasterId,
'machine_id' => $machineId,
'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'];
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;
$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;
@@ -264,17 +259,17 @@ class ProductCharacteristicsMasterImporter extends Importer
// return null;
// }
//return new WorkGroupMaster();
// return new WorkGroupMaster();
// return new ProductCharacteristicsMaster();
// 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.';
$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.';
$body .= ' '.number_format($failedRowsCount).' '.str('row')->plural($failedRowsCount).' failed to import.';
}
return $body;

View File

@@ -20,7 +20,7 @@ class InvoiceDataDashboard extends Page
protected static string $view = 'filament.pages.invoice-data-dashboard';
protected static ?string $navigationGroup = 'Invoice Management';
protected static ?string $navigationGroup = 'Manufacturing SD';
public function mount(): void
{

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

@@ -2,9 +2,12 @@
namespace App\Filament\Resources;
use App\Filament\Exports\AlertMailRuleExporter;
use App\Filament\Imports\AlertMailRuleImporter;
use App\Filament\Resources\AlertMailRuleResource\Pages;
use App\Filament\Resources\AlertMailRuleResource\RelationManagers;
use App\Models\AlertMailRule;
use App\Models\InvoiceMaster;
use App\Models\Plant;
use Dotenv\Exception\ValidationException;
use Filament\Facades\Filament;
@@ -17,7 +20,13 @@ use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Forms\Components\Section;
use Filament\Forms\Components\Actions\Action;
use Filament\Notifications\Notification;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\ValidationException as ValidationValidationException;
use Filament\Tables\Actions\ImportAction;
use Filament\Tables\Actions\ExportAction;
class AlertMailRuleResource extends Resource
{
@@ -51,6 +60,7 @@ class AlertMailRuleResource extends Resource
'InvoiceDataReport' => 'InvoiceDataReport',
'ProductionQuantities' => 'ProductionQuantities',
'QualityValidation' => 'QualityValidation',
'InvoiceTransit' => 'InvoiceTransit',
]),
Forms\Components\Select::make('rule_name')
->label('Rule Name')
@@ -61,6 +71,7 @@ class AlertMailRuleResource extends Resource
'ProductionMail' => 'Production Mail',
'InvoiceDataMail' => 'Invoice Data Mail',
'QualityMail' => 'Quality Mail',
'InvoiceTransitMail' => 'Invoice Transit Mail',
])
->required(),
Forms\Components\TextInput::make('email')
@@ -75,29 +86,76 @@ class AlertMailRuleResource extends Resource
'Hourly' => 'Hourly',
'Daily' => 'Daily',
]),
Forms\Components\Select::make('receiving_plant_name')
->label('Receiving Plant')
->options(
InvoiceMaster::query()
->whereNotNull('receiving_plant_name')
->select('receiving_plant_name')
->distinct()
->pluck('receiving_plant_name', 'receiving_plant_name')
)
->searchable()
->reactive()
->afterStateUpdated(function (callable $set) {
$set('invoice_master_id', null);
}),
Forms\Components\Select::make('invoice_master_id')
->label('Transporter Name')
->options(function (callable $get) {
$recPlant = $get('receiving_plant_name');
if (! $recPlant) {
return [];
}
return InvoiceMaster::query()
->where('receiving_plant_name', $recPlant)
->whereNotNull('transport_name')
->where('transport_name', '!=', '')
->orderBy('transport_name')
->pluck('transport_name', 'id')
->toArray();
})
->searchable(),
Checkbox::make('is_active')
->label('All Plants Reports')
->afterStateUpdated(fn ($state, callable $set) => $state ? $set('plant', null) : null)
->reactive(),
// Forms\Components\Actions::make([
// Action::make('sendInvoiceData')
// ->label('Invoice Data Report')
// ->action(function ($get) {
// $plantIds = AlertMailRule::where('module', 'InvoiceDataReport')
// ->orderBy('plant')
// ->pluck('plant')
// ->toArray();
// foreach ($plantIds as $plantId) {
// Artisan::call('send:invoice-data-report', [
// 'schedule_type' => 'Daily',
// 'plant' => $plantId,
// ]);
// }
// // Notify user in Filament
// Notification::make()
// ->title('Invoice data report sent successfully!')
// ->success()
// ->send();
// }),
// ]),
Forms\Components\Hidden::make('created_by')
->default(fn () => Filament::auth()->user()?->name),
Forms\Components\Hidden::make('updated_by')
->default(fn () => Filament::auth()->user()?->name),
])
->columns(6),
->columns(2),
]);
}
// Optionally, also override for update/editing
// public static function mutateFormDataBeforeSave(array $data): array
// {
// dd('test');
// if ($data['is_active']) {
// $data['plant'] = 'All Plants';
// }
// return $data;
// }
public static function table(Table $table): Table
{
return $table
@@ -132,6 +190,14 @@ class AlertMailRuleResource extends Resource
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('invoiceMaster.receiving_plant_name')
->label('Receiving Plant')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('invoiceMaster.transport_name')
->label('Transporter')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('email')
->label('TO Emails')
->searchable()
@@ -188,6 +254,22 @@ class AlertMailRuleResource extends Resource
Tables\Actions\ForceDeleteBulkAction::make(),
Tables\Actions\RestoreBulkAction::make(),
]),
])
->headerActions([
ImportAction::make()
->label('Import Alert Mail Rule')
->color('warning')
->importer(AlertMailRuleImporter::class)
->visible(function() {
return Filament::auth()->user()->can('view import alert mail rule');
}),
ExportAction::make()
->label('Export Alert Mail Rule')
->color('warning')
->exporter(AlertMailRuleExporter::class)
->visible(function() {
return Filament::auth()->user()->can('view export alert mail rule');
}),
]);
}

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(),
];
}
}

View File

@@ -28,7 +28,7 @@ class InvoiceDataValidationResource extends Resource
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
protected static ?string $navigationGroup = 'Invoice Management';
protected static ?string $navigationGroup = 'Manufacturing SD';
public static function form(Form $form): Form
{

View File

@@ -0,0 +1,630 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Exports\InvoiceInTransitExporter;
use App\Filament\Resources\InvoiceInTransitResource\Pages;
use App\Filament\Resources\InvoiceInTransitResource\RelationManagers;
use App\Models\InvoiceInTransit;
use App\Models\Plant;
use Filament\Facades\Filament;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Notifications\Notification;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Forms\Components\FileUpload;
use Storage;
use Maatwebsite\Excel\Facades\Excel;
use Filament\Tables\Actions\ExportAction;
use Carbon\Carbon;
use PhpOffice\PhpSpreadsheet\Shared\Date as ExcelDate;
class InvoiceInTransitResource extends Resource
{
protected static ?string $model = InvoiceInTransit::class;
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
protected static ?string $navigationGroup = 'Manufacturing SD';
public static function form(Form $form): Form
{
return $form
->schema([
Forms\Components\Select::make('plant_id')
->relationship('plant', 'name')
->required(),
Forms\Components\TextInput::make('receiving_plant')
->label('Receiving Plant'),
Forms\Components\TextInput::make('receiving_plant_name')
->label('Receiving Plant Name'),
Forms\Components\TextInput::make('invoice_number')
->label('Invoice Number'),
Forms\Components\TextInput::make('invoice_date')
->label('Invoice Date'),
Forms\Components\TextInput::make('item_code')
->label('Item Code'),
Forms\Components\TextInput::make('description')
->label('Description'),
Forms\Components\TextInput::make('quantity')
->label('Quantity')
->numeric()
->default(null),
Forms\Components\TextInput::make('transport_name')
->label('Transport Name'),
Forms\Components\TextInput::make('lr_bl_aw_number')
->label('LR/BL/AW Number'),
Forms\Components\TextInput::make('lr_bl_aw_date')
->label('LR/BL/AW Date'),
Forms\Components\TextInput::make('pending_days')
->label('Pending Days'),
Forms\Components\TextInput::make('obd_number')
->label('OBD Number'),
Forms\Components\TextInput::make('obd_date')
->label('OBD Date'),
Forms\Components\TextInput::make('shipment_weight')
->label('Shipment Weight'),
Forms\Components\TextInput::make('unit_price')
->label('Unit Price'),
Forms\Components\TextInput::make('net_value')
->label('Net value'),
Forms\Components\TextInput::make('total_item_amount')
->label('Total Item Amount'),
Forms\Components\TextInput::make('tax_amount')
->label('Tax Amount'),
Forms\Components\TextInput::make('transport_mode')
->label('Transport Mode'),
Forms\Components\TextInput::make('vehicle_number')
->label('Vehicle Number'),
Forms\Components\TextInput::make('e_waybill_number')
->label('E Way Bill Number'),
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.')
->alignCenter()
->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()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('receiving_plant')
->label('Receiving Plant')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('receiving_plant_name')
->label('Receiving Plant Name')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('invoice_number')
->label('Invoice Number')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('invoice_date')
->label('Invoice Date')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('item_code')
->label('Item Code')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('description')
->label('Description')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('quantity')
->label('Quantity')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('transport_name')
->label('Transport Name')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('lr_bl_aw_number')
->label('LR/BL/AW Number')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('lr_bl_aw_date')
->label('LR/BL/AW Date')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('pending_days')
->label('Pending Days')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('obd_number')
->label('OBD Number')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('obd_date')
->label('OBD Date')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('shipment_weight')
->label('Shipment Weight')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('unit_price')
->label('Unit Price')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('net_value')
->label('Net value')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('total_item_amount')
->label('Total Item Amount')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('tax_amount')
->label('Tax Amount')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('transport_mode')
->label('Transport Mode')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('vehicle_number')
->label('Vehicle Number')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('e_waybill_number')
->label('E Way Bill Number')
->alignCenter()
->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([
Tables\Actions\Action::make('Import Invoice In Transit')
->label('Import Invoice In Transit')
->form([
FileUpload::make('invoice_in_transit_file')
->label('Import Invoice In Transit')
->preserveFilenames()
->storeFiles(false)
->reactive()
->required()
->disk('local')
->directory('uploads/temp'),
])
->action(function (array $data) {
InvoiceInTransit::truncate();
$uploadedFile = $data['invoice_in_transit_file'];
$disk = Storage::disk('local');
$user = Filament::auth()->user();
$operatorName = $user->name;
// Get original filename
$originalName = $uploadedFile->getClientOriginalName();
$path = $uploadedFile->storeAs('uploads/temp', $originalName, 'local'); // returns relative path
$fullPath = Storage::disk('local')->path($path);
if ($fullPath && file_exists($fullPath))
{
$rows = Excel::toArray(null, $fullPath)[0];
if ((count($rows) - 1) <= 0) {
Notification::make()
->title('Records Not Found')
->body("Import the valid 'Invoice Master Data' file to proceed..!")
->danger()
->send();
if ($disk->exists($path)) {
$disk->delete($path);
}
return;
}
$invalidPlantCode = [];
$invalidPlantCo = [];
$invalidPlaCoFound = [];
$invalidRecPlant = [];
$invalidRecPlantName = [];
$invalidInvNo = [];
$invalidInvDt = [];
$invalidICode = [];
$invalidDesc = [];
$invalidQty = [];
$invalidTransportName = [];
$invalidLRBLAWNo = [];
$invalidLRBLAWDt = [];
$invalidPenDay = [];
foreach ($rows as $index => $row) {
if ($index == 0) {
continue;
}
$plantCode = trim($row[0]);
$receivingPlant = trim($row[2]);
$receivingPlantName = trim($row[3]);
$invoiceNo = trim($row[4]);
$invoiceDt = trim($row[5]);
$itemCode = trim($row[6]);
$des = trim($row[7]);
$quantity = trim($row[8]);
$transportName = trim($row[9]);
$LRBAWNo = trim($row[10]);
$LRBAWDt = trim($row[11]);
$pendingDays = trim($row[12]);
if (empty($plantCode)) {
$invalidPlantCode[] = "Row {$index}";
}
if (empty($receivingPlant)) {
$invalidRecPlant[] = "Row {$index}";
}
if (empty($receivingPlantName)) {
$invalidRecPlantName[] = "Row {$index}";
}
if (empty($invoiceNo)) {
$invalidInvNo[] = "Row {$index}";
}
if (empty($invoiceDt)) {
$invalidInvDt[] = "Row {$index}";
}
if (empty($itemCode)) {
$invalidICode[] = "Row {$index}";
}
if (empty($des)) {
$invalidDesc[] = "Row {$index}";
}
if (empty($quantity)) {
$invalidQty[] = "Row {$index}";
}
if (empty($transportName)) {
$invalidTransportName[] = "Row {$index}";
}
if (empty($LRBAWNo)) {
$invalidLRBLAWNo[] = "Row {$index}";
}
if (empty($LRBAWDt)) {
$invalidLRBLAWDt[] = "Row {$index}";
}
if (empty($pendingDays)) {
$invalidPenDay[] = "Row {$index}";
}
if (strlen($plantCode) < 4) {
$invalidPlantCo[] = $plantCode;
} elseif (! Plant::where('code', $plantCode)->first()) {
$invalidPlaCoFound[] = $plantCode;
}
$plant = Plant::where('code', $plantCode)->first();
//$plantId = $plant->id;
}
if (! empty($invalidPlantCode) || ! empty($invalidRecPlant) || ! empty($invalidRecPlantName) || ! empty($invalidInvNo) || ! empty($invalidInvDt) || ! empty($invalidICode) || ! empty($invalidDesc) || ! empty($invalidQty) || ($invalidTransportName) || ! empty($invalidLRBLAWNo) || ! empty($invalidLRBLAWDt) || ! empty($invalidPenDay)) {
$errorMsg = '';
if (! empty($invalidPlantCode)) {
$errorMsg .= 'Missing Receiving Plant in rows: '.implode(', ', $invalidPlantCode).'<br>';
}
if (! empty($invalidRecPlant)) {
$errorMsg .= 'Missing Receiving Plant Name in rows: '.implode(', ', $invalidRecPlant).'<br>';
}
if (! empty($invalidRecPlantName)) {
$errorMsg .= 'Missing Transit Days in rows: '.implode(', ', $invalidRecPlantName).'<br>';
}
if (! empty($invalidInvNo)) {
$errorMsg .= 'Missing Transport Name in rows: '.implode(', ', $invalidInvNo).'<br>';
}
if (! empty($invalidInvDt)) {
$errorMsg .= 'Missing Receiving Plant in rows: '.implode(', ', $invalidInvDt).'<br>';
}
if (! empty($invalidICode)) {
$errorMsg .= 'Missing Receiving Plant Name in rows: '.implode(', ', $invalidICode).'<br>';
}
if (! empty($invalidDesc)) {
$errorMsg .= 'Missing Transit Days in rows: '.implode(', ', $invalidDesc).'<br>';
}
if (! empty($invalidQty)) {
$errorMsg .= 'Missing Transport Name in rows: '.implode(', ', $invalidQty).'<br>';
}
if (! empty($invalidTransportName)) {
$errorMsg .= 'Missing Receiving Plant in rows: '.implode(', ', $invalidTransportName).'<br>';
}
if (! empty($invalidLRBLAWNo)) {
$errorMsg .= 'Missing Receiving Plant Name in rows: '.implode(', ', $invalidLRBLAWNo).'<br>';
}
if (! empty($invalidLRBLAWDt)) {
$errorMsg .= 'Missing Transit Days in rows: '.implode(', ', $invalidLRBLAWDt).'<br>';
}
if (! empty($invalidPenDay)) {
$errorMsg .= 'Missing Transport Name in rows: '.implode(', ', $invalidPenDay).'<br>';
}
Notification::make()
->title('Missing Mandatory Fields')
->body($errorMsg)
->danger()
->send();
if ($disk->exists($path)) {
$disk->delete($path);
}
return;
}
if (! empty($invalidPlantCo)) {
$invalidPlantCode = array_unique($invalidPlantCo);
Notification::make()
->title('Invalid Plant Codes')
->body('The following plant codes should contain minimum 4 digits:<br>'.implode(', ', $invalidPlantCode))
->danger()
->send();
if ($disk->exists($path)) {
$disk->delete($path);
}
return;
}
if (! empty($invalidPlaCoFound)) {
$invalidPlaCoFound = array_unique($invalidPlaCoFound);
Notification::make()
->title('Invalid Plant Codes')
->body('The following plant codes not found in plants:<br>'.implode(', ', $invalidPlaCoFound))
->danger()
->send();
if ($disk->exists($path)) {
$disk->delete($path);
}
return;
}
$mandatoryColumns = 23;
$firstRow = $rows[0] ?? [];
if (count($firstRow) < $mandatoryColumns) {
Notification::make()
->title('Invalid Excel Format')
->body('Few columns not found. Columns A to W are mandatory.')
->danger()
->persistent()
->send();
return;
}
foreach ($rows as $index => $row)
{
if ($index == 0) {
continue;
}
$plantCode = trim($row[0]);
$receivingPlant = trim($row[2]);
$receivingPlantName = trim($row[3]);
$invoiceNo = trim($row[4]);
$invoiceDt = trim($row[5]);
$itemCode = trim($row[6]);
$des = trim($row[7]);
$quantity = trim($row[8]);
$transportName = trim($row[9]);
$LRBAWNo = trim($row[10]);
$LRBAWDt = trim($row[11]);
$pendingDays = trim($row[12]);
$OBDNumber = trim($row[13]);
$OBDDate = trim($row[14]);
$ShipmentWeight = trim($row[15]);
$UnitPrice = trim($row[16]);
$NetValue = trim($row[17]);
$TotalItemAmount = trim($row[18]);
$TaxAmount = trim($row[19]);
$TransportMode = trim($row[20]);
$VehicleNumber = trim($row[21]);
$EWayBillNumber = trim($row[22]);
$plant = Plant::where('code', $plantCode)->first();
if (! $plant) {
throw new \Exception("Invalid plant code : '{$plantCode}'");
}
if (! empty($invoiceDt))
{
if (preg_match('/^\d{2}[-\/]\d{2}[-\/]\d{4}$/', $invoiceDt)) {
[$day, $month, $year] = preg_split('/[-\/]/', $invoiceDt);
$formattedDate = "{$year}-{$month}-{$day}";
} elseif (is_numeric($invoiceDt)) {
$formattedDate = \PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($invoiceDt)->format('Y-m-d');
} else {
$formattedDate = date('Y-m-d', strtotime($invoiceDt));
}
} else {
$formattedDate = null;
}
if (! empty($LRBAWDt))
{
if (preg_match('/^\d{2}[-\/]\d{2}[-\/]\d{4}$/', $LRBAWDt)) {
[$day, $month, $year] = preg_split('/[-\/]/', $LRBAWDt);
$formattedDt = "{$year}-{$month}-{$day}";
} elseif (is_numeric($LRBAWDt)) {
$formattedDt = \PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($LRBAWDt)->format('Y-m-d');
} else {
$formattedDt = date('Y-m-d', strtotime($LRBAWDt));
}
} else {
$formattedDt = null;
}
if (! empty($OBDDate))
{
if (preg_match('/^\d{2}[-\/]\d{2}[-\/]\d{4}$/', $OBDDate)) {
[$day, $month, $year] = preg_split('/[-\/]/', $OBDDate);
$formattedDate = "{$year}-{$month}-{$day}";
} elseif (is_numeric($OBDDate)) {
$formatted = \PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($OBDDate)->format('Y-m-d');
} else {
$formatted = date('Y-m-d', strtotime($OBDDate));
}
} else {
$formatted = null;
}
$inserted = InvoiceInTransit::create([
'plant_id' => $plant->id,
'receiving_plant' => $receivingPlant,
'receiving_plant_name' => $receivingPlantName,
'invoice_number' => $invoiceNo,
'invoice_date' => $formattedDate,
'item_code' => $itemCode,
'description' => $des,
'quantity' => $quantity,
'transport_name' => $transportName,
'lr_bl_aw_number' => $LRBAWNo,
'lr_bl_aw_date' => $formattedDt,
'pending_days' => $pendingDays,
'obd_number' => $OBDNumber,
'obd_date' => $formatted,
'shipment_weight' => $ShipmentWeight,
'unit_price' => $UnitPrice,
'net_value' => $NetValue,
'total_item_amount' => $TotalItemAmount,
'tax_amount' => $TaxAmount,
'transport_mode' => $TransportMode,
'vehicle_number' => $VehicleNumber,
'e_waybill_number' => $EWayBillNumber,
'created_at' => now(),
'created_by' => $operatorName,
]);
}
if ($inserted) {
Notification::make()
->title('Upload Success')
->body('Invoice in transit uploaded successfully!')
->success()
->send();
return;
}
else
{
Notification::make()
->title('Insertion Failed')
->body('Invoice in transit upload failed!')
->success()
->send();
return;
}
}
})
->visible(function () {
return Filament::auth()->user()->can('view import invoice in transit');
}),
ExportAction::make()
->label('Export Invoice In Transit')
->color('warning')
->exporter(InvoiceInTransitExporter::class)
->visible(function () {
return Filament::auth()->user()->can('view export invoice in transit');
}),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListInvoiceInTransits::route('/'),
'create' => Pages\CreateInvoiceInTransit::route('/create'),
'view' => Pages\ViewInvoiceInTransit::route('/{record}'),
'edit' => Pages\EditInvoiceInTransit::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\InvoiceInTransitResource\Pages;
use App\Filament\Resources\InvoiceInTransitResource;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
class CreateInvoiceInTransit extends CreateRecord
{
protected static string $resource = InvoiceInTransitResource::class;
}

View File

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

View File

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

View File

@@ -0,0 +1,301 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Exports\InvoiceMasterExporter;
use App\Filament\Resources\InvoiceMasterResource\Pages;
use App\Filament\Resources\InvoiceMasterResource\RelationManagers;
use App\Models\InvoiceMaster;
use Filament\Facades\Filament;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Notifications\Notification;
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 Storage;
use Maatwebsite\Excel\Facades\Excel;
use Filament\Forms\Components\FileUpload;
class InvoiceMasterResource extends Resource
{
protected static ?string $model = InvoiceMaster::class;
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
protected static ?string $navigationGroup = 'Manufacturing SD';
public static function form(Form $form): Form
{
return $form
->schema([
Forms\Components\TextInput::make('receiving_plant')
->label('Receiving Plant'),
Forms\Components\TextInput::make('receiving_plant_name')
->label('Receiving Plant Name'),
Forms\Components\TextInput::make('transit_days')
->label('Transit Days'),
Forms\Components\TextInput::make('transport_name')
->label('Transport Name'),
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.')
->alignCenter()
->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('receiving_plant')
->label('Receiving Plant')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('receiving_plant_name')
->label('Receiving Plant Name')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('transit_days')
->label('Transit Days')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('transport_name')
->label('Transport Name')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('created_at')
->label('Created At')
->alignCenter()
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('updated_at')
->label('Updated At')
->alignCenter()
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('deleted_at')
->label('Deleted At')
->alignCenter()
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
Tables\Filters\TrashedFilter::make(),
])
->actions([
Tables\Actions\ViewAction::make(),
Tables\Actions\EditAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
Tables\Actions\ForceDeleteBulkAction::make(),
Tables\Actions\RestoreBulkAction::make(),
]),
])
->headerActions([
Tables\Actions\Action::make('Import Invoice Master')
->label('Import Invoice Master')
->form([
FileUpload::make('invoice_master_file')
->label('Import Invoice Master')
->preserveFilenames()
->storeFiles(false)
->reactive()
->required()
->disk('local')
->directory('uploads/temp'),
])
->action(function (array $data) {
$uploadedFile = $data['invoice_master_file'];
$disk = Storage::disk('local');
$user = Filament::auth()->user();
$operatorName = $user->name;
// Get original filename
$originalName = $uploadedFile->getClientOriginalName();
$path = $uploadedFile->storeAs('uploads/temp', $originalName, 'local'); // returns relative path
$fullPath = Storage::disk('local')->path($path);
if ($fullPath && file_exists($fullPath))
{
$rows = Excel::toArray(null, $fullPath)[0];
if ((count($rows) - 1) <= 0) {
Notification::make()
->title('Records Not Found')
->body("Import the valid 'Invoice Master Data' file to proceed..!")
->danger()
->send();
if ($disk->exists($path)) {
$disk->delete($path);
}
return;
}
$invalidReceivePlant = [];
$invalidReceivePlantName = [];
$invalidTransitDays = [];
$invalidTransportName = [];
foreach ($rows as $index => $row) {
if ($index == 0) {
continue;
}
$receivingPlant = trim($row[0]);
$receivingPlantName = trim($row[1]);
$transitDays = trim($row[2]);
$transportName = trim($row[3]);
if (empty($receivingPlant)) {
$invalidReceivePlant[] = "Row {$index}";
}
if (empty($receivingPlantName)) {
$invalidReceivePlantName[] = "Row {$index}";
}
if (empty($transitDays)) {
$invalidTransitDays[] = "Row {$index}";
}
if (empty($transportName)) {
$invalidTransportName[] = "Row {$index}";
}
}
if (! empty($invalidReceivePlant) || ! empty($invalidReceivePlantName) || ! empty($invalidTransitDays) || ! empty($invalidTransportName)) {
$errorMsg = '';
if (! empty($invalidReceivePlant)) {
$errorMsg .= 'Missing Receiving Plant in rows: '.implode(', ', $invalidReceivePlant).'<br>';
}
if (! empty($invalidReceivePlantName)) {
$errorMsg .= 'Missing Receiving Plant Name in rows: '.implode(', ', $invalidReceivePlantName).'<br>';
}
if (! empty($invalidTransitDays)) {
$errorMsg .= 'Missing Transit Days in rows: '.implode(', ', $invalidTransitDays).'<br>';
}
if (! empty($invalidTransportName)) {
$errorMsg .= 'Missing Transport Name in rows: '.implode(', ', $invalidTransportName).'<br>';
}
Notification::make()
->title('Missing Mandatory Fields')
->body($errorMsg)
->danger()
->send();
if ($disk->exists($path)) {
$disk->delete($path);
}
return;
}
foreach ($rows as $index => $row)
{
if ($index == 0) {
continue;
}
$receivingPlant = trim($row[0]);
$receivingPlantName = trim($row[1]);
$transitDays = trim($row[2]);
$transportName = trim($row[3]);
$inserted = InvoiceMaster::create([
'receiving_plant' => $receivingPlant,
'receiving_plant_name' => $receivingPlantName,
'transit_days' => $transitDays,
'transport_name' => $transportName,
'created_at' => now(),
'created_by' => $operatorName,
]);
}
if ($inserted) {
Notification::make()
->title('Upload Success')
->body('Invoice master uploaded successfully!')
->success()
->send();
return;
}
else
{
Notification::make()
->title('Insertion Failed')
->body('Invoice master upload failed!')
->success()
->send();
return;
}
}
})
->visible(function () {
return Filament::auth()->user()->can('view import invoice master');
}),
ExportAction::make()
->label('Export Invoice Master')
->color('warning')
->exporter(InvoiceMasterExporter::class)
->visible(function () {
return Filament::auth()->user()->can('view export invoice master');
}),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListInvoiceMasters::route('/'),
'create' => Pages\CreateInvoiceMaster::route('/create'),
'view' => Pages\ViewInvoiceMaster::route('/{record}'),
'edit' => Pages\EditInvoiceMaster::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\InvoiceMasterResource\Pages;
use App\Filament\Resources\InvoiceMasterResource;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
class CreateInvoiceMaster extends CreateRecord
{
protected static string $resource = InvoiceMasterResource::class;
}

View File

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

View File

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

View File

@@ -30,7 +30,7 @@ class InvoiceOutValidationResource extends Resource
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
protected static ?string $navigationGroup = 'Invoice Management';
protected static ?string $navigationGroup = 'Manufacturing SD';
public static function form(Form $form): Form
{

File diff suppressed because it is too large Load Diff

View File

@@ -53,6 +53,7 @@ class CreateInvoiceValidation extends CreateRecord
public bool $showCapacitorInput = false;
public $excel_file;
public $mInvoiceNo;
public function getFormActions(): array
{
@@ -103,6 +104,8 @@ class CreateInvoiceValidation extends CreateRecord
{
$invoiceNumber = trim($invoiceNumber);
$parts = explode('.', $invoiceNumber);
$this->showCapacitorInput = false;
$user = Filament::auth()->user();
@@ -118,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;
@@ -2261,7 +2320,7 @@ class CreateInvoiceValidation extends CreateRecord
];
}
public function processSerial($serNo)
public function processSer($serNo)
{
$serNo = trim($serNo);
$mSerNo = $serNo;
@@ -2742,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,
@@ -2784,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,
@@ -2825,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,
@@ -3171,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.");
@@ -3379,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');
@@ -3509,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');
@@ -3582,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,
@@ -3719,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';
@@ -3765,11 +3746,11 @@ class CreateInvoiceValidation extends CreateRecord
}
}
// #[On('process-scan')]
// public function processSerial($serial)
// {
// $this->processSer($serial); // Your duplicate check + mail logic
// }
#[On('process-scan')]
public function processSerial($serial)
{
$this->processSer($serial);
}
public function getHeading(): string
{

View File

@@ -30,6 +30,10 @@ use Filament\Forms\Components\Select;
use App\Models\Line;
use Filament\Forms\Components\TextInput;
use App\Models\Item;
use App\Models\User;
// use App\Models\PalletValidation;
// use Dom\Text;
class ProcessOrderResource extends Resource
{
@@ -81,7 +85,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');
@@ -90,20 +94,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(),
@@ -115,7 +122,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 {
@@ -124,6 +131,22 @@ 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(),
@@ -265,10 +288,16 @@ class ProcessOrderResource extends Resource
->disk('local')
->directory('uploads/temp')
->preserveFilenames()
->visible(function() {
return Filament::auth()->user()->can('view process order packing slip');
})
->reactive(),
Forms\Components\Actions::make([
Action::make('uploadNow')
->label('Upload PDF Now')
->visible(function() {
return Filament::auth()->user()->can('view process order packing slip');
})
->action(function ($get, callable $set) {
$uploadedFiles = $get('attachment');
@@ -356,6 +385,9 @@ class ProcessOrderResource extends Resource
Action::make('downloadAttachment')
->label('Download PDF')
->visible(function() {
return Filament::auth()->user()->can('view process order packing slip');
})
->action(function ($get) {
$equipmentNumber = $get('process_order');
@@ -450,7 +482,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')
@@ -468,6 +499,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()
@@ -528,8 +564,7 @@ class ProcessOrderResource extends Resource
// ->filters([
// Tables\Filters\TrashedFilter::make(),
// ])
->filters([
->filters([
Tables\Filters\TrashedFilter::make(),
Filter::make('advanced_filters')
->label('Advanced Filters')
@@ -548,10 +583,17 @@ class ProcessOrderResource extends Resource
Select::make('Item')
->label('Item Code')
->nullable()
->searchable()
->options(function (callable $get) {
$plantId = $get('Plant');
return $plantId ? Item::where('plant_id', $plantId)->pluck('code', 'id') : [];
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) {
@@ -611,8 +653,6 @@ class ProcessOrderResource extends Resource
if (!empty($data['created_to'])) {
$query->where('created_at', '<=', $data['created_to']);
}
//$query->orderBy('created_at', 'asc');
})
->indicateUsing(function (array $data) {
@@ -662,6 +702,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

@@ -6,6 +6,7 @@ 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\Item;
use App\Models\Line;
use App\Models\Machine;
use App\Models\Plant;
@@ -22,11 +23,17 @@ use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Tables\Actions\ImportAction;
use Filament\Tables\Actions\ExportAction;
use Filament\Forms\Components\DateTimePicker;
use Filament\Tables\Filters\Filter;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
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
@@ -230,47 +237,57 @@ class ProductCharacteristicsMasterResource extends Resource
}),
Tables\Columns\TextColumn::make('plant.name')
->label('Plant')
->searchable()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('item.code')
->label('Item Code')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('line.name')
->label('Line')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('characteristics_type')
->label('Characteristics Type')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('workGroupMaster.name')
->label('Group Work Center')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('machine.work_center')
->label('Work Center')
->alignCenter()
->searchable()
->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()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('lower')
->label('Lower')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('middle')
->label('Middle')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('upper')
->label('Upper')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('created_at')
->label('Created At')
@@ -300,9 +317,203 @@ class ProductCharacteristicsMasterResource 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('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('work_group_master')
->label('Select Work Group Master')
->nullable()
->options(function (callable $get) {
$plantId = $get('Plant');
if(empty($plantId)) {
return [];
}
return WorkGroupMaster::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('Machine', 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('characteristics_type')
->label('Characteristics Type')
->options([
'Product' => 'Product',
'Process' => 'Process'
]),
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['work_group_master']) && empty($data['Machine']) && empty($data['characteristics_type']) && 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['work_group_master'])) {
$query->where('work_group_master_id', $data['work_group_master']);
}
if (!empty($data['Machine'])) {
$query->where('machine_id', $data['Machine']);
}
if (!empty($data['characteristics_type'])) {
$query->where('characteristics_type', $data['characteristics_type']);
}
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['work_group_master'])) {
$indicators[] = 'Work Group Master: ' . WorkGroupMaster::where('id', $data['work_group_master'])->value('name');
}
if (!empty($data['Machine'])) {
$indicators[] = 'Machine: ' . Machine::where('id', $data['Machine'])->value('work_center');
}
if (!empty($data['characteristics_type'])) {
$indicators[] = 'Characteristics Type: ' . $data['characteristics_type'];
}
if (!empty($data['created_from'])) {
$indicators[] = 'From: ' . $data['created_from'];
}
if (!empty($data['created_to'])) {
$indicators[] = 'To: ' . $data['created_to'];
}
return $indicators;
})
])
->filtersFormMaxHeight('280px')
->actions([
Tables\Actions\ViewAction::make(),
Tables\Actions\EditAction::make(),

View File

@@ -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 = [];
@@ -706,7 +710,6 @@ class QualityValidationResource extends Resource
$fileName = "{$value}.png";
$imageUrl = route('part.validation.image', [
'plant' => $plantCode1,
'filename' => $fileName
]);
@@ -1731,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;
@@ -1832,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;
}
@@ -1856,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;
@@ -1941,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);
@@ -1962,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 {
@@ -1989,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;
@@ -2092,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;
}
@@ -2305,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);
@@ -2316,7 +2454,7 @@ class QualityValidationResource extends Resource
// ]);
if (file_exists($fullPath)) {
$imageUrl = route('part.validation.image', [
'plant' => $plantCodePart1,
// 'plant' => $plantCodePart1,
'filename' => $fileName
]);
} else {
@@ -2607,7 +2745,7 @@ class QualityValidationResource extends Resource
'filename' => $fileName
]);
$set('part_validation2_error_image', $imageUrl);
$set('part_validation4_error_image', $imageUrl);
return;
}
@@ -2771,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

@@ -844,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

@@ -26,6 +26,8 @@ class StickerPrintingResource extends Resource
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
protected static ?string $navigationGroup = 'Sticker Reprint';
public static function form(Form $form): Form
{
return $form
@@ -38,7 +40,6 @@ class StickerPrintingResource extends Resource
->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()

View File

@@ -0,0 +1,252 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Resources\TestingTempResource\Pages;
use App\Filament\Resources\TestingTempResource\RelationManagers;
use App\Models\TestingTemp;
use Filament\Facades\Filament;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Forms\Components\Actions\Action;
use Filament\Notifications\Notification;
use Storage;
use Livewire\Features\SupportFileUploads\TemporaryUploadedFile;
class TestingTempResource extends Resource
{
protected static ?string $model = TestingTemp::class;
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
public static function form(Form $form): Form
{
return $form
->schema([
Forms\Components\TextInput::make('name')
->label('File Name'),
Forms\Components\Select::make('selected_file')
->label('Select Uploaded File')
->options(function () {
return collect(Storage::disk('local')->files('uploads'))
->mapWithKeys(function ($file) {
return [
$file => basename($file), // value => label
];
})
->toArray();
})
->searchable()
->reactive(),
Forms\Components\FileUpload::make('attachment')
->label('Upload')
// ->acceptedFileTypes(['application/pdf'])
->storeFiles(false)
->disk('local')
->directory('uploads/temp')
->preserveFilenames()
->reactive(),
Forms\Components\Actions::make([
Action::make('uploadNow')
->label('File Upload')
->color('success')
->action(function ($get) {
$uploadedFiles = $get('attachment');
if (is_array($uploadedFiles) && count($uploadedFiles) > 0) {
$uploaded = reset($uploadedFiles);
if ($uploaded instanceof TemporaryUploadedFile) {
$baseName = $get('name');
$extension = $uploaded->getClientOriginalExtension();
$finalFileName = $baseName . '.' . $extension;
$uploaded->storeAs(
'uploads',
$finalFileName,
'local'
);
Notification::make()
->title("File uploaded successfully: {$finalFileName}")
->success()
->send();
}
} else {
Notification::make()
->title('No file selected to upload')
->warning()
->send();
}
}),
// Action::make('downloadAttachment')
// ->label('Download File')
// ->action(function ($get) {
// $fileName = basename($get('selected_file'));
// //dd($fileName);
// // if (!$fileName) {
// // Notification::make()
// // ->title('Enter file name to download')
// // ->danger()
// // ->send();
// // return;
// // }
// $files = Storage::disk('local')->files('uploads');
// foreach ($files as $file) {
// if (pathinfo($file, PATHINFO_FILENAME) === $fileName) {
// dd($fileName);
// Notification::make()
// ->title("File downloaded successfully")
// ->success()
// ->send();
// return response()->download(
// Storage::disk('local')->path($file)
// );
// }
// }
// // Notification::make()
// // ->title('File not found')
// // ->danger()
// // ->send();
// }),
Action::make('downloadAttachment')
->label('Download File')
->action(function ($get) {
$filePath = $get('selected_file'); // uploads/filename.pdf
if (!$filePath || !Storage::disk('local')->exists($filePath)) {
Notification::make()
->title('File not found')
->danger()
->send();
return;
}
Notification::make()
->title('File downloaded successfully')
->success()
->send();
return response()->download(
Storage::disk('local')->path($filePath)
);
}),
Action::make('deleteAttachment')
->label('Delete File')
->color('danger')
->requiresConfirmation()
->action(function ($get) {
$filePath = $get('selected_file'); // uploads/filename.pdf
if (!$filePath || !Storage::disk('local')->exists($filePath)) {
Notification::make()
->title('File not found')
->danger()
->send();
return;
}
Storage::disk('local')->delete($filePath);
Notification::make()
->title('File deleted successfully')
->success()
->send();
}),
]),
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('id')
->label('ID')
->numeric()
->sortable(),
Tables\Columns\TextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('deleted_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
Tables\Filters\TrashedFilter::make(),
])
->actions([
Tables\Actions\ViewAction::make(),
Tables\Actions\EditAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
Tables\Actions\ForceDeleteBulkAction::make(),
Tables\Actions\RestoreBulkAction::make(),
]),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListTestingTemps::route('/'),
'create' => Pages\CreateTestingTemp::route('/create'),
'view' => Pages\ViewTestingTemp::route('/{record}'),
'edit' => Pages\EditTestingTemp::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\TestingTempResource\Pages;
use App\Filament\Resources\TestingTempResource;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
class CreateTestingTemp extends CreateRecord
{
protected static string $resource = TestingTempResource::class;
}

View File

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

View File

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

View File

@@ -2,6 +2,7 @@
namespace App\Http\Controllers;
use App\Models\CharacteristicValue;
use App\Models\ClassCharacteristic;
use App\Models\Item;
use App\Models\Line;
@@ -497,7 +498,7 @@ class CharacteristicsController extends Controller
}
}
$col = ['marked_by', 'man_marked_by'];
$col = ['marked_by', 'man_marked_by', 'motor_marked_by', 'pump_marked_by'];
$missingUsers = [];
$missingUsersPlant = [];
$missingUsersRight = [];
@@ -556,25 +557,150 @@ class CharacteristicsController extends Controller
$isAuto = false;
foreach ($data['characteristics'] as $char) {
$values = [
'mark_status' => $char['mark_status'] ?? null,
'marked_datetime' => $char['marked_datetime'] ?? null,
'marked_by' => ($char['marked_by'] == 'jothi') ? 'Admin' : $char['marked_by'] ?? null,
'man_marked_status' => $char['man_marked_status'] ?? null,
'man_marked_datetime' => $char['man_marked_datetime'] ?? null,
'man_marked_by' => ($char['man_marked_by'] == 'jothi') ? 'Admin' : $char['man_marked_by'] ?? null,
'motor_marked_status' => $char['motor_marked_status'] ?? null,
'pump_marked_status' => $char['pump_marked_status'] ?? null,
'motor_pump_pumpset_status' => $char['motor_pump_pumpset_status'] ?? null,
'part_validation_1' => $char['part_validation_1'] ?? null,
'part_validation_2' => $char['part_validation_2'] ?? null,
'samlight_logged_name' => $char['samlight_logged_name'] ?? null,
'pending_released_status' => $char['pending_released_status'] ?? null,
'expected_time' => $char['expected_time'] ?? null,
'updated_by' => $userName ?? null,
];
// $values = [
// 'mark_status' => $char['mark_status'] ?? null,
// 'marked_datetime' => $char['marked_datetime'] ?? null,
// 'marked_by' => ($char['marked_by'] == 'jothi') ? 'Admin' : $char['marked_by'] ?? null,
// 'man_marked_status' => $char['man_marked_status'] ?? null,
// 'man_marked_datetime' => $char['man_marked_datetime'] ?? null,
// 'man_marked_by' => ($char['man_marked_by'] == 'jothi') ? 'Admin' : $char['man_marked_by'] ?? null,
// 'motor_marked_status' => $char['motor_marked_status'] ?? null,
// 'pump_marked_status' => $char['pump_marked_status'] ?? null,
// 'motor_pump_pumpset_status' => $char['motor_pump_pumpset_status'] ?? null,
// 'part_validation_1' => $char['part_validation_1'] ?? null,
// 'part_validation_2' => $char['part_validation_2'] ?? null,
// 'samlight_logged_name' => $char['samlight_logged_name'] ?? null,
// 'pending_released_status' => $char['pending_released_status'] ?? null,
// 'expected_time' => $char['expected_time'] ?? null,
// 'updated_by' => $userName ?? null,
// ];
if ($jobNo != null && $jobNo != '' && $jobNo) {
$curStat = ClassCharacteristic::where('plant_id', $plantId)
->where('machine_id', $machineId)
->where('aufnr', $jobNo)
->where('gernr', $serialNumber)
->where('item_id', $itemId)
->first();
if ($char['mark_status'] == 'Stopped') {
$values = [
'mark_status' => $char['mark_status'] ?? null,
'marked_datetime' => $char['marked_datetime'] ?? null,
'marked_by' => ($char['marked_by'] == 'jothi') ? 'Admin' : $char['marked_by'] ?? null,
'updated_by' => $userName ?? null,
];
} elseif ($char['motor_pump_pumpset_status'] == '3') {
$values = [
'mark_status' => $char['mark_status'] ?? null,
'marked_datetime' => $char['marked_datetime'] ?? null,
'marked_by' => ($char['marked_by'] == 'jothi') ? 'Admin' : $char['marked_by'] ?? null,
'motor_marked_status' => $char['motor_marked_status'] ?? null,
'motor_marked_by' => ($char['motor_marked_by'] == 'jothi') ? 'Admin' : $char['motor_marked_by'] ?? null,
'pump_marked_status' => $char['pump_marked_status'] ?? null,
'pump_marked_by' => ($char['pump_marked_by'] == 'jothi') ? 'Admin' : $char['pump_marked_by'] ?? null,
'motor_pump_pumpset_status' => '3',
'pumpset_machine_name' => $char['pumpset_machine_name'] ?? null,
'part_validation_1' => $char['part_validation_1'] ?? null,
'part_validation_2' => $char['part_validation_2'] ?? null,
'samlight_logged_name' => $char['samlight_logged_name'] ?? null,
// 'pending_released_status' => $char['pending_released_status'] ?? null,
'motor_expected_time' => $char['motor_expected_time'] ?? null,
'pump_expected_time' => $char['pump_expected_time'] ?? null,
'updated_by' => $userName ?? null,
];
} elseif ($char['motor_pump_pumpset_status'] == '2') {
if ($curStat->motor_marked_status == null || $curStat->motor_marked_status == '') {
$values = [
// 'mark_status' => $char['mark_status'] ?? null,
'marked_datetime' => $char['marked_datetime'] ?? null,
// 'marked_by' => ($char['marked_by'] == 'jothi') ? 'Admin' : $char['marked_by'] ?? null,
'pump_marked_status' => $char['pump_marked_status'] ?? null,
'pump_marked_by' => ($char['pump_marked_by'] == 'jothi') ? 'Admin' : $char['pump_marked_by'] ?? null,
'motor_pump_pumpset_status' => '3',
'pump_machine_name' => $char['pump_machine_name'] ?? null,
'part_validation_1' => $char['part_validation_1'] ?? null,
'part_validation_2' => $char['part_validation_2'] ?? null,
'samlight_logged_name' => $char['samlight_logged_name'] ?? null,
// 'pending_released_status' => $char['pending_released_status'] ?? null,
'pump_expected_time' => $char['pump_expected_time'] ?? null,
'updated_by' => $userName ?? null,
];
} else {
$values = [
'mark_status' => $char['mark_status'] ?? null,
'marked_datetime' => $char['marked_datetime'] ?? null,
'marked_by' => ($char['marked_by'] == 'jothi') ? 'Admin' : $char['marked_by'] ?? null,
'pump_marked_status' => $char['pump_marked_status'] ?? null,
'pump_marked_by' => ($char['pump_marked_by'] == 'jothi') ? 'Admin' : $char['pump_marked_by'] ?? null,
'motor_pump_pumpset_status' => '3',
'pump_machine_name' => $char['pump_machine_name'] ?? null,
'part_validation_1' => $char['part_validation_1'] ?? null,
'part_validation_2' => $char['part_validation_2'] ?? null,
'samlight_logged_name' => $char['samlight_logged_name'] ?? null,
// 'pending_released_status' => $char['pending_released_status'] ?? null,
'pump_expected_time' => $char['pump_expected_time'] ?? null,
'updated_by' => $userName ?? null,
];
}
} elseif ($char['motor_pump_pumpset_status'] == '1') {
if ($curStat->pump_marked_status == null || $curStat->pump_marked_status == '') {
$values = [
// 'mark_status' => $char['mark_status'] ?? null,
'marked_datetime' => $char['marked_datetime'] ?? null,
// 'marked_by' => ($char['marked_by'] == 'jothi') ? 'Admin' : $char['marked_by'] ?? null,
'motor_marked_status' => $char['motor_marked_status'] ?? null,
'motor_marked_by' => ($char['motor_marked_by'] == 'jothi') ? 'Admin' : $char['motor_marked_by'] ?? null,
'motor_pump_pumpset_status' => '3',
'motor_machine_name' => $char['motor_machine_name'] ?? null,
'part_validation_1' => $char['part_validation_1'] ?? null,
'part_validation_2' => $char['part_validation_2'] ?? null,
'samlight_logged_name' => $char['samlight_logged_name'] ?? null,
// 'pending_released_status' => $char['pending_released_status'] ?? null,
'motor_expected_time' => $char['motor_expected_time'] ?? null,
'updated_by' => $userName ?? null,
];
} else {
$values = [
'mark_status' => $char['mark_status'] ?? null,
'marked_datetime' => $char['marked_datetime'] ?? null,
'marked_by' => ($char['marked_by'] == 'jothi') ? 'Admin' : $char['marked_by'] ?? null,
'motor_marked_status' => $char['motor_marked_status'] ?? null,
'motor_marked_by' => ($char['motor_marked_by'] == 'jothi') ? 'Admin' : $char['motor_marked_by'] ?? null,
'motor_pump_pumpset_status' => '3',
'motor_machine_name' => $char['motor_machine_name'] ?? null,
'part_validation_1' => $char['part_validation_1'] ?? null,
'part_validation_2' => $char['part_validation_2'] ?? null,
'samlight_logged_name' => $char['samlight_logged_name'] ?? null,
// 'pending_released_status' => $char['pending_released_status'] ?? null,
'motor_expected_time' => $char['motor_expected_time'] ?? null,
'updated_by' => $userName ?? null,
];
}
} else {
$values = [
'mark_status' => $char['mark_status'] ?? null,
'marked_datetime' => $char['marked_datetime'] ?? null,
'marked_by' => ($char['marked_by'] == 'jothi') ? 'Admin' : $char['marked_by'] ?? null,
'motor_marked_status' => $char['motor_marked_status'] ?? null,
'motor_marked_by' => ($char['motor_marked_by'] == 'jothi') ? 'Admin' : $char['motor_marked_by'] ?? null,
'pump_marked_status' => $char['pump_marked_status'] ?? null,
'pump_marked_by' => ($char['pump_marked_by'] == 'jothi') ? 'Admin' : $char['pump_marked_by'] ?? null,
'motor_pump_pumpset_status' => $char['motor_pump_pumpset_status'] ?? null,
'motor_machine_name' => $char['motor_machine_name'] ?? null,
'pump_machine_name' => $char['pump_machine_name'] ?? null,
'pumpset_machine_name' => $char['pumpset_machine_name'] ?? null,
'part_validation_1' => $char['part_validation_1'] ?? null,
'part_validation_2' => $char['part_validation_2'] ?? null,
'samlight_logged_name' => $char['samlight_logged_name'] ?? null,
// 'pending_released_status' => $char['pending_released_status'] ?? null,
'motor_expected_time' => $char['motor_expected_time'] ?? null,
'pump_expected_time' => $char['pump_expected_time'] ?? null,
'updated_by' => $userName ?? null,
];
}
$isAuto = true;
$affected = ClassCharacteristic::where('plant_id', $plantId)
->where('machine_id', $machineId)
@@ -585,6 +711,21 @@ class CharacteristicsController extends Controller
$updatedRows += $affected;
} else {
$curStat = ClassCharacteristic::where('plant_id', $plantId)
->where('machine_id', $machineId)
->where('gernr', $serialNumber)
->where('item_id', $itemId)
->first();
$manStat = ($curStat->man_marked_status == null || $curStat->man_marked_status == '' || $curStat->man_marked_status == '0') ? 0 : (int) $curStat->man_marked_status;
$values = [
'man_marked_status' => (string) ($manStat + 1),
'man_marked_datetime' => $char['man_marked_datetime'] ?? null,
'man_marked_by' => ($char['man_marked_by'] == 'jothi') ? 'Admin' : $char['man_marked_by'] ?? null,
'samlight_logged_name' => $char['samlight_logged_name'] ?? null,
'updated_by' => $userName ?? null,
];
$isAuto = false;
$affected = ClassCharacteristic::where('plant_id', $plantId)
->where('machine_id', $machineId)
@@ -717,9 +858,7 @@ class CharacteristicsController extends Controller
$machineId = $machine->id;
$availFields = [
'class', 'arbid', 'gamng', 'lmnga', 'zz1_cn_bill_ord', 'zmm_amps', 'zmm_brand', 'zmm_degreeofprotection', 'zmm_delivery', 'zmm_dir_rot', 'zmm_discharge', 'zmm_discharge_max', 'zmm_discharge_min', 'zmm_duty', 'zmm_eff_motor', 'zmm_eff_pump', 'zmm_frequency', 'zmm_head', 'zmm_heading', 'zmm_head_max', 'zmm_head_minimum', 'zmm_idx_eff_mtr', 'zmm_idx_eff_pump', 'zmm_kvacode', 'zmm_maxambtemp', 'zmm_mincoolingflow', 'zmm_motorseries', 'zmm_motor_model', 'zmm_outlet', 'zmm_phase', 'zmm_pressure', 'zmm_pumpflowtype', 'zmm_pumpseries', 'zmm_pump_model', 'zmm_ratedpower', 'zmm_region', 'zmm_servicefactor', 'zmm_servicefactormaximumamps', 'zmm_speed', 'zmm_suction', 'zmm_suctionxdelivery', 'zmm_supplysource', 'zmm_temperature', 'zmm_thrustload', 'zmm_volts', 'zmm_wire', 'zmm_package', 'zmm_pvarrayrating', 'zmm_isi', 'zmm_isimotor', 'zmm_isipump', 'zmm_isipumpset', 'zmm_pumpset_model', 'zmm_stages', 'zmm_headrange', 'zmm_overall_efficiency', 'zmm_connection', 'zmm_min_bore_size', 'zmm_isireference', 'zmm_category', 'zmm_submergence', 'zmm_capacitorstart', 'zmm_capacitorrun', 'zmm_inch', 'zmm_motor_type', 'zmm_dismantle_direction', 'zmm_eff_ovrall', 'zmm_bodymoc', 'zmm_rotormoc', 'zmm_dlwl', 'zmm_inputpower', 'zmm_imp_od', 'zmm_ambtemp', 'zmm_de', 'zmm_dischargerange', 'zmm_efficiency_class', 'zmm_framesize', 'zmm_impellerdiameter', 'zmm_insulationclass', 'zmm_maxflow', 'zmm_minhead', 'zmm_mtrlofconst', 'zmm_nde', 'zmm_powerfactor', 'zmm_tagno', 'zmm_year', 'zmm_laser_name', 'zmm_beenote', 'zmm_beenumber', 'zmm_beestar', 'zmm_logo_ce', 'zmm_codeclass', 'zmm_colour', 'zmm_logo_cp', 'zmm_grade', 'zmm_grwt_pset', 'zmm_grwt_cable', 'zmm_grwt_motor', 'zmm_grwt_pf', 'zmm_grwt_pump', 'zmm_isivalve', 'zmm_isi_wc', 'zmm_labelperiod', 'zmm_length', 'zmm_license_cml_no', 'zmm_mfgmonyr', 'zmm_modelyear', 'zmm_motoridentification', 'zmm_newt_pset', 'zmm_newt_cable', 'zmm_newt_motor', 'zmm_newt_pf', 'zmm_newt_pump', 'zmm_logo_nsf', 'zmm_packtype', 'zmm_panel', 'zmm_performance_factor', 'zmm_pumpidentification', 'zmm_psettype', 'zmm_size', 'zmm_eff_ttl', 'zmm_type', 'zmm_usp', 'mark_status', 'marked_datetime', 'marked_by', 'man_marked_status', 'man_marked_datetime', 'man_marked_by', 'motor_marked_status', 'pump_marked_status', 'motor_pump_pumpset_status', 'part_validation_1', 'part_validation_2', 'samlight_logged_name', 'pending_released_status', 'expected_time',
];
$availFields = ['class', 'arbid', 'gamng', 'lmnga', 'zz1_cn_bill_ord', 'zmm_amps', 'zmm_brand', 'zmm_degreeofprotection', 'zmm_delivery', 'zmm_dir_rot', 'zmm_discharge', 'zmm_discharge_max', 'zmm_discharge_min', 'zmm_duty', 'zmm_eff_motor', 'zmm_eff_pump', 'zmm_frequency', 'zmm_head', 'zmm_heading', 'zmm_head_max', 'zmm_head_minimum', 'zmm_idx_eff_mtr', 'zmm_idx_eff_pump', 'zmm_kvacode', 'zmm_maxambtemp', 'zmm_mincoolingflow', 'zmm_motorseries', 'zmm_motor_model', 'zmm_outlet', 'zmm_phase', 'zmm_pressure', 'zmm_pumpflowtype', 'zmm_pumpseries', 'zmm_pump_model', 'zmm_ratedpower', 'zmm_region', 'zmm_servicefactor', 'zmm_servicefactormaximumamps', 'zmm_speed', 'zmm_suction', 'zmm_suctionxdelivery', 'zmm_supplysource', 'zmm_temperature', 'zmm_thrustload', 'zmm_volts', 'zmm_wire', 'zmm_package', 'zmm_pvarrayrating', 'zmm_isi', 'zmm_isimotor', 'zmm_isipump', 'zmm_isipumpset', 'zmm_pumpset_model', 'zmm_stages', 'zmm_headrange', 'zmm_overall_efficiency', 'zmm_connection', 'zmm_min_bore_size', 'zmm_isireference', 'zmm_category', 'zmm_submergence', 'zmm_capacitorstart', 'zmm_capacitorrun', 'zmm_inch', 'zmm_motor_type', 'zmm_dismantle_direction', 'zmm_eff_ovrall', 'zmm_bodymoc', 'zmm_rotormoc', 'zmm_dlwl', 'zmm_inputpower', 'zmm_imp_od', 'zmm_ambtemp', 'zmm_de', 'zmm_dischargerange', 'zmm_efficiency_class', 'zmm_framesize', 'zmm_impellerdiameter', 'zmm_insulationclass', 'zmm_maxflow', 'zmm_minhead', 'zmm_mtrlofconst', 'zmm_nde', 'zmm_powerfactor', 'zmm_tagno', 'zmm_year', 'zmm_laser_name', 'zmm_logo_cp', 'zmm_logo_ce', 'zmm_logo_nsf', 'zmm_beenote', 'zmm_beenumber', 'zmm_beestar', 'zmm_codeclass', 'zmm_colour', 'zmm_grade', 'zmm_grwt_pset', 'zmm_grwt_cable', 'zmm_grwt_motor', 'zmm_grwt_pf', 'zmm_grwt_pump', 'zmm_isivalve', 'zmm_isi_wc', 'zmm_labelperiod', 'zmm_length', 'zmm_license_cml_no', 'zmm_mfgmonyr', 'zmm_modelyear', 'zmm_motoridentification', 'zmm_newt_pset', 'zmm_newt_cable', 'zmm_newt_motor', 'zmm_newt_pf', 'zmm_newt_pump', 'zmm_packtype', 'zmm_panel', 'zmm_performance_factor', 'zmm_pumpidentification', 'zmm_psettype', 'zmm_size', 'zmm_eff_ttl', 'zmm_type', 'zmm_usp', 'mark_status', 'marked_datetime', 'marked_by', 'man_marked_status', 'man_marked_datetime', 'man_marked_by', 'motor_marked_status', 'motor_marked_by', 'pump_marked_status', 'pump_marked_by', 'motor_pump_pumpset_status', 'motor_machine_name', 'pump_machine_name', 'pumpset_machine_name', 'part_validation_1', 'part_validation_2', 'samlight_logged_name', 'pending_released_status', 'motor_expected_time', 'pump_expected_time'];
if ($itemCode != '' && $itemCode != null && $itemCode && Str::length($itemCode) > 0) {
$existingJob = ClassCharacteristic::where('plant_id', $plantId)
@@ -805,7 +944,7 @@ class CharacteristicsController extends Controller
], 404);
}
$col = ['marked_by', 'man_marked_by'];
$col = ['marked_by', 'man_marked_by', 'motor_marked_by', 'pump_marked_by'];
$missingUsers = [];
$missingUsersPlant = [];
$missingUsersRight = [];
@@ -910,6 +1049,8 @@ class CharacteristicsController extends Controller
$insertData['marked_by'] = ($char['marked_by'] == 'jothi') ? 'Admin' : $char['marked_by'] ?? null;
$insertData['man_marked_by'] = ($char['man_marked_by'] == 'jothi') ? 'Admin' : $char['man_marked_by'] ?? null;
$insertData['motor_marked_by'] = ($char['motor_marked_by'] == 'jothi') ? 'Admin' : $char['motor_marked_by'] ?? null;
$insertData['pump_marked_by'] = ($char['pump_marked_by'] == 'jothi') ? 'Admin' : $char['pump_marked_by'] ?? null;
$existing = ClassCharacteristic::where('plant_id', $plantId)
->where('item_id', $itemId)
@@ -989,7 +1130,7 @@ class CharacteristicsController extends Controller
} else {
$hasNewSno = true;
$col = ['marked_by', 'man_marked_by'];
$col = ['marked_by', 'man_marked_by', 'motor_marked_by', 'pump_marked_by'];
$missingUsers = [];
$missingUsersPlant = [];
$missingUsersRight = [];
@@ -1081,9 +1222,7 @@ class CharacteristicsController extends Controller
], 404);
}
$masterFields = [
'class', 'arbid', 'gamng', 'lmnga', 'zz1_cn_bill_ord', 'zmm_amps', 'zmm_brand', 'zmm_degreeofprotection', 'zmm_delivery', 'zmm_dir_rot', 'zmm_discharge', 'zmm_discharge_max', 'zmm_discharge_min', 'zmm_duty', 'zmm_eff_motor', 'zmm_eff_pump', 'zmm_frequency', 'zmm_head', 'zmm_heading', 'zmm_head_max', 'zmm_head_minimum', 'zmm_idx_eff_mtr', 'zmm_idx_eff_pump', 'zmm_kvacode', 'zmm_maxambtemp', 'zmm_mincoolingflow', 'zmm_motorseries', 'zmm_motor_model', 'zmm_outlet', 'zmm_phase', 'zmm_pressure', 'zmm_pumpflowtype', 'zmm_pumpseries', 'zmm_pump_model', 'zmm_ratedpower', 'zmm_region', 'zmm_servicefactor', 'zmm_servicefactormaximumamps', 'zmm_speed', 'zmm_suction', 'zmm_suctionxdelivery', 'zmm_supplysource', 'zmm_temperature', 'zmm_thrustload', 'zmm_volts', 'zmm_wire', 'zmm_package', 'zmm_pvarrayrating', 'zmm_isi', 'zmm_isimotor', 'zmm_isipump', 'zmm_isipumpset', 'zmm_pumpset_model', 'zmm_stages', 'zmm_headrange', 'zmm_overall_efficiency', 'zmm_connection', 'zmm_min_bore_size', 'zmm_isireference', 'zmm_category', 'zmm_submergence', 'zmm_capacitorstart', 'zmm_capacitorrun', 'zmm_inch', 'zmm_motor_type', 'zmm_dismantle_direction', 'zmm_eff_ovrall', 'zmm_bodymoc', 'zmm_rotormoc', 'zmm_dlwl', 'zmm_inputpower', 'zmm_imp_od', 'zmm_ambtemp', 'zmm_de', 'zmm_dischargerange', 'zmm_efficiency_class', 'zmm_framesize', 'zmm_impellerdiameter', 'zmm_insulationclass', 'zmm_maxflow', 'zmm_minhead', 'zmm_mtrlofconst', 'zmm_nde', 'zmm_powerfactor', 'zmm_tagno', 'zmm_year', 'zmm_laser_name',
];
$masterFields = ['class', 'arbid', 'gamng', 'lmnga', 'zz1_cn_bill_ord', 'zmm_amps', 'zmm_brand', 'zmm_degreeofprotection', 'zmm_delivery', 'zmm_dir_rot', 'zmm_discharge', 'zmm_discharge_max', 'zmm_discharge_min', 'zmm_duty', 'zmm_eff_motor', 'zmm_eff_pump', 'zmm_frequency', 'zmm_head', 'zmm_heading', 'zmm_head_max', 'zmm_head_minimum', 'zmm_idx_eff_mtr', 'zmm_idx_eff_pump', 'zmm_kvacode', 'zmm_maxambtemp', 'zmm_mincoolingflow', 'zmm_motorseries', 'zmm_motor_model', 'zmm_outlet', 'zmm_phase', 'zmm_pressure', 'zmm_pumpflowtype', 'zmm_pumpseries', 'zmm_pump_model', 'zmm_ratedpower', 'zmm_region', 'zmm_servicefactor', 'zmm_servicefactormaximumamps', 'zmm_speed', 'zmm_suction', 'zmm_suctionxdelivery', 'zmm_supplysource', 'zmm_temperature', 'zmm_thrustload', 'zmm_volts', 'zmm_wire', 'zmm_package', 'zmm_pvarrayrating', 'zmm_isi', 'zmm_isimotor', 'zmm_isipump', 'zmm_isipumpset', 'zmm_pumpset_model', 'zmm_stages', 'zmm_headrange', 'zmm_overall_efficiency', 'zmm_connection', 'zmm_min_bore_size', 'zmm_isireference', 'zmm_category', 'zmm_submergence', 'zmm_capacitorstart', 'zmm_capacitorrun', 'zmm_inch', 'zmm_motor_type', 'zmm_dismantle_direction', 'zmm_eff_ovrall', 'zmm_bodymoc', 'zmm_rotormoc', 'zmm_dlwl', 'zmm_inputpower', 'zmm_imp_od', 'zmm_ambtemp', 'zmm_de', 'zmm_dischargerange', 'zmm_efficiency_class', 'zmm_framesize', 'zmm_impellerdiameter', 'zmm_insulationclass', 'zmm_maxflow', 'zmm_minhead', 'zmm_mtrlofconst', 'zmm_nde', 'zmm_powerfactor', 'zmm_tagno', 'zmm_year', 'zmm_laser_name', 'zmm_logo_cp', 'zmm_logo_ce', 'zmm_logo_nsf'];
$isInsertOrUpdate = false;
@@ -1146,6 +1285,8 @@ class CharacteristicsController extends Controller
$insertData['marked_by'] = ($char['marked_by'] == 'jothi') ? 'Admin' : $char['marked_by'] ?? null;
$insertData['man_marked_by'] = ($char['man_marked_by'] == 'jothi') ? 'Admin' : $char['man_marked_by'] ?? null;
$insertData['motor_marked_by'] = ($char['motor_marked_by'] == 'jothi') ? 'Admin' : $char['motor_marked_by'] ?? null;
$insertData['pump_marked_by'] = ($char['pump_marked_by'] == 'jothi') ? 'Admin' : $char['pump_marked_by'] ?? null;
$existing = ClassCharacteristic::where('plant_id', $plantId)
->where('item_id', $itemId)
@@ -1338,9 +1479,9 @@ class CharacteristicsController extends Controller
], 400);
}
$columnsToShow = ['mark_status', 'marked_datetime', 'marked_by', 'man_marked_status', 'man_marked_datetime', 'man_marked_by', 'motor_marked_status', 'pump_marked_status', 'motor_pump_pumpset_status', 'part_validation_1', 'part_validation_2', 'samlight_logged_name', 'pending_released_status', 'expected_time'];
$columnsToShow = ['mark_status', 'marked_datetime', 'marked_by', 'man_marked_status', 'man_marked_datetime', 'man_marked_by', 'motor_marked_status', 'motor_marked_by', 'pump_marked_status', 'pump_marked_by', 'motor_pump_pumpset_status', 'motor_machine_name', 'pump_machine_name', 'pumpset_machine_name', 'part_validation_1', 'part_validation_2', 'samlight_logged_name', 'pending_released_status', 'motor_expected_time', 'pump_expected_time'];
$characteristicsColumns = ['class', 'arbid', 'gamng', 'lmnga', 'zz1_cn_bill_ord', 'zmm_amps', 'zmm_brand', 'zmm_degreeofprotection', 'zmm_delivery', 'zmm_dir_rot', 'zmm_discharge', 'zmm_discharge_max', 'zmm_discharge_min', 'zmm_duty', 'zmm_eff_motor', 'zmm_eff_pump', 'zmm_frequency', 'zmm_head', 'zmm_heading', 'zmm_head_max', 'zmm_head_minimum', 'zmm_idx_eff_mtr', 'zmm_idx_eff_pump', 'zmm_kvacode', 'zmm_maxambtemp', 'zmm_mincoolingflow', 'zmm_motorseries', 'zmm_motor_model', 'zmm_outlet', 'zmm_phase', 'zmm_pressure', 'zmm_pumpflowtype', 'zmm_pumpseries', 'zmm_pump_model', 'zmm_ratedpower', 'zmm_region', 'zmm_servicefactor', 'zmm_servicefactormaximumamps', 'zmm_speed', 'zmm_suction', 'zmm_suctionxdelivery', 'zmm_supplysource', 'zmm_temperature', 'zmm_thrustload', 'zmm_volts', 'zmm_wire', 'zmm_package', 'zmm_pvarrayrating', 'zmm_isi', 'zmm_isimotor', 'zmm_isipump', 'zmm_isipumpset', 'zmm_pumpset_model', 'zmm_stages', 'zmm_headrange', 'zmm_overall_efficiency', 'zmm_connection', 'zmm_min_bore_size', 'zmm_isireference', 'zmm_category', 'zmm_submergence', 'zmm_capacitorstart', 'zmm_capacitorrun', 'zmm_inch', 'zmm_motor_type', 'zmm_dismantle_direction', 'zmm_eff_ovrall', 'zmm_bodymoc', 'zmm_rotormoc', 'zmm_dlwl', 'zmm_inputpower', 'zmm_imp_od', 'zmm_ambtemp', 'zmm_de', 'zmm_dischargerange', 'zmm_efficiency_class', 'zmm_framesize', 'zmm_impellerdiameter', 'zmm_insulationclass', 'zmm_maxflow', 'zmm_minhead', 'zmm_mtrlofconst', 'zmm_nde', 'zmm_powerfactor', 'zmm_tagno', 'zmm_year', 'zmm_laser_name'];
$characteristicsColumns = ['class', 'arbid', 'gamng', 'lmnga', 'zz1_cn_bill_ord', 'zmm_amps', 'zmm_brand', 'zmm_degreeofprotection', 'zmm_delivery', 'zmm_dir_rot', 'zmm_discharge', 'zmm_discharge_max', 'zmm_discharge_min', 'zmm_duty', 'zmm_eff_motor', 'zmm_eff_pump', 'zmm_frequency', 'zmm_head', 'zmm_heading', 'zmm_head_max', 'zmm_head_minimum', 'zmm_idx_eff_mtr', 'zmm_idx_eff_pump', 'zmm_kvacode', 'zmm_maxambtemp', 'zmm_mincoolingflow', 'zmm_motorseries', 'zmm_motor_model', 'zmm_outlet', 'zmm_phase', 'zmm_pressure', 'zmm_pumpflowtype', 'zmm_pumpseries', 'zmm_pump_model', 'zmm_ratedpower', 'zmm_region', 'zmm_servicefactor', 'zmm_servicefactormaximumamps', 'zmm_speed', 'zmm_suction', 'zmm_suctionxdelivery', 'zmm_supplysource', 'zmm_temperature', 'zmm_thrustload', 'zmm_volts', 'zmm_wire', 'zmm_package', 'zmm_pvarrayrating', 'zmm_isi', 'zmm_isimotor', 'zmm_isipump', 'zmm_isipumpset', 'zmm_pumpset_model', 'zmm_stages', 'zmm_headrange', 'zmm_overall_efficiency', 'zmm_connection', 'zmm_min_bore_size', 'zmm_isireference', 'zmm_category', 'zmm_submergence', 'zmm_capacitorstart', 'zmm_capacitorrun', 'zmm_inch', 'zmm_motor_type', 'zmm_dismantle_direction', 'zmm_eff_ovrall', 'zmm_bodymoc', 'zmm_rotormoc', 'zmm_dlwl', 'zmm_inputpower', 'zmm_imp_od', 'zmm_ambtemp', 'zmm_de', 'zmm_dischargerange', 'zmm_efficiency_class', 'zmm_framesize', 'zmm_impellerdiameter', 'zmm_insulationclass', 'zmm_maxflow', 'zmm_minhead', 'zmm_mtrlofconst', 'zmm_nde', 'zmm_powerfactor', 'zmm_tagno', 'zmm_year', 'zmm_laser_name', 'zmm_logo_cp', 'zmm_logo_ce', 'zmm_logo_nsf'];
$characteristicsData = ClassCharacteristic::where('aufnr', $jobNumber)
->where('plant_id', $plantId)
@@ -1391,6 +1532,8 @@ class CharacteristicsController extends Controller
$otherData['marked_by'] = ($otherData['marked_by'] == 'Admin') ? 'jothi' : $otherData['marked_by'] ?? '';
$otherData['man_marked_by'] = ($otherData['man_marked_by'] == 'Admin') ? 'jothi' : $otherData['man_marked_by'] ?? '';
$otherData['motor_marked_by'] = ($otherData['motor_marked_by'] == 'Admin') ? 'jothi' : $otherData['motor_marked_by'] ?? '';
$otherData['pump_marked_by'] = ($otherData['pump_marked_by'] == 'Admin') ? 'jothi' : $otherData['pump_marked_by'] ?? '';
// $otherData['pending_released_status'] = (string)$otherData['pending_released_status'] ?? '';
return array_merge(['gernr' => $serial->gernr], $otherData);
@@ -1505,7 +1648,7 @@ class CharacteristicsController extends Controller
], 404);
}
if ($serialExists->mark_status != 'Marked' && $serialExists->mark_status != 'marked') {
if ($serialExists->mark_status != 'Marked' && $serialExists->motor_marked_status != 'Marked' && $serialExists->pump_marked_status != 'Marked') {
// "Serial number '{$serialNumber}' is not marked yet.<br>Please proceed with marking first.";
return response()->json([
'status_code' => 'ERROR',
@@ -1520,7 +1663,7 @@ class CharacteristicsController extends Controller
->get();
$remFields = [
'id', 'plant_id', 'machine_id', 'item_id', 'gernr', 'zmm_beenote', 'zmm_beenumber', 'zmm_beestar', 'zmm_logo_ce', 'zmm_codeclass', 'zmm_colour', 'zmm_logo_cp', 'zmm_grade', 'zmm_grwt_pset', 'zmm_grwt_cable', 'zmm_grwt_motor', 'zmm_grwt_pf', 'zmm_grwt_pump', 'zmm_isivalve', 'zmm_isi_wc', 'zmm_labelperiod', 'zmm_length', 'zmm_license_cml_no', 'zmm_mfgmonyr', 'zmm_modelyear', 'zmm_motoridentification', 'zmm_newt_pset', 'zmm_newt_cable', 'zmm_newt_motor', 'zmm_newt_pf', 'zmm_newt_pump', 'zmm_logo_nsf', 'zmm_packtype', 'zmm_panel', 'zmm_performance_factor', 'zmm_pumpidentification', 'zmm_psettype', 'zmm_size', 'zmm_eff_ttl', 'zmm_type', 'zmm_usp', 'created_at', 'updated_at', 'created_by', 'updated_by', 'deleted_at',
'id', 'plant_id', 'machine_id', 'item_id', 'gernr', 'zmm_beenote', 'zmm_beenumber', 'zmm_beestar', 'zmm_codeclass', 'zmm_colour', 'zmm_grade', 'zmm_grwt_pset', 'zmm_grwt_cable', 'zmm_grwt_motor', 'zmm_grwt_pf', 'zmm_grwt_pump', 'zmm_isivalve', 'zmm_isi_wc', 'zmm_labelperiod', 'zmm_length', 'zmm_license_cml_no', 'zmm_mfgmonyr', 'zmm_modelyear', 'zmm_motoridentification', 'zmm_newt_pset', 'zmm_newt_cable', 'zmm_newt_motor', 'zmm_newt_pf', 'zmm_newt_pump', 'zmm_packtype', 'zmm_panel', 'zmm_performance_factor', 'zmm_pumpidentification', 'zmm_psettype', 'zmm_size', 'zmm_eff_ttl', 'zmm_type', 'zmm_usp', 'created_at', 'updated_at', 'created_by', 'updated_by', 'deleted_at',
];
$filteredData = $characteristicsData->map(function ($char) use ($remFields) {
@@ -1539,6 +1682,8 @@ class CharacteristicsController extends Controller
$charArray['marked_by'] = ($charArray['marked_by'] == 'Admin') ? 'jothi' : $charArray['marked_by'] ?? '';
$charArray['man_marked_by'] = ($charArray['man_marked_by'] == 'Admin') ? 'jothi' : $charArray['man_marked_by'] ?? '';
$charArray['motor_marked_by'] = ($charArray['motor_marked_by'] == 'Admin') ? 'jothi' : $charArray['motor_marked_by'] ?? '';
$charArray['pump_marked_by'] = ($charArray['pump_marked_by'] == 'Admin') ? 'jothi' : $charArray['pump_marked_by'] ?? '';
foreach ($charArray as $key => $value) {
if ($value instanceof \Carbon\Carbon) {
@@ -1723,9 +1868,9 @@ class CharacteristicsController extends Controller
], 400);
}
// $columnsToShow = ['mark_status','marked_datetime','marked_by','man_marked_status','man_marked_datetime','man_marked_by','motor_marked_status','pump_marked_status','motor_pump_pumpset_status','part_validation_1','part_validation_2','samlight_logged_name','pending_released_status','expected_time'];
// $columnsToShow = ['mark_status','marked_datetime','marked_by','man_marked_status','man_marked_datetime','man_marked_by','motor_marked_status','pump_marked_status','motor_pump_pumpset_status','part_validation_1','part_validation_2','samlight_logged_name','pending_released_status','motor_expected_time','pump_expected_time'];
$characteristicsColumns = ['class', 'arbid', 'gamng', 'lmnga', 'zz1_cn_bill_ord', 'zmm_amps', 'zmm_brand', 'zmm_degreeofprotection', 'zmm_delivery', 'zmm_dir_rot', 'zmm_discharge', 'zmm_discharge_max', 'zmm_discharge_min', 'zmm_duty', 'zmm_eff_motor', 'zmm_eff_pump', 'zmm_frequency', 'zmm_head', 'zmm_heading', 'zmm_head_max', 'zmm_head_minimum', 'zmm_idx_eff_mtr', 'zmm_idx_eff_pump', 'zmm_kvacode', 'zmm_maxambtemp', 'zmm_mincoolingflow', 'zmm_motorseries', 'zmm_motor_model', 'zmm_outlet', 'zmm_phase', 'zmm_pressure', 'zmm_pumpflowtype', 'zmm_pumpseries', 'zmm_pump_model', 'zmm_ratedpower', 'zmm_region', 'zmm_servicefactor', 'zmm_servicefactormaximumamps', 'zmm_speed', 'zmm_suction', 'zmm_suctionxdelivery', 'zmm_supplysource', 'zmm_temperature', 'zmm_thrustload', 'zmm_volts', 'zmm_wire', 'zmm_package', 'zmm_pvarrayrating', 'zmm_isi', 'zmm_isimotor', 'zmm_isipump', 'zmm_isipumpset', 'zmm_pumpset_model', 'zmm_stages', 'zmm_headrange', 'zmm_overall_efficiency', 'zmm_connection', 'zmm_min_bore_size', 'zmm_isireference', 'zmm_category', 'zmm_submergence', 'zmm_capacitorstart', 'zmm_capacitorrun', 'zmm_inch', 'zmm_motor_type', 'zmm_dismantle_direction', 'zmm_eff_ovrall', 'zmm_bodymoc', 'zmm_rotormoc', 'zmm_dlwl', 'zmm_inputpower', 'zmm_imp_od', 'zmm_ambtemp', 'zmm_de', 'zmm_dischargerange', 'zmm_efficiency_class', 'zmm_framesize', 'zmm_impellerdiameter', 'zmm_insulationclass', 'zmm_maxflow', 'zmm_minhead', 'zmm_mtrlofconst', 'zmm_nde', 'zmm_powerfactor', 'zmm_tagno', 'zmm_year', 'zmm_laser_name'];
$characteristicsColumns = ['class', 'arbid', 'gamng', 'lmnga', 'zz1_cn_bill_ord', 'zmm_amps', 'zmm_brand', 'zmm_degreeofprotection', 'zmm_delivery', 'zmm_dir_rot', 'zmm_discharge', 'zmm_discharge_max', 'zmm_discharge_min', 'zmm_duty', 'zmm_eff_motor', 'zmm_eff_pump', 'zmm_frequency', 'zmm_head', 'zmm_heading', 'zmm_head_max', 'zmm_head_minimum', 'zmm_idx_eff_mtr', 'zmm_idx_eff_pump', 'zmm_kvacode', 'zmm_maxambtemp', 'zmm_mincoolingflow', 'zmm_motorseries', 'zmm_motor_model', 'zmm_outlet', 'zmm_phase', 'zmm_pressure', 'zmm_pumpflowtype', 'zmm_pumpseries', 'zmm_pump_model', 'zmm_ratedpower', 'zmm_region', 'zmm_servicefactor', 'zmm_servicefactormaximumamps', 'zmm_speed', 'zmm_suction', 'zmm_suctionxdelivery', 'zmm_supplysource', 'zmm_temperature', 'zmm_thrustload', 'zmm_volts', 'zmm_wire', 'zmm_package', 'zmm_pvarrayrating', 'zmm_isi', 'zmm_isimotor', 'zmm_isipump', 'zmm_isipumpset', 'zmm_pumpset_model', 'zmm_stages', 'zmm_headrange', 'zmm_overall_efficiency', 'zmm_connection', 'zmm_min_bore_size', 'zmm_isireference', 'zmm_category', 'zmm_submergence', 'zmm_capacitorstart', 'zmm_capacitorrun', 'zmm_inch', 'zmm_motor_type', 'zmm_dismantle_direction', 'zmm_eff_ovrall', 'zmm_bodymoc', 'zmm_rotormoc', 'zmm_dlwl', 'zmm_inputpower', 'zmm_imp_od', 'zmm_ambtemp', 'zmm_de', 'zmm_dischargerange', 'zmm_efficiency_class', 'zmm_framesize', 'zmm_impellerdiameter', 'zmm_insulationclass', 'zmm_maxflow', 'zmm_minhead', 'zmm_mtrlofconst', 'zmm_nde', 'zmm_powerfactor', 'zmm_tagno', 'zmm_year', 'zmm_laser_name', 'zmm_logo_cp', 'zmm_logo_ce', 'zmm_logo_nsf'];
$characteristicsData = ClassCharacteristic::where('aufnr', $jobNumber)
->where('plant_id', $plantId)
@@ -1954,7 +2099,7 @@ class CharacteristicsController extends Controller
// ], 404);
// }
// $columnsToShow = ['mark_status','marked_datetime','marked_by','man_marked_status','man_marked_datetime','man_marked_by','motor_marked_status','pump_marked_status','motor_pump_pumpset_status','part_validation_1','part_validation_2','samlight_logged_name','pending_released_status','expected_time'];
// $columnsToShow = ['mark_status','marked_datetime','marked_by','man_marked_status','man_marked_datetime','man_marked_by','motor_marked_status','pump_marked_status','motor_pump_pumpset_status','part_validation_1','part_validation_2','samlight_logged_name','pending_released_status','motor_expected_time','pump_expected_time'];
// $characteristicsColumns = ['class','arbid','gamng','lmnga','zz1_cn_bill_ord','zmm_amps','zmm_brand','zmm_degreeofprotection','zmm_delivery','zmm_dir_rot','zmm_discharge','zmm_discharge_max','zmm_discharge_min','zmm_duty','zmm_eff_motor','zmm_eff_pump','zmm_frequency','zmm_head','zmm_heading','zmm_head_max','zmm_head_minimum','zmm_idx_eff_mtr','zmm_idx_eff_pump','zmm_kvacode','zmm_maxambtemp','zmm_mincoolingflow','zmm_motorseries','zmm_motor_model','zmm_outlet','zmm_phase','zmm_pressure','zmm_pumpflowtype','zmm_pumpseries','zmm_pump_model','zmm_ratedpower','zmm_region','zmm_servicefactor','zmm_servicefactormaximumamps','zmm_speed','zmm_suction','zmm_suctionxdelivery','zmm_supplysource','zmm_temperature','zmm_thrustload','zmm_volts','zmm_wire','zmm_package','zmm_pvarrayrating','zmm_isi','zmm_isimotor','zmm_isipump','zmm_isipumpset','zmm_pumpset_model','zmm_stages','zmm_headrange','zmm_overall_efficiency','zmm_connection','zmm_min_bore_size','zmm_isireference','zmm_category','zmm_submergence','zmm_capacitorstart','zmm_capacitorrun','zmm_inch','zmm_motor_type','zmm_dismantle_direction','zmm_eff_ovrall','zmm_bodymoc','zmm_rotormoc','zmm_dlwl','zmm_inputpower','zmm_imp_od','zmm_ambtemp','zmm_de','zmm_dischargerange','zmm_efficiency_class','zmm_framesize','zmm_impellerdiameter','zmm_insulationclass','zmm_maxflow','zmm_minhead','zmm_mtrlofconst','zmm_nde','zmm_powerfactor','zmm_tagno','zmm_year','zmm_laser_name'];
@@ -1976,13 +2121,20 @@ class CharacteristicsController extends Controller
'ZMM_HEADING' => $serialExists->zmm_heading ?? '',
'MARK_STATUS' => $serialExists->mark_status ?? '',
'MARKED_DATETIME' => $serialExists->marked_datetime,
'MARKED_BY' => $serialExists->marked_by ?? '',
'MARKED_BY' => ($serialExists->marked_by == 'Admin') ? 'jothi' : $serialExists->marked_by ?? '',
'MAN_MARKED_STATUS' => $serialExists->man_marked_status ?? '',
'MAN_MARKED_DATETIME' => $serialExists->man_marked_datetime ?? '',
'MAN_MARKED_BY' => $serialExists->man_marked_by ?? '',
'MAN_MARKED_BY' => ($serialExists->man_marked_by == 'Admin') ? 'jothi' : $serialExists->man_marked_by ?? '',
'MOTOR_MARKED_STATUS' => $serialExists->motor_marked_status ?? '',
'MOTOR_MARKED_BY' => ($serialExists->motor_marked_by == 'Admin') ? 'jothi' : $serialExists->motor_marked_by ?? '',
'PUMP_MARKED_STATUS' => $serialExists->pump_marked_status ?? '',
'PUMP_MARKED_BY' => ($serialExists->pump_marked_by == 'Admin') ? 'jothi' : $serialExists->pump_marked_by ?? '',
'MOTOR_PUMP_PUMPSET_STATUS' => $serialExists->motor_pump_pumpset_status ?? '',
'MOTOR_MACHINE_NAME' => $serialExists->motor_machine_name ?? '',
'PUMP_MACHINE_NAME' => $serialExists->pump_machine_name ?? '',
'PUMPSET_MACHINE_NAME' => $serialExists->pumpset_machine_name ?? '',
'MOTOR_EXPECTED_TIME' => $serialExists->motor_expected_time ?? '',
'PUMP_EXPECTED_TIME' => $serialExists->pump_expected_time ?? '',
], 200);
}
}
@@ -2137,6 +2289,230 @@ class CharacteristicsController extends Controller
return response()->json($output, 200);
}
public function storeCharValues(Request $request)
{
$expectedUser = env('API_AUTH_USER');
$expectedPw = env('API_AUTH_PW');
$headerAuth = $request->header('Authorization');
$expectedToken = 'Bearer '.$expectedUser.':'.$expectedPw;
if ($headerAuth !== $expectedToken) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Invalid authorization token!',
], 404);
}
$plantCode = $request->header('plant-code');
$itemCode = $request->header('item-code');
$lineName = $request->header('line-name');
$workCenter = $request->header('work-center');
if ($plantCode == null || $plantCode == '' || ! $plantCode) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Plant code can't be empty!",
], 404);
} elseif (! is_numeric($plantCode) || Str::length($plantCode) < 4 || ! preg_match('/^[1-9]\d{3,}$/', $plantCode)) { // !ctype_digit($data['plant_code'])
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Invalid plant code found!',
], 404);
}
$plant = Plant::where('code', $plantCode)->first();
if (! $plant) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Plant code '{$plantCode}' not found!",
], 404);
}
$plantId = $plant->id;
if ($lineName == null || $lineName == '') {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Line name can't be empty!",
], 404);
}
$line = Line::where('name', $lineName)->first();
if (! $line) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Line '{$lineName}' not found!",
], 404);
}
$lineAgaPlant = Line::where('plant_id', $plantId)->where('name', $lineName)->first();
if (! $lineAgaPlant) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Line '{$lineName}' not found against plant code '$plantCode'!",
], 404);
}
$lineId = $lineAgaPlant->id;
if ($itemCode == null || $itemCode == '') {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Item code can't be empty!",
], 404);
}
$item = Item::where('code', $itemCode)->first();
if (! $item) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Item Code '{$itemCode}' not found!",
], 404);
}
$itemAgaPlant = Item::where('plant_id', $plantId)->where('code', $itemCode)->first();
if (! $itemAgaPlant) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Item code '{$itemCode}' not found against plant code '$plantCode'!",
], 404);
}
$itemId = $itemAgaPlant->id;
if ($workCenter == null || $workCenter == '') {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Work center can't be empty!",
], 404);
}
$machine = Machine::where('work_center', $workCenter)->first();
if (! $machine) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Work center '{$workCenter}' not found!",
], 404);
}
$machineAgaPlant = Machine::where('plant_id', $plantId)->where('work_center', $workCenter)->first();
if (! $machineAgaPlant) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Work center '{$workCenter}' not found against plant code '$plantCode'!",
], 404);
}
$machineAgaPlantLine = Machine::where('plant_id', $plantId)->where('line_id', $lineId)->where('work_center', $workCenter)->first();
if (! $machineAgaPlantLine) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Work center '{$workCenter}' not found against plant code '$plantCode' and line name '$lineName'!",
], 404);
}
$machineId = $machineAgaPlantLine->id;
$data = $request->all();
$processOrder = $data['process_order'] ?? '';
$coilNo = $data['coil_number'] ?? '';
$status = $data['status'] ?? '';
$obsValue = $data['observed_value'] ?? '';
$createdBy = $data['created_by'] ?? '';
if ($processOrder == null || $processOrder == '' || ! $processOrder) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Process order can't be empty!",
], 404);
} elseif (Str::length($processOrder) < 9) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Process order should contain minimum 9 digits!',
], 404);
}
if ($coilNo == null || $coilNo == '' || ! $coilNo) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Coil number can't be empty!",
], 404);
} elseif (! is_numeric($coilNo)) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Coil number should contain only numeric values!',
], 404);
}
if ($status == null || $status == '' || ! $status) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Status can't be empty!",
], 404);
} elseif (! in_array($status, ['Ok', 'NotOk'], true)) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Status must be either 'Ok' or 'NotOk'!",
], 404);
}
if ($obsValue == null || $obsValue == '' || ! $obsValue) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Observed value can't be empty!",
], 404);
}
if ($createdBy == null || $createdBy == '' || ! $createdBy) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Created by can't be empty!",
], 404);
}
$existing = CharacteristicValue::where('plant_id', $plantId)
->where('process_order', $processOrder)
->where('item_id', '!=', $itemId)
->first();
if ($existing) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Process order '{$processOrder}' already has item_code '{$existing->item->code}' for the plant code '{$plantCode}'!",
], 404);
}
$existing = CharacteristicValue::where('plant_id', $plantId)
->where('process_order', $processOrder)
->where('coil_number', $coilNo)
->first();
if ($existing) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Process order '{$processOrder}' with coil number '{$coilNo}' already exist for the plant code '{$plantCode}'!",
], 404);
}
CharacteristicValue::create([
'plant_id' => $plantId,
'line_id' => $lineId,
'item_id' => $itemId,
'machine_id' => $machineId,
'process_order' => $processOrder,
'coil_number' => $coilNo,
'status' => $status,
'observed_value' => $obsValue,
'created_by' => $createdBy,
]);
return response()->json([
'status_code' => 'SUCCESS',
'status_description' => 'Characteristics values inserted successfully',
], 200);
}
/**
* Display the specified resource.
*/

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

@@ -46,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;
}

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;
}
/**
@@ -110,15 +113,18 @@ class InvalidSerialMail extends Mailable
case 'DuplicateCapacitorQR':
$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':
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(
@@ -141,48 +147,20 @@ class InvalidSerialMail extends Mailable
<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 '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>
";
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>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>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 '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,119 @@
<?php
namespace App\Mail;
use Carbon\Carbon;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
class InvoiceTransitMail extends Mailable
{
use Queueable, SerializesModels;
public $scheduleType;
public $tableData;
public $mailSubject;
/**
* Create a new message instance.
*/
public function __construct($scheduleType, $tableData, $mailSubject)
{
$this->scheduleType = $scheduleType;
$this->tableData = $tableData ?? [];
$this->mailSubject = $mailSubject ?? 'Invoice In Transit';
}
/**
* Get the message envelope.
*/
public function envelope(): Envelope
{
return new Envelope(
subject: $this->mailSubject,
);
}
/**
* Get the message content definition.
*/
// public function content(): Content
// {
// return new Content(
// view: 'view.name',
// );
// }
public function content(): Content
{
$greeting = '<b>Dear Service Provider</b>,<br><br>The following consignments to our branch warehouse are overdue beyond the agreed timeline.Immediate delivery is required today; Failure to complain will result to not able to fulfill customer requirements and leads to potential sales loss.Please treat this as the critical and confirm despatch without delay. <br><br><b> Dear C.R.I Branch Team,</b> <br><br> Please follow and ensure the same.';
//$greeting1 = 'Dear C.R.I Branch Team, <br><br> Please follow and ensure the same';
if (strtolower($this->scheduleType) == 'daily') {
$dates = collect($this->tableData)
->pluck('lr_bl_aw_date')
->filter()
->map(fn ($d) => Carbon::parse($d));
if ($dates->isNotEmpty()) {
$startDate = $dates->min()->startOfDay();
}
else
{
$startDate = now()->subDay()->startOfDay();
}
$endDate = now();
// $reportPeriod = "<br><br>"
// . "Report Period: <b>{$startDate->format('d-m-Y')}</b> "
// . "to <b>{$endDate->format('d-m-Y')}.</b>";
// . "<br>Please arrange to receipt the same immediately.";
//$greeting .= $reportPeriod;
}
if ($this->scheduleType == 'Hourly') {
$now = now();
$fromHour = $now->copy()->subHour()->format('H:i:s');
$toHour = $now->format('H:i:s');
$reportDate = $now->format('d/m/Y');
$greeting .= "from: $reportDate, $fromHour to $toHour. <br><br>Please arrange to receipt the same immediately.";
}
if ($this->scheduleType == 'Live') {
$now = now();
$fromMinute = $now->copy()->subMinute()->format('d/m/Y H:i:s');
$toMinute = $now->format('d/m/Y H:i:s');
$greeting .= "from: $fromMinute to $toMinute. <br><br>Please arrange to receipt the same immediately.";
}
return new Content(
view: 'mail.invoice-in-transit-report',
with: [
'company' => 'CRI Digital Manufacturing Solutions',
'greeting' => $greeting,
'tableData' => $this->tableData,
'wishes' => 'Thanks & Regards,<br>CRI Digital Manufacturing Solutions',
],
);
}
/**
* Get the attachments for the message.
*
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
*/
public function attachments(): array
{
return [];
}
}

View File

@@ -13,6 +13,7 @@ class AlertMailRule extends Model
protected $fillable = [
'module',
'plant',
'invoice_master_id',
'rule_name',
'email',
'cc_emails',
@@ -23,8 +24,9 @@ class AlertMailRule extends Model
'updated_by',
];
// public function plant(): BelongsTo
// {
// return $this->belongsTo(Plant::class);
// }
public function invoiceMaster(): BelongsTo
{
return $this->belongsTo(InvoiceMaster::class);
//return $this->belongsTo(InvoiceMaster::class, 'invoice_master_id');
}
}

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,46 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class InvoiceInTransit extends Model
{
use SoftDeletes;
protected $fillable = [
"plant_id",
"receiving_plant",
"receiving_plant_name",
"invoice_number",
"invoice_date",
"item_code",
"description",
"quantity",
"transport_name",
"lr_bl_aw_number",
"lr_bl_aw_date",
"pending_days",
"obd_number",
"obd_date",
"shipment_weight",
"unit_price",
"net_value",
"total_item_amount",
"tax_amount",
"transport_mode",
"vehicle_number",
"e_waybill_number",
"created_at",
"created_by",
"updated_by",
"updated_at"
];
public function plant(): BelongsTo
{
return $this->belongsTo(Plant::class);
}
}

View File

@@ -0,0 +1,22 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class InvoiceMaster extends Model
{
use SoftDeletes;
protected $fillable = [
"receiving_plant",
"receiving_plant_name",
"transit_days",
"transport_name",
"created_at",
"created_by",
"updated_by",
"updated_at"
];
}

View File

@@ -0,0 +1,20 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class TestingTemp extends Model
{
use SoftDeletes;
protected $fillable = [
'name',
'created_at',
'updated_at',
'created_by',
'updated_by',
];
}

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\InvoiceInTransit;
use App\Models\User;
class InvoiceInTransitPolicy
{
/**
* Determine whether the user can view any models.
*/
public function viewAny(User $user): bool
{
return $user->checkPermissionTo('view-any InvoiceInTransit');
}
/**
* Determine whether the user can view the model.
*/
public function view(User $user, InvoiceInTransit $invoiceintransit): bool
{
return $user->checkPermissionTo('view InvoiceInTransit');
}
/**
* Determine whether the user can create models.
*/
public function create(User $user): bool
{
return $user->checkPermissionTo('create InvoiceInTransit');
}
/**
* Determine whether the user can update the model.
*/
public function update(User $user, InvoiceInTransit $invoiceintransit): bool
{
return $user->checkPermissionTo('update InvoiceInTransit');
}
/**
* Determine whether the user can delete the model.
*/
public function delete(User $user, InvoiceInTransit $invoiceintransit): bool
{
return $user->checkPermissionTo('delete InvoiceInTransit');
}
/**
* Determine whether the user can delete any models.
*/
public function deleteAny(User $user): bool
{
return $user->checkPermissionTo('delete-any InvoiceInTransit');
}
/**
* Determine whether the user can restore the model.
*/
public function restore(User $user, InvoiceInTransit $invoiceintransit): bool
{
return $user->checkPermissionTo('restore InvoiceInTransit');
}
/**
* Determine whether the user can restore any models.
*/
public function restoreAny(User $user): bool
{
return $user->checkPermissionTo('restore-any InvoiceInTransit');
}
/**
* Determine whether the user can replicate the model.
*/
public function replicate(User $user, InvoiceInTransit $invoiceintransit): bool
{
return $user->checkPermissionTo('replicate InvoiceInTransit');
}
/**
* Determine whether the user can reorder the models.
*/
public function reorder(User $user): bool
{
return $user->checkPermissionTo('reorder InvoiceInTransit');
}
/**
* Determine whether the user can permanently delete the model.
*/
public function forceDelete(User $user, InvoiceInTransit $invoiceintransit): bool
{
return $user->checkPermissionTo('force-delete InvoiceInTransit');
}
/**
* Determine whether the user can permanently delete any models.
*/
public function forceDeleteAny(User $user): bool
{
return $user->checkPermissionTo('force-delete-any InvoiceInTransit');
}
}

View File

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

View File

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

View File

@@ -42,7 +42,7 @@
"laravel/sail": "^1.26",
"mockery/mockery": "^1.6",
"nunomaduro/collision": "^8.1",
"phpunit/phpunit": "^12.0.0"
"phpunit/phpunit": "^11.0.1"
},
"autoload": {
"psr-4": {

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

@@ -0,0 +1,60 @@
<?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 invoice_in_transits (
id BIGINT GENERATED always AS IDENTITY PRIMARY KEY,
plant_id BIGINT NOT NULL,
receiving_plant TEXT DEFAULT NULL,
receiving_plant_name TEXT DEFAULT NULL,
invoice_number TEXT DEFAULT NULL,
invoice_date TEXT DEFAULT NULL,
item_code TEXT DEFAULT NULL,
description TEXT DEFAULT NULL,
quantity NUMERIC(10,3) DEFAULT NULL,
transport_name TEXT DEFAULT NULL,
lr_bl_aw_number TEXT DEFAULT NULL,
lr_bl_aw_date TEXT DEFAULT NULL,
pending_days TEXT DEFAULT NULL,
obd_number TEXT DEFAULT NULL,
obd_date TEXT DEFAULT NULL,
shipment_weight TEXT DEFAULT NULL,
unit_price TEXT DEFAULT NULL,
net_value TEXT DEFAULT NULL,
total_item_amount TEXT DEFAULT NULL,
tax_amount TEXT DEFAULT NULL,
transport_mode TEXT DEFAULT NULL,
vehicle_number TEXT DEFAULT NULL,
e_waybill_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('invoice_in_transits');
}
};

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
{
$sql = <<<'SQL'
CREATE TABLE invoice_masters (
id BIGINT GENERATED always AS IDENTITY PRIMARY KEY,
receiving_plant TEXT DEFAULT NULL,
receiving_plant_name TEXT DEFAULT NULL,
transit_days TEXT DEFAULT NULL,
transport_name 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
);
SQL;
DB::statement($sql);
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('invoice_masters');
}
};

View File

@@ -0,0 +1,33 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
$sql = <<<'SQL'
ALTER TABLE alert_mail_rules
ADD COLUMN invoice_master_id BIGINT DEFAULT NULL,
ADD CONSTRAINT invoice_masters_invoice_master_id_fkey
FOREIGN KEY (invoice_master_id) REFERENCES invoice_masters(id);
SQL;
DB::statement($sql);
}
/**
* Reverse the migrations.
*/
public function down(): void
{
// Schema::table('alert_mail_rules', 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
{
$sql = <<<'SQL'
CREATE TABLE testing_temps (
id BIGINT GENERATED always AS IDENTITY PRIMARY KEY,
name 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
);
SQL;
DB::statement($sql);
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('testing_temps');
}
};

View File

@@ -171,5 +171,12 @@ class PermissionSeeder extends Seeder
Permission::updateOrCreate(['name' => 'view import sticker printing']);
Permission::updateOrCreate(['name' => 'view export sticker printing']);
Permission::updateOrCreate(['name' => 'view import invoice master']);
Permission::updateOrCreate(['name' => 'view export invoice master']);
Permission::updateOrCreate(['name' => 'view import invoice in transit']);
Permission::updateOrCreate(['name' => 'view export invoice in transit']);
}
}

View File

@@ -3,7 +3,6 @@
namespace Database\Seeders;
use App\Models\User;
use Hash;
use Illuminate\Database\Seeder;
class UserSeeder extends Seeder
@@ -17,20 +16,20 @@ class UserSeeder extends Seeder
['email' => 'dhanabalan.saravanan@cripumps.com'],
[
'name' => 'Dhanabalan S',
'password' => bcrypt('SdHaNa@123'),
'password' => bcrypt('SdHaNa$1997'),
'updated_at' => now(),
'created_at' => now()
'created_at' => now(),
]
);
$user1->assignRole('Super Admin');
$user2 = User::updateOrCreate(
['email' => 'ranjith@cripumps.com'],
['email' => 'ranjith.bala@cripumps.com'],
[
'name' => 'Ranjith B',
'password' => bcrypt('Ranjii@5503'),
'password' => bcrypt('Ranjii$5503'),
'updated_at' => now(),
'created_at' => now()
'created_at' => now(),
]
);
$user2->assignRole('Super Admin');

View File

@@ -0,0 +1,125 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Invoice Data Report</title>
<style>
body {
font-family: 'Segoe UI', Arial, sans-serif;
background-color: #f9fafb;
color: #333;
margin: 0;
padding: 0;
}
h2 {
color: #215c98;
text-align: center;
margin-bottom: 20px;
}
table {
border-collapse: collapse;
width: 100%;
font-size: 14px;
white-space: nowrap !important;
}
th, td {
border: 1px solid #020813da;
padding: 8px 10px;
text-align: center;
white-space: nowrap !important;
text-overflow: ellipsis;
}
.td-left {
text-align: left !important;
}
th {
background-color: #215c98;
color: #fff;
white-space: nowrap !important;
}
tr:nth-child(even) {
background-color: #f3f4f6;
}
.status-wentout {
color: #10b981;
font-weight: bold;
}
/* .status-pending {
color: #ef4444;
font-weight: bold;
} */
.status-pending-yellow {
color: #eab308;
font-weight: bold;
}
.status-pending-red {
color: #ef4444;
font-weight: bold;
}
.footer {
text-align: center;
font-size: 13px;
color: #6b7280;
margin-top: 30px;
}
</style>
</head>
<body>
<div style="text-align: center; font-weight: bold;">
{{ $company }}
</div>
<br>
<p>{!! $greeting !!}</p>
<div class="container">
@if(empty($tableData))
<p style="text-align:center;">No invoice in transit data available.</p>
@else
<table>
<thead>
<tr>
<th>No</th>
<th>Receiving Plant Code</th>
<th>Plant Name</th>
<th>Receiving Plant Name</th>
<th>Invoice Number</th>
<th>Transport Name</th>
<th>LR Number</th>
<th>LR Date</th>
<th>Transit Days</th>
<th>Pending Days</th>
</tr>
</thead>
<tbody>
@foreach ($tableData as $row)
<tr>
<td>{{ $row['no'] }}</td>
<td>{{ $row['receiving_plant'] }}</td>
<td>{{ $row['plant'] }}</td>
<td>{{ $row['receiving_plant_name'] }}</td>
<td>{{ $row['invoice_number'] }}</td>
<td class="td-left">{{ $row['transport_name'] }}</td>
<td>{{ $row['lr_bl_aw_number'] }}</td>
<td>
@if(!empty($row['lr_bl_aw_date']) && $row['lr_bl_aw_date'] != '-')
{{ \Carbon\Carbon::parse($row['lr_bl_aw_date'])->format('d-M-Y') }}
@else
-
@endif
</td>
{{-- <td>{{ $row['lr_bl_aw_date'] }}</td> --}}
<td>{{ $row['transit_days'] }}</td>
<td>{{ $row['status'] }}</td>
{{-- <td class="{{ $row['status_class'] ?? '' }}">
{{ $row['status'] }}
</td> --}}
</tr>
@endforeach
</tbody>
</table>
@endif
<p>{!! $wishes !!}</p>
</div>
</body>
</html>

View File

@@ -43,7 +43,6 @@ use Illuminate\Support\Facades\Route;
// return $item;
// });
// Route::post('/user/update', function (Request $request) {
// // Return the request data as JSON
@@ -54,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',
@@ -63,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']);
@@ -78,11 +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-reprint-process-pdf/{plant}/{item}/{process_order}/{coil_number}', [PalletController::class, 'downloadReprintProcess'])->name('download-reprint-process-pdf');
// Route::get('/download-reprint-process-pdf/{plant}/{item}/{process_order}/{coil_number}/{name}', [PalletController::class, 'downloadReprintProcess'])->name('download-reprint-process-pdf');
Route::get('/download-qr1-pdf/{palletNo}', [ProductionStickerReprintController::class, 'downloadQrPdf'])->name('download-qr1-pdf');
//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
// 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']);
@@ -156,25 +155,37 @@ 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']);
// ..Serial or job
// Route::get('laser/characteristics/get', [CharacteristicsController::class, 'getClassChar']);
// Route::get('laser/characteristics/check', [CharacteristicsController::class, 'checkClassChar']);
// ..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']);
//GR Master PDF and Serial Number
Route::post('characteristics/values', [CharacteristicsController::class, 'storeCharValues']);
// GR Master PDF and Serial Number
Route::get('grNumber-pdf', [PdfController::class, 'getGRPdf']);

View File

@@ -9,14 +9,9 @@ Artisan::command('inspire', function () {
$this->comment(Inspiring::quote());
})->purpose('Display an inspiring quote');
Artisan::command('auto:scheduler', function () {
$this->call('custom:scheduler');
})->everyMinute();
// Schedule::command('send:invoice-report');
// Schedule::command('send:production-report');
})->everyMinute()->withoutOverlapping();
// app()->booted(function () {
// $schedule = app(Schedule::class);

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');