237 Commits

Author SHA1 Message Date
52f61551a3 Update dependency barryvdh/laravel-debugbar to v4
Some checks failed
renovate/artifacts Artifact file update failure
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 / Gemini PR Review (pull_request) Failing after 16s
Laravel Larastan / larastan (pull_request) Failing after 2m10s
Laravel Pint / pint (pull_request) Failing after 2m28s
2026-01-25 00:00:59 +00:00
f3389399eb Merge pull request 'Added class charcteristics policy file' (#255) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Reviewed-on: #255
2026-01-24 05:51:51 +00:00
c18a07853e Merge pull request 'Added class charactertisc resource pages' (#254) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #254
2026-01-24 05:51:03 +00:00
555f810c0f Merge pull request 'Added cclass charcteristuc model file' (#253) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #253
2026-01-24 05:49:43 +00:00
2e5d185be1 Merge pull request 'Added class characteritiscs migartion file' (#252) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #252
2026-01-24 05:48:46 +00:00
0ece1d0dd6 Merge pull request 'Added characteristics controller' (#251) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #251
2026-01-24 05:46:01 +00:00
e145560920 Merge pull request 'Added request characteristic api' (#250) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #250
2026-01-24 05:44:28 +00:00
e02052e536 Merge pull request 'Added request characteritics policy file' (#249) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #249
2026-01-24 05:42:50 +00:00
39e40e011f Merge pull request 'Added request characteristics resource pages' (#248) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #248
2026-01-24 05:41:56 +00:00
7184eda58c Merge pull request 'Added request characteristics model file' (#247) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #247
2026-01-24 05:40:31 +00:00
3c4b419078 Merge pull request 'Added request characteristics migration file' (#246) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #246
2026-01-24 05:39:19 +00:00
7ba5375386 Merge pull request 'Added column duration1 and duration2 nd in characteritsic approve master' (#245) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #245
2026-01-24 05:36:56 +00:00
c3324caa08 Merge pull request 'Added characteristic policy file' (#244) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #244
2026-01-24 05:33:03 +00:00
ace14124f3 Merge pull request 'Added characteristic approve master resource page' (#243) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #243
2026-01-24 05:30:52 +00:00
c68a45ef8d Merge pull request 'Added characteristic approve model file' (#242) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #242
2026-01-24 05:28:56 +00:00
3edd8fafc6 Merge pull request 'Added characteristics approve master migration file' (#241) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #241
2026-01-24 05:27:44 +00:00
2c66f2e6bd Merge pull request 'Comment out the admin redirect route in web.php' (#240) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #240
2026-01-23 11:30:05 +00:00
e791176500 Merge pull request 'Refactor characteristic approval routes and enhance session handling' (#239) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Reviewed-on: #239
2026-01-23 11:23:59 +00:00
1eddecc660 Merge pull request 'Added welcome page in cri page' (#238) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #238
2026-01-23 10:42:16 +00:00
379e8fc8f9 Merge pull request 'removed logic for skipping in remark import' (#237) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #237
2026-01-23 06:38:34 +00:00
b018ef48d7 Merge pull request 'changed logic in invoice pending reason page' (#236) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
Reviewed-on: #236
2026-01-23 05:30:52 +00:00
e45c166345 Merge pull request 'Added invoice pending livewire pages' (#235) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #235
2026-01-23 05:13:30 +00:00
d53d3dedbb Merge pull request 'Added invoice pending reason import' (#234) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #234
2026-01-23 05:11:02 +00:00
18e74f4a52 Merge pull request 'Added invoice pending reason export' (#233) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #233
2026-01-23 05:08:58 +00:00
16c525773b Merge pull request 'Added item code missing logic on new invoice' (#232) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
Reviewed-on: #232
2026-01-22 06:20:30 +00:00
501cd541b9 Merge pull request 'chnaged logic in sticker reprint controller' (#231) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 16s
Reviewed-on: #231
2026-01-22 05:58:07 +00:00
62e14fb3c3 Merge pull request 'Added default value as '-' to material_type on view report' (#230) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #230
2026-01-22 05:38:40 +00:00
78f4929e27 Merge pull request 'changed time for invoice data report' (#229) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #229
2026-01-22 04:27:43 +00:00
b674966886 Merge pull request 'changed proper time for reports in scheduler' (#228) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 18s
Reviewed-on: #228
2026-01-21 11:00:36 +00:00
103515a387 Merge pull request 'changed time in scheduler' (#227) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 16s
Reviewed-on: #227
2026-01-21 10:56:24 +00:00
dd182c6504 Merge pull request 'changed logic in schdeuler' (#226) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 16s
Reviewed-on: #226
2026-01-21 10:48:50 +00:00
1fed559feb Merge pull request 'changed logic inside the schduler' (#225) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #225
2026-01-21 10:46:24 +00:00
312de66a1c Merge pull request 'changed time in invoice transit' (#224) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #224
2026-01-21 10:34:58 +00:00
7d8a891f95 Merge pull request 'chnaged time in scheduler' (#223) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #223
2026-01-21 10:31:24 +00:00
557c367f4c Merge pull request 'changed time in scheduler' (#222) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 16s
Reviewed-on: #222
2026-01-21 10:22:37 +00:00
cef3e17dc7 Merge pull request 'changed time in invoice in transit' (#221) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #221
2026-01-21 10:21:14 +00:00
f89ad49eff Merge pull request 'changed time in invoice in transit' (#220) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #220
2026-01-21 09:29:47 +00:00
c9006ee0a1 Merge pull request 'change time in invoice transit' (#219) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #219
2026-01-21 09:27:24 +00:00
2fa58b587e Merge pull request 'chnaged time in scheduler' (#218) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #218
2026-01-21 07:31:49 +00:00
bb0a684366 Merge pull request 'Changed time logic in invoice data report' (#217) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #217
2026-01-21 06:30:19 +00:00
16b1802412 Merge pull request 'changed time in invoice transit' (#216) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #216
2026-01-21 06:16:14 +00:00
079ed2eba6 Merge pull request 'changed time in invoice in transit' (#215) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 9s
Reviewed-on: #215
2026-01-21 06:09:33 +00:00
f1f6b596a4 Merge pull request 'changed time for invoice in transit' (#214) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #214
2026-01-21 05:58:54 +00:00
b2aa572994 Merge pull request 'Added customer trade and location in invoice pending reason page' (#213) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #213
2026-01-21 05:55:35 +00:00
44bdcba615 Merge pull request 'chnaged logic in invoice chart' (#212) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #212
2026-01-20 13:31:09 +00:00
76a5379c02 Merge pull request 'changed logic in invoice report' (#211) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Reviewed-on: #211
2026-01-20 13:12:35 +00:00
eeeec722ee Merge pull request 'changed logic for this week also in invoice chart' (#210) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Reviewed-on: #210
2026-01-20 12:50:26 +00:00
d8a4ddf6e9 Merge pull request 'changed logic in invoice chart' (#209) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #209
2026-01-20 12:47:42 +00:00
9493bf5edf Merge pull request 'changed logic in invoice chart' (#208) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
Reviewed-on: #208
2026-01-20 12:18:11 +00:00
feab063017 Merge pull request 'changed logic in invoice chart' (#207) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Reviewed-on: #207
2026-01-20 11:09:45 +00:00
b2f5194ef9 Merge pull request 'changed logic in invoice chart' (#206) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
Reviewed-on: #206
2026-01-20 10:59:15 +00:00
3a3322ccc4 Merge pull request 'changed update scenario logic in invoice out validations page' (#205) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
Reviewed-on: #205
2026-01-20 06:24:38 +00:00
7a9dac239d Merge pull request 'changed logic in invoice pending reason page' (#204) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Reviewed-on: #204
2026-01-20 05:30:46 +00:00
77d98b16fb Merge pull request 'Added notifications for invoice pending reason page' (#203) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #203
2026-01-20 05:28:39 +00:00
a2554fb4a9 Merge pull request 'Added permission for invoice pending reason page in seeder' (#202) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #202
2026-01-20 05:24:27 +00:00
353774b184 Merge pull request 'Added save button in invoice pending reason page' (#201) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #201
2026-01-20 05:22:17 +00:00
29fecaea3d Merge pull request 'changed max length in invoice pending reason' (#200) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #200
2026-01-20 05:13:57 +00:00
a35185e4b1 Merge pull request 'Added max length for remark for invoice pending reason page' (#199) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #199
2026-01-20 05:12:30 +00:00
f07ba9dd00 Merge pull request 'Added remark column in invoice data validation resource page' (#198) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
Reviewed-on: #198
2026-01-20 05:03:26 +00:00
2a7f48cc75 Merge pull request 'Added remark column in invoice data validations' (#197) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #197
2026-01-20 04:58:03 +00:00
c7f4f49669 Merge pull request 'Added remark column for invoice data report' (#196) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #196
2026-01-20 04:57:05 +00:00
2e9a52a890 Merge pull request 'Added invoice pending reason page' (#195) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #195
2026-01-20 04:53:20 +00:00
3c34495048 Merge pull request 'changed report time for invoice transit and invoice data' (#194) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Reviewed-on: #194
2026-01-19 10:33:34 +00:00
b70907cb9f Merge pull request 'ranjith-dev' (#193) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 16s
Reviewed-on: #193
2026-01-19 10:03:28 +00:00
9ee4fe5c7e Merge pull request 'changed name of the column overdue days' (#190) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #190
2026-01-14 06:52:50 +00:00
6f06319752 Merge pull request 'changed logic in invoice in transit' (#189) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #189
2026-01-14 06:49:00 +00:00
785be70629 Merge pull request 'Refactor item code retrieval in WeightValidationResource table method' (#188) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #188
2026-01-14 06:47:41 +00:00
e5cb7f3d88 Merge pull request 'ranjith-dev' (#187) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
Reviewed-on: #187
2026-01-14 06:37:24 +00:00
1dbbd53fc9 Merge pull request 'Updated item code filter option against plant from stickerMaster' (#186) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #186
2026-01-13 10:10:36 +00:00
04d0c2dc82 Merge pull request 'Removed commented notifications' (#185) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #185
2026-01-13 09:22:51 +00:00
048977a44b Merge pull request 'ranjith-dev' (#183) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #183
2026-01-13 09:21:33 +00:00
8395599d9d Merge pull request 'Update .github/workflows/gemini-pr-review.yaml' (#184) from jothi-patch-1 into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
Reviewed-on: #184
2026-01-13 09:18:30 +00:00
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
79e3427cdb Merge pull request 'removed extra attribute in invoice validation' (#80) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Reviewed-on: #80
2025-12-06 11:15:16 +00:00
81a5fa16c4 Merge pull request 'solved quick scanning issue in invoice validation' (#79) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #79
2025-12-06 09:38:37 +00:00
6520c3ca87 Merge pull request 'ranjith-dev' (#78) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #78
2025-12-06 07:26:07 +00:00
2e167c75b0 Merge pull request 'Alter data type for order quantity for process orders table' (#77) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #77
2025-12-06 06:54:18 +00:00
aca5d6c957 Merge pull request 'Added proper mail trigger for serial invoice' (#76) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #76
2025-12-06 06:39:07 +00:00
9edbaf3d43 Merge pull request 'removed unwanted mail trigger for invoice validation error mail' (#75) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Reviewed-on: #75
2025-12-06 04:41:26 +00:00
a46aaa72a2 Merge pull request 'Added product characteristics master policy file' (#74) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
Reviewed-on: #74
2025-12-05 09:05:58 +00:00
d917aa530d Merge pull request 'Added product characteristics master importer and exporter' (#73) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #73
2025-12-05 09:04:44 +00:00
45944c5c25 Merge pull request 'Added product characteristics master resource pages' (#72) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #72
2025-12-05 09:03:20 +00:00
fda672948b Merge pull request 'Added product characteristics model file' (#71) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #71
2025-12-05 09:01:39 +00:00
f15e6451ca Merge pull request 'removed two migartion file for product characteristics' (#70) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #70
2025-12-05 08:58:25 +00:00
c8aac9116d Merge pull request 'Added production characteristics migration file' (#69) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
Reviewed-on: #69
2025-12-05 08:45:49 +00:00
bcd107a8bc Merge pull request 'Added rout api fopr get char master for product charcteristics' (#68) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #68
2025-12-05 08:34:19 +00:00
458e143b9a Merge pull request 'Added chracteristics master for product characterstics' (#67) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #67
2025-12-05 08:31:12 +00:00
de2dda0dc5 Merge pull request 'removed notification sound in capacitor input box' (#66) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
Reviewed-on: #66
2025-12-04 11:00:49 +00:00
7543f8a416 Merge pull request 'removed required for part validation type in quality validation' (#65) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
Reviewed-on: #65
2025-12-04 06:32:43 +00:00
f76316ec91 Merge pull request 'Added validation for process order with item code' (#64) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
Reviewed-on: #64
2025-12-04 05:04:03 +00:00
acea7b14a6 Merge pull request 'Added line name and employee code for quality validation mail' (#63) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #63
2025-12-03 05:05:30 +00:00
87f49e8491 Merge pull request 'Added filter logic in process order screen' (#62) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #62
2025-12-03 04:34:48 +00:00
f612551288 Merge pull request 'removed required option in alert mail for schedule type' (#61) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #61
2025-12-03 03:17:05 +00:00
4f84735eaf Merge pull request 'correction of alert mail rule logic for invoice data report' (#60) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Reviewed-on: #60
2025-12-03 03:05:35 +00:00
45b8c1fbb4 Merge pull request 'corrected logic for mail triggering' (#59) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Reviewed-on: #59
2025-12-02 11:13:56 +00:00
6015968043 Merge pull request 'Update .github/workflows/gemini-pr-review.yaml' (#58) from actions/gemini-pr-review-patch into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #58
2025-12-02 10:57:48 +00:00
2bc8584e7a Update .github/workflows/gemini-pr-review.yaml
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 10s
Gemini PR Review / review (pull_request) Successful in 29s
Laravel Pint / pint (pull_request) Has been cancelled
Laravel Larastan / larastan (pull_request) Has been cancelled
2025-12-02 10:55:46 +00:00
d126e931c8 Merge pull request 'decreased font size of the sticker printing table' (#56) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Reviewed-on: #56
2025-12-02 03:05:34 +00:00
62bf68ad2e Merge pull request 'corrected logic in sticker printing page' (#55) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Reviewed-on: #55
2025-12-02 02:54:47 +00:00
c6c63dcb35 Merge pull request 'Added ref no above the qr code in sticker printing' (#54) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Reviewed-on: #54
2025-12-01 12:20:43 +00:00
d1663ae58a Merge pull request 'Added serial qr code validation in create page of sticker printing' (#53) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Reviewed-on: #53
2025-12-01 12:11:15 +00:00
deb46cdda2 Merge pull request 'chnaged indentation in item resource page' (#52) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #52
2025-12-01 12:10:12 +00:00
002bdc597d Merge pull request 'Added crt logic policy for sticker printing' (#51) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #51
2025-12-01 10:50:34 +00:00
a406d1b58a Merge pull request 'commented logic for sticker prinitng policy' (#50) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Reviewed-on: #50
2025-12-01 10:26:58 +00:00
58d0b9f0ae Merge pull request 'Added sticker printing policy' (#49) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #49
2025-12-01 10:12:17 +00:00
c0d8ca7b1e Merge pull request 'commented all line sof cod ein sticker printing policy' (#48) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #48
2025-12-01 10:10:03 +00:00
f31ab62ec0 Merge pull request 'commented user model class in spatie page' (#47) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #47
2025-12-01 09:55:11 +00:00
4285a31f94 Merge pull request 'Added permissions for import and export for sticker printing' (#46) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Reviewed-on: #46
2025-12-01 09:30:07 +00:00
0c9228bfec Merge pull request 'Updated item selection logic in StickerMasterResource to return an empty array when no plant is selected' (#45) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #45
2025-12-01 09:23:49 +00:00
58b45c849d Merge pull request 'Added print button for sticker printing page' (#44) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #44
2025-12-01 09:20:43 +00:00
61a2e7ffad Merge pull request 'Added sticker printing create resource file' (#43) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #43
2025-12-01 09:18:30 +00:00
3779cf3e3b Merge pull request 'Added sticker printing livewire page for table' (#42) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #42
2025-12-01 09:15:31 +00:00
acf955dd94 Merge pull request 'Added pdf qr code for sticker print page' (#41) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #41
2025-12-01 09:14:11 +00:00
0de49f14ce Merge pull request 'Added sticker printing policy page' (#40) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #40
2025-12-01 09:13:27 +00:00
0473ca33cf Merge pull request 'Added sticker prinitng import and export file' (#39) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #39
2025-12-01 09:12:15 +00:00
8a01033459 Merge pull request 'Added sticker printing resource file' (#38) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #38
2025-12-01 09:11:15 +00:00
0555f9faff Merge pull request 'Added sticker printing model file' (#37) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #37
2025-12-01 09:09:39 +00:00
8cbbaa4845 Merge pull request 'Added sticker printing migration file' (#36) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #36
2025-12-01 09:08:26 +00:00
cb6b201648 Merge pull request 'Added user model class in spatie' (#35) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #35
2025-12-01 09:06:52 +00:00
c3089a147c Merge pull request 'Refactor processSerialNumber method to improve package validation logic' (#34) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #34
2025-12-01 08:28:43 +00:00
45f0e39f73 Merge pull request 'Refactor plant selection logic in ItemResource and StickerMasterResource to order by code' (#33) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Reviewed-on: #33
2025-12-01 04:40:07 +00:00
fe1e1b9918 Merge pull request 'Added Quality mail alert in alert mail page' (#32) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #32
2025-12-01 04:30:07 +00:00
e20915ca82 Merge pull request 'Refactor content method in InvoiceDataMail to use null-safe operator for document_date check' (#29) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Reviewed-on: #29
2025-11-29 12:58:25 +00:00
58e6cbfac0 Merge pull request 'Added proper imports for mail' (#28) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #28
2025-11-29 12:57:53 +00:00
1ace049687 Merge pull request 'Uncommented the mail schedule logic' (#27) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
Reviewed-on: #27
2025-11-29 12:33:52 +00:00
e5e85a8eea Merge pull request 'ranjith-dev' (#26) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
Reviewed-on: #26
2025-11-29 12:28:01 +00:00
555802ab35 Merge pull request 'Updated warning message against tube_sticker and pack_slip master data' (#25) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #25
2025-11-29 11:53:18 +00:00
587b743f12 Merge pull request 'Clear process_order if plant not selected' (#24) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Reviewed-on: #24
2025-11-29 10:47:24 +00:00
42555d4a81 Merge pull request 'Added reactive validation for plant selection and duplicate checks for coil and SFG numbers in ProcessOrder form' (#23) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
Reviewed-on: #23
2025-11-29 10:43:17 +00:00
fd1e554076 Merge pull request 'commented out machine ID validation logic in storeProcessOrderData method' (#22) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #22
2025-11-29 10:07:18 +00:00
022654f192 Merge pull request 'Updated get hasPumpQr status from pack_slip_pump if it does not exist in tube_sticker_pump' (#21) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Reviewed-on: #21
2025-11-29 09:00:31 +00:00
55f1088fda Merge pull request 'Updated sfg_number validations as optional and check duplcate only if it exist' (#20) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #20
2025-11-29 06:52:08 +00:00
f9233f44d8 Merge pull request 'commented alert mail rules logic from boot method' (#19) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
Reviewed-on: #19
2025-11-29 06:19:01 +00:00
e0fec6b07c Merge pull request 'Added schedule method logic in app service provider' (#18) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #18
2025-11-29 05:35:04 +00:00
6bda9c1459 Merge pull request 'Added LogClear command and Updated log message' (#17) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Reviewed-on: #17
2025-11-27 06:34:58 +00:00
39bdd3df57 Merge pull request 'Updated report view logic' (#16) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Reviewed-on: #16
2025-11-27 05:41:34 +00:00
5bcf0703d9 Merge pull request 'Refactor: Clean up imports and enhance form/table structure in InvoiceDataValidation and InvoiceOutValidation resources' (#15) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #15
2025-11-27 05:29:19 +00:00
80e522b7e6 Merge pull request 'feat: Add validation rules for Machine and Work Center names; enhance ProcessOrder table sorting; refactor StickerMasterResource for improved readability and functionality' (#14) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Reviewed-on: #14
2025-11-27 04:50:10 +00:00
ee101f80ea Merge pull request 'Updated error response codes in updateGR and related methods to return 404 for various validation errors and Added sfg_number duplicate warning' (#13) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #13
2025-11-27 03:08:14 +00:00
37a99d03c1 Merge pull request 'Enhanced storeProcessOrderData method with improved validation and error handling for plant code, item code, coil number, order quantity, received quantity, SFG number, machine ID, and created by' (#12) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #12
2025-11-26 14:21:05 +00:00
5fdced003a Merge pull request 'ranjith-dev' (#11) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #11
2025-11-26 14:17:41 +00:00
0b0bb90efb Merge pull request 'Added POST API logs to view the structure in command prompt' (#10) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Reviewed-on: #10
2025-11-26 11:43:09 +00:00
32ce6da2c1 Merge pull request 'Add Larastan configuration and dependencies for static analysis' (#9) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Reviewed-on: #9
2025-11-26 09:11:36 +00:00
84 changed files with 1158 additions and 6992 deletions

View File

@@ -39,7 +39,7 @@ class Scheduler extends Command
public function handle()
{
$this->call('approval:trigger-mails');
// $this->call('approval:trigger-mails');
// --- Production Rules ---
$productionRules = AlertMailRule::where('module', 'ProductionQuantities')
@@ -112,7 +112,6 @@ class Scheduler extends Command
break;
}
}
// foreach ($invoiceRules as $rule) {
// switch ($rule->schedule_type) {
@@ -211,7 +210,7 @@ class Scheduler extends Command
}
break;
case 'Daily':
if (now()->format('H:i') == '11:00') {
if (now()->format('H:i') == '10:45') {
try {
\Artisan::call('send:invoice-transit-report', [
'schedule_type' => $rule->schedule_type,

View File

@@ -48,12 +48,12 @@ class SendInvoiceTransitReport extends Command
if ($plants->isEmpty()) {
$this->error('No valid plant(s) found.');
return;
}
if (strtolower($scheduleType) == 'daily') {
$results = DB::table('invoice_in_transits as it')
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');
})
@@ -84,18 +84,17 @@ class SendInvoiceTransitReport extends Command
')
)
->when($plantId != 0, fn ($q) => $q->where('it.plant_id', $plantId))
->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
')
->distinct('it.invoice_number')
->get();
if ($results->isEmpty()) {
$this->info('No invoice transit records found for today.');
return;
}
@@ -104,25 +103,24 @@ class SendInvoiceTransitReport extends Command
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);
//$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;
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';
: "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,
@@ -134,10 +132,9 @@ class SendInvoiceTransitReport extends Command
'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',
'status' => $item->delayed_days . ' Days',
];
})->toArray();
}
$mail = new InvoiceTransitMail($scheduleType, $tableData, $mailSubject);
@@ -158,14 +155,13 @@ class SendInvoiceTransitReport extends Command
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)
"Mail sent → Rule {$rule->id} | Invoice Master ID: {$rule->invoice_master_id} | To: " . implode(', ', $toEmails)
);
}
}

View File

@@ -1,204 +0,0 @@
<?php
namespace App\Console\Commands;
use App\Mail\CharacteristicApprovalMail;
use App\Models\CharacteristicApproverMaster;
use App\Models\RequestCharacteristic;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Carbon;
class TriggerPendingApprovalMails extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
// protected $signature = 'app:trigger-pending-approval-mails';
/**
* The console command description.
*
* @var string
*/
// protected $description = 'Command description';
// /**
// * Execute the console command.
// */
// public function handle()
// {
// //
// }
protected $signature = 'approval:trigger-mails';
protected $description = 'Trigger approval mail manually';
public $pdfPath;
public function handle()
{
$this->info('Approval mail job started');
$records = RequestCharacteristic::whereNull('approver_status1')
->whereNull('approver_status2')
->whereNull('approver_status3')
->get();
if ($records->isEmpty()) {
$this->info('No pending approvals');
return;
}
$grouped = $records->groupBy(function ($item) {
return $item->plant_id . '|' . $item->machine_id . '|' . $item->aufnr . '|' . $item->work_flow_id;
});
$rows = [];
foreach ($grouped as $groupRecords) {
$first = $groupRecords->first();
$approver = CharacteristicApproverMaster::where('plant_id', $first->plant_id)
->where('machine_id', $first->machine_id)
->where('id', $first->characteristic_approver_master_id)
->first();
if (!$approver) {
continue;
}
$characteristics = $groupRecords->map(fn ($r) => [
'work_flow_id' => $r->work_flow_id,
'characteristic_name' => $r->characteristic_name,
'current_value' => $r->current_value,
'update_value' => $r->update_value,
])->toArray();
$level = null;
$mail = null;
$name = null;
$updateData = [];
$now = Carbon::now();
// --- FIRST MAIL ---
if (is_null($first->mail_status)){
$level = 1;
$mail = $approver->mail1;
$name = $approver->name1;
$updateData['mail_status'] = 'Sent';
// $updateData['trigger_at'] = $approver->duration1 > 0
// ? $now->copy()->addMinutes($approver->duration1 * 10)
// : null;
if ($approver->duration1 > 0)
{
$duration = number_format((float)$approver->duration1, 2, '.', '');
[$hours, $minutes] = explode('.', $duration);
$totalMinutes = ((int)$hours * 60) + (int)$minutes;
$updateData['trigger_at'] = $now
->copy()
->addMinutes($totalMinutes)
->startOfMinute();
}
else
{
$updateData['trigger_at'] = null;
}
}
// --- SECOND MAIL ---
elseif (
$first->mail_status == 'Sent' &&
is_null($first->approver_status1) &&
$first->trigger_at &&
\Carbon\Carbon::parse($first->trigger_at)->lte($now)
// $first->trigger_at <= $now
) {
$level = 2;
$mail = $approver->mail2;
$name = $approver->name2;
// $updateData['trigger_at'] = $approver->duration2 > 0
// ? $now->copy()->addMinutes($approver->duration2 * 10)
// : null;
// $updateData['mail_status'] = 'Sent-Mail2';
if ($approver->duration2 > 0) {
$duration = number_format((float)$approver->duration2, 2, '.', '');
[$hours, $minutes] = explode('.', $duration);
$totalMinutes = ((int)$hours * 60) + (int)$minutes;
// IMPORTANT: use NOW, not old trigger
$updateData['trigger_at'] = $now->copy()->addMinutes($totalMinutes);
} else {
$updateData['trigger_at'] = null;
}
$updateData['mail_status'] = 'Sent-Mail2';
}
// --- THIRD MAIL ---
elseif (
$first->mail_status == 'Sent-Mail2' &&
is_null($first->approver_status1) &&
is_null($first->approver_status2) &&
$first->trigger_at &&
// $first->trigger_at <= $now
\Carbon\Carbon::parse($first->trigger_at)->lte($now)
) {
$level = 3;
$mail = $approver->mail3;
$name = $approver->name3;
$updateData['trigger_at'] = null;
$updateData['mail_status'] = 'Sent-Mail3';
}
if (!$level || !$mail) {
continue;
}
$pdfPath = 'uploads/LaserDocs/' . $first->work_flow_id . '.pdf';
Mail::to($mail)->send(
new CharacteristicApprovalMail(
$first,
$name,
$level,
$pdfPath,
$characteristics
)
);
RequestCharacteristic::whereIn('id', $groupRecords->pluck('id'))
->update($updateData);
$rows[] = [
$first->id,
$first->plant_id,
$first->machine_id,
"Level $level",
$mail,
'SENT'
];
}
$this->table(
['ID', 'Plant', 'Machine', 'Level', 'Mail', 'Status'],
$rows
);
$this->info('Approval mail job completed');
}
}

View File

@@ -1,231 +0,0 @@
<?php
namespace App\Exports;
use Illuminate\Support\Facades\View as FacadesView;
use Illuminate\View\View as ViewView;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\FromView;
use Illuminate\Contracts\View\View;
use Maatwebsite\Excel\Concerns\FromArray;
use Maatwebsite\Excel\Concerns\WithChunkReading;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithEvents;
use Maatwebsite\Excel\Events\AfterSheet;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\WithCustomStartCell;
// use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithMapping;
use Maatwebsite\Excel\Concerns\WithStartRow;
use Maatwebsite\Excel\Excel;
use Maatwebsite\Excel\Events\BeforeExport;
use PhpOffice\PhpSpreadsheet\IOFactory;
// {
// public function __construct(
// public $records,
// ) {}
// // public function view(): View
// // {
// // return view('exports.export-isi-pdf', [
// // 'records' => $this->records,
// // ]);
// // }
// public function collection()
// {
// return $this->records;
// }
// public function headings(): array
// {
// // Top two rows (Company info + Motor KW/HP)
// return [
// ['C.R.I. Pumps Private Limited', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'Unit: MOTOR FREE RUN TEST REGISTER'],
// ['Motor KW/HP : - / -', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'Phase : -'],
// // Column headers
// [
// 'Date', 'Motor SNo', 'Item Code', 'Motor Type',
// 'Voltage', 'Current', 'Power', 'IR.Hot', 'IR.Cool', 'Frequency', 'Speed', 'Leakage Current', // AFTER FREE RUN
// 'Voltage', 'Current', 'Power', // LOCKED ROTOR TEST
// 'No Load Pickup Voltage', 'Room Temp.', 'High Voltage Test', 'Result', 'Remark'
// ]
// ];
// }
// public function registerEvents(): array
// {
// return [
// AfterSheet::class => function (AfterSheet $event) {
// $sheet = $event->sheet->getDelegate();
// // Merge top rows for company info
// $sheet->mergeCells('A1:S1'); // Company Name
// $sheet->mergeCells('T1:T1'); // Unit/Register info
// $sheet->mergeCells('A2:S2'); // Motor KW/HP row
// $sheet->mergeCells('T2:T2'); // Phase
// // Merge headers for grouped columns (AFTER FREE RUN & LOCKED ROTOR TEST)
// $sheet->mergeCells('E3:L3'); // AFTER FREE RUN
// $sheet->mergeCells('M3:O3'); // LOCKED ROTOR TEST
// // Optional: style headers
// $sheet->getStyle('A1:T3')->getFont()->setBold(true);
// $sheet->getStyle('A1:T3')->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
// $sheet->getStyle('A1:T3')->getBorders()->getAllBorders()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
// // Set column widths (optional for better visibility)
// $columns = range('A', 'T');
// foreach ($columns as $col) {
// $sheet->getColumnDimension($col)->setAutoSize(true);
// }
// },
// ];
// }
// }
// class MotorFreeRunExport implements FromCollection, WithMapping, WithStartRow
// {
// protected Collection $records;
// public function __construct(Collection $records)
// {
// $this->records = $records;
// }
// public function collection()
// {
// return $this->records;
// }
// public function startRow(): int
// {
// return 3; // insert data starting from row 3
// }
// public function map($record): array
// {
// return [
// $record['Date'] ?? '',
// $record['Output'] ?? '',
// $record['Motor SNo'] ?? '',
// $record['Item Code'] ?? '',
// $record['Motor Type'] ?? '',
// $record['kw'] ?? '',
// $record['hp'] ?? '',
// $record['phase'] ?? '',
// $record['isi_model'] ?? '',
// $record['Voltage_Before'] ?? '',
// $record['Current_Before'] ?? '',
// $record['Power_Before'] ?? '',
// $record['Resistance_RY'] ?? '',
// $record['Resistance_YB'] ?? '',
// $record['Resistance_BR'] ?? '',
// $record['Insulation_Resistance'] ?? '',
// $record['Frequency_Before'] ?? '',
// $record['Speed_Before'] ?? '',
// $record['Voltage_After'] ?? '',
// $record['Current_After'] ?? '',
// $record['Power_After'] ?? '',
// $record['IR_Hot'] ?? '',
// $record['IR_Cool'] ?? '',
// $record['Leakage_Current'] ?? '',
// $record['Frequency_After'] ?? '',
// $record['Speed_After'] ?? '',
// $record['Voltage_Locked'] ?? '',
// $record['Current_Locked'] ?? '',
// $record['Power_Locked'] ?? '',
// $record['No_Load_Pickup_Voltage'] ?? '',
// $record['Room_Temp'] ?? '',
// $record['High_Voltage_Test'] ?? '',
// $record['Batch_Number'] ?? '',
// $record['Batch_Count'] ?? '',
// $record['Result'] ?? '',
// $record['Remark'] ?? '',
// $record['Tested_By'] ?? '',
// ];
// }
// }
class MotorFreeRunExport implements WithCustomStartCell, WithMapping, WithStartRow, WithChunkReading
{
protected $records;
protected $templatePath;
public function __construct($records)
{
$this->records = $records;
// dd($this->records);
}
public function collection()
{
return $this->records;
}
public function startRow(): int
{
return 7; // Start inserting data from row 7
}
public function startCell(): string
{
return 'A7'; // Start inserting data from row 7 column A
}
public function map($record): array
{
return [
$record['Date'] ?? '',
$record['Output'] ?? '',
$record['Motor SNo'] ?? '',
$record['Item Code'] ?? '',
$record['Motor Type'] ?? '',
$record['kw'] ?? '',
$record['hp'] ?? '',
$record['phase'] ?? '',
$record['isi_model'] ?? '',
$record['Voltage_Before'] ?? '',
$record['Current_Before'] ?? '',
$record['Power_Before'] ?? '',
$record['Resistance_RY'] ?? '',
$record['Resistance_YB'] ?? '',
$record['Resistance_BR'] ?? '',
$record['Insulation_Resistance'] ?? '',
$record['Frequency_Before'] ?? '',
$record['Speed_Before'] ?? '',
$record['Voltage_After'] ?? '',
$record['Current_After'] ?? '',
$record['Power_After'] ?? '',
$record['IR_Hot'] ?? '',
$record['IR_Cool'] ?? '',
$record['Leakage_Current'] ?? '',
$record['Frequency_After'] ?? '',
$record['Speed_After'] ?? '',
$record['Voltage_Locked'] ?? '',
$record['Current_Locked'] ?? '',
$record['Power_Locked'] ?? '',
$record['No_Load_Pickup_Voltage'] ?? '',
$record['Room_Temp'] ?? '',
$record['High_Voltage_Test'] ?? '',
$record['Batch_Number'] ?? '',
$record['Batch_Count'] ?? '',
$record['Result'] ?? '',
$record['Remark'] ?? '',
$record['Tested_By'] ?? '',
];
}
public function chunkSize(): int
{
return 1000; // load 1000 records at a time
}
}

View File

@@ -1,159 +0,0 @@
<?php
namespace App\Exports;
use App\Models\TestingPanelReading;
use Illuminate\Contracts\Queue\ShouldQueue;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\WithChunkReading;
// use Maatwebsite\Excel\Concerns\ShouldQueue;
use Maatwebsite\Excel\Concerns\WithHeadings;
// class TestingPanelReadingExport implements FromCollection
// {
// /**
// * @return \Illuminate\Support\Collection
// */
// public function collection()
// {
// return TestingPanelReading::all();
// }
// }
// class TestingPanelReadingExport implements FromQuery, WithChunkReading, ShouldQueue, WithHeadings
// {
// protected array $ids;
// protected int $counter = 0;
// public function __construct(array $ids)
// {
// $this->ids = $ids;
// }
// public function query()
// {
// return TestingPanelReading::query()
// ->whereIn('id', $this->ids)
// ->select('id', 'plant_id', 'line_id', 'motor_testing_master_id', 'machine_id', 'output', 'serial_number', 'winded_serial_number', 'before_fr_volt', 'before_fr_cur', 'before_fr_pow', 'before_fr_res_ry', 'before_fr_res_yb', 'before_fr_res_br', 'before_fr_ir', 'before_fr_ir_r', 'before_fr_ir_y', 'before_fr_ir_b', 'before_fr_freq', 'before_fr_speed', 'after_fr_vol', 'after_fr_cur', 'after_fr_pow', 'after_fr_ir_hot','after_fr_ir_hot_r', 'after_fr_ir_hot_y', 'after_fr_ir_hot_b', 'after_fr_ir_cool', 'after_fr_ir_cool_r', 'after_fr_ir_cool_y', 'after_fr_ir_cool_b', 'after_fr_freq', 'after_fr_speed', 'after_fr_leak_cur', 'locked_rt_volt', 'locked_rt_cur', 'locked_rt_pow', 'no_load_pickup_volt', 'room_temperature', 'hv_test', 'batch_number', 'batch_count', 'result', 'remark', 'rework_count', 'update_count', 'output_flag', 'tested_by', 'updated_by', 'created_at', 'updated_at', 'scanned_at', 'created_at');
// }
// public function chunkSize(): int
// {
// return 1000; // process 1000 rows at a time
// }
// public function headings(): array
// {
// return ['NO', 'PLANT', 'LINE', 'MOTORTESTINGMASTER', 'MACHINE', 'OUTPUT', 'SERIAL NUMBER', 'WINDED SERIAL NUMBER', 'BEFORE FR VOLT', 'BEFORE FR CUR', 'BEFORE FR POW', 'BEFORE FR RES RY', 'BEFORE FR RES YB', 'BEFORE FR RES BR', 'BEFORE FR IR', 'BEFORE FR IR R', 'BEFORE FR IR Y', 'BEFORE FR IR B', 'BEFORE FR FREQ', 'BEFORE FR SPEED', 'AFTER FR VOL', 'AFTER FR CUR', 'AFTER FR POW', 'AFTER FR IR HOT', 'AFTER FR IR HOT R', 'AFTER FR IR HOT Y', 'AFTER FR IR HOT B', 'AFTER FR IR COOL', 'AFTER FR IR COOL R', 'AFTER FR IR COOL Y', 'AFTER FR IR COOL B', 'AFTER FR FREQ', 'AFTER FR SPEED', 'AFTER FR LEAK CUR', 'LOCKED RT VOLT', 'LOCKED RT CUR', 'LOCKED RT POW', 'NO LOAD PICKUP VOLT', 'ROOM TEMPERATURE', 'HV TEST', 'BATCH NUMBER', 'BATCH COUNT', 'RESULT', 'REMARK', 'REWORK COUNT', 'UPDATE COUNT', 'OUTPUT FLAG', 'TETSED BY', 'UPDATED BY', 'CREATED AT', 'UPDATED AT', 'SCANNED AT', 'CREATED AT'];
// }
// public function map($record): array
// {
// $this->counter++;
// return [
// $this->counter, // No.
// $record->plant_id,
// $record->line_id,
// $record->motor_testing_master_id,
// $record->machine_id,
// $record->output,
// $record->serial_number,
// $record->winded_serial_number,
// $record->before_fr_volt,
// $record->before_fr_cur,
// $record->before_fr_pow,
// $record->before_fr_res_ry,
// $record->before_fr_res_yb,
// $record->before_fr_res_br,
// $record->before_fr_ir,
// $record->before_fr_ir_r,
// $record->before_fr_ir_y,
// $record->before_fr_ir_b,
// $record->before_fr_freq,
// $record->before_fr_speed,
// $record->after_fr_vol,
// $record->after_fr_cur,
// $record->after_fr_pow,
// $record->after_fr_ir_hot,
// $record->after_fr_ir_hot_r,
// $record->after_fr_ir_hot_y,
// $record->after_fr_ir_hot_b,
// $record->after_fr_ir_cool,
// $record->after_fr_ir_cool_r,
// $record->after_fr_ir_cool_y,
// $record->after_fr_ir_cool_b,
// $record->after_fr_freq,
// $record->after_fr_speed,
// $record->after_fr_leak_cur,
// $record->locked_rt_volt,
// $record->locked_rt_cur,
// $record->locked_rt_pow,
// $record->no_load_pickup_volt,
// $record->room_temperature,
// $record->hv_test,
// $record->batch_number,
// $record->batch_count,
// $record->result,
// $record->remark,
// $record->rework_count,
// $record->update_count,
// $record->output_flag,
// $record->tested_by,
// $record->updated_by,
// // $record->created_at,
// $record->updated_at,
// $record->scanned_at,
// $record->created_at,
// ];
// }
// }
class TestingPanelReadingExport implements FromCollection, WithHeadings
{
protected $records;
protected $isAllStarDelta;
public function __construct($records, $isAllStarDelta)
{
$this->records = $records;
$this->isAllStarDelta = $isAllStarDelta;
}
public function collection()
{
return collect($this->records)->map(function ($record) {
if (!$this->isAllStarDelta) {
return [
'Date' => date('Y-m-d', strtotime($record['created_at'] ?? '')),
'Output' => $record['output'] ?? '',
'Motor SNo' => $record['serial_number'] ?? '',
'Item Code' => $record->motorTestingMaster->item->code ?? '',
'Motor Type' => $record->motorTestingMaster->item->description ?? '',
'IR_Hot' => $record['after_fr_ir_hot'] ?? '',
'IR_Cool' => $record['after_fr_ir_cool'] ?? '',
'Leakage_Current' => $record['after_fr_leak_cur'] ?? '',
];
} else {
return [
'Date' => date('Y-m-d', strtotime($record['created_at'] ?? '')),
'Output' => $record['output'] ?? '',
'Motor SNo' => $record['serial_number'] ?? '',
'Item Code' => $record->motorTestingMaster->item->code ?? '',
'Motor Type' => $record->motorTestingMaster->item->description ?? '',
'IR_Hot_R' => $record['after_fr_ir_hot_r'] ?? '',
'IR_Hot_Y' => $record['after_fr_ir_hot_y'] ?? '',
'IR_Hot_B' => $record['after_fr_ir_hot_b'] ?? '',
'IR_Cool_R' => $record['after_fr_ir_cool_r'] ?? '',
'IR_Cool_Y' => $record['after_fr_ir_cool_y'] ?? '',
'IR_Cool_B' => $record['after_fr_ir_cool_b'] ?? '',
'Leakage_Current' => $record['after_fr_leak_cur'] ?? '',
];
}
});
}
public function headings(): array
{
return array_keys($this->collection()->first() ?? []);
}
}

View File

@@ -1,77 +0,0 @@
<?php
namespace App\Filament\Exports;
use App\Models\CharacteristicApproverMaster;
use Filament\Actions\Exports\ExportColumn;
use Filament\Actions\Exports\Exporter;
use Filament\Actions\Exports\Models\Export;
class CharacteristicApproverMasterExporter extends Exporter
{
protected static ?string $model = CharacteristicApproverMaster::class;
public static function getColumns(): array
{
static $rowNumber = 0;
return [
// ExportColumn::make('id')
// ->label('ID'),
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('machine.work_center')
->label('WORK CENTER'),
ExportColumn::make('machine_name')
->label('MACHINE NAME'),
ExportColumn::make('characteristic_field')
->label('MASTER CHARACTERISTIC FIELD'),
ExportColumn::make('name1')
->label('APPROVER NAME 1'),
ExportColumn::make('mail1')
->label('APPROVER MAIL 1'),
ExportColumn::make('duration1')
->label('DURATION 1'),
ExportColumn::make('name2')
->label('APPROVER NAME 2'),
ExportColumn::make('mail2')
->label('APPROVER MAIL 2'),
ExportColumn::make('duration2')
->label('DURATION 2'),
ExportColumn::make('name3')
->label('APPROVER NAME 3'),
ExportColumn::make('mail3')
->label('APPROVER MAIL 3'),
ExportColumn::make('duration3')
->label('DURATION 3'),
ExportColumn::make('created_at')
->label('CREATED AT'),
ExportColumn::make('created_by')
->label('CREATED BY'),
ExportColumn::make('updated_at')
->label('UPDATED AT'),
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 approver 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

@@ -1,335 +0,0 @@
<?php
namespace App\Filament\Exports;
use App\Models\ClassCharacteristic;
use Filament\Actions\Exports\ExportColumn;
use Filament\Actions\Exports\Exporter;
use Filament\Actions\Exports\Models\Export;
class ClassCharacteristicExporter extends Exporter
{
protected static ?string $model = ClassCharacteristic::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('item.code')
->label('ITEM CODE'),
ExportColumn::make('aufnr')
->label('AUFNR'),
ExportColumn::make('class')
->label('CLASS'),
ExportColumn::make('arbid')
->label('ARBID'),
ExportColumn::make('gamng')
->label('GAMNG'),
ExportColumn::make('lmnga')
->label('LMNGA'),
ExportColumn::make('gernr')
->label('GERNR'),
ExportColumn::make('zz1_cn_bill_ord')
->label('ZZ1 CN BILL ORD'),
ExportColumn::make('zmm_amps')
->label('ZMM AMPSTEXT'),
ExportColumn::make('zmm_brand')
->label('ZMM BRAND'),
ExportColumn::make('zmm_degreeofprotection')
->label('ZMM DEGREEOFPROTECTION'),
ExportColumn::make('zmm_delivery')
->label('ZMM DELIVERY'),
ExportColumn::make('zmm_dir_rot')
->label('ZMM DIR ROT'),
ExportColumn::make('zmm_discharge')
->label('ZMM DISCHARGE'),
ExportColumn::make('zmm_discharge_max')
->label('ZMM DISCHARGE MAX'),
ExportColumn::make('zmm_discharge_min')
->label('ZMM DISCHARGE MIN'),
ExportColumn::make('zmm_duty')
->label('ZMM DUTY'),
ExportColumn::make('zmm_eff_motor')
->label('ZMM EFF MOTOR'),
ExportColumn::make('zmm_eff_pump')
->label('ZMM EFF PUMP'),
ExportColumn::make('zmm_frequency')
->label('ZMM FREQUENCY'),
ExportColumn::make('zmm_head')
->label('ZMM HEAD'),
ExportColumn::make('zmm_heading')
->label('ZMM HEADING'),
ExportColumn::make('zmm_head_max')
->label('ZMM HEAD MAX'),
ExportColumn::make('zmm_head_minimum')
->label('ZMM HEAD MINIMUM'),
ExportColumn::make('zmm_idx_eff_mtr')
->label('ZMM IDX EFF MTR'),
ExportColumn::make('zmm_idx_eff_pump')
->label('ZMM IDX EFF PUMP'),
ExportColumn::make('zmm_kvacode')
->label('ZMM KVACODE'),
ExportColumn::make('zmm_maxambtemp')
->label('ZMM MAXAMBTEMP'),
ExportColumn::make('zmm_mincoolingflow')
->label('ZMM MINCOOLING FLOW'),
ExportColumn::make('zmm_motorseries')
->label('ZMM MOTORSERIES'),
ExportColumn::make('zmm_motor_model')
->label('ZMM MOTOR MODEL'),
ExportColumn::make('zmm_outlet')
->label('ZMM OUTLET'),
ExportColumn::make('zmm_phase')
->label('ZMM PHASE'),
ExportColumn::make('zmm_pressure')
->label('ZMM PRESSURE'),
ExportColumn::make('zmm_pumpflowtype')
->label('ZMM PUMPFLOWTYPE'),
ExportColumn::make('zmm_pumpseries')
->label('ZMM PUMPSERIES'),
ExportColumn::make('zmm_pump_model')
->label('ZMM PUMP MODEL'),
ExportColumn::make('zmm_ratedpower')
->label('ZMM RATEDPOWER'),
ExportColumn::make('zmm_region')
->label('ZMM REGION'),
ExportColumn::make('zmm_servicefactor')
->label('ZMM SERVICEFACTOR'),
ExportColumn::make('zmm_servicefactormaximumamps')
->label('ZMM SERVICEFACTORMAXIMUMAMPS'),
ExportColumn::make('zmm_speed')
->label('ZMM SPEED'),
ExportColumn::make('zmm_suction')
->label('ZMM SUCTION'),
ExportColumn::make('zmm_suctionxdelivery')
->label('ZMM SUCTIONXDELIVERY'),
ExportColumn::make('zmm_supplysource')
->label('ZMM SUPPLYSOURCE'),
ExportColumn::make('zmm_temperature')
->label('ZMM TEMPERATURE'),
ExportColumn::make('zmm_thrustload')
->label('ZMM THRUSTLOAD'),
ExportColumn::make('zmm_volts')
->label('ZMM VOLTS'),
ExportColumn::make('zmm_wire')
->label('ZMM WIRE'),
ExportColumn::make('zmm_package')
->label('ZMM PACKAGE'),
ExportColumn::make('zmm_pvarrayrating')
->label('ZMM PVARRAYRATING'),
ExportColumn::make('zmm_isi')
->label('ZMM ISI'),
ExportColumn::make('zmm_isimotor')
->label('ZMM ISIMOTOR'),
ExportColumn::make('zmm_isipump')
->label('ZMM ISIPUMP'),
ExportColumn::make('zmm_isipumpset')
->label('ZMM ISIPUMPSET'),
ExportColumn::make('zmm_pumpset_model')
->label('ZMM PUMPSET MODEL'),
ExportColumn::make('zmm_stages')
->label('ZMM STAGES'),
ExportColumn::make('zmm_headrange')
->label('ZMM HEADRANGE'),
ExportColumn::make('zmm_overall_efficiency')
->label('ZMM OVERALL EFFICIENCY'),
ExportColumn::make('zmm_connection')
->label('ZMM CONNECTION'),
ExportColumn::make('zmm_min_bore_size')
->label('ZMM MIN BORE SIZE'),
ExportColumn::make('zmm_isireference')
->label('ZMM ISIREFERENCE'),
ExportColumn::make('zmm_category')
->label('ZMM CATEGORY'),
ExportColumn::make('zmm_submergence')
->label('ZMM SUBMERGENCE'),
ExportColumn::make('zmm_capacitorstart')
->label('ZMM CAPACITORSTART'),
ExportColumn::make('zmm_capacitorrun')
->label('ZMM CAPACITORRUN'),
ExportColumn::make('zmm_inch')
->label('ZMM INCH'),
ExportColumn::make('zmm_motor_type')
->label('ZMM MOTOR TYPE'),
ExportColumn::make('zmm_dismantle_direction')
->label('ZMM DISMANTLE DIRECTION'),
ExportColumn::make('zmm_eff_ovrall')
->label('ZMM EFF OVRALL'),
ExportColumn::make('zmm_bodymoc')
->label('ZMM BODYMOC'),
ExportColumn::make('zmm_rotormoc')
->label('ZMM ROTORMOC'),
ExportColumn::make('zmm_dlwl')
->label('ZMM DLWL'),
ExportColumn::make('zmm_inputpower')
->label('ZMM INPUTPOWER'),
ExportColumn::make('zmm_imp_od')
->label('ZMM IMP OD'),
ExportColumn::make('zmm_ambtemp')
->label('ZMM AMBTEMP'),
ExportColumn::make('zmm_de')
->label('ZMM DE'),
ExportColumn::make('zmm_dischargerange')
->label('ZMM DISCHARGERANGE'),
ExportColumn::make('zmm_efficiency_class')
->label('ZMM EFFICIENCY CLASS'),
ExportColumn::make('zmm_framesize')
->label('ZMM FRAMESIZE'),
ExportColumn::make('zmm_impellerdiameter')
->label('ZMM IMPELLERDIAMETER'),
ExportColumn::make('zmm_insulationclass')
->label('ZMM INSULATIONCLASS'),
ExportColumn::make('zmm_maxflow')
->label('ZMM MAXFLOW'),
ExportColumn::make('zmm_minhead')
->label('ZMM MINHEAD'),
ExportColumn::make('zmm_mtrlofconst')
->label('ZMM MTRLOFCONST'),
ExportColumn::make('zmm_nde')
->label('ZMM NDE'),
ExportColumn::make('zmm_powerfactor')
->label('ZMM POWERFACTOR'),
ExportColumn::make('zmm_tagno')
->label('ZMM TANGO'),
ExportColumn::make('zmm_year')
->label('ZMM YEAR'),
ExportColumn::make('zmm_laser_name')
->label('ZMM LASER NAME'),
ExportColumn::make('zmm_beenote')
->label('ZMM BEENOTE'),
ExportColumn::make('zmm_beenumber')
->label('ZMM BEENUMBER'),
ExportColumn::make('zmm_beestar')
->label('ZMM BEESTAR'),
ExportColumn::make('zmm_codeclass')
->label('ZMM CODECLASS'),
ExportColumn::make('zmm_colour')
->label('ZMM COLOUR'),
ExportColumn::make('zmm_logo_cp')
->label('ZMM LOGO CP'),
ExportColumn::make('zmm_logo_ce')
->label('ZMM LOGO CE'),
ExportColumn::make('zmm_logo_nsf')
->label('ZMM LOGO NSF'),
ExportColumn::make('zmm_grade')
->label('ZMM GRADE'),
ExportColumn::make('zmm_grwt_pset')
->label('ZMM GRWT PSET'),
ExportColumn::make('zmm_grwt_cable')
->label('ZMM GRWT CABLE'),
ExportColumn::make('zmm_grwt_motor')
->label('ZMM GRWT MOTOR'),
ExportColumn::make('zmm_grwt_pf')
->label('ZMM GRWT PF'),
ExportColumn::make('zmm_grwt_pump')
->label('ZMM GRWT PUMP'),
ExportColumn::make('zmm_isivalve')
->label('ZMM ISIVALVE'),
ExportColumn::make('zmm_isi_wc')
->label('ZMM ISI WC'),
ExportColumn::make('zmm_labelperiod')
->label('ZMM LABELPERIOD'),
ExportColumn::make('zmm_length')
->label('ZMM LENGTH'),
ExportColumn::make('zmm_license_cml_no')
->label('ZMM LICENSE CML NO'),
ExportColumn::make('zmm_mfgmonyr')
->label('ZMM MFGMONYR'),
ExportColumn::make('zmm_modelyear')
->label('ZMM MODELYEAR'),
ExportColumn::make('zmm_motoridentification')
->label('ZMM MOTORIDENTIFICATION'),
ExportColumn::make('zmm_newt_pset')
->label('ZMM NEWT PSET'),
ExportColumn::make('zmm_newt_cable')
->label('ZMM NEWT CABLE'),
ExportColumn::make('zmm_newt_motor')
->label('ZMM NEWT MOTOR'),
ExportColumn::make('zmm_newt_pf')
->label('ZMM NEWT PF'),
ExportColumn::make('zmm_newt_pump')
->label('ZMM NEWT PUMP'),
ExportColumn::make('zmm_packtype')
->label('ZMM PACKTYPE'),
ExportColumn::make('zmm_panel')
->label('ZMM PANEL'),
ExportColumn::make('zmm_performance_factor')
->label('ZMM PERFORMANCE FACTOR'),
ExportColumn::make('zmm_pumpidentification')
->label('ZMM PUMPIDENTIFICATION'),
ExportColumn::make('zmm_psettype')
->label('ZMM PSETTYPE'),
ExportColumn::make('zmm_size')
->label('ZMM SIZE'),
ExportColumn::make('zmm_eff_ttl')
->label('ZMM EFF TTL'),
ExportColumn::make('zmm_type')
->label('ZMM TYPE'),
ExportColumn::make('zmm_usp')
->label('ZMM USP'),
ExportColumn::make('mark_status')
->label('MARKED STATUS'),
ExportColumn::make('marked_datetime')
->label('MARKED DATETIME'),
ExportColumn::make('marked_by')
->label('MARKED BY'),
ExportColumn::make('man_marked_status')
->label('MANUAL MARKED STATUS'),
ExportColumn::make('man_marked_datetime')
->label('MANUAL MARKED DATETIME'),
ExportColumn::make('man_marked_by')
->label('MANUAL MARKED BY'),
ExportColumn::make('motor_marked_status')
->label('MOTOR MARKED STATUS'),
ExportColumn::make('pump_marked_status')
->label('PUMP MARKED STATUS'),
ExportColumn::make('motor_pump_pumpset_status')
->label('MOTOR PUMP PUMPSET STATUS'),
ExportColumn::make('part_validation_1')
->label('PART VALIDATION 1'),
ExportColumn::make('part_validation_2')
->label('PART VALIDATION 2'),
ExportColumn::make('samlight_logged_name')
->label('SAMLIGHT LOGGED NAME'),
ExportColumn::make('pending_released_status')
->label('PENDING RELEASED STATUS'),
ExportColumn::make('motor_expected_time')
->label('MOTOR EXPECTED TIME'),
ExportColumn::make('pump_expected_time')
->label('PUMP EXPECTED TIME'),
ExportColumn::make('created_at')
->label('CREATED AT'),
ExportColumn::make('created_by')
->label('CREATED BY'),
ExportColumn::make('updated_at')
->label('UPDATED AT')
->enabledByDefault(true),
ExportColumn::make('updated_by')
->label('UPDATED BY')
->enabledByDefault(true),
ExportColumn::make('deleted_at')
->label('DELETED AT')
->enabledByDefault(false),
];
}
public static function getCompletedNotificationBody(Export $export): string
{
$body = 'Your class characteristic 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

@@ -44,8 +44,6 @@ class InvoiceValidationExporter extends Exporter
->label('CAPACITOR SCANNED STATUS'),
ExportColumn::make('scanned_status')
->label('SCANNED STATUS'),
ExportColumn::make('panel_box_code')
->label('PANEL BOX CODE'),
ExportColumn::make('panel_box_supplier')
->label('PANEL BOX SUPPLIER'),
ExportColumn::make('panel_box_serial_number')
@@ -63,13 +61,9 @@ class InvoiceValidationExporter extends Exporter
ExportColumn::make('created_at')
->label('CREATED AT'),
// ->dateTimeFormat('d-m-Y H:i:s'),
ExportColumn::make('created_by')
->label('CREATED BY'),
ExportColumn::make('updated_at')
->label('UPDATED AT'),
// ->dateTimeFormat('d-m-Y H:i:s'),
ExportColumn::make('updated_by')
->label('UPDATED BY'),
ExportColumn::make('deleted_at')
->enabledByDefault(false)
->label('DELETED AT'),

View File

@@ -1,99 +0,0 @@
<?php
namespace App\Filament\Exports;
use App\Models\RequestCharacteristic;
use Filament\Actions\Exports\ExportColumn;
use Filament\Actions\Exports\Exporter;
use Filament\Actions\Exports\Models\Export;
class RequestCharacteristicExporter extends Exporter
{
protected static ?string $model = RequestCharacteristic::class;
public static function getColumns(): array
{
static $rowNumber = 0;
return [
// ExportColumn::make('id')
// ->label('ID'),
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('machine.work_center')
->label('WORK CENTER'),
ExportColumn::make('work_flow_id')
->label('WORK FLOW ID'),
ExportColumn::make('item.code')
->label('ITEM CODE'),
ExportColumn::make('aufnr')
->label('AUFNR'),
ExportColumn::make('characteristicApproverMaster.machine_name')
->label('MACHINE NAME'),
ExportColumn::make('characteristicApproverMaster.characteristic_field')
->label('MASTER CHARACTERISTIC FIELD'),
ExportColumn::make('characteristic_name')
->label('CHARACTERISTIC NAME'),
ExportColumn::make('current_value')
->label('CURRENT VALUE'),
ExportColumn::make('update_value')
->label('UPDATE VALUE'),
ExportColumn::make('characteristicApproverMaster.name1')
->label('APPROVER NAME 1'),
ExportColumn::make('approver_status1')
->label('APPROVER STATUS 1'),
ExportColumn::make('approver_remark1')
->label('APPROVER REMARK 1'),
ExportColumn::make('approved1_at')
->label('APPROVED AT 1'),
ExportColumn::make('characteristicApproverMaster.name2')
->label('APPROVER NAME 2'),
ExportColumn::make('approver_status2')
->label('APPROVER STATUS 2'),
ExportColumn::make('approver_remark2')
->label('APPROVER REMARK 2'),
ExportColumn::make('approved2_at')
->label('APPROVED AT 2'),
ExportColumn::make('characteristicApproverMaster.name3')
->label('APPROVER NAME 3'),
ExportColumn::make('approver_status3')
->label('APPROVER STATUS 3'),
ExportColumn::make('approver_remark3')
->label('APPROVER REMARK 3'),
ExportColumn::make('approved3_at')
->label('APPROVED AT 1'),
ExportColumn::make('mail_status')
->label('MAIL STATUS'),
ExportColumn::make('trigger_at')
->label('TRIGGERED AT'),
ExportColumn::make('created_at')
->label('CREATED AT'),
ExportColumn::make('created_by')
->label('CREATED BY'),
ExportColumn::make('updated_at')
->label('UPDATED AT'),
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 request characteristic 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

@@ -1,651 +0,0 @@
<?php
namespace App\Filament\Imports;
use App\Models\ClassCharacteristic;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
class ClassCharacteristicImporter extends Importer
{
protected static ?string $model = ClassCharacteristic::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('item')
->requiredMapping()
->exampleHeader('Item Code')
->example('630214')
->label('Item Code')
->relationship(resolveUsing: 'code')
->rules(['required']),
ImportColumn::make('aufnr')
->label('Aufnr')
->exampleHeader('Aufnr')
->example(''),
ImportColumn::make('class')
->label('Class')
->exampleHeader('Class')
->example(''),
ImportColumn::make('arbid')
->label('Arbid')
->exampleHeader('Arbid')
->example(''),
ImportColumn::make('gamng')
->label('Gamng')
->exampleHeader('Gamng')
->example(''),
ImportColumn::make('lmnga')
->label('Lmnga')
->exampleHeader('Lmnga')
->example(''),
ImportColumn::make('gernr')
->label('Gernr')
->exampleHeader('Gernr')
->example(''),
ImportColumn::make('zz1_cn_bill_ord')
->label('zz1 ccn bill ord')
->exampleHeader('zz1 ccn bill ord')
->example(''),
ImportColumn::make('zmm_amps')
->label('zmm amps')
->exampleHeader('zmm amps')
->example(''),
ImportColumn::make('zmm_brand')
->label('zmm brand')
->exampleHeader('zmm brand')
->example(''),
ImportColumn::make('zmm_degreeofprotection')
->label('zmm degreeofprotection')
->exampleHeader('zmm degreeofprotection')
->example(''),
ImportColumn::make('zmm_delivery')
->label('zmm delivery')
->exampleHeader('zmm delivery')
->example(''),
ImportColumn::make('zmm_dir_rot')
->label('zmm dir rot')
->exampleHeader('zmm dir rot')
->example(''),
ImportColumn::make('zmm_discharge')
->label('zmm discharge')
->exampleHeader('zmm discharge')
->example(''),
ImportColumn::make('zmm_discharge_max')
->label('zmm discharge max')
->exampleHeader('zmm discharge max')
->example(''),
ImportColumn::make('zmm_discharge_min')
->label('zmm discharge min')
->exampleHeader('zmm discharge min')
->example(''),
ImportColumn::make('zmm_duty')
->label('zmm duty')
->exampleHeader('zmm duty')
->example(''),
ImportColumn::make('zmm_eff_motor')
->label('zmm eff motor')
->exampleHeader('zmm eff motor')
->example(''),
ImportColumn::make('zmm_eff_pump')
->label('zmm eff pump')
->exampleHeader('zmm eff pump')
->example(''),
ImportColumn::make('zmm_frequency')
->label('zmm frequency')
->exampleHeader('zmm frequency')
->example(''),
ImportColumn::make('zmm_head')
->label('zmm head')
->exampleHeader('zmm head')
->example(''),
ImportColumn::make('zmm_heading')
->label('zmm heading')
->exampleHeader('zmm heading')
->example(''),
ImportColumn::make('zmm_head_max')
->label('zmm head max')
->exampleHeader('zmm head max')
->example(''),
ImportColumn::make('zmm_head_minimum')
->label('zmm head minimum')
->exampleHeader('zmm head minimum')
->example(''),
ImportColumn::make('zmm_idx_eff_mtr')
->label('zmm idx eff mtr')
->exampleHeader('zmm idx eff mtr')
->example(''),
ImportColumn::make('zmm_idx_eff_pump')
->label('zmm idx eff pump')
->exampleHeader('zmm idx eff pump')
->example(''),
ImportColumn::make('zmm_kvacode')
->label('zmm kvacode')
->exampleHeader('zmm kvacode')
->example(''),
ImportColumn::make('zmm_maxambtemp')
->label('zmm maxambtemp')
->exampleHeader('zmm maxambtemp')
->example(''),
ImportColumn::make('zmm_mincoolingflow')
->label('zmm mincoolingflow')
->exampleHeader('zmm mincoolingflow')
->example(''),
ImportColumn::make('zmm_motorseries')
->label('zmm motorseries')
->exampleHeader('zmm motorseries')
->example(''),
ImportColumn::make('zmm_motor_model')
->label('zmm motor model')
->exampleHeader('zmm motor model')
->example(''),
ImportColumn::make('zmm_outlet')
->label('zmm outlet')
->exampleHeader('zmm outlet')
->example(''),
ImportColumn::make('zmm_phase')
->label('zmm phase')
->exampleHeader('zmm phase')
->example(''),
ImportColumn::make('zmm_pressure')
->label('zmm pressure')
->exampleHeader('zmm pressure')
->example(''),
ImportColumn::make('zmm_pumpflowtype')
->label('zmm pumpflowtype')
->exampleHeader('zmm pumpflowtype')
->example(''),
ImportColumn::make('zmm_pumpseries')
->label('zmm pumpseries')
->exampleHeader('zmm pumpseries')
->example(''),
ImportColumn::make('zmm_pump_model')
->label('zmm pump model')
->exampleHeader('zmm pump model')
->example(''),
ImportColumn::make('zmm_ratedpower')
->label('zmm ratedpower')
->exampleHeader('zmm ratedpower')
->example(''),
ImportColumn::make('zmm_region')
->label('zmm region')
->exampleHeader('zmm region')
->example(''),
ImportColumn::make('zmm_servicefactor')
->label('zmm servicefactor')
->exampleHeader('zmm servicefactor')
->example(''),
ImportColumn::make('zmm_servicefactormaximumamps')
->label('zmm servicefactormaximumamps')
->exampleHeader('zmm servicefactormaximumamps')
->example(''),
ImportColumn::make('zmm_speed')
->label('zmm speed')
->exampleHeader('zmm speed')
->example(''),
ImportColumn::make('zmm_suction')
->label('zmm suction')
->exampleHeader('zmm suction')
->example(''),
ImportColumn::make('zmm_suctionxdelivery')
->label('zmm suctionxdelivery')
->exampleHeader('zmm suctionxdelivery')
->example(''),
ImportColumn::make('zmm_supplysource')
->label('zmm supplysource')
->exampleHeader('zmm supplysource')
->example(''),
ImportColumn::make('zmm_temperature')
->label('zmm temperature')
->exampleHeader('zmm temperature')
->example(''),
ImportColumn::make('zmm_thrustload')
->label('zmm thrustload')
->exampleHeader('zmm thrustload')
->example(''),
ImportColumn::make('zmm_volts')
->label('zmm volts')
->exampleHeader('zmm volts')
->example(''),
ImportColumn::make('zmm_wire')
->label('zmm wire')
->exampleHeader('zmm wire')
->example(''),
ImportColumn::make('zmm_package')
->label('zmm package')
->exampleHeader('zmm package')
->example(''),
ImportColumn::make('zmm_pvarrayrating')
->label('zmm pvarrayrating')
->exampleHeader('zmm pvarrayrating')
->example(''),
ImportColumn::make('zmm_isi')
->label('zmm isi')
->exampleHeader('zmm isi')
->example(''),
ImportColumn::make('zmm_isimotor')
->label('zmm isimotor')
->exampleHeader('zmm isimotor')
->example(''),
ImportColumn::make('zmm_isipump')
->label('zmm isipump')
->exampleHeader('zmm isipump')
->example(''),
ImportColumn::make('zmm_isipumpset')
->label('zmm isipumpset')
->exampleHeader('zmm isipumpset')
->example(''),
ImportColumn::make('zmm_pumpset_model')
->label('zmm pumpset model')
->exampleHeader('zmm pumpset model')
->example(''),
ImportColumn::make('zmm_stages')
->label('zmm stages')
->exampleHeader('zmm stages')
->example(''),
ImportColumn::make('zmm_headrange')
->label('zmm headrange')
->exampleHeader('zmm headrange')
->example(''),
ImportColumn::make('zmm_overall_efficiency')
->label('zmm overall efficiency')
->exampleHeader('zmm overall efficiency')
->example(''),
ImportColumn::make('zmm_connection')
->label('zmm connection')
->exampleHeader('zmm connection')
->example(''),
ImportColumn::make('zmm_min_bore_size')
->label('zmm min bore size')
->exampleHeader('zmm min bore size')
->example(''),
ImportColumn::make('zmm_isireference')
->label('zmm isireference')
->exampleHeader('zmm isireference')
->example(''),
ImportColumn::make('zmm_category')
->label('zmm category')
->exampleHeader('zmm category')
->example(''),
ImportColumn::make('zmm_submergence')
->label('zmm submergence')
->exampleHeader('zmm submergence')
->example(''),
ImportColumn::make('zmm_capacitorstart')
->label('zmm capacitorstart')
->exampleHeader('zmm capacitorstart')
->example(''),
ImportColumn::make('zmm_capacitorrun')
->label('zmm capacitorrun')
->exampleHeader('zmm capacitorrun')
->example(''),
ImportColumn::make('zmm_inch')
->label('zmm inch')
->exampleHeader('zmm inch')
->example(''),
ImportColumn::make('zmm_motor_type')
->label('zmm motor type')
->exampleHeader('zmm motor type')
->example(''),
ImportColumn::make('zmm_dismantle_direction')
->label('zmm dismantle direction')
->exampleHeader('zmm dismantle direction')
->example(''),
ImportColumn::make('zmm_eff_ovrall')
->label('zmm eff ovrall')
->exampleHeader('zmm eff ovrall')
->example(''),
ImportColumn::make('zmm_bodymoc')
->label('zmm bodymoc')
->exampleHeader('zmm bodymoc')
->example(''),
ImportColumn::make('zmm_rotormoc')
->label('zmm rotormoc')
->exampleHeader('zmm rotormoc')
->example(''),
ImportColumn::make('zmm_dlwl')
->label('zmm dlwl')
->exampleHeader('zmm dlwl')
->example(''),
ImportColumn::make('zmm_inputpower')
->label('zmm inputpower')
->exampleHeader('zmm inputpower')
->example(''),
ImportColumn::make('zmm_imp_od')
->label('zmm imp od')
->exampleHeader('zmm imp od')
->example(''),
ImportColumn::make('zmm_ambtemp')
->label('zmm ambtemp')
->exampleHeader('zmm ambtemp')
->example(''),
ImportColumn::make('zmm_de')
->label('zmm de')
->exampleHeader('zmm de')
->example(''),
ImportColumn::make('zmm_dischargerange')
->label('zmm dischargerange')
->exampleHeader('zmm dischargerange')
->example(''),
ImportColumn::make('zmm_efficiency_class')
->label('zmm efficiency class')
->exampleHeader('zmm efficiency class')
->example(''),
ImportColumn::make('zmm_framesize')
->label('zmm framesize')
->exampleHeader('zmm framesize')
->example(''),
ImportColumn::make('zmm_impellerdiameter')
->label('zmm impellerdiameter')
->exampleHeader('zmm impellerdiameter')
->example(''),
ImportColumn::make('zmm_insulationclass')
->label('zmm insulationclass')
->exampleHeader('zmm insulationclass')
->example(''),
ImportColumn::make('zmm_maxflow')
->label('zmm maxflow')
->exampleHeader('zmm maxflow')
->example(''),
ImportColumn::make('zmm_minhead')
->label('zmm minhead')
->exampleHeader('zmm minhead')
->example(''),
ImportColumn::make('zmm_mtrlofconst')
->label('zmm mtrlofconst')
->exampleHeader('zmm mtrlofconst')
->example(''),
ImportColumn::make('zmm_nde')
->label('zmm nde')
->exampleHeader('zmm nde')
->example(''),
ImportColumn::make('zmm_powerfactor')
->label('zmm powerfactor')
->exampleHeader('zmm powerfactor')
->example(''),
ImportColumn::make('zmm_tagno')
->label('zmm tagno')
->exampleHeader('zmm tagno')
->example(''),
ImportColumn::make('zmm_year')
->label('zmm year')
->exampleHeader('zmm year')
->example(''),
ImportColumn::make('zmm_laser_name')
->label('zmm laser name')
->exampleHeader('zmm laser name')
->example(''),
ImportColumn::make('zmm_beenote')
->label('zmm beenote')
->exampleHeader('zmm beenote')
->example(''),
ImportColumn::make('zmm_beenumber')
->label('zmm beenumber')
->exampleHeader('zmm beenumber')
->example(''),
ImportColumn::make('zmm_beestar')
->label('zmm beenumber')
->exampleHeader('zmm beenumber')
->example(''),
ImportColumn::make('zmm_codeclass')
->label('zmm codeclass')
->exampleHeader('zmm codeclass')
->example(''),
ImportColumn::make('zmm_colour')
->label('zmm colour')
->exampleHeader('zmm colour')
->example(''),
ImportColumn::make('zmm_logo_cp')
->label('zmm logo cp')
->exampleHeader('zmm logo cp')
->example(''),
ImportColumn::make('zmm_logo_ce')
->label('zmm logo ce')
->exampleHeader('zmm logo ce')
->example(''),
ImportColumn::make('zmm_logo_nsf')
->label('zmm logo nsf')
->exampleHeader('zmm logo nsf')
->example(''),
ImportColumn::make('zmm_grade')
->label('zmm grade')
->exampleHeader('zmm grade')
->example(''),
ImportColumn::make('zmm_grwt_pset')
->label('zmm grwt pset')
->exampleHeader('zmm grwt pset')
->example(''),
ImportColumn::make('zmm_grwt_cable')
->label('zmm grwt cable')
->exampleHeader('zmm grwt cable')
->example(''),
ImportColumn::make('zmm_grwt_motor')
->label('zmm grwt motor')
->exampleHeader('zmm grwt motor')
->example(''),
ImportColumn::make('zmm_grwt_pf')
->label('zmm grwt pf')
->exampleHeader('zmm grwt pf')
->example(''),
ImportColumn::make('zmm_grwt_pump')
->label('zmm grwt pump')
->exampleHeader('zmm grwt pump')
->example(''),
ImportColumn::make('zmm_isivalve')
->label('zmm isivalve')
->exampleHeader('zmm isivalve')
->example(''),
ImportColumn::make('zmm_isi_wc')
->label('zmm isi wc')
->exampleHeader('zmm isi wc')
->example(''),
ImportColumn::make('zmm_labelperiod')
->label('zmm labelperiod')
->exampleHeader('zmm labelperiod')
->example(''),
ImportColumn::make('zmm_length')
->label('zmm length')
->exampleHeader('zmm length')
->example(''),
ImportColumn::make('zmm_license_cml_no')
->label('zmm license cml no')
->exampleHeader('zmm license cml no')
->example(''),
ImportColumn::make('zmm_mfgmonyr')
->label('zmm mfgmonyr')
->exampleHeader('zmm mfgmonyr')
->example(''),
ImportColumn::make('zmm_modelyear')
->label('zmm modelyear')
->exampleHeader('zmm modelyear')
->example(''),
ImportColumn::make('zmm_motoridentification')
->label('zmm motoridentification')
->exampleHeader('zmm motoridentification')
->example(''),
ImportColumn::make('zmm_newt_pset')
->label('zmm newt pset')
->exampleHeader('zmm newt pset')
->example(''),
ImportColumn::make('zmm_newt_cable')
->label('zmm newt cable')
->exampleHeader('zmm newt cable')
->example(''),
ImportColumn::make('zmm_newt_motor')
->label('zmm newt motor')
->exampleHeader('zmm newt motor')
->example(''),
ImportColumn::make('zmm_newt_pf')
->label('zmm newt pf')
->exampleHeader('zmm newt pf')
->example(''),
ImportColumn::make('zmm_newt_pump')
->label('zmm newt pump')
->exampleHeader('zmm newt pump')
->example(''),
ImportColumn::make('zmm_packtype')
->label('zmm packtype')
->exampleHeader('zmm packtype')
->example(''),
ImportColumn::make('zmm_panel')
->label('zmm panel')
->exampleHeader('zmm panel')
->example(''),
ImportColumn::make('zmm_performance_factor')
->label('zmm performance factor')
->exampleHeader('zmm performance factor')
->example(''),
ImportColumn::make('zmm_pumpidentification')
->label('zmm pumpidentification')
->exampleHeader('zmm pumpidentification')
->example(''),
ImportColumn::make('zmm_psettype')
->label('zmm psettype')
->exampleHeader('zmm psettype')
->example(''),
ImportColumn::make('zmm_size')
->label('zmm size')
->exampleHeader('zmm size')
->example(''),
ImportColumn::make('zmm_eff_ttl')
->label('zmm eff ttl')
->exampleHeader('zmm eff ttl')
->example(''),
ImportColumn::make('zmm_type')
->label('zmm type')
->exampleHeader('zmm type')
->example(''),
ImportColumn::make('zmm_usp')
->label('zmm usp')
->exampleHeader('zmm usp')
->example(''),
ImportColumn::make('mark_status')
->label('MARKED STATUS')
->exampleHeader('MARKED STATUS')
->example(''),
ImportColumn::make('marked_datetime')
->label('MARKED DATETIME')
->exampleHeader('MARKED DATETIME')
->example(''),
ImportColumn::make('marked_by')
->label('MARKED BY')
->exampleHeader('MARKED BY')
->example(''),
ImportColumn::make('man_marked_status')
->label('MANUAL MARKED STATUS')
->exampleHeader('MANUAL MARKED STATUS')
->example(''),
ImportColumn::make('man_marked_datetime')
->label('MANUAL MARKED DATETIME')
->exampleHeader('MANUAL MARKED DATETIME')
->example(''),
ImportColumn::make('man_marked_by')
->label('MANUAL MARKED BY')
->exampleHeader('MANUAL MARKED BY')
->example(''),
ImportColumn::make('motor_marked_status')
->label('MOTOR MARKED STATUS')
->exampleHeader('MOTOR MARKED STATUS')
->example(''),
ImportColumn::make('motor_marked_by')
->label('MOTOR MARKED BY')
->exampleHeader('MOTOR MARKED BY')
->example(''),
ImportColumn::make('pump_marked_status')
->label('PUMP MARKED STATUS')
->exampleHeader('PUMP MARKED STATUS')
->example(''),
ImportColumn::make('pump_marked_by')
->label('PUMP MARKED BY')
->exampleHeader('PUMP MARKED BY')
->example(''),
ImportColumn::make('motor_pump_pumpset_status')
->label('MOTOR PUMP PUMPSET STATUS')
->exampleHeader('MOTOR PUMP PUMPSET STATUS')
->example(''),
ImportColumn::make('motor_machine_name')
->label('MOTOR MACHINE NAME')
->exampleHeader('MOTOR MACHINE NAME')
->example(''),
ImportColumn::make('pump_machine_name')
->label('PUMP MACHINE NAME')
->exampleHeader('PUMP MACHINE NAME')
->example(''),
ImportColumn::make('pumpset_machine_name')
->label('PUMPSET MACHINE NAME')
->exampleHeader('PUMPSET MACHINE NAME')
->example(''),
ImportColumn::make('part_validation_1')
->label('PART VALIDATION 1')
->exampleHeader('PART VALIDATION 1')
->example(''),
ImportColumn::make('part_validation_2')
->label('PART VALIDATION 2')
->exampleHeader('PART VALIDATION 2')
->example(''),
ImportColumn::make('samlight_logged_name')
->label('SAMLGHT LOGGED NAME')
->exampleHeader('SAMLGHT LOGGED NAME')
->example(''),
ImportColumn::make('pending_released_status')
->label('PENDING RELEASED STATUS')
->exampleHeader('PENDING RELEASED STATUS')
->example(''),
ImportColumn::make('motor_expected_time')
->label('MOTOR EXPECTED TIME')
->exampleHeader('MOTOR EXPECTED TIME')
->example(''),
ImportColumn::make('pump_expected_time')
->label('PUMP EXPECTED TIME')
->exampleHeader('PUMP EXPECTED TIME')
->example(''),
ImportColumn::make('created_at')
->label('CREATED AT')
->exampleHeader('CREATED AT')
->example(''),
ImportColumn::make('created_by')
->label('CREATED BY')
->exampleHeader('CREATED BY')
->example('RAW01234'),
ImportColumn::make('updated_at')
->label('UPDATED AT')
->exampleHeader('UPDATED AT')
->example(''),
ImportColumn::make('updated_by')
->label('UPDATED BY')
->exampleHeader('UPDATED BY')
->example(''),
// ImportColumn::make('updated_by'),
];
}
public function resolveRecord(): ?ClassCharacteristic
{
// return ClassCharacteristic::firstOrNew([
// // Update existing records, matching them by `$this->data['column_name']`
// 'email' => $this->data['email'],
// ]);
return new ClassCharacteristic;
}
public static function getCompletedNotificationBody(Import $import): string
{
$body = 'Your class characteristic 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

@@ -18,7 +18,7 @@ class UserImporter extends Importer
public static function getColumns(): array
{
return [
ImportColumn::make('plant_id')
ImportColumn::make('plant')
->requiredMapping()
->exampleHeader('Plant Code')
->example('1000')
@@ -54,13 +54,10 @@ class UserImporter extends Importer
public function resolveRecord(): ?User
{
$warnMsg = [];
$plantCod = $this->data['plant_id'];
$plantCod = $this->data['plant'];
$plant = null;
if (Str::length($plantCod) > 0 && (Str::length($plantCod) < 4 || ! is_numeric($plantCod) || ! preg_match('/^[1-9]\d{3,}$/', $plantCod))) {
if (Str::length($plantCod) < 4 || ! is_numeric($plantCod) || ! preg_match('/^[1-9]\d{3,}$/', $plantCod)) {
$warnMsg[] = 'Invalid plant code found!';
} elseif (Str::length($plantCod) <= 0) {
$plant = null;
$plantCod = null;
} else {
$plant = Plant::where('code', $plantCod)->first();
if (! $plant) {

View File

@@ -357,6 +357,18 @@ class InvoicePendingReason extends Page
]);
return;
}
// else if(!empty($import->remarkEmpty)) {
// Notification::make()
// ->title('Import failed')
// ->body("Remark can't be empty")
// ->danger()
// ->send();
// $this->filtersForm->fill([
// 'file' => null,
// ]);
// return;
// }
else if (! empty($import->duplicateExcelDocs)) {
$duplicates = collect($import->duplicateExcelDocs)

View File

@@ -7,11 +7,13 @@ use Illuminate\Support\Facades\Auth;
class Welcome extends Page
{
protected static ?string $navigationIcon = 'heroicon-s-gift'; // 'heroicon-o-document-text';
protected static ?string $navigationIcon = 'heroicon-o-document-text';
protected static string $view = 'filament.pages.welcome';
public function getHeading(): string
public function getHeading(): string
{
return '';
}

View File

@@ -2,18 +2,14 @@
namespace App\Filament\Resources;
use App\Filament\Exports\CharacteristicApproverMasterExporter;
use App\Filament\Resources\CharacteristicApproverMasterResource\Pages;
use App\Models\CharacteristicApproverMaster;
use App\Models\Machine;
use Filament\Facades\Filament;
use Filament\Forms;
use Filament\Forms\Components\Section;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Actions\ExportAction;
use Filament\Tables\Actions\ImportAction;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
@@ -30,183 +26,53 @@ class CharacteristicApproverMasterResource extends Resource
{
return $form
->schema([
Section::make('')
->schema([
Forms\Components\Select::make('plant_id')
->label('Plant')
->columnSpan(2)
->reactive()
->relationship('plant', 'name')
->required()
->default(function () {
return optional(CharacteristicApproverMaster::latest()->first())->plant_id;
})
->afterStateUpdated(function ($state, callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
}),
Forms\Components\Select::make('machine_id')
->label('Work Center')
->columnSpan(2)
// ->relationship('machine', 'name')
->reactive()
->searchable()
->options(function (callable $get) {
$plantId = $get('plant_id');
if (empty($plantId)) {
return [];
}
Forms\Components\Select::make('plant_id')
->label('Plant')
->reactive()
->relationship('plant', 'name')
->required(),
Forms\Components\Select::make('machine_id')
->label('Work Center')
// ->relationship('machine', 'name')
->reactive()
->searchable()
->options(function (callable $get) {
$plantId = $get('plant_id');
if (empty($plantId)) {
return [];
}
return Machine::where('plant_id', $plantId)->pluck('work_center', 'id');
})
->required()
->default(function () {
return optional(CharacteristicApproverMaster::latest()->first())->machine_id ?? [];
})
->afterStateUpdated(function ($state, callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
}),
Forms\Components\TextInput::make('machine_name')
->label('Machine')
->columnSpan(2)
->reactive()
->required()
->minLength(5)
->default(function () {
return optional(CharacteristicApproverMaster::latest()->first())->machine_name ?? '';
})
->afterStateUpdated(function ($state, callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
}),
Forms\Components\TextInput::make('characteristic_field')
->label('Master Characteristic Field')
->columnSpan(2)
->reactive()
->required()
->minLength(1)
->default('NIL')
->afterStateUpdated(function ($state, callable $set) {
if (strtolower($state) == 'nil' || $state == '' || $state == null) {
$set('characteristic_field', 'NIL');
}
$set('updated_by', Filament::auth()->user()?->name);
}),
Section::make('Approver - 1')
// ->description('Prevent abuse by limiting the number of requests per period')
->columnSpan(['default' => 2, 'sm' => 4])
->schema([
Forms\Components\TextInput::make('name1')
->label('Name')
->reactive()
->required()
->afterStateUpdated(function ($state, callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
}),
Forms\Components\TextInput::make('mail1')
->label('Mail ID')
->columnSpan(['default' => 1, 'sm' => 2])
->reactive()
->required()
->suffixIcon('heroicon-m-envelope')
->suffixIconColor('primary')
->email()
->afterStateUpdated(function ($state, callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
}),
Forms\Components\TextInput::make('duration1')
->label('Duration (HH.MM)')
->reactive()
->required()
->minLength(4)
->maxLength(5)
->regex('/^([0-9]|0[0-9]|1[0-9]|2[0-3])\.(0[0-9]|[1-5][0-9])$/')
->validationMessages([
// 'regex' => 'Duration must be 4 digits in HH.MM format (e.g., 12.30, 23.59). Hours: 00-23, Minutes: 00-59.',
'regex' => 'Duration must be HH.MM format (example: 00.00 - 23.59)',
// 'length' => 'Duration must be exactly 5 characters',
])
->afterStateUpdated(function ($state, callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
}),
])
->collapsed()// collapsible()
->columns(['default' => 1, 'sm' => 4]),
Section::make('Approver - 2')
->columnSpan(['default' => 2, 'sm' => 4])
->schema([
Forms\Components\TextInput::make('name2')
->label('Name')
->reactive()
->afterStateUpdated(function ($state, callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
}),
Forms\Components\TextInput::make('mail2')
->label('Mail ID')
->columnSpan(['default' => 1, 'sm' => 2])
->reactive()
->suffixIcon('heroicon-m-envelope')
->suffixIconColor('primary')
->email()
->afterStateUpdated(function ($state, callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
}),
Forms\Components\TextInput::make('duration2')
->label('Duration (HH.MM)')
->reactive()
->length(4)
->regex('/^([0-9]|0[0-9]|1[0-9]|2[0-3])\.(0[0-9]|[1-5][0-9])$/')
->validationMessages([
'regex' => 'Duration must be HH.MM format (example: 00.00 - 23.59)',
])
->afterStateUpdated(function ($state, callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
}),
])
->collapsed()// collapsible()
->columns(['default' => 1, 'sm' => 4]),
Section::make('Approver - 3')
->columnSpan(['default' => 2, 'sm' => 4])
->schema([
Forms\Components\TextInput::make('name3')
->label('Name')
->reactive()
->afterStateUpdated(function ($state, callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
}),
Forms\Components\TextInput::make('mail3')
->label('Mail ID')
->columnSpan(['default' => 1, 'sm' => 2])
->reactive()
->suffixIcon('heroicon-m-envelope')
->suffixIconColor('primary')
->email()
->afterStateUpdated(function ($state, callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
}),
Forms\Components\TextInput::make('duration3')
->label('Duration (HH.MM)')
->reactive()
->length(4)
->regex('/^([0-9]|0[0-9]|1[0-9]|2[0-3])\.(0[0-9]|[1-5][0-9])$/')
->validationMessages([
'regex' => 'Duration must be HH.MM format (example: 00.00 - 23.59)',
])
->afterStateUpdated(function ($state, callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
}),
])
->collapsed()// collapsible()
->columns(['default' => 1, 'sm' => 4]),
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),
Forms\Components\TextInput::make('id')
->hidden()
->readOnly(),
])
->columns(['default' => 1, 'sm' => 4]),
return Machine::where('plant_id', $plantId)->pluck('work_center', 'id');
})
->required(),
Forms\Components\TextInput::make('characteristic_field')
->label('Characteristic Field'),
Forms\Components\TextInput::make('machine_name')
->label('Machine Name'),
Forms\Components\TextInput::make('name1')
->label('Name-1'),
Forms\Components\TextInput::make('mail1')
->label('Mail-1'),
Forms\Components\TextInput::make('duration1')
->label('Duration-1 (Hour.Minute)'),
Forms\Components\TextInput::make('name2')
->label('Name-2'),
Forms\Components\TextInput::make('mail2')
->label('Mail-2'),
Forms\Components\TextInput::make('duration2')
->label('Duration-2 (Hour.Minute)'),
Forms\Components\TextInput::make('name3')
->label('Name-3'),
Forms\Components\TextInput::make('mail3')
->label('Mail-3'),
Forms\Components\TextInput::make('duration3')
->label('Duration-3 (Hour.Minute)'),
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),
]);
}
@@ -226,34 +92,26 @@ class CharacteristicApproverMasterResource extends Resource
Tables\Columns\TextColumn::make('plant.name')
->label('Plant')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('machine.work_center')
->label('Work Center')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('characteristic_field')
->label('Master Characteristic Field')
->label('Characteristic Field')
->alignCenter()
->searchable()
->formatStateUsing(fn (string $state): string => strtoupper(__($state)))
->extraAttributes(['class' => 'uppercase'])
->sortable(),
Tables\Columns\TextColumn::make('machine_name')
->label('Machine Name')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('name1')
->label('Approver Name 1')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('mail1')
->label('E-Mail 1')
->label('Mail 1')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('duration1')
->label('Duration 1 (Hour.Minute)')
@@ -262,12 +120,10 @@ class CharacteristicApproverMasterResource extends Resource
Tables\Columns\TextColumn::make('name2')
->label('Approver Name 2')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('mail2')
->label('E-Mail 2')
->label('Mail 2')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('duration2')
->label('Duration 2 (Hour.Minute)')
@@ -276,12 +132,10 @@ class CharacteristicApproverMasterResource extends Resource
Tables\Columns\TextColumn::make('name3')
->label('Approver Name 3')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('mail3')
->label('E-Mail 3')
->label('Mail 3')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('duration3')
->label('Duration 3 (Hour.Minute)')
@@ -291,31 +145,16 @@ class CharacteristicApproverMasterResource extends Resource
->label('Created At')
->alignCenter()
->dateTime()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('created_by')
->label('Created By')
->alignCenter()
->searchable()
->sortable(),
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('updated_at')
->label('Updated At')
->alignCenter()
->dateTime()
->searchable()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('updated_by')
->label('Updated By')
->alignCenter()
->searchable()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('deleted_at')
->label('Deleted At')
->dateTime()
->alignCenter()
->searchable()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
@@ -332,22 +171,6 @@ class CharacteristicApproverMasterResource extends Resource
Tables\Actions\ForceDeleteBulkAction::make(),
Tables\Actions\RestoreBulkAction::make(),
]),
])
->headerActions([
// ImportAction::make()
// ->label('Import Characteristics Approver Master')
// ->color('warning')
// ->importer(CharacteristicApproverMasterImporter::class)
// ->visible(function () {
// return Filament::auth()->user()->can('view import characteristic approver master');
// }),
ExportAction::make()
->label('Export Characteristics Approver Master')
->color('warning')
->exporter(CharacteristicApproverMasterExporter::class)
->visible(function () {
return Filament::auth()->user()->can('view export characteristic approver master');
}),
]);
}

View File

@@ -67,7 +67,7 @@ class InvoiceValidationResource extends Resource
->options(function (callable $get) {
$userHas = Filament::auth()->user()->plant_id;
return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::orderBy('code')->pluck('name', 'id')->toArray();
return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::pluck('name', 'id')->toArray();
})
->default(function () {
return optional(InvoiceValidation::latest()->first())->plant_id;
@@ -77,7 +77,7 @@ class InvoiceValidationResource extends Resource
->afterStateUpdated(function ($state, callable $set, callable $get) {
$plantId = $get('plant_id');
$set('update_invoice', null);
// Ensure `linestop_id` is not cleared
if (! $plantId) {
$set('invoice_number', null);
$set('serial_number', null);
@@ -87,11 +87,6 @@ class InvoiceValidationResource extends Resource
return;
} else {
$plantCode = Plant::find($plantId)?->code ?? null;
$directory = "uploads/temp/{$plantCode}";
if (! Storage::disk('local')->exists($directory)) {
Storage::disk('local')->makeDirectory($directory);
}
$set('ivPlantError', null);
}
})
@@ -212,14 +207,6 @@ class InvoiceValidationResource extends Resource
Forms\Components\TextInput::make('id')
->hidden()
->readOnly(true),
// Forms\Components\Hidden::make('created_by')
// ->label('Created By')
// ->default(Filament::auth()->user()?->name)
// ->reactive(),
// Forms\Components\Hidden::make('updated_by')
// ->label('Updated By')
// ->default(Filament::auth()->user()?->name)
// ->reactive(),
])
->columns(5),
]);
@@ -275,11 +262,9 @@ class InvoiceValidationResource extends Resource
Tables\Columns\TextColumn::make('scanned_status')
->label('Scanned Status')
->alignCenter(),
Tables\Columns\TextColumn::make('panel_box_code')// stickerMaster.panel_box_code
->label('Panel Box Code')
->alignCenter()
->sortable(), // ->searchable()
// ->toggleable(isToggledHiddenByDefault: true),
// Tables\Columns\TextColumn::make('stickerMaster.panel_box_code')
// ->label('Panel Box Code')
// ->alignCenter(),
Tables\Columns\TextColumn::make('panel_box_supplier')
->label('Panel Box Supplier')
->alignCenter(),
@@ -304,20 +289,11 @@ class InvoiceValidationResource extends Resource
->label('Plant')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('created_by')
->label('Created By')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('created_at')
->label('Created At')
->dateTime()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('updated_by')
->label('Updated By')
->alignCenter()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('updated_at')
->label('Updated At')
->dateTime()
@@ -356,7 +332,7 @@ class InvoiceValidationResource extends Resource
->options(function (callable $get) {
$userHas = Filament::auth()->user()->plant_id;
return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::orderBy('code')->pluck('name', 'id')->toArray();
return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::pluck('name', 'id')->toArray();
})
->label('Select Plant')
->required()
@@ -365,37 +341,19 @@ class InvoiceValidationResource extends Resource
})
->afterStateUpdated(function ($state, callable $set, callable $get) {
$set('invoice_serial_number', null);
$plantId = $get('plant_id');
$plantCode = Plant::find($plantId)?->code ?? null;
$directory = "uploads/temp/{$plantCode}";
if ($plantId && ! Storage::disk('local')->exists($directory)) {
Storage::disk('local')->makeDirectory($directory);
}
})
->reactive(),
FileUpload::make('invoice_serial_number')
->label('Invoice Serial Number')
->required()
->acceptedFileTypes([
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'application/vnd.ms-excel', // Legacy .xls fallback if needed
])
->rules(['mimes:xlsx']) // Laravel validation: extension check
// ->required()
->preserveFilenames() // <- this keeps the original filename
->reactive()
->storeFiles(false) // prevent auto-storing, we will store manually
->reactive()
->required()
->disk('local') // 'local' refers to the local storage disk defined in config/filesystems.php, typically pointing to storage/app.
->visible(fn (Get $get) => ! empty($get('plant_id')))
->directory(function (callable $get) {
$plant = Plant::find($get('plant_id'));
$plantCode = $plant?->code ?? null;
return "uploads/temp/{$plantCode}";
})
->uploadingMessage('Uploading...')
->helperText('Only .xlsx files are allowed (Excel files).'),
->directory('uploads/temp'),
])
->action(function (array $data) {
$uploadedFile = $data['invoice_serial_number'];
@@ -404,40 +362,17 @@ class InvoiceValidationResource extends Resource
$plantId = $data['plant_id'];
$plant = Plant::find($plantId);
$plantCode = $plant?->code ?? null;
// Get original filename
$originalName = $uploadedFile->getClientOriginalName(); // e.g. 3RA0018732.xlsx
$extension = strtolower(pathinfo($originalName, PATHINFO_EXTENSION));
if ($extension !== 'xlsx') {
throw new \Exception('Only .xlsx files allowed.');
}
$originalNameOnly = pathinfo($originalName, PATHINFO_FILENAME);
$originalName = "{$originalNameOnly}.xlsx";
// Store manually using storeAs to keep original name
$path = $uploadedFile->storeAs("uploads/temp/{$plantCode}", $originalName, 'local'); // returns relative path
// uploads/temp/{$plantCode}/3RA0018735.xlsx
if (strlen($originalNameOnly) < 8 || ! ctype_alnum($originalNameOnly)) {
Notification::make()
->title("Serial invoice number : '$originalNameOnly' should contain minimum 8 digit alpha numeric values!")
->danger()
->send();
if ($disk->exists($path)) {
$disk->delete($path);
}
return;
}
$path = $uploadedFile->storeAs('uploads/temp', $originalName, 'local'); // returns relative path
// uploads/temp/3RA0018735.xlsx
$fullPath = Storage::disk('local')->path($path);
// /home/iot-dev/projects/pds/storage/app/private/uploads/temp/{$plantCode}/3RA0018735.xlsx
// /home/iot-dev/projects/pds/storage/app/private/uploads/temp/3RA0018735.xlsx
$totQuan = InvoiceValidation::where('invoice_number', $originalNameOnly)->count();
if ($totQuan > 0) {
@@ -702,7 +637,7 @@ class InvoiceValidationResource extends Resource
->options(function (callable $get) {
$userHas = Filament::auth()->user()->plant_id;
return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::orderBy('code')->pluck('name', 'id')->toArray();
return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::pluck('name', 'id')->toArray();
})
->label('Select Plant')
->required()
@@ -711,68 +646,32 @@ class InvoiceValidationResource extends Resource
})
->afterStateUpdated(function ($state, callable $set, callable $get) {
$set('invoice_material', null);
$plantId = $get('plant_id');
$plantCode = Plant::find($plantId)?->code ?? null;
$directory = "uploads/temp/{$plantCode}";
if ($plantId && ! Storage::disk('local')->exists($directory)) {
Storage::disk('local')->makeDirectory($directory);
}
})
->reactive(),
FileUpload::make('invoice_material')
->label('Invoice Material')
->required()
->preserveFilenames() // <- this keeps the original filename
->reactive()
->preserveFilenames()
->reactive() // <- this keeps the original filename
->storeFiles(false) // prevent auto-storing
->disk('local')
->visible(fn (Get $get) => ! empty($get('plant_id')))
->directory(function (callable $get) {
$plant = Plant::find($get('plant_id'));
$plantCode = $plant?->code ?? null;
return "uploads/temp/{$plantCode}";
})
->helperText('Only .xlsx files are allowed (Excel files).'),
->directory('uploads/temp'),
])
->action(function (array $data) {
$uploadedFile = $data['invoice_material'];
$plantId = $data['plant_id']; // Access the selected plant_id
$plant = Plant::find($plantId);
$plantCode = $plant?->code ?? null;
$disk = Storage::disk('local');
// Get original filename
$originalName = $uploadedFile->getClientOriginalName();
$extension = strtolower(pathinfo($originalName, PATHINFO_EXTENSION));
if ($extension !== 'xlsx') {
throw new \Exception('Only .xlsx files allowed.');
}
$originalNameOnly = pathinfo($originalName, PATHINFO_FILENAME);
$originalName = "{$originalNameOnly}.xlsx";
$path = $uploadedFile->storeAs("uploads/temp/{$plantCode}", $originalName, 'local');
if (strlen($originalNameOnly) < 8 || ! ctype_alnum($originalNameOnly)) {
Notification::make()
->title("Material invoice number : '$originalNameOnly' should contain minimum 8 digit alpha numeric values!")
->danger()
->send();
if ($disk->exists($path)) {
$disk->delete($path);
}
return;
}
$path = $uploadedFile->storeAs('uploads/temp', $originalName, 'local');
$fullPath = Storage::disk('local')->path($path);
@@ -1174,7 +1073,7 @@ class InvoiceValidationResource extends Resource
->options(function (callable $get) {
$userHas = Filament::auth()->user()->plant_id;
return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::orderBy('code')->pluck('name', 'id')->toArray();
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): void {

View File

@@ -117,8 +117,8 @@ class CreateInvoiceValidation extends CreateRecord
$this->plantId = $plantId;
$plant = Plant::find($plantId);
$plantCode = $plant?->code ?? null;
// $plant = Plant::find($plantId);
// $plantCode = $plant ? $plant->code : null;
// ..GET SERIAL INVOICE API
@@ -233,7 +233,7 @@ class CreateInvoiceValidation extends CreateRecord
$this->dispatch('playNotificationSound');
$filename = $invoiceNumber.'.xlsx';
$directory = "uploads/temp/{$plantCode}";
$directory = 'uploads/temp';
$disk = Storage::disk('local');
$filePath = $directory.'/'.$filename;
// $fullPath = null;
@@ -266,7 +266,7 @@ class CreateInvoiceValidation extends CreateRecord
if ($updateStatus == '1') {
// 'Material invoice update in progress...';
$filename = $invoiceNumber.'.xlsx';
$directory = "uploads/temp/{$plantCode}";
$directory = 'uploads/temp';
$disk = Storage::disk('local');
$filePath = $directory.'/'.$filename;
$fullPath = $disk->path($filePath);
@@ -613,8 +613,6 @@ class CreateInvoiceValidation extends CreateRecord
'invoice_number' => $invoiceNumber,
'quantity' => 1,
'operator_id' => $operatorName,
'created_by' => $operatorName,
'updated_by' => $operatorName,
]);
$inserted++;
}
@@ -655,8 +653,6 @@ class CreateInvoiceValidation extends CreateRecord
'invoice_number' => $invoiceNumber,
'quantity' => $bundleQty,
'operator_id' => $operatorName,
'created_by' => $operatorName,
'updated_by' => $operatorName,
]);
$inserted++;
}
@@ -720,7 +716,6 @@ class CreateInvoiceValidation extends CreateRecord
$existEmpRecQty->update([
'quantity' => $newInsQty,
'operator_id' => $operatorName,
'updated_by' => $operatorName,
'updated_at' => now(),
]);
$newQuan--;
@@ -732,8 +727,6 @@ class CreateInvoiceValidation extends CreateRecord
'invoice_number' => $invoiceNumber,
'quantity' => $newInsQty,
'operator_id' => $operatorName,
'created_by' => $operatorName,
'updated_by' => $operatorName,
]);
$inserted++;
}
@@ -753,7 +746,6 @@ class CreateInvoiceValidation extends CreateRecord
$existEmpRecQty->update([
'quantity' => $newInsQty,
'operator_id' => $operatorName,
'updated_by' => $operatorName,
'updated_at' => now(),
]);
$newQuan--;
@@ -765,8 +757,6 @@ class CreateInvoiceValidation extends CreateRecord
'invoice_number' => $invoiceNumber,
'quantity' => $newInsQty,
'operator_id' => $operatorName,
'created_by' => $operatorName,
'updated_by' => $operatorName,
]);
$inserted++;
}
@@ -790,8 +780,6 @@ class CreateInvoiceValidation extends CreateRecord
->send();
$this->dispatch('playNotificationSound');
InvoiceValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->update(['updated_by' => $operatorName]); // 'updated_at' => now(),
// Update total quantity in the form
$totalQuantity = InvoiceValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count();
$scannedQuantity = InvoiceValidation::where('invoice_number', $invoiceNumber)->whereNotNull('serial_number')->where('serial_number', '!=', '')->where('plant_id', $plantId)->count();
@@ -889,7 +877,7 @@ class CreateInvoiceValidation extends CreateRecord
$this->dispatch('playNotificationSound');
$filename = $invoiceNumber.'.xlsx';
$directory = "uploads/temp/{$plantCode}";
$directory = 'uploads/temp';
$disk = Storage::disk('local');
$filePath = $directory.'/'.$filename;
// $fullPath = null;
@@ -919,15 +907,16 @@ class CreateInvoiceValidation extends CreateRecord
if ($updateStatus == '1') {
$filename = $invoiceNumber.'.xlsx';
$directory = "uploads/temp/{$plantCode}";
$directory = 'uploads/temp';
$disk = Storage::disk('local');
$filePath = $directory.'/'.$filename;
$fullPath = $disk->path($filePath);
// Check if file exists //if ($disk->exists($filePath))
if ($fullPath && file_exists($fullPath)) {
// /home/iot-dev/projects/pds/storage/app/private/uploads/temp/{$plantCode}/3RA0018735.xlsx
// /home/iot-dev/projects/pds/storage/app/private/uploads/temp/3RA0018735.xlsx
// 'Serial invoice update in progress...'
// Now you can read/process the file here
$rows = Excel::toArray(null, $fullPath)[0];
@@ -1244,8 +1233,6 @@ class CreateInvoiceValidation extends CreateRecord
'invoice_number' => $invoiceNumber,
'serial_number' => $serialNumber,
'operator_id' => $operatorName,
'created_by' => $operatorName,
'updated_by' => $operatorName,
]);
$inserted++;
}
@@ -1268,8 +1255,6 @@ class CreateInvoiceValidation extends CreateRecord
$this->dispatch('playNotificationSound');
InvoiceValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->update(['updated_by' => $operatorName]); // 'updated_at' => now(),
// Update total quantity in the form
$totalQuantity = InvoiceValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count();
$scannedQuantity = InvoiceValidation::where('invoice_number', $invoiceNumber)->where('scanned_status', 'Scanned')->where('plant_id', $plantId)->count();
@@ -1352,7 +1337,7 @@ class CreateInvoiceValidation extends CreateRecord
}
$filename = $invoiceNumber.'.xlsx';
$directory = "uploads/temp/{$plantCode}";
$directory = 'uploads/temp';
$disk = Storage::disk('local');
$filePath = $directory.'/'.$filename;
$fullPath = null; // $fullPath = $disk->path($filePath);
@@ -1793,8 +1778,6 @@ class CreateInvoiceValidation extends CreateRecord
'invoice_number' => $invoiceNumber,
'quantity' => 1,
'operator_id' => $operatorName,
'created_by' => $operatorName,
'updated_by' => $operatorName,
]);
$inserted++;
}
@@ -1828,8 +1811,6 @@ class CreateInvoiceValidation extends CreateRecord
'invoice_number' => $invoiceNumber,
'quantity' => $bundleQty,
'operator_id' => $operatorName,
'created_by' => $operatorName,
'updated_by' => $operatorName,
]);
$inserted++;
}
@@ -1861,8 +1842,6 @@ class CreateInvoiceValidation extends CreateRecord
'invoice_number' => $invoiceNumber,
'quantity' => $totalExcelQty,
'operator_id' => $operatorName,
'created_by' => $operatorName,
'updated_by' => $operatorName,
]);
$inserted++;
}
@@ -2227,8 +2206,6 @@ class CreateInvoiceValidation extends CreateRecord
'invoice_number' => $invoiceNumber,
'serial_number' => $serialNumber,
'operator_id' => $operatorName,
'created_by' => $operatorName,
'updated_by' => $operatorName,
]);
$inserted++;
}
@@ -2381,9 +2358,6 @@ class CreateInvoiceValidation extends CreateRecord
$invoiceNumber = $this->form->getState()['invoice_number'];
$this->invoiceNumber = $invoiceNumber;
$plant = Plant::find($plantId);
$plantCode = $plant?->code ?? null;
$totQuan = InvoiceValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count();
$scanSQuan = InvoiceValidation::where('invoice_number', $invoiceNumber)->where('scanned_status', 'Scanned')->where('plant_id', $plantId)->count();
$totMQuan = InvoiceValidation::where('invoice_number', $invoiceNumber)->whereNotNull('quantity')->where('plant_id', $plantId)->count(); // ->where('quantity', '!=', '')
@@ -2421,7 +2395,7 @@ class CreateInvoiceValidation extends CreateRecord
$this->dispatch('playNotificationSound');
$filename = $invoiceNumber.'.xlsx';
$directory = "uploads/temp/{$plantCode}";
$directory = 'uploads/temp';
$disk = Storage::disk('local');
$filePath = $directory.'/'.$filename;
// $fullPath = null;
@@ -2925,7 +2899,7 @@ class CreateInvoiceValidation extends CreateRecord
if ($dupRecord) {
Notification::make()
->title('Duplicate: Material QR')
->body("Scanned Material QR : '{$serialNumber}' already completed the scanning process..!")
->body("Scanned 'Material QR' already completed the scanning process.")
->danger()
->seconds(2)
->send();
@@ -2973,7 +2947,6 @@ class CreateInvoiceValidation extends CreateRecord
if ($curExistQty > $curScanQty) { // 5 > 2
$record->quantity = $curExistQty - $curScanQty; // 5 - 2
$record->operator_id = $operatorName;
// $record->updated_by = $operatorName;
// $record->updated_at = now();
$record->save();
@@ -2986,15 +2959,12 @@ class CreateInvoiceValidation extends CreateRecord
'quantity' => $curScanQty,
'created_at' => $createdDt,
'operator_id' => $operatorName,
'created_by' => $operatorName,
'updated_by' => $operatorName,
]);
} elseif ($curExistQty == $curScanQty) { // 2 = 2
// $record->delete();
$record->serial_number = $serialNumber;
$record->batch_number = $batchNumber;
$record->operator_id = $operatorName;
// $record->updated_by = $operatorName;
// $record->updated_at = now();
$record->save();
@@ -3005,8 +2975,6 @@ class CreateInvoiceValidation extends CreateRecord
// 'quantity' => $curScanQty,
// 'created_at' => $createdDt,
// 'operator_id'=> $operatorName,
// 'created_by' => $operatorName,
// 'updated_by' => $operatorName,
// ]);
} else {
Notification::make()
@@ -3030,19 +2998,19 @@ class CreateInvoiceValidation extends CreateRecord
}
} else {
if (str_contains($serialNumber, '|')) {
Notification::make()
->title('Duplicate: Material QR')
->body("Scanned Material QR : '{$serialNumber}' already completed the scanning process..!")
->danger()
->seconds(2)
->send();
$itemCode = null;
$this->currentItemCode = '';
$batchNumber = null;
$serNo = null;
$serialNumber = null;
Notification::make()
->title('Duplicate: Material QR')
->body("Scanned 'Material QR' already completed the scanning process.")
->danger()
->seconds(2)
->send();
$this->dispatch('playWarnSound');
$this->form->fill([
@@ -3062,7 +3030,6 @@ class CreateInvoiceValidation extends CreateRecord
$record->batch_number = $batchNumber;
// $record->updated_at = now();
$record->operator_id = $operatorName;
// $record->updated_by = $operatorName;
$record->save();
}
@@ -3088,7 +3055,7 @@ class CreateInvoiceValidation extends CreateRecord
$this->dispatch('playNotificationSound');
$filename = $invoiceNumber.'.xlsx';
$directory = "uploads/temp/{$plantCode}";
$directory = 'uploads/temp';
$disk = Storage::disk('local');
$filePath = $directory.'/'.$filename;
// $fullPath = null;
@@ -3132,7 +3099,7 @@ class CreateInvoiceValidation extends CreateRecord
$this->dispatch('playNotificationSound');
$filename = $invoiceNumber.'.xlsx';
$directory = "uploads/temp/{$plantCode}";
$directory = 'uploads/temp';
$disk = Storage::disk('local');
$filePath = $directory.'/'.$filename;
// $fullPath = null;
@@ -3392,7 +3359,7 @@ class CreateInvoiceValidation extends CreateRecord
} elseif ($hadMotorQr == $hasMotorQr) {
Notification::make()
->title('Duplicate: Motor QR')
->body("Scanned Motor Serial Number : '{$serialNumber}' already completed the scanning process.")
->body("Scanned 'Motor' serial number already completed the scanning process.")
->danger()
->seconds(3)
->send();
@@ -3431,7 +3398,6 @@ class CreateInvoiceValidation extends CreateRecord
$record->scanned_status = 'Scanned';
}
$record->operator_id = $operatorName;
// $record->updated_by = $operatorName;
$record->save();
// Notification::make()
@@ -3461,7 +3427,7 @@ class CreateInvoiceValidation extends CreateRecord
$this->dispatch('playNotificationSound');
$filename = $invoiceNumber.'.xlsx';
$directory = "uploads/temp/{$plantCode}";
$directory = 'uploads/temp';
$disk = Storage::disk('local');
$filePath = $directory.'/'.$filename;
// $fullPath = null;
@@ -3510,7 +3476,7 @@ class CreateInvoiceValidation extends CreateRecord
} elseif ($hadPumpQr == $hasPumpQr) {
Notification::make()
->title('Duplicate: Pump QR')
->body("Scanned Pump Serial Number : '{$serialNumber}' already completed the scanning process.")
->body("Scanned 'Pump' serial number already completed the scanning process.")
->danger()
->seconds(3)
->send();
@@ -3548,7 +3514,6 @@ class CreateInvoiceValidation extends CreateRecord
$record->scanned_status = 'Scanned';
}
$record->operator_id = $operatorName;
// $record->updated_by = $operatorName;
$record->save();
// Notification::make()
@@ -3579,7 +3544,7 @@ class CreateInvoiceValidation extends CreateRecord
$this->dispatch('playNotificationSound');
$filename = $invoiceNumber.'.xlsx';
$directory = "uploads/temp/{$plantCode}";
$directory = 'uploads/temp';
$disk = Storage::disk('local');
$filePath = $directory.'/'.$filename;
// $fullPath = null;
@@ -3630,7 +3595,7 @@ class CreateInvoiceValidation extends CreateRecord
} elseif ($hadCapacitorQr == '1' && $hasCapacitorQr) {
Notification::make()
->title('Duplicate: Capacitor QR')
->body("Scanned Capacitor Serial Number : '{$serialNumber}' already completed the scanning process.")
->body("Scanned 'Capacitor' serial number already completed the scanning process.")
->danger()
->seconds(3)
->send();
@@ -3692,7 +3657,7 @@ class CreateInvoiceValidation extends CreateRecord
} elseif ($hadPumpSetQr == $hasPumpSetQr) {
Notification::make()
->title('Duplicate: Pump Set QR')
->body("Scanned Pump Set Serial Number : '{$serialNumber}' already completed the scanning process.")
->body("Scanned 'Pump Set' serial number already completed the scanning process.")
->danger()
->seconds(3)
->send();
@@ -3731,7 +3696,6 @@ class CreateInvoiceValidation extends CreateRecord
$record->scanned_status = 'Scanned';
}
$record->operator_id = $operatorName;
// $record->updated_by = $operatorName;
$record->save();
// Notification::make()
@@ -3776,7 +3740,7 @@ class CreateInvoiceValidation extends CreateRecord
// }
$filename = $invoiceNumber.'.xlsx';
$directory = "uploads/temp/{$plantCode}";
$directory = 'uploads/temp';
$disk = Storage::disk('local');
$filePath = $directory.'/'.$filename;
// $fullPath = null;

View File

@@ -156,9 +156,6 @@ class LineResource extends Resource
'Base FG Line' => 'Base FG Line',
'SFG Line' => 'SFG Line',
'FG Line' => 'FG Line',
'Process Base FG Line' => 'Process Base FG Line',
'Process SFG Line' => 'Process SFG Line',
'Process FG Line' => 'Process FG Line',
'Machining Cell' => 'Machining Cell',
'Blanking Cell' => 'Blanking Cell',
'Forming Cell' => 'Forming Cell',

View File

@@ -6,7 +6,6 @@ use App\Filament\Exports\ProcessOrderExporter;
use App\Filament\Imports\ProcessOrderImporter;
use App\Filament\Resources\ProcessOrderResource\Pages;
use App\Models\Item;
use App\Models\Line;
use App\Models\Plant;
use App\Models\ProcessOrder;
use Filament\Facades\Filament;
@@ -72,28 +71,6 @@ class ProcessOrderResource extends Resource
->hint(fn ($get) => $get('poPlantError') ? $get('poPlantError') : null)
->hintColor('danger')
->required(),
Forms\Components\Select::make('line_id')
->label('Line')
->reactive()
->options(function (callable $get) {
$plantId = $get('plant_id');
if (empty($plantId)) {
return [];
}
return Line::where('plant_id', $plantId)->pluck('name', 'id');
})
->afterStateUpdated(function (callable $set, callable $get, ?string $state) {
$set('item_id', null);
$set('item_description', null);
$set('item_uom', null);
$set('process_order', null);
$set('order_quantity', null);
$set('received_quantity', null);
$set('sfg_number', null);
$set('machine_name', null);
})
->required(),
Forms\Components\Select::make('item_id')
->label('Item Code')
// ->relationship('item', 'id')
@@ -154,7 +131,6 @@ class ProcessOrderResource extends Resource
Forms\Components\TextInput::make('item_uom')
->label('UOM')
->readOnly()
->required()
->reactive()
->afterStateHydrated(function ($component, $state, Get $get, Set $set) {
@@ -269,8 +245,6 @@ class ProcessOrderResource extends Resource
->label('Received Quantity')
->default('0')
->required(),
Forms\Components\TextInput::make('scrap_quantity')
->label('Scrap Quantity'),
Forms\Components\TextInput::make('sfg_number')
->label('SFG Number')
->reactive()
@@ -305,9 +279,6 @@ class ProcessOrderResource extends Resource
->hintColor('danger'),
Forms\Components\TextInput::make('machine_name')
->label('Machine ID'),
Forms\Components\TextInput::make('rework_status')
->label('Rework Status')
->default(0),
Forms\Components\FileUpload::make('attachment')
->label('PDF Upload')
->acceptedFileTypes(['application/pdf'])
@@ -517,11 +488,6 @@ class ProcessOrderResource extends Resource
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('line.name')
->label('Line')
->searchable()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('item.code')
->label('Item')
->searchable()
@@ -557,11 +523,6 @@ class ProcessOrderResource extends Resource
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('scrap_quantity')
->label('Scrap Quantity')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('sfg_number')
->label('SFG Number')
->alignCenter()
@@ -572,12 +533,6 @@ class ProcessOrderResource extends Resource
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('rework_status')
->label('Rework Status')
->alignCenter()
->searchable()
->formatStateUsing(fn ($state) => $state == 1 ? 'Yes' : 'No')
->sortable(),
Tables\Columns\TextColumn::make('created_at')
->label('Created At')
->alignCenter()

File diff suppressed because it is too large Load Diff

View File

@@ -15,9 +15,6 @@ use Storage;
use Maatwebsite\Excel\Facades\Excel;
use Livewire\Livewire;
use Str;
use Livewire\Attributes\On;
use App\Services\SmbService;
use Illuminate\Support\Facades\Log;
class CreateSerialValidation extends CreateRecord
{
@@ -64,13 +61,10 @@ class CreateSerialValidation extends CreateRecord
return $this->getResource()::getUrl('create');
}
public function processInvoice($invoiceNumber)
{
$invoiceNumber = trim($invoiceNumber);
$fileName = $invoiceNumber . '.txt';
$this->showCapacitorInput = false;
$user = Filament::auth()->user();
@@ -94,187 +88,6 @@ class CreateSerialValidation extends CreateRecord
//..GET SERIAL INVOICE API
$content = SmbService::readTextFile($fileName);
if ($content == '') {
Notification::make()
->title('File Not Found')
->body("Unable to locate file: {$fileName}")
->danger()
->send();
return;
}
$lines = preg_split("/\r\n|\n|\r/", trim($content));
$insertData = [];
$missingItemCodes = [];
$InvalidLenSno = [];
$InvalidSno = [];
$InvalidLenItem = [];
$InvalidItem = [];
foreach ($lines as $line)
{
$line = trim($line);
if ($line == '') {
continue;
}
$parts = array_map('trim', explode(',', $line));
if (count($parts) != 2) {
Notification::make()
->title("Invalid data found inside the file.")
->danger()
->seconds(1)
->send();
return;
}
[$itemCode, $serialNumber] = $parts;
$sticker = StickerMaster::where('plant_id', $plantId)
->whereHas('item', function ($query) use ($itemCode, $plantId) {
$query->where('plant_id', $plantId)
->where('code', $itemCode);
})
->first();
if (Str::length($itemCode) < 6)
{
$InvalidLenItem [] = $itemCode;
continue;
}
else if(!is_numeric($itemCode)){
$InvalidItem [] = $itemCode;
continue;
}
if (Str::length($serialNumber) < 9)
{
$InvalidLenSno [] = $serialNumber;
continue;
}
else if(!ctype_alnum($serialNumber)){
$InvalidSno [] = $serialNumber;
continue;
}
if (!$sticker) {
$missingItemCodes[] = $itemCode;
continue;
}
$insertData[] = [
'plant_id' => $plantId,
'sticker_master_id' => $sticker->id,
'invoice_number' => $invoiceNumber,
'serial_number' => $serialNumber,
'created_at' => now(),
'operator_id' => $operatorName,
'updated_at' => now(),
];
}
if (!empty($InvalidLenItem))
{
$count = count($InvalidLenItem);
if ($count <= 10) {
$body = 'Item Code should contain minimum 6 digits: ' . implode(', ', $InvalidLenItem);
} else {
$body = "{$count} item codes contain minimum 6 digits.";
}
Notification::make()
->title("Invalid Item Code.")
->body("$body")
->danger()
->seconds(1)
->send();
return;
}
else if (!empty($InvalidItem))
{
$count = count($InvalidItem);
if ($count <= 10) {
$body = 'Item code must be in numeric values: ' . implode(', ', $InvalidSno);
} else {
$body = "{$count} item codes must be in numeric values.";
}
Notification::make()
->title("Invalid Item Code.")
->body("$body")
->danger()
->seconds(1)
->send();
return;
}
else if (!empty($InvalidLenSno))
{
$count = count($InvalidLenSno);
if ($count <= 10) {
$body = 'Serial number should be minimum 9 digits: ' . implode(', ', $InvalidLenSno);
} else {
$body = "{$count} serial number should be minimum 9 digits.";
}
Notification::make()
->title("Invalid Serial Number.")
->body("$body")
->danger()
->seconds(1)
->send();
return;
}
else if (!empty($InvalidSno))
{
$count = count($InvalidSno);
if ($count <= 10) {
$body = 'Serial number should be conatin alpha numeric values: ' . implode(', ', $InvalidSno);
} else {
$body = "{$count} serial number should be conatin alpha numeric values.";
}
Notification::make()
->title("Invalid Serial Number.")
->body("$body")
->danger()
->seconds(1)
->send();
return;
}
else if (!empty($missingItemCodes))
{
$count = count($missingItemCodes);
if ($count <= 10) {
$body = 'Item codes not found in sticker master: ' . implode(', ', $missingItemCodes);
} else {
$body = "{$count} item codes not found in sticker master table.";
}
Notification::make()
->title("Unknown Item Code.")
->body("$body")
->danger()
->seconds(1)
->send();
return;
}
if (!empty($insertData)) {
SerialValidation::insert($insertData);
}
else{
Notification::make()
->title("Insert Failed.")
->body("Data insertion failed")
->danger()
->seconds(1)
->send();
return;
}
//..
@@ -2498,9 +2311,8 @@ class CreateSerialValidation extends CreateRecord
}
}
public function processSer($serNo)
public function processSerialNumber($serNo)
{
$serNo = trim($serNo);
$user = Filament::auth()->user();
$operatorName = $user->name;
@@ -2983,28 +2795,24 @@ class CreateSerialValidation extends CreateRecord
return;
}
// $this->dispatch('openCapacitorModal', itemCode: $itemCode, serialNumber: $serialNumber, plantId: $plantId);
//$this->dispatch('focusCapacitor', invoiceNumber: $invoiceNumber, plantId: $plantId);
$this->dispatch('openCapacitorModal', itemCode: $itemCode, serialNumber: $serialNumber, plantId: $plantId);
$this->dispatch('focusCapacitor', itemCode: $itemCode);
$scannedQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->where('scanned_status', 'Scanned')->where('plant_id', $plantId)->count();
$totQuan = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count();
$scanSQuan = SerialValidation::where('invoice_number', $invoiceNumber)->where('scanned_status', 'Scanned')->where('plant_id', $plantId)->count();
$totMQuan = SerialValidation::where('invoice_number', $invoiceNumber)->whereNotNull('quantity')->where('plant_id', $plantId)->count(); //->where('quantity', '!=', '')
$scanMQuan = SerialValidation::where('invoice_number', $invoiceNumber)->whereNotNull('serial_number')->where('serial_number', '!=', '')->where('plant_id', $plantId)->count();
//$scannedQuantity = SerialValidation::where('invoice_number', $invoiceNumber)->where('scanned_status', 'Scanned')->where('plant_id', $plantId)->count();
// $totQuan = SerialValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->count();
// $scanSQuan = SerialValidation::where('invoice_number', $invoiceNumber)->where('scanned_status', 'Scanned')->where('plant_id', $plantId)->count();
// $totMQuan = SerialValidation::where('invoice_number', $invoiceNumber)->whereNotNull('quantity')->where('plant_id', $plantId)->count(); //->where('quantity', '!=', '')
// $scanMQuan = SerialValidation::where('invoice_number', $invoiceNumber)->whereNotNull('serial_number')->where('serial_number', '!=', '')->where('plant_id', $plantId)->count();
// $this->form->fill([
// 'plant_id' => $plantId,
// 'invoice_number' => $invoiceNumber,
// 'serial_number' => $serNo,
// 'total_quantity' => $totQuan,
// 'update_invoice' => false,
// 'scanned_quantity'=> $scanSQuan,
// ]);
// $this->dispatch( 'refreshInvoiceData', invoiceNumber: $invoiceNumber, plantId: $plantId);
$this->form->fill([
'plant_id' => $plantId,
'invoice_number' => $invoiceNumber,
'serial_number' => null,
'total_quantity' => $totQuan,
'update_invoice' => false,
'scanned_quantity'=> $scannedQuantity,
]);
$this->dispatch( 'refreshInvoiceData', invoiceNumber: $invoiceNumber, plantId: $plantId);
return;
}
else if ($isMarkPs)
@@ -3150,173 +2958,6 @@ class CreateSerialValidation extends CreateRecord
}
}
#[On('process-scan')]
public function processSerial($serial)
{
$this->processSer($serial);
}
public function processCapacitor($serial, $itemCode)
{
$user = Filament::auth()->user();
$operatorName = $user->name;
$this->currentItemCode = $itemCode;
if (!$serial) {
return;
}
if (!preg_match('/^[^\/]+\/[^\/]+\/.+$/', $serial)) {
Notification::make()
->title('Invalid Panel Box QR Format:')
->body('Scan the valid panel box QR code to proceed!')
->danger()
// ->duration(3000)
->seconds(2)
->send();
return;
}
$parts = explode('/', $serial);
$supplier = $parts[0];
$itemCode = $parts[1];
$serialNumber = implode('/', array_slice($parts, 2)); // Keep rest of the string
$existsInStickerMaster = StickerMaster::where('panel_box_code', $itemCode)->where('plant_id', $this->plantId)->whereHas('item', function ($query) {
$query->where('code', $this->currentItemCode);
})
->exists();
if (!$existsInStickerMaster) {
Notification::make()
->title('Unknown: Panel Box Code')
->body("Unknown panel box code: $itemCode found for item code: $this->currentItemCode")
->danger()
// ->duration(4000)
->seconds(2)
->send();
return;
}
foreach ($this->invoiceData as &$row) {
if (
($row['code'] ?? '') === $this->currentItemCode &&
($row['serial_number'] ?? '') === $this->currentSerialNumber
) {
$row['panel_box_supplier'] = $supplier;
$row['panel_box_item_code'] = $itemCode;
$row['panel_box_serial_number'] = $serialNumber;
$row['capacitor_scanned_status'] = 1;
// $row['scanned_status_set'] = true;
$matchingValidation = SerialValidation::with('stickerMaster.item')
->where('serial_number', $this->currentSerialNumber)
->where('plant_id', $this->plantId)
->get()
->first(function ($validation) {
return $validation->stickerMaster?->item?->code === $this->currentItemCode;
});
if ($matchingValidation) {
$hasMotorQr = $matchingValidation->stickerMasterRelation->tube_sticker_motor ?? null;
$hasPumpQr = $matchingValidation->stickerMasterRelation->tube_sticker_pump ?? null;
$hasPumpSetQr = $matchingValidation->stickerMasterRelation->tube_sticker_pumpset ?? null;
// $hasCapacitorQr = $matchingValidation->stickerMasterRelation->panel_box_code ?? null;
$hadMotorQr = $matchingValidation->motor_scanned_status ?? null;
$hadPumpQr = $matchingValidation->pump_scanned_status ?? null;
$hadPumpSetQr = $matchingValidation->scanned_status_set ?? null;
// $hadCapacitorQr = $matchingValidation->capacitor_scanned_status ?? null;
$packCnt = 1;
$scanCnt = 1;
// if($hadMotorQr === $hasMotorQr && $hadPumpQr === $hasPumpQr && $hadPumpSetQr === $hasPumpSetQr)
if($hasMotorQr || $hasPumpQr || $hasPumpSetQr)
{
$packCnt = $hasMotorQr ? $packCnt + 1 : $packCnt;
$packCnt = $hasPumpQr ? $packCnt + 1 : $packCnt;
$packCnt = $hasPumpSetQr ? $packCnt + 1 : $packCnt;
$scanCnt = $hadMotorQr ? $scanCnt + 1: $scanCnt;
$scanCnt = $hadPumpQr ? $scanCnt + 1: $scanCnt;
$scanCnt = $hadPumpSetQr ? $scanCnt + 1: $scanCnt;
if($packCnt === $scanCnt)
{
$matchingValidation->update([
'panel_box_supplier' => $supplier,
'panel_box_item_code' => $itemCode,
'panel_box_serial_number' => $serialNumber,
'capacitor_scanned_status' => 1,
'scanned_status' => 'Scanned',
'operator_id'=> $operatorName,
]);
}
else
{
$matchingValidation->update([
'panel_box_supplier' => $supplier,
'panel_box_item_code' => $itemCode,
'panel_box_serial_number' => $serialNumber,
'capacitor_scanned_status' => 1,
'operator_id'=> $operatorName,
]);
}
}
else
{
$matchingValidation->update([
'panel_box_supplier' => $supplier,
'panel_box_item_code' => $itemCode,
'panel_box_serial_number' => $serialNumber,
'capacitor_scanned_status' => 1,
'scanned_status' => 'Scanned',
'operator_id'=> $operatorName,
]);
}
// Notification::make()
// ->title('Success: Capacitor QR')
// // ->title("Panel box code scanned: $itemCode")
// ->body("'Capacitor' QR scanned status updated, Scan next QR.")
// ->success() // commented
// ->seconds(2)
// ->send();
$totalQuantity = SerialValidation::where('invoice_number', $matchingValidation->invoice_number)->where('plant_id', $this->plantId)->count();
$scannedQuantity = SerialValidation::where('invoice_number', $matchingValidation->invoice_number)->where('plant_id', $this->plantId)->where('scanned_status', 'Scanned')->count();
// $this->form->fill([
// 'plant_id' => $matchingValidation->plant_id,
// 'invoice_number' => $matchingValidation->invoice_number,
// 'serial_number' => null,
// 'total_quantity' => $totalQuantity,
// 'scanned_quantity'=> $scannedQuantity,
// ]);
if($totalQuantity === $scannedQuantity)
{
Notification::make()
->title('Completed: Serial Invoice')
->body("Serial invoice '$matchingValidation->invoice_number' completed the scanning process.<br>Scan the next 'Serial Invoice' to proceed!")
->success()
->seconds(2)
->send();
$this->loadCompletedData($matchingValidation->invoice_number, $matchingValidation->plant_id, true);
}
else
{
$this->loadData($matchingValidation->invoice_number, $matchingValidation->plant_id);
}
}
break;
}
}
$this->showCapacitorInput = false;
$this->dispatch('focus-serial-number');
}
public function getHeading(): string
{
return 'Scan Serial Validation';

View File

@@ -3,20 +3,20 @@
namespace App\Filament\Resources;
use App\Filament\Resources\TestingTempResource\Pages;
use App\Models\Plant;
use App\Filament\Resources\TestingTempResource\RelationManagers;
use App\Models\TestingTemp;
use Filament\Facades\Filament;
use Filament\Forms;
use Filament\Forms\Components\Actions\Action;
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 Livewire\Features\SupportFileUploads\TemporaryUploadedFile;
use Filament\Forms\Components\Actions\Action;
use Filament\Notifications\Notification;
use Storage;
use Livewire\Features\SupportFileUploads\TemporaryUploadedFile;
class TestingTempResource extends Resource
{
@@ -24,83 +24,16 @@ class TestingTempResource extends Resource
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
protected static ?string $navigationGroup = 'IIOT Temp';
public static function form(Form $form): Form
{
return $form
->schema([
Forms\Components\Select::make('plant_id')
->label('Plant Name')
->relationship('plant', 'name')
->required()
->searchable()
// ->preload()
// ->nullable(),
->reactive()
->columnSpan(1)
->options(function (callable $get) {
$userHas = Filament::auth()->user()->plant_id;
return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::orderBy('code')->pluck('name', 'id')->toArray();
})
->afterStateUpdated(function ($state, callable $set, callable $get) {
$plantId = $get('plant_id');
$set('ivPlantError', null);
$set('name', null);
$set('selected_file', null);
$set('attachment', null);
if (! $plantId) {
$set('ivPlantError', 'Please select a plant first.');
} else {
$plantCode = Plant::find($plantId)?->code ?? null;
$directory = "uploads/temp/{$plantCode}";
if (! Storage::disk('local')->exists($directory)) {
Storage::disk('local')->makeDirectory($directory);
}
}
$set('updated_by', Filament::auth()->user()?->name);
})
->extraAttributes(fn ($get) => [
'class' => $get('ivPlantError') ? 'border-red-500' : '',
])
->hint(fn ($get) => $get('ivPlantError') ? $get('ivPlantError') : null)
->hintColor('danger'),
Forms\Components\TextInput::make('name')
->label('File Name')
->required()
->reactive()
->afterStateUpdated(function ($state, callable $set, callable $get) {
$plantId = $get('plant_id');
$fileNam = $get('name');
// $set('selected_file', null);
if (! $plantId) {
$set('name', null);
} elseif (! $fileNam) {
$set('attachment', null);
}
$set('updated_by', Filament::auth()->user()?->name);
}),
->label('File Name'),
Forms\Components\Select::make('selected_file')
->label('Select Uploaded File')
->searchable()
->options(function (callable $get) {
$plantId = $get('plant_id');
if (! $plantId) {
return collect(Storage::disk('local')->files('uploads/temp'))
->mapWithKeys(function ($file) {
return [
$file => basename($file), // value => label
];
})
->toArray();
}
$plantCode = Plant::find($plantId)?->code ?? null;
return collect(Storage::disk('local')->files("uploads/temp/{$plantCode}"))
->options(function () {
return collect(Storage::disk('local')->files('uploads'))
->mapWithKeys(function ($file) {
return [
$file => basename($file), // value => label
@@ -108,157 +41,100 @@ class TestingTempResource extends Resource
})
->toArray();
})
->afterStateUpdated(function ($state, callable $set, callable $get) {
// $plantId = $get('plant_id');
// if (! $plantId) {
// $set('selected_file', null);
// }
$set('updated_by', Filament::auth()->user()?->name);
})
->searchable()
->reactive(),
// ->disabled(fn (callable $get) => ! $get('plant_id')),
Forms\Components\FileUpload::make('attachment')
->label('Choose File to Upload')
->label('Upload')
// ->acceptedFileTypes(['application/pdf'])
->storeFiles(false)
->disk('local')
->directory(function (callable $get) {
$plantId = $get('plant_id');
$plantCode = Plant::find($plantId)?->code ?? null;
return "uploads/temp/{$plantCode}";
})
->directory('uploads/temp')
->preserveFilenames()
->maxSize(20480) // 20 MB
->afterStateUpdated(function ($state, callable $set, callable $get) {
$plantId = $get('plant_id');
if (! $plantId) {
$set('attachment', null);
}
$set('updated_by', Filament::auth()->user()?->name);
})
->required(function (callable $get) {
$selFile = $get('selected_file');
$selAtt = $get('attachment');
if (! $selAtt && ! $selFile) {
return true;
}
return false;
})
->reactive()
->disabled(fn (callable $get) => ! $get('plant_id') || ! $get('name')),
->reactive(),
Forms\Components\Actions::make([
Action::make('uploadNow')
->label('Upload File')
->color('success')
->requiresConfirmation(function (callable $get) {
$filePath = $get('attachment');
if ($filePath) {
return true;
->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();
}
return false;
})
->action(function (callable $get, callable $set) {
} else {
Notification::make()
->title('No file selected to upload')
->warning()
->send();
}
}),
$uploadedFiles = $get('attachment');
// Action::make('downloadAttachment')
// ->label('Download File')
// ->action(function ($get) {
if (is_array($uploadedFiles) && count($uploadedFiles) > 0) {
// $fileName = basename($get('selected_file'));
$uploaded = reset($uploadedFiles);
// //dd($fileName);
if ($uploaded instanceof TemporaryUploadedFile) {
// // if (!$fileName) {
// // Notification::make()
// // ->title('Enter file name to download')
// // ->danger()
// // ->send();
// // return;
// // }
$baseName = $get('name');
$extension = $uploaded->getClientOriginalExtension();
// $files = Storage::disk('local')->files('uploads');
$finalFileName = $baseName.'.'.$extension;
// foreach ($files as $file) {
$plantId = $get('plant_id');
$plantCode = Plant::find($plantId)?->code ?? null;
// if (pathinfo($file, PATHINFO_FILENAME) === $fileName) {
// dd($fileName);
// Notification::make()
// ->title("File downloaded successfully")
// ->success()
// ->send();
if (! $plantCode) {
Notification::make()
->title('Please select a plant first.')
->warning()
->send();
return;
} elseif (! $baseName) {
Notification::make()
->title('Please enter a file name first.')
->warning()
->send();
return;
}
// return "uploads/temp/{$plantCode}";
$uploaded->storeAs(
"uploads/temp/{$plantCode}",
$finalFileName,
'local'
);
$set('updated_by', Filament::auth()->user()?->name);
Notification::make()
->title("File uploaded successfully: {$finalFileName}")
->success()
->send();
}
} else {
if (! $get('plant_id')) {
Notification::make()
->title('Please select a plant first.')
->warning()
->send();
} elseif (! $get('name')) {
Notification::make()
->title('Please enter a file name first.')
->warning()
->send();
} else {
Notification::make()
->title('No file selected to upload')
->warning()
->send();
}
}
}),
// return response()->download(
// Storage::disk('local')->path($file)
// );
// }
// }
// // Notification::make()
// // ->title('File not found')
// // ->danger()
// // ->send();
// }),
Action::make('downloadAttachment')
->label('Download File')
->color('warning')
->requiresConfirmation(function (callable $get) {
$filePath = $get('selected_file');
if ($filePath) {
return true;
}
->action(function ($get) {
return false;
})
->action(function (callable $get, callable $set) {
$filePath = $get('selected_file'); // uploads/filename.pdf
// if (! $get('plant_id')) {
// Notification::make()
// ->title('Please select a plant first.')
// ->warning()
// ->send();
// return;
// } else
if (! $filePath) {
Notification::make()
->title('Please select a file first.')
->warning()
->send();
return;
} elseif (! Storage::disk('local')->exists($filePath)) {
if (!$filePath || !Storage::disk('local')->exists($filePath)) {
Notification::make()
->title('File not found')
->danger()
@@ -267,8 +143,6 @@ class TestingTempResource extends Resource
return;
}
$set('updated_by', Filament::auth()->user()?->name);
Notification::make()
->title('File downloaded successfully')
->success()
@@ -279,65 +153,38 @@ class TestingTempResource extends Resource
);
}),
Action::make('deleteAttachment')
Action::make('deleteAttachment')
->label('Delete File')
->color('danger')
->requiresConfirmation(function (callable $get) {
$filePath = $get('selected_file');
if ($filePath) {
return true;
}
return false;
})
->action(function ($get, $set) {
->requiresConfirmation()
->action(function ($get) {
$filePath = $get('selected_file'); // uploads/filename.pdf
// if (! $get('plant_id')) {
// Notification::make()
// ->title('Please select a plant first.')
// ->warning()
// ->send();
if (!$filePath || !Storage::disk('local')->exists($filePath)) {
Notification::make()
->title('File not found')
->danger()
->send();
return;
}
Storage::disk('local')->delete($filePath);
// return;
// } else
if (! $filePath) {
Notification::make()
->title('Please select a file first.')
->warning()
->title('File deleted successfully')
->success()
->send();
}),
return;
} elseif (! Storage::disk('local')->exists($filePath)) {
Notification::make()
->title('File not found')
->danger()
->send();
return;
}
Storage::disk('local')->delete($filePath);
$set('selected_file', null);
Notification::make()
->title('File deleted successfully')
->success()
->send();
}),
]),
]),
Forms\Components\Hidden::make('created_by')
->label('Created By')
->default(Filament::auth()->user()?->name)
->reactive(),
->default(Filament::auth()->user()?->name),
Forms\Components\Hidden::make('updated_by')
->label('Updated By')
->default(Filament::auth()->user()?->name)
->reactive(),
->default(Filament::auth()->user()?->name),
]);
}

View File

@@ -5,7 +5,7 @@ namespace App\Filament\Resources;
use App\Filament\Exports\UserExporter;
use App\Filament\Imports\UserImporter;
use App\Filament\Resources\UserResource\Pages;
use App\Models\Plant;
use App\Filament\Resources\UserResource\RelationManagers;
use App\Models\User;
use Filament\Facades\Filament;
use Filament\Forms;
@@ -36,21 +36,16 @@ class UserResource extends Resource
->relationship('plant', 'name')
->nullable()
->reactive()
->options(function (callable $get) {
$userHas = Filament::auth()->user()->plant_id;
return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::orderBy('code')->pluck('name', 'id')->toArray();
})
->default(function () {
return optional(User::latest()->first())->plant_id;
}),
Forms\Components\TextInput::make('name')
->required()
->autofocus()
// ->reactive()
//->reactive()
->live(debounce: 600)
->afterStateUpdated(function ($state, callable $set, callable $get) {
$set('email', $state.'@cripumps.com');
$set('email', $state . '@cripumps.com');
})
->maxLength(255),
Forms\Components\TextInput::make('email')
@@ -63,7 +58,7 @@ class UserResource extends Resource
// ->ignore($get('id')); // Ignore current record during updates
// })
->reactive()
// ->prefix(fn ($get) => $get('name') ?? null)
//->prefix(fn ($get) => $get('name') ?? null)
// ->suffix('@cripumps.com')
->maxLength(255),
Forms\Components\DateTimePicker::make('email_verified_at'),
@@ -78,7 +73,7 @@ class UserResource extends Resource
// ->relationship('roles', 'name'),
Forms\Components\Select::make('roles')
->relationship('roles', 'name')
// ->relationship(name: 'roles', titleAttribute: 'name')
//->relationship(name: 'roles', titleAttribute: 'name')
// ->saveRelationshipsUsing(function (Model $record, $state) {
// $record->roles()->syncWithPivotValues($state, [config('permission.column_names.team_foreign_key') => getPermissionsTeamId()]);
// })
@@ -106,7 +101,6 @@ class UserResource 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')
@@ -171,14 +165,14 @@ class UserResource extends Resource
->label('Import Users')
->color('warning')
->importer(UserImporter::class)
->visible(function () {
->visible(function() {
return Filament::auth()->user()->can('view import user');
}),
ExportAction::make()
->label('Export Users')
->color('warning')
->exporter(UserExporter::class)
->visible(function () {
->visible(function() {
return Filament::auth()->user()->can('view export user');
}),
]);

View File

@@ -1,294 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Models\RequestCharacteristic;
use Carbon\Carbon;
use Illuminate\Http\Request;
class CharacteristicApprovalController extends Controller
{
/**
* Display a listing of the resource.
*/
public function approve(Request $request)
{
return $this->updateStatus($request, 'Approved');
}
public function reject(Request $request)
{
return $this->updateStatus($request, 'Rejected');
}
public function holdForm(Request $request)
{
$id = $request->query('id');
$level = (int) $request->query('level');
$record = RequestCharacteristic::findOrFail($id);
[$statusColumn, $approvedAtColumn, $remarkColumn] = match ($level) {
1 => ['approver_status1', 'approved1_at', 'approver_remark1'],
2 => ['approver_status2', 'approved2_at', 'approver_remark2'],
3 => ['approver_status3', 'approved3_at', 'approver_remark3'],
default => abort(403, 'Invalid approver level'),
};
$levels = [
1 => 'approver_status1',
2 => 'approver_status2',
3 => 'approver_status3',
];
$currentStatus = $record->$statusColumn;
$currentStatusColumn = $levels[$level];
if (in_array($currentStatus, ['Approved', 'Rejected'])) {
return view('approval.already-processed', [
'status' => $currentStatus,
]);
}
foreach ($levels as $lvl => $column) {
if ($lvl != $level && in_array($record->$column, ['Approved', 'Rejected'])) {
return view('approval.already-processed', [
'status' => 'Already processed by another approver',
]);
}
}
$allowedMailStatusByLevel = [
1 => 'Sent',
2 => 'Sent-Mail2',
3 => 'Sent-Mail3',
];
$expectedMailStatus = $allowedMailStatusByLevel[$level] ?? null;
if ($record->mail_status != $expectedMailStatus) {
return view('approval.already-processed', [
'status' => 'You are not authorized to act at this level',
]);
}
return view('approval.hold-form', compact('id', 'level'));
}
public function rejectForm(Request $request)
{
$id = $request->query('id');
// $level = $request->query('level');
$level = (int) $request->query('level');
$record = RequestCharacteristic::findOrFail($id);
[$statusColumn, $approvedAtColumn, $remarkColumn] = match ($level) {
1 => ['approver_status1', 'approved1_at', 'approver_remark1'],
2 => ['approver_status2', 'approved2_at', 'approver_remark2'],
3 => ['approver_status3', 'approved3_at', 'approver_remark3'],
default => abort(403, 'Invalid approver level'),
};
$levels = [
1 => 'approver_status1',
2 => 'approver_status2',
3 => 'approver_status3',
];
$currentStatusColumn = $levels[$level];
$currentStatus = $record->$statusColumn;
if (in_array($currentStatus, ['Approved', 'Rejected'])) {
return view('approval.already-processed', [
'status' => $currentStatus,
]);
}
foreach ($levels as $lvl => $column) {
if ($lvl != $level && in_array($record->$column, ['Approved', 'Rejected'])) {
return view('approval.already-processed', [
'status' => 'Already processed by another approver',
]);
}
}
$allowedMailStatusByLevel = [
1 => 'Sent',
2 => 'Sent-Mail2',
3 => 'Sent-Mail3',
];
$expectedMailStatus = $allowedMailStatusByLevel[$level] ?? null;
if ($record->mail_status != $expectedMailStatus) {
return view('approval.already-processed', [
'status' => 'You are not authorized to act at this level',
]);
}
return view('approval.reject-form', compact('id', 'level'));
}
public function holdSave(Request $request)
{
$request->validate([
'id' => 'required|integer',
'level' => 'required|integer',
'remark' => 'required|string',
]);
return $this->updateStatus($request, 'Hold', false);
}
public function rejectSave(Request $request)
{
$request->validate([
'id' => 'required|integer',
'level' => 'required|integer',
'remark' => 'required|string',
]);
return $this->updateStatus($request, 'Rejected', false);
}
protected function updateStatus(Request $request, string $status, bool $returnView = true)
{
$requestId = $request->input('id');
$level = (int) $request->input('level');
$record = RequestCharacteristic::findOrFail($requestId);
[$statusColumn, $approvedAtColumn, $remarkColumn] = match ($level) {
1 => ['approver_status1', 'approved1_at', 'approver_remark1'],
2 => ['approver_status2', 'approved2_at', 'approver_remark2'],
3 => ['approver_status3', 'approved3_at', 'approver_remark3'],
default => abort(403, 'Invalid approver level'),
};
$pendingRecords = RequestCharacteristic::where('plant_id', $record->plant_id)
->where('machine_id', $record->machine_id)
->where('aufnr', $record->aufnr)
->where('work_flow_id', $record->work_flow_id)
->whereNull('approver_status1')
->whereNull('approver_status2')
->whereNull('approver_status3')
->get();
$processRecords = RequestCharacteristic::where('plant_id', $record->plant_id)
->where('machine_id', $record->machine_id)
->where('aufnr', $record->aufnr)
->where('work_flow_id', $record->work_flow_id)
->where(function ($query) {
$query->whereNotNull('approver_status1')
->orWhereNotNull('approver_status2')
->orWhereNotNull('approver_status3');
})
->get();
$alreadyProcessed = RequestCharacteristic::whereIn($statusColumn, ['Approved', 'Rejected'])->exists();
if ($alreadyProcessed) {
if ($returnView) {
return view('approval.already-processed', [
'status' => 'Already processed',
]);
}
return response()->json([
'status' => false,
'message' => 'This request has already been processed.',
], 404);
}
$allowedMailStatusByLevel = [
1 => 'Sent',
2 => 'Sent-Mail2',
3 => 'Sent-Mail3',
];
$expectedMailStatus = $allowedMailStatusByLevel[$level] ?? null;
if ($record->mail_status != $expectedMailStatus) {
if ($returnView) {
return view('approval.already-processed', [
'status' => 'You are not authorized to act at this level',
]);
}
return response()->json([
'status' => false,
'message' => 'Invalid approval level for current mail status',
], 403);
}
$updateData = [
$statusColumn => $status,
$remarkColumn => $request->input('remark'),
$approvedAtColumn => Carbon::now(),
];
// if ($status == 'Approved') {
// $updateData[$approvedAtColumn] = Carbon::now();
// }
foreach ($pendingRecords as $rec) {
$rec->update($updateData);
}
foreach ($processRecords as $recd) {
$recd->update($updateData);
}
if ($returnView) {
return match ($status) {
'Approved' => view('approval.success'),
'Hold' => view('approval.hold-success'),
'Rejected' => view('approval.reject-success'),
default => abort(500),
};
}
return response()->json(['status' => true, 'message' => 'Status updated successfully']);
}
public function index()
{
//
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
}
}

View File

@@ -2875,7 +2875,7 @@ class CharacteristicsController extends Controller
// $pendingCharacteristics = [];
// foreach ($characteristics as $char) {
// $charName = strtoupper($char['characteristic_name']) ?? null;
// $charName = strtolower($char['characteristic_name']) ?? null;
// $pendingExists = RequestCharacteristic::where('aufnr', $jobNo)
// ->where('characteristic_name', $charName)
// ->latest()
@@ -2948,7 +2948,7 @@ class CharacteristicsController extends Controller
// 'item_id' => $ItemId,
// 'characteristic_approver_master_id' => $charId,
// 'aufnr' => $jobNo,
// 'characteristic_name' => strtoupper($char['characteristic_name']),//strtolower
// 'characteristic_name' => strtolower($char['characteristic_name']),
// 'current_value' => $char['current_value'],
// 'update_value' => $char['update_value'],
// 'created_by' => $userName,
@@ -3011,8 +3011,6 @@ class CharacteristicsController extends Controller
$userName = 'Admin';
}
$charField = $request->header('characteristic-field');
$json = $request->input('data');
$data = json_decode($json, true);
@@ -3036,10 +3034,6 @@ class CharacteristicsController extends Controller
], 404);
}
if ($charField == null || $charField == '') {
$charField = 'NIL';
}
$plant = Plant::where('code', $plantCode)->first();
if (! $plant) {
return response()->json([
@@ -3078,47 +3072,11 @@ class CharacteristicsController extends Controller
], 404);
}
if ($machineName == null || $machineName == '' || ! $machineName) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Machine name can't be empty!",
], 404);
}
if ($itemCode == null || $itemCode == '') {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Item Code can't be empty!",
], 400);
} elseif (Str::length($itemCode) < 6 || ! ctype_alnum($itemCode)) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Invalid item code found!',
], 404);
}
if (! $jobNo) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Job number can't be empty",
], 404);
} elseif (Str::length($jobNo) < 7) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Job number '{$jobNo}' should contain minimum 7 digits!",
], 404);
} elseif (! is_numeric($jobNo)) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Job number '{$jobNo}' should contain only numeric values!",
], 404);
}
$machine = Machine::where('work_center', $workCenter)->first();
if (! $machine) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Work center '{$workCenter}' not found in master!",
'status_description' => "Work center '{$workCenter}' not found!",
], 404);
}
@@ -3126,12 +3084,44 @@ class CharacteristicsController extends Controller
if (! $machineAgaPlant) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Work center '{$workCenter}' not found for the plant code '{$plantCode}' in master!",
'status_description' => "Work center '{$workCenter}' not found for the plant code '{$plantCode}'!",
], 404);
}
$MachineId = $machineAgaPlant->id;
if ($machineName == null || $machineName == '' || ! $machineName) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Machine name can't be empty!",
], 404);
}
$mName = CharacteristicApproverMaster::where('machine_name', $machineName)->first();
if (! $mName) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Machine name '{$machineName}' not found in master!",
], 404);
}
$mNameAgaPlant = CharacteristicApproverMaster::where('machine_name', $machineName)->where('plant_id', $plantId)->first();
if (! $mNameAgaPlant) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Machine name '{$machineName}' not found in master against plant code '{$plantCode}'!",
], 404);
}
$charId = $mNameAgaPlant->id;
if ($itemCode == null || $itemCode == '' || ! $itemCode) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Item code can't be empty!",
], 404);
}
$iCode = Item::where('code', $itemCode)->first();
if (! $iCode) {
return response()->json([
@@ -3150,117 +3140,14 @@ class CharacteristicsController extends Controller
$ItemId = $iCodeAgaPlant->id;
$pCode = CharacteristicApproverMaster::where('plant_id', $plantId)->first();
if (! $pCode) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Plant code '{$plantCode}' not found in characteristic approver master!",
], 404);
}
$wCenter = CharacteristicApproverMaster::where('machine_id', $MachineId)->first();
if (! $wCenter) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Work center '{$workCenter}' not found in characteristic approver master!",
], 404);
}
$wCenterAgaPlant = CharacteristicApproverMaster::where('machine_id', $MachineId)->where('plant_id', $plantId)->first();
if (! $wCenterAgaPlant) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Work center '{$workCenter}' not found for the plant code '{$plantCode}' in characteristic approver master!",
], 404);
}
$mName = CharacteristicApproverMaster::where('machine_name', $machineName)->first();
if (! $mName) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Machine name '{$machineName}' not found in characteristic approver master!",
], 404);
}
$mNameAgaPlant = CharacteristicApproverMaster::where('machine_name', $machineName)->where('plant_id', $plantId)->first();
if (! $mNameAgaPlant) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Machine name '{$machineName}' not found for the plant code '{$plantCode}' in characteristic approver master!",
], 404);
}
$cField = CharacteristicApproverMaster::where('characteristic_field', $charField)->first();
if (! $cField) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Master characteristic field value '{$charField}' not found in characteristic approver master!",
], 404);
}
$cFieldAgaPlant = CharacteristicApproverMaster::where('characteristic_field', $charField)->where('plant_id', $plantId)->first();
if (! $cFieldAgaPlant) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Master characteristic field value '{$charField}' not found for the plant code '{$plantCode}' in characteristic approver master!",
], 404);
}
$mNameAndWorkCenter = CharacteristicApproverMaster::where('machine_name', $machineName)->where('machine_id', $MachineId)->first();
if (! $mNameAndWorkCenter) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Machine name '{$machineName}' and work center '{$workCenter}' not found in characteristic approver master!",
], 404);
}
$mNameAndWorkCenterAgaPlant = CharacteristicApproverMaster::where('machine_name', $machineName)->where('machine_id', $MachineId)->where('plant_id', $plantId)->first();
if (! $mNameAndWorkCenterAgaPlant) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Machine name '{$machineName}' and work center '{$workCenter}' not found for the plant code '{$plantCode}' in characteristic approver master!",
], 404);
}
$cFieldAndWorkCent = CharacteristicApproverMaster::where('characteristic_field', $charField)->where('machine_id', $MachineId)->first();
if (! $cFieldAndWorkCent) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Master characteristic field value '{$charField}' not found for the work center '{$workCenter}' in characteristic approver master!",
], 404);
}
$cFieldAndWorkCentAgaPlant = CharacteristicApproverMaster::where('characteristic_field', $charField)->where('machine_id', $MachineId)->where('plant_id', $plantId)->first();
if (! $cFieldAndWorkCentAgaPlant) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Master characteristic field value '{$charField}' and work center '{$workCenter}' not found for the plant code '{$plantCode}' in characteristic approver master!",
], 404);
}
$cFieldAndMach = CharacteristicApproverMaster::where('characteristic_field', $charField)->where('machine_name', $machineName)->first();
if (! $cFieldAndMach) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Master characteristic field value '{$charField}' not found for the machine name '{$machineName}' in characteristic approver master!",
], 404);
}
$cFieldAndWorkCentAndMachAgaPlant = CharacteristicApproverMaster::where('characteristic_field', $charField)->where('machine_id', $MachineId)->where('machine_name', $machineName)->where('plant_id', $plantId)->first();
if (! $cFieldAndWorkCentAndMachAgaPlant) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Master characteristic field value '{$charField}', work center '{$workCenter}', and machine name '{$machineName}' not found for the plant code '{$plantCode}' in characteristic approver master!",
], 404);
}
$charId = $cFieldAndWorkCentAndMachAgaPlant->id;
$pendingCharacteristics = [];
foreach ($characteristics as $char) {
$charName = strtoupper($char['characteristic_name']) ?? null;
$pendingExists = RequestCharacteristic::where('plant_id', $plantId)->where('aufnr', $jobNo)->where('characteristic_name', $charName)->latest()->first();
$charName = strtolower($char['characteristic_name']) ?? null;
$pendingExists = RequestCharacteristic::where('aufnr', $jobNo)
->where('characteristic_name', $charName)
->latest()
->first();
if ($pendingExists) {
@@ -3289,8 +3176,7 @@ class CharacteristicsController extends Controller
$year = now()->format('y');
$month = now()->format('m');
$date = now()->format('d');
$prefix = "WF-{$year}{$month}{$date}-";
$prefix = "WF-{$year}{$month}-";
// $existingWorkflowId = RequestCharacteristic::where('plant_id', $plantId)
// ->where('machine_id', $MachineId)
@@ -3302,9 +3188,8 @@ class CharacteristicsController extends Controller
// }
$lastWorkflow = RequestCharacteristic::where('work_flow_id', 'like', "{$prefix}%")
// ->where('plant_id', $plantId)
// ->where('machine_id', $MachineId)
$lastWorkflow = RequestCharacteristic::where('plant_id', $plantId)
->where('machine_id', $MachineId)
->where('work_flow_id', 'like', "{$prefix}%")
->orderByDesc('work_flow_id')
->first();
@@ -3340,7 +3225,7 @@ class CharacteristicsController extends Controller
'item_id' => $ItemId,
'characteristic_approver_master_id' => $charId,
'aufnr' => $jobNo,
'characteristic_name' => strtoupper($char['characteristic_name']), // strtolower
'characteristic_name' => strtolower($char['characteristic_name']),
'current_value' => $char['current_value'],
'update_value' => $char['update_value'],
'created_by' => $userName,
@@ -3768,8 +3653,6 @@ class CharacteristicsController extends Controller
], 404);
}
$workFlowId = strtoupper($workFlowId);
if (! $workFlowId) {
$records = RequestCharacteristic::with('approver')->where([
@@ -3832,14 +3715,14 @@ class CharacteristicsController extends Controller
], 404);
}
// if (! str_ends_with(strtolower($filename), '.pdf')) {
// $filename .= '.pdf';
// }
if (! str_ends_with(strtolower($filename), '.pdf')) {
$filename .= '.pdf';
}
if (! Storage::disk('local')->exists($filePath)) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Pdf File not found for the provided 'Work Flow ID' number!",
'status_description' => 'Pdf File not found for the provided work flow id number!',
], 404);
}

View File

@@ -808,29 +808,4 @@ class InvoiceValidationController extends Controller
{
//
}
// public function handle(Request $request)
// {
// $invoice = InvoiceValidation::withCount([
// 'serialNumbers as scanned_count' => function ($q) {
// $q->where('is_scanned', 1);
// }
// ])->find($request->invoice_id);
// if (!$invoice) {
// return response()->json(['error' => 'Invoice not found'], 404);
// }
// if ($invoice->scanned_count < $invoice->total_serials) {
// Mail::to('alerts@example.com')->send(
// new \App\Mail\IncompleteInvoiceMail(
// $invoice,
// $invoice->scanned_count,
// $invoice->total_serials
// )
// );
// }
// return response()->json(['status' => 'ok']);
// }
}

View File

@@ -33,28 +33,29 @@ class MachineController extends Controller
public function get_all_data(Request $request)
{
$expectedUser = env('API_AUTH_USER');
$expectedPw = env('API_AUTH_PW');
$header_auth = $request->header('Authorization');
$expectedToken = $expectedUser.':'.$expectedPw;
$expectedPw = env('API_AUTH_PW');
$header_auth = $request->header('Authorization');
$expectedToken = $expectedUser . ':' . $expectedPw;
if ('Bearer '.$expectedToken != $header_auth) {
if ("Bearer " . $expectedToken != $header_auth)
{
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Invalid authorization token!',
'status_description' => 'Invalid authorization token!'
], 403);
}
$machines = Machine::with('plant')->with('workGroupMaster')->orderBy('plant_id')->get();
$machinesData = $machines->map(function ($machine) {
$machinesData = $machines->map(function($machine) {
return [
'plant_code' => $machine->plant ? (string) $machine->plant->code : '',
'group_work_center' => $machine->workGroupMaster ? (string) $machine->workGroupMaster->name : '',
'work_center' => $machine->work_center ?? '',
'plant_code' => $machine->plant ? (String)$machine->plant->code : "",
'group_work_center' => $machine->workGroupMaster ? (String)$machine->workGroupMaster->name : "",
'work_center' => $machine->work_center ?? "",
];
});
return response()->json([
'machines' => $machinesData,
'machines' => $machinesData
]);
}
@@ -64,70 +65,80 @@ class MachineController extends Controller
public function get_data(Request $request)
{
$expectedUser = env('API_AUTH_USER');
$expectedPw = env('API_AUTH_PW');
$header_auth = $request->header('Authorization');
$expectedToken = $expectedUser.':'.$expectedPw;
$expectedPw = env('API_AUTH_PW');
$header_auth = $request->header('Authorization');
$expectedToken = $expectedUser . ':' . $expectedPw;
if ('Bearer '.$expectedToken != $header_auth) {
if ("Bearer " . $expectedToken != $header_auth)
{
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Invalid authorization token!',
'status_description' => 'Invalid authorization token!'
], 403);
}
$plantCode = $request->header('plant-code');
$lineName = $request->header('line-name');
if ($plantCode == null || $plantCode == '') {
if ($plantCode == null || $plantCode == '')
{
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Plant code can't be empty!",
'status_description' => "Plant code can't be empty!"
], 400);
} elseif (Str::length($plantCode) < 4 || ! is_numeric($plantCode) || ! preg_match('/^[1-9]\d{3,}$/', $plantCode)) {
}
else if (Str::length($plantCode) < 4 || !is_numeric($plantCode) || !preg_match('/^[1-9]\d{3,}$/', $plantCode))
{
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Invalid plant code found!',
'status_description' => "Invalid plant code found!"
], 400);
} elseif ($lineName == null || $lineName == '' || Str::length($lineName) <= 0) {
}
else if ($lineName == null || $lineName == '' || Str::length($lineName) <= 0)
{
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Line name can't be empty!",
'status_description' => "Line name can't be empty!"
], 400);
}
$plant = Plant::where('code', $plantCode)->first();
if (! $plant) {
if (!$plant)
{
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Plant Code '{$plantCode}' not found!",
'status_description' => "Plant Code '{$plantCode}' not found!"
], 400);
}
$plantId = $plant->id;
$line = Line::where('name', $lineName)->first();
if (! $line) {
if (!$line)
{
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Line Name '{$lineName}' not found!",
'status_description' => "Line Name '{$lineName}' not found!"
], 400);
}
$line = Line::where('name', $lineName)->where('plant_id', $plantId)->first();
if (! $line) {
if (!$line)
{
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Line Name '{$lineName}' not found for the plant!",
'status_description' => "Line Name '{$lineName}' not found for the plant!"
], 400);
}
$lineId = $line->id; // no_of_operation
$lineId = $line->id;//no_of_operation
$lineWorkGroup1Id = $line->work_group1_id;
$lineWorkGroup2Id = $line->work_group2_id;
if ($line->no_of_operation == null || $line->no_of_operation == '' || $line->no_of_operation == 0 || ! is_numeric($line->no_of_operation)) {
if ($line->no_of_operation == null || $line->no_of_operation == '' || $line->no_of_operation == 0 || !is_numeric($line->no_of_operation))
{
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Group work center not found for the plant & line!',
'status_description' => "Group work center not found for the plant & line!"
], 400);
}
@@ -135,22 +146,26 @@ class MachineController extends Controller
$lineWorkGroupIds = [];
for ($i = 1; $i <= $line->no_of_operation; $i++) {
$curWorkGroupId = $line->{"work_group{$i}_id"};
if (in_array($curWorkGroupId, $lineWorkGroupIds)) {
if (in_array($curWorkGroupId, $lineWorkGroupIds))
{
continue;
} else {
}
else
{
$lineWorkGroupIds[] = $curWorkGroupId;
}
$test[] = [
'group_work_center' => WorkGroupMaster::where('id', $curWorkGroupId)->first()->name ?? '',
'operation_number' => WorkGroupMaster::where('id', $curWorkGroupId)->first()->operation_number ?? '',
'work_centers' => Machine::where('plant_id', $plantId)->where('work_group_master_id', $curWorkGroupId)->orderBy('work_center')->pluck('work_center')->toArray() ?? [],
'group_work_center' => WorkGroupMaster::where('id', $curWorkGroupId)->first()->name ?? "",
'operation_number' => WorkGroupMaster::where('id', $curWorkGroupId)->first()->operation_number ?? "",
'work_centers' => Machine::where('plant_id', $plantId)->where('work_group_master_id', $curWorkGroupId)->orderBy('work_center')->pluck('work_center')->toArray() ?? [],
];
}
if ($lineWorkGroupIds) {
if($lineWorkGroupIds)
{
return response()->json([
'machines' => $test,
'machines' => $test
]);
}
// $machines = Machine::with('plant')->with('workGroupMaster')->orderBy('plant_id')->get();

View File

@@ -2,7 +2,6 @@
namespace App\Http\Controllers;
use Filament\Notifications\Notification;
use Illuminate\Http\Request;
use Mpdf\Mpdf;
use Mpdf\QrCode\Output;
@@ -21,11 +20,11 @@ class PalletController extends Controller
public function downloadReprintQrPdf($palletNo)
{
$qrCode = new QrCode($palletNo);
$output = new Output\Png;
$output = new Output\Png();
$qrBinary = $output->output($qrCode, 100);
$qrBase64 = base64_encode($qrBinary);
return '
return '
<html>
<head>
<style>
@@ -40,10 +39,10 @@ class PalletController extends Controller
<table class="sticker-table">
<tr>
<td class="qr-cell">
<img class="qr" src="data:image/png;base64,'.$qrBase64.'" alt="QR" />
<img class="qr" src="data:image/png;base64,' . $qrBase64 . '" alt="QR" />
</td>
<td class="text-cell">
'.htmlspecialchars($palletNo).'
' . htmlspecialchars($palletNo) . '
</td>
</tr>
</table>
@@ -74,182 +73,26 @@ class PalletController extends Controller
// $mpdf->Output('qr-label.pdf', 'I');
}
public function downloadReprintProcess($plant, $item, $process_order, $coil_number, $name)
{
// dd($plant,$item,$process_order,$coil_number);
$processOrder = \App\Models\ProcessOrder::where('plant_id', $plant)
->where('item_id', $item)
->where('process_order', $process_order)
->where('coil_number', $coil_number)
->first();
if (! $processOrder) {
return response()->json(['error' => 'Process order not found'], 404);
}
$receivedQuantity = $processOrder->received_quantity;
$machineName = $processOrder->machine_name;
$user = $processOrder->created_by;
$icode = \App\Models\Item::find($item);
$pCode = \App\Models\Plant::find($plant);
$plCode = $pCode->code;
if (! $plCode) {
Notification::make()
->title('Unknown Plant')
->body('Plant not found.')
->warning()
->send();
}
if (! $icode) {
Notification::make()
->title('Unknown Item')
->body('Item not found.')
->warning()
->send();
}
$itCode = $icode->code;
$itemAgaPlant = \App\Models\Item::where('code', $itCode)
->where('plant_id', $plant)
->first();
if (! $itemAgaPlant) {
Notification::make()
->title('Unknown Item')
->body("Item not found against plant code $plCode.")
->warning()
->send();
} else {
$itemDescription = $itemAgaPlant->description;
}
$nowDT = now()->format('d-m-Y H:i:s');
// Build QR content
$qrContent = "{$receivedQuantity}|{$itCode}|{$process_order}-{$coil_number}";
$qrCode = new QrCode($qrContent);
$output = new Output\Png;
$qrBinary = $output->output($qrCode, 100);
$qrBase64 = base64_encode($qrBinary);
return '
<html>
<head>
<style>
@page {
size: 60mm 30mm;
margin: 0;
}
body {
margin: 0;
padding: 0;
width: 60mm;
font-size: 9pt;
font-family: "DejaVu Sans Condensed", "FreeSans", sans-serif;
}
.sticker-table {
width: 60mm;
border-collapse: collapse;
page-break-inside: avoid;
}
.text-cell {
text-align: left;
vertical-align: top;
font-size: 9pt;
padding-left: 2mm;
padding-top: 2mm; /* was 6mm ❌ */
font-weight: bold;
line-height: 1.1; /* IMPORTANT */
white-space: nowrap;
width: 40mm;
}
.qr-cell {
width: 20mm;
text-align: center;
vertical-align: middle;
}
.lbl {
display: inline-block;
width: 11mm;
font-weight: bold;
}
.text-cell b {
font-size: 10pt; /* was 12pt ❌ */
font-weight: bold;
}
img.qr {
width: 12mm;
height: 12mm;
display: block;
margin: auto;
}
</style>
</head>
<body>
<table class="sticker-table">
<tr>
<td class="text-cell">
<span class="lbl">D/T</span>: '.htmlspecialchars($nowDT).'<br>
<span class="lbl">OP ID</span>: '.htmlspecialchars($user).'<br>
<span class="lbl">PO NO</span>: '.htmlspecialchars($process_order).'<br>
<span class="lbl">M/C</span>: '.htmlspecialchars($itCode).'<br>
<span class="lbl">DES</span>: '.htmlspecialchars($itemDescription).'<br>
<span class="lbl">WGT</span>: <b>'.htmlspecialchars($receivedQuantity).' KGS</b><br>
<span class="lbl">MAC</span>: '.htmlspecialchars($machineName).'
</td>
<td class="qr-cell">
<img class="qr" src="data:image/png;base64,'.$qrBase64.'" alt="QR" />
</td>
</tr>
</table>
<script>
window.onload = function () {
window.print();
setTimeout(function () { window.close(); }, 500);
};
</script>
</body>
</html>
';
}
public function downloadQrPdf($palletNo)
{
$qrCode = new QrCode($palletNo);
$output = new Output\Png;
$output = new Output\Png();
$qrBinary = $output->output($qrCode, 100);
$qrBase64 = base64_encode($qrBinary);
$htmlBlock = '
$htmlBlock = '
<table class="sticker-table">
<tr>
<td class="qr-cell">
<img class="qr" src="data:image/png;base64,'.$qrBase64.'" alt="QR" />
<img class="qr" src="data:image/png;base64,' . $qrBase64 . '" alt="QR" />
</td>
<td class="text-cell">
'.htmlspecialchars($palletNo).'
' . htmlspecialchars($palletNo) . '
</td>
</tr>
</table>';
return '
return '
<html>
<head>
<style>
@@ -261,7 +104,7 @@ class PalletController extends Controller
</style>
</head>
<body>
'.$htmlBlock.$htmlBlock.'
' . $htmlBlock . $htmlBlock . '
<script>
window.onload = function () {
window.print();

View File

@@ -4,7 +4,6 @@ namespace App\Http\Controllers;
use App\Models\GrMaster;
use App\Models\Item;
use App\Models\Line;
use App\Models\Plant;
use App\Models\ProcessOrder;
use App\Models\User;
@@ -668,14 +667,11 @@ class PdfController extends Controller
$plantId = $plant->id;
$itemCode = $data['item_code'] ?? '';
$lineName = $data['line_name'] ?? '';
$coilNo = $data['coil_number'] ?? '';
$orderQty = $data['order_quantity'] ?? 0;
$receivedQty = $data['received_quantity'] ?? 0;
$scrapQty = $data['scrap_quantity'] ?? 0;
$sfgNo = $data['sfg_number'] ?? '';
$machineId = $data['machine_id'] ?? '';
$rework = $data['rework'] ?? '';
$createdBy = $data['created_by'] ?? '';
// $validated = $request->validate([
@@ -705,35 +701,6 @@ class PdfController extends Controller
], 404);
}
if ($lineName == null || $lineName == '' || ! $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 name '{$lineName}' not found!",
], 404);
}
$lineNamePlant = Line::where('name', $lineName)
->where('plant_id', $plantId)
->first();
if (! $lineNamePlant) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Line name '{$lineName}' not found for the plant code '{$plantCode}'!",
], 404);
}
$lineNamePlantId = $lineNamePlant->id;
if ($coilNo == null || $coilNo == '') {
return response()->json([
'status_code' => 'ERROR',
@@ -839,6 +806,18 @@ class PdfController extends Controller
], 404);
}
$existing = ProcessOrder::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);
}
$alreadyReceived = ProcessOrder::where('plant_id', $plantId)
->where('process_order', $processOrder)
->where('item_id', $itemId)
@@ -860,98 +839,25 @@ class PdfController extends Controller
], 404);
}
if ($rework == null || $rework == '' || ! $rework) {
try {
ProcessOrder::Create(
[
'plant_id' => $plantId,
'process_order' => $processOrder,
'item_id' => $itemId,
'coil_number' => $coilNo,
'order_quantity' => $orderQty,
'received_quantity' => $receivedQty,
'sfg_number' => $sfgNo,
'machine_name' => $machineId,
'created_by' => $createdBy,
]
);
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Rework can't be empty!",
], 404);
}
if($rework != 'Yes' && $rework != 'No'){
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Rework value should be either 'Yes' or 'No'!",
], 404);
}
else if ($rework == 'No')
{
if($scrapQty != 0){
return response()->json([
'status_code' => 'ERROR',
'status_description' => "Scrap Quanity value should be '0'!",
], 404);
}
}
try
{
if ($rework == 'Yes')
{
$updated = ProcessOrder::where('plant_id', $plantId)
->where('process_order', $processOrder)
->where('line_id', $lineNamePlantId)
->where('coil_number', $coilNo)
->update([
// 'order_quantity' => $orderQty,
'received_quantity' => $receivedQty,
'scrap_quantity' => $scrapQty,
// 'sfg_number' => $sfgNo,
// 'machine_name' => $machineId,
'rework_status' => 1,
'updated_by' => $createdBy,
'updated_at' => now(),
]);
if ($updated == 0) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'No matching record found for rework coil number!',
], 404);
}
else
{
return response()->json([
'status_code' => 'SUCCESS',
'status_description' => 'Record Updated Successfully (Rework)',
]);
}
}
else
{
$existing = ProcessOrder::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);
}
ProcessOrder::Create(
[
'plant_id' => $plantId,
'line_id' => $lineNamePlantId,
'process_order' => $processOrder,
'item_id' => $itemId,
'coil_number' => $coilNo,
'order_quantity' => $orderQty,
'received_quantity' => $receivedQty,
'scrap_quantity' => $scrapQty,
'sfg_number' => $sfgNo,
'machine_name' => $machineId,
'rework_status' => 0,
'created_by' => $createdBy,
]
);
return response()->json([
'status_code' => 'SUCCESS',
'status_description' => 'Record Inserted Successfully',
]);
}
'status_code' => 'SUCCESS',
'status_description' => 'Record Inserted Successfully',
]);
} catch (\Exception $e) {
return response()->json([
'status_code' => 'ERROR',
@@ -960,65 +866,6 @@ class PdfController extends Controller
}
}
public function storeLaserPdf(Request $request){
$expectedUser = env('API_AUTH_USER');
$expectedPw = env('API_AUTH_PW');
$header_auth = $request->header('Authorization');
$expectedToken = $expectedUser.':'.$expectedPw;
if ('Bearer '.$expectedToken != $header_auth) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Invalid authorization token!',
], 404);
}
$workflowId = $request->header('work_flow_id');
if (!$workflowId) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => "work_flow_id can't be empty!",
], 404);
}
if (! $request->hasFile('pdf_file')) {
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'No PDF file provided!',
], 404);
}
// $file = $request->file('pdf_file');
// $filename = $file->getClientOriginalName();
// $filePath = $file->storeAs(
// 'uploads/LaserDocs',
// $filename,
// 'local'
// );
$filename = $workflowId . '.pdf';
$filePath = 'uploads/LaserDocs/' . $filename;
if (Storage::disk('local')->exists($filePath)) {
Storage::disk('local')->delete($filePath);
}
Storage::disk('local')->putFileAs(
'uploads/LaserDocs',
$filename,
'local'
);
return response()->json([
'status_code' => 'SUCCESS',
'status_description' => 'Laser document pdf file replaced successfully!',
], 200);
}
/**
* Display the specified resource.
*/

View File

@@ -2,8 +2,6 @@
namespace App\Http\Controllers;
use App\Models\DriverMaster;
use App\Models\VehicleMaster;
use Illuminate\Http\Request;
use Str;
use Illuminate\Support\Facades\Schema;
@@ -21,21 +19,10 @@ class SapFileController extends Controller
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
$request->validate([
'name' => 'required|string',
'identification1' => 'nullable|string',
'identification2' => 'nullable|string',
'identification3' => 'nullable|string',
'contact_number' => 'nullable|string',
'alternate_number' => 'nullable|string',
]);
DriverMaster::create($request->all());
return response()->json(['success' => true]);
}
// public function store(Request $request)
// {
// //
// }
public function getSapData(Request $request)
{
@@ -158,6 +145,40 @@ class SapFileController extends Controller
], 500);
}
// $table = 'class_characteristics';
// $columns = Schema::getColumnListing($table); // returns lowercase column names
// $rows = [];
// foreach ($lines as $line) {
// $values = str_getcsv($line); // split by comma
// $row = [];
// foreach ($columns as $index => $column) {
// $value = $values[$index] ?? null; // if missing, set null
// if ($value === '') $value = null; // empty string -> null
// $row[$column] = $value;
// }
// $rows[] = $row;
// }
// return response()->json([
// 'status' => 'DEBUG_ROWS',
// 'rows_sample' => array_slice($rows, 0, 5),
// ]);
// Insert into database
// foreach ($rows as $row) {
// \App\Models\ClassCharacteristic::create($row);
// }
// return response()->json([
// 'status' => 'SUCCESS',
// 'rows_imported' => count($rows),
// ]);
// Prepare arrays
// $serialNumbers = [];
// $remainingRows = [];
@@ -230,7 +251,7 @@ class SapFileController extends Controller
if (!empty($invalidSerials)) {
return response()->json([
'status' => 'ERROR',
'status_description' => 'serial numbers are invalid (less than 13 characters)',
'status_description' => 'Some serial numbers are invalid (less than 13 characters)',
'invalid_serials' => $invalidSerials
], 400);
}

View File

@@ -4,7 +4,7 @@ namespace App\Http\Controllers;
use App\Models\Plant;
use App\Models\User;
// use Carbon\Carbon;
//use Carbon\Carbon;
use Hash;
use Illuminate\Http\Request;
@@ -29,65 +29,72 @@ class UserController extends Controller
/**
* Display the specified resource.
*/
// show(string $id)
//show(string $id)
public function get_testing_data(Request $request)
{
$expectedUser = env('API_AUTH_USER');
$expectedPw = env('API_AUTH_PW');
$header_auth = $request->header('Authorization');
$header_user = $request->header('User-Name');
$header_pass = $request->header('User-Pass');
$expectedToken = $expectedUser.':'.$expectedPw;
$expectedPw = env('API_AUTH_PW');
$header_auth = $request->header('Authorization');
$header_user = $request->header('User-Name');
$header_pass = $request->header('User-Pass');
$expectedToken = $expectedUser . ':' . $expectedPw;
if ('Bearer '.$expectedToken != $header_auth) {
if ("Bearer " . $expectedToken != $header_auth)
{
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Invalid authorization token!',
'status_description' => 'Invalid authorization token!'
], 403);
}
if (! $header_user) {
if (!$header_user)
{
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Invalid user name found!',
'status_description' => 'Invalid user name found!'
], 400);
} elseif (! $header_pass) {
}
else if (!$header_pass)
{
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Invalid password found!',
'status_description' => 'Invalid password found!'
], 400);
}
$existUser = User::where('name', $header_user)->first();
$existPlant = 'All Plants';
$existPlant = "All Plants";
if (! $existUser) {
if (!$existUser)
{
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Unknown user name found!',
'status_description' => 'Unknown user name found!'
], 400);
} else {
}
else {
$codeExist = Plant::where('id', $existUser->plant_id)->first();
if ($codeExist) {
$existPlant = $codeExist->code;
}
}
// Retrieve the user by email
// $user = User::where('email', $email)->first();
//$user = User::where('email', $email)->first();
if (Hash::check($header_pass, $existUser->password)) {
return response()->json([
'created_at' => $existUser->created_at->format('Y-m-d H:i:s') ?? '',
'updated_at' => $existUser->updated_at->format('Y-m-d H:i:s') ?? '',
'requested_at' => now()->format('Y-m-d H:i:s') ?? '', // Carbon::now(config('app.timezone'))->format('Y-m-d H:i:s') ?? "",
'plant' => (string) $existPlant ?? '',
'email' => $existUser->email ?? '',
'roles' => $existUser->roles()->pluck('name')->toArray(),
'created_at' => $existUser->created_at->format('Y-m-d H:i:s') ?? "",
'updated_at' => $existUser->updated_at->format('Y-m-d H:i:s') ?? "",
'requested_at' => now()->format('Y-m-d H:i:s') ?? "", //Carbon::now(config('app.timezone'))->format('Y-m-d H:i:s') ?? "",
'plant' => (String)$existPlant ?? "",
'email' => $existUser->email ?? "",
'roles' => $existUser->roles()->pluck('name')->toArray()
], 200);
} else {
return response()->json([
'status_code' => 'ERROR',
'status_description' => 'Password does not match!',
'status_description' => 'Password does not match!'
], 400);
}

View File

@@ -114,7 +114,6 @@ class InvoicePendingReasonImport implements ToCollection
continue;
}
// dd($row['document_number'], bin2hex($row['document_number']));
$this->validRows[] = [
'plant_id' => $plantId,

View File

@@ -1,51 +0,0 @@
<?php
namespace App\Jobs;
use App\Mail\CharacteristicApprovalMail;
use App\Models\CharacteristicApproverMaster;
use App\Models\RequestCharacteristic;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Queue\Queueable;
use Illuminate\Support\Facades\Mail;
class SendApprover1MailJob implements ShouldQueue
{
use Queueable;
/**
* Create a new job instance.
*/
public function __construct(public RequestCharacteristic $request) {
}
/**
* Execute the job.
*/
public function handle()
{
// Already approved? stop
if (!is_null($this->request->approver_status1)) return;
if ($this->request->approver1_mail_sent) return;
$approver = CharacteristicApproverMaster::where('plant_id', $this->request->plant_id)
->where('machine_id', $this->request->machine_id)
->first();
if (! $approver || ! $approver->mail1) return;
Mail::to($approver->mail1)
->queue(new CharacteristicApprovalMail(
$this->request,
$approver->name1,
1
));
$this->request->update(['approver1_mail_sent' => 1]);
SendApprover2MailJob::dispatch($this->request)
->delay(now()->addMinutes(5));
}
}

View File

@@ -1,58 +0,0 @@
<?php
namespace App\Jobs;
use App\Mail\CharacteristicApprovalMail;
use App\Models\CharacteristicApproverMaster;
use App\Models\RequestCharacteristic;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Queue\Queueable;
use Illuminate\Support\Facades\Mail;
class SendApprover2MailJob implements ShouldQueue
{
use Queueable;
/**
* Create a new job instance.
*/
// public function __construct()
// {
// //
// }
/**
* Execute the job.
*/
public function __construct(public RequestCharacteristic $request) {}
public function handle()
{
// If approver-1 approved → STOP
if (!is_null($this->request->approver_status1)) return;
// If approver-2 already approved → STOP
if (!is_null($this->request->approver_status2)) return;
if ($this->request->approver2_mail_sent) return;
$approver = CharacteristicApproverMaster::where('plant_id', $this->request->plant_id)
->where('machine_id', $this->request->machine_id)
->first();
if (! $approver || ! $approver->mail2) return;
Mail::to($approver->mail2)
->queue(new CharacteristicApprovalMail(
$this->request,
$approver->name2,
2
));
$this->request->update(['approver2_mail_sent' => 1]);
// Schedule Approver-3 after 5 minutes
SendApprover3MailJob::dispatch($this->request)
->delay(now()->addMinutes(5));
}
}

View File

@@ -1,56 +0,0 @@
<?php
namespace App\Jobs;
use App\Mail\CharacteristicApprovalMail;
use App\Models\CharacteristicApproverMaster;
use App\Models\RequestCharacteristic;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Queue\Queueable;
use Illuminate\Support\Facades\Mail;
class SendApprover3MailJob implements ShouldQueue
{
use Queueable;
/**
* Create a new job instance.
*/
// public function __construct()
// {
// //
// }
/**
* Execute the job.
*/
public function __construct(public RequestCharacteristic $request) {}
public function handle()
{
if (
!is_null($this->request->approver_status1) ||
!is_null($this->request->approver_status2) ||
!is_null($this->request->approver_status3)
) {
return;
}
if ($this->request->approver3_mail_sent) return;
$approver = CharacteristicApproverMaster::where('plant_id', $this->request->plant_id)
->where('machine_id', $this->request->machine_id)
->first();
if (! $approver || ! $approver->mail3) return;
Mail::to($approver->mail3)
->queue(new CharacteristicApprovalMail(
$this->request,
$approver->name3,
3
));
$this->request->update(['approver3_mail_sent' => 1]);
}
}

View File

@@ -13,41 +13,23 @@ class GuardPatrolEntryDataTable extends Component
// public $date;
public $newNameFound;
public $guardName;
public $checkPointName;
public $startTime;
public $endTime;
public $start;
public $finish;
public $begin;
public $end;
public $labTime;
public $minDiff;
public $seqNoCnt = 0;
public $seqNo = 0;
public $isSequenced = true;
public $sequences = [];
public $seqTime;
public $seqTimes = [];
public $startSeqCheckPoints = [];
public $records = [];
protected $listeners = [
@@ -79,9 +61,9 @@ class GuardPatrolEntryDataTable extends Component
$this->seqTimes = [];
$this->startSeqCheckPoints = [];
if (! $plantId || ! $date) {
if (!$plantId || !$date)
{
$this->records = [];
return;
}
@@ -91,19 +73,20 @@ class GuardPatrolEntryDataTable extends Component
$this->startSeqCheckPoints[$i] = CheckPointTime::with('checkPointNames1')->with('checkPointNames2')->where('sequence_number', $i)->where('plant_id', $plantId)->first();
}
$this->sequences = array_fill(1, $this->seqNoCnt, 'X');
$this->sequences = array_fill(1, $this->seqNoCnt, "X");
$this->seqTimes = array_fill(1, $this->seqNoCnt, null);
$hasSingleGuard = GuardPatrolEntry::whereDate('patrol_time', $date)->where('plant_id', $plantId)->orderBy('patrol_time', 'asc')->get();
$checking = 0;
$records = GuardPatrolEntry::with('guardNames')->with('checkPointNames')->whereDate('patrol_time', $date)->where('plant_id', $plantId)->orderBy('patrol_time', 'asc')->get(); // desc Carbon::parse($record->patrol_time)->toTimeString()
foreach ($records as $index => $record) { // foreach ($startSeqCheckPoints as $seq => $checkpoint)
$records = GuardPatrolEntry::with('guardNames')->with('checkPointNames')->whereDate('patrol_time', $date)->where('plant_id', $plantId)->orderBy('patrol_time', 'asc')->get(); //desc Carbon::parse($record->patrol_time)->toTimeString()
foreach ($records as $index => $record) { //foreach ($startSeqCheckPoints as $seq => $checkpoint)
$checking++;
$guardName = $record->guardNames ? $record->guardNames->name : null;
$checkPointName = $record->checkPointNames ? $record->checkPointNames->name : null;
if ($this->guardName != $guardName || $this->newNameFound) {// if ($this->newNameFound) {
if ($this->guardName) {
if ($this->guardName != $guardName || $this->newNameFound) {//if ($this->newNameFound) {
if ($this->guardName)
{
$recordData = [
'guard_name' => $this->guardName,
'start_time' => $this->startTime,
@@ -122,25 +105,27 @@ class GuardPatrolEntryDataTable extends Component
$this->seqTimes = array_fill(1, $this->seqNoCnt, null);
$this->guardName = $guardName;
$this->startTime = Carbon::parse($record->patrol_time)->toTimeString(); // "2025-06-01 00:07:12"
$this->startTime = Carbon::parse($record->patrol_time)->toTimeString(); //"2025-06-01 00:07:12"
$this->start = Carbon::parse($record->patrol_time);
$this->endTime = Carbon::parse($record->patrol_time)->toTimeString(); // "2025-06-01 00:07:12"
$this->endTime = Carbon::parse($record->patrol_time)->toTimeString(); //"2025-06-01 00:07:12"
$this->finish = Carbon::parse($record->patrol_time);
$this->begin = Carbon::parse($record->patrol_time);
$this->end = Carbon::parse($record->patrol_time);
$this->labTime = (int) $this->start->diffInMinutes($this->finish);
$this->minDiff = (int) $this->begin->diffInMinutes($this->end);
$this->seqTime = $this->begin->toTimeString().' - '.$this->end->toTimeString();
$this->labTime = (int)$this->start->diffInMinutes($this->finish);
$this->minDiff = (int)$this->begin->diffInMinutes($this->end);
$this->seqTime = $this->begin->toTimeString(). " - " . $this->end->toTimeString();
$this->seqNo = 0;
$this->newNameFound = false;
$this->isSequenced = true;
} elseif ($this->guardName == $guardName && $this->start && $this->begin) {
$this->endTime = Carbon::parse($record->patrol_time)->toTimeString(); // "2025-06-01 00:07:12"
}
else if ($this->guardName == $guardName && $this->start && $this->begin)
{
$this->endTime = Carbon::parse($record->patrol_time)->toTimeString(); //"2025-06-01 00:07:12"
$this->finish = Carbon::parse($record->patrol_time);
$this->end = Carbon::parse($record->patrol_time);
$this->labTime = (int) $this->start->diffInMinutes($this->finish);
$this->minDiff = (int) $this->begin->diffInMinutes($this->end);
$this->seqTime = $this->begin->toTimeString().' - '.$this->end->toTimeString();
$this->labTime = (int)$this->start->diffInMinutes($this->finish);
$this->minDiff = (int)$this->begin->diffInMinutes($this->end);
$this->seqTime = $this->begin->toTimeString(). " - " . $this->end->toTimeString();
$this->begin = Carbon::parse($record->patrol_time);
// $this->seqNo = 0;
}
@@ -148,16 +133,19 @@ class GuardPatrolEntryDataTable extends Component
$this->seqNo++;
if ($this->seqNo == 1) {
if ($checkPointName == $this->startSeqCheckPoints[$this->seqNo]->checkPointNames1->name) {// "STP BACKSIDE"
if ($checkPointName == $this->startSeqCheckPoints[$this->seqNo]->checkPointNames1->name) {//"STP BACKSIDE"
$this->isSequenced = true;
$this->sequences = array_fill(1, $this->seqNoCnt, 'X');
} else {
$this->sequences = array_fill(1, $this->seqNoCnt, "X");
}
else {
$this->isSequenced = false;
$this->sequences = array_fill(1, $this->seqNoCnt, 'X');
$this->sequences = array_fill(1, $this->seqNoCnt, "X");
}
if (($index + 1) == count($hasSingleGuard)) {
if ($this->guardName) {
if (($index+1) == count($hasSingleGuard))
{
if ($this->guardName)
{
$recordData = [
'guard_name' => $this->guardName,
'start_time' => $this->startTime,
@@ -173,37 +161,26 @@ class GuardPatrolEntryDataTable extends Component
$this->records[] = $recordData;
}
}
} elseif ($this->seqNo >= ($this->seqNoCnt + 1)) {
$this->seqTimes[$this->seqNo - 1] = $this->seqTime;
if ($checkPointName == $this->startSeqCheckPoints[$this->seqNo - 1]->checkPointNames2->name) {// "D 72 END"
}
else if ($this->seqNo >= ($this->seqNoCnt+1)) {
$this->seqTimes[$this->seqNo-1] = $this->seqTime;
if ($checkPointName == $this->startSeqCheckPoints[$this->seqNo-1]->checkPointNames2->name) {//"D 72 END"
if ($this->isSequenced) {
$this->sequences[$this->seqNo - 1] = $this->minDiff;
$this->sequences[$this->seqNo-1] = $this->minDiff;
}
} else {
}
else {
$this->isSequenced = false;
}
$this->newNameFound = true;
if ($hasSingleGuard->unique('guard_name_id')->count() == 1) {
if (($this->seqNoCnt + 1) == count($hasSingleGuard)) {
// dd("Has 1 Guard and single patrol round (".($this->seqNoCnt+1).") is present");
if ($this->guardName) {
$recordData = [
'guard_name' => $this->guardName,
'start_time' => $this->startTime,
'end_time' => $this->endTime,
'lap_time' => $this->labTime,
];
for ($i = 1; $i <= $this->seqNoCnt; $i++) {
$recordData["Sequence_$i"] = $this->sequences[$i];
$recordData["Sequence_Time_$i"] = $this->seqTimes[$i];
}
$this->records[] = $recordData;
}
} elseif (($index + 1) == count($hasSingleGuard)) {
if ($this->guardName) {
if ($hasSingleGuard->unique('guard_name_id')->count() == 1)
{
if (($this->seqNoCnt+1) == count($hasSingleGuard))
{
//dd("Has 1 Guard and single patrol round (".($this->seqNoCnt+1).") is present");
if ($this->guardName)
{
$recordData = [
'guard_name' => $this->guardName,
'start_time' => $this->startTime,
@@ -219,8 +196,30 @@ class GuardPatrolEntryDataTable extends Component
$this->records[] = $recordData;
}
}
} elseif (($index + 1) == count($hasSingleGuard)) {
if ($this->guardName) {
else if (($index+1) == count($hasSingleGuard))
{
if ($this->guardName)
{
$recordData = [
'guard_name' => $this->guardName,
'start_time' => $this->startTime,
'end_time' => $this->endTime,
'lap_time' => $this->labTime,
];
for ($i = 1; $i <= $this->seqNoCnt; $i++) {
$recordData["Sequence_$i"] = $this->sequences[$i];
$recordData["Sequence_Time_$i"] = $this->seqTimes[$i];
}
$this->records[] = $recordData;
}
}
}
else if (($index+1) == count($hasSingleGuard))
{
if ($this->guardName)
{
$recordData = [
'guard_name' => $this->guardName,
'start_time' => $this->startTime,
@@ -236,36 +235,26 @@ class GuardPatrolEntryDataTable extends Component
$this->records[] = $recordData;
}
}
} else { // if ($this->seqNo >= 2) {
$this->seqTimes[$this->seqNo - 1] = $this->seqTime;
if ($checkPointName == $this->startSeqCheckPoints[$this->seqNo]->checkPointNames1->name) {// "CANTEEN"
}
else // if ($this->seqNo >= 2) {
{
$this->seqTimes[$this->seqNo-1] = $this->seqTime;
if ($checkPointName == $this->startSeqCheckPoints[$this->seqNo]->checkPointNames1->name) {//"CANTEEN"
if ($this->isSequenced) {
$this->sequences[$this->seqNo - 1] = $this->minDiff;
$this->sequences[$this->seqNo-1] = $this->minDiff;
}
} else {
}
else {
$this->isSequenced = false;
}
if ($hasSingleGuard->unique('guard_name_id')->count() == 1) {
if ($this->seqNo == count($hasSingleGuard)) {
// dd("Has 1 Guard and single patrol round (".($this->seqNoCnt+1).") is present");
if ($this->guardName) {
$recordData = [
'guard_name' => $this->guardName,
'start_time' => $this->startTime,
'end_time' => $this->endTime,
'lap_time' => $this->labTime,
];
for ($i = 1; $i <= $this->seqNoCnt; $i++) {
$recordData["Sequence_$i"] = $this->sequences[$i];
$recordData["Sequence_Time_$i"] = $this->seqTimes[$i];
}
$this->records[] = $recordData;
}
} elseif (($index + 1) == count($hasSingleGuard)) {
if ($this->guardName) {
if ($hasSingleGuard->unique('guard_name_id')->count() == 1)
{
if ($this->seqNo == count($hasSingleGuard))
{
//dd("Has 1 Guard and single patrol round (".($this->seqNoCnt+1).") is present");
if ($this->guardName)
{
$recordData = [
'guard_name' => $this->guardName,
'start_time' => $this->startTime,
@@ -281,8 +270,30 @@ class GuardPatrolEntryDataTable extends Component
$this->records[] = $recordData;
}
}
} elseif (($index + 1) == count($hasSingleGuard)) {
if ($this->guardName) {
else if (($index+1) == count($hasSingleGuard))
{
if ($this->guardName)
{
$recordData = [
'guard_name' => $this->guardName,
'start_time' => $this->startTime,
'end_time' => $this->endTime,
'lap_time' => $this->labTime,
];
for ($i = 1; $i <= $this->seqNoCnt; $i++) {
$recordData["Sequence_$i"] = $this->sequences[$i];
$recordData["Sequence_Time_$i"] = $this->seqTimes[$i];
}
$this->records[] = $recordData;
}
}
}
else if (($index+1) == count($hasSingleGuard))
{
if ($this->guardName)
{
$recordData = [
'guard_name' => $this->guardName,
'start_time' => $this->startTime,

View File

@@ -6,25 +6,15 @@ use App\Models\InvoiceValidation;
use App\Models\StickerMaster;
use Filament\Facades\Filament;
use Filament\Notifications\Notification;
use Livewire\Attributes\On;
use Livewire\Component;
use Livewire\WithPagination;
use Str;
class InvoiceDataTable extends Component
{
use WithPagination;
protected $paginationTheme = 'tailwind';
public $invoiceData = [];
// public $invoiceRecords;
public $plantId = 0;
public $package = [];
public $packageCount = 0;
public string $invoiceNumber = '';
@@ -57,7 +47,7 @@ class InvoiceDataTable extends Component
public $panel_box_supplier;
public $panel_box_code;
public $panel_box_item_code;
public $panel_box_serial_number;
@@ -186,193 +176,10 @@ class InvoiceDataTable extends Component
// }
// }
// public function loadData($invoiceNumber, $plantId, $onCapFocus = false)
// {
// $this->invoiceNumber = $invoiceNumber;
// $this->plantId = $plantId;
// $this->completedInvoice = false;
// $this->isSerial = true;
// $this->onCapFocus = $onCapFocus;
// $this->emptyInvoice = false;
// $this->hasSearched = true;
// $this->materialInvoice = false;
// $this->resetPage();
// $this->packageCount = 0;
// // IMPORTANT: keep scanned rows, otherwise count will not update
// $this->invoiceRecords = InvoiceValidation::with('stickerMasterRelation')
// ->where('invoice_number', $this->invoiceNumber)
// ->where('plant_id', $this->plantId)
// ->get();
// foreach ($this->invoiceRecords as &$row) {
// $stickCount = 0;
// $scannedCount = 0;
// // Get item code
// $row['code'] = StickerMaster::with('item')
// ->find($row['sticker_master_id'] ?? null)?->item?->code ?? 'N/A';
// $curStick = StickerMaster::find($row['sticker_master_id']);
// if ($curStick) {
// /** ---------------- REQUIRED STICKERS ---------------- */
// // PANEL BOX (capacitor)
// if (!empty($curStick->panel_box_code)) {
// $stickCount++;
// // Panel box scan = capacitor_scanned_status
// if ($row['capacitor_scanned_status'] == 1) {
// $scannedCount++;
// }
// }
// // Tube stickers
// if (
// $curStick->tube_sticker_motor == 1 ||
// $curStick->tube_sticker_pump == 1 ||
// $curStick->tube_sticker_pumpset == 1
// ) {
// if ($curStick->tube_sticker_motor == 1) {
// $stickCount++;
// if ($row['motor_scanned_status'] == 1) {
// $scannedCount++;
// }
// }
// if (
// $curStick->tube_sticker_pump == 1 ||
// ($curStick->tube_sticker_pumpset != 1 &&
// $curStick->tube_sticker_pump != 1 &&
// $curStick->pack_slip_pump == 1)
// ) {
// $stickCount++;
// if ($row['pump_scanned_status'] == 1) {
// $scannedCount++;
// }
// }
// if ($curStick->tube_sticker_pumpset == 1) {
// $stickCount++;
// if ($row['scanned_status_set'] == 1) {
// $scannedCount++;
// }
// }
// }
// // Pack slips (only if no tube stickers)
// elseif (
// $curStick->pack_slip_motor == 1 ||
// $curStick->pack_slip_pump == 1 ||
// $curStick->pack_slip_pumpset == 1
// ) {
// if ($curStick->pack_slip_motor == 1) {
// $stickCount++;
// if ($row['motor_scanned_status'] == 1) {
// $scannedCount++;
// }
// }
// if ($curStick->pack_slip_pump == 1) {
// $stickCount++;
// if ($row['pump_scanned_status'] == 1) {
// $scannedCount++;
// }
// }
// if ($curStick->pack_slip_pumpset == 1) {
// $stickCount++;
// if ($row['scanned_status_set'] == 1) {
// $scannedCount++;
// }
// }
// }
// }
// // SAFETY: never go negative
// $this->packageCount += max($stickCount - $scannedCount, 0);
// }
// $this->dispatch($onCapFocus ? 'focus-capacitor-input' : 'focus-serial-number');
// }
// #[On('refreshInvoiceData')]
// public function loadData($invoiceNumber, $plantId, $onCapFocus = false)
// {
// $this->invoiceNumber = $invoiceNumber;
// $this->plantId = $plantId;
// $this->completedInvoice = false;
// $this->isSerial = true;
// $this->onCapFocus = $onCapFocus;
// $this->emptyInvoice = false;
// $this->hasSearched = true;
// $this->materialInvoice = false;
// $this->resetPage();
// $this->packageCount = 0;
// $records = InvoiceValidation::with('stickerMasterRelation')
// ->where('invoice_number', $this->invoiceNumber)
// ->where('plant_id', $this->plantId)
// ->get();
// $this->packageCount = $records->sum(function ($record) {
// $sm = $record->stickerMasterRelation;
// $stickCount = 0;
// $scannedCount = 0;
// if ($sm) {
// if (strlen($sm->panel_box_code) > 0) $stickCount++;
// // if (!empty($sm->panel_box_code)) {
// // $stickCount++;
// // if (!empty($record->panel_box_serial_number)) {
// // $scannedCount++;
// // }
// // }
// // Tube stickers
// if ($sm->tube_sticker_motor || $sm->tube_sticker_pump || $sm->tube_sticker_pumpset) {
// $stickCount += $sm->tube_sticker_motor ? 1 : 0;
// $stickCount += ($sm->tube_sticker_pump || ($sm->tube_sticker_pumpset != 1 && !$sm->tube_sticker_pump && $sm->pack_slip_pump)) ? 1 : 0;
// $stickCount += $sm->tube_sticker_pumpset ? 1 : 0;
// }
// // Pack slips (only if tube stickers not applied)
// elseif ($sm->pack_slip_motor || $sm->pack_slip_pump || $sm->pack_slip_pumpset) {
// $stickCount += $sm->pack_slip_motor ? 1 : 0;
// $stickCount += $sm->pack_slip_pump ? 1 : 0;
// $stickCount += $sm->pack_slip_pumpset ? 1 : 0;
// }
// }
// // 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;
// return max($stickCount - $scannedCount, 0);
// });
// $this->dispatch($onCapFocus ? 'focus-capacitor-input' : 'focus-serial-number');
// }
public function loadData($invoiceNumber, $plantId, $onCapFocus = false)
{
$this->invoiceNumber = $invoiceNumber;
$this->plantId = $plantId;
$this->invoiceNumber = $invoiceNumber;
$this->completedInvoice = false;
$this->isSerial = true;
$this->onCapFocus = $onCapFocus;
@@ -380,189 +187,78 @@ class InvoiceDataTable extends Component
$this->hasSearched = true;
$this->materialInvoice = false;
$this->resetPage();
$this->packageCount = 0;
$records = InvoiceValidation::with('stickerMasterRelation')
->where('invoice_number', $this->invoiceNumber)
->where('plant_id', $this->plantId)
// Eager load stickerMasterRelation and item
$invoiceRecords = InvoiceValidation::with('stickerMasterRelation.item')
->where('invoice_number', $invoiceNumber)
->where('plant_id', $plantId)
->whereNull('scanned_status')
->get();
$this->packageCount = $records->sum(function ($record) {
$this->invoiceData = [];
$this->packageCount = 0;
foreach ($invoiceRecords as $record) {
$sm = $record->stickerMasterRelation;
if (! $sm) {
return 0;
}
// Compute code
$rowCode = $sm?->item?->code ?? 'N/A';
$stickCount = 0;
$scannedCount = 0;
if (! empty($sm->panel_box_code)) {
$stickCount++;
if ($record->capacitor_scanned_status == 1) {
$scannedCount++;
}
}
if ($sm->tube_sticker_motor == 1 || $sm->tube_sticker_pump == 1 || $sm->tube_sticker_pumpset == 1) {
if ($sm->tube_sticker_motor == 1) {
if ($sm) {
// Panel box code
if (Str::length($sm->panel_box_code) > 0) {
$stickCount++;
if ($record->motor_scanned_status == 1) {
$scannedCount++;
}
}
if (
$sm->tube_sticker_pump == 1 ||
($sm->tube_sticker_pumpset != 1 &&
$sm->tube_sticker_pump != 1 &&
$sm->pack_slip_pump == 1)
) {
$stickCount++;
if ($record->pump_scanned_status == 1) {
$scannedCount++;
}
// 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++;
}
if ($sm->tube_sticker_pumpset == 1) {
$stickCount++;
if ($record->scanned_status_set == 1) {
$scannedCount++;
}
}
} elseif ($sm->pack_slip_motor == 1 || $sm->pack_slip_pump == 1 || $sm->pack_slip_pumpset == 1) {
if ($sm->pack_slip_motor == 1) {
$stickCount++;
if ($record->motor_scanned_status == 1) {
$scannedCount++;
}
}
if ($sm->pack_slip_pump == 1) {
$stickCount++;
if ($record->pump_scanned_status == 1) {
$scannedCount++;
}
}
if ($sm->pack_slip_pumpset == 1) {
$stickCount++;
if ($record->scanned_status_set == 1) {
$scannedCount++;
}
// 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++;
}
}
return max($stickCount - $scannedCount, 0);
});
// 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->dispatch(
$onCapFocus ? 'focus-capacitor-input' : 'focus-serial-number'
);
// 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) {
$this->dispatch('focus-capacitor-input');
} else {
$this->dispatch('focus-serial-number');
}
}
public function getInvoiceRecordsProperty()
{
return InvoiceValidation::with('stickerMasterRelation.item')
->where('invoice_number', $this->invoiceNumber)
->where('plant_id', $this->plantId)
->where(function ($query) {
$query->whereNull('scanned_status')
->orWhere('scanned_status', '');
})
// ->when($this->hasSearched, function ($query) {
// $query->where('invoice_number', $this->invoiceNumber)
// ->where('plant_id', $this->plantId)
// ->where('scanned_status', '=', '');
// })
->paginate(6);
}
// public function loadData($invoiceNumber, $plantId, $onCapFocus = false)
// {
// $this->plantId = $plantId;
// $this->invoiceNumber = $invoiceNumber;
// $this->completedInvoice = false;
// $this->isSerial = true;
// $this->onCapFocus = $onCapFocus;
// $this->emptyInvoice = false;
// $this->hasSearched = true;
// $this->materialInvoice = false;
// // 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;
// foreach ($invoiceRecords as $record) {
// $sm = $record->stickerMasterRelation;
// // Compute code
// $rowCode = $sm?->item?->code ?? 'N/A';
// $stickCount = 0;
// $scannedCount = 0;
// if ($sm) {
// // Panel box code
// if (Str::length($sm->panel_box_code) > 0) {
// $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++;
// }
// }
// // 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;
// // 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) {
// $this->dispatch('focus-capacitor-input');
// } else {
// $this->dispatch('focus-serial-number');
// }
// }
public function loadMaterialData($invoiceNumber, $plantId)
{
$this->plantId = $plantId;
@@ -627,168 +323,10 @@ class InvoiceDataTable extends Component
public function cancelCapacitorInput()
{
$this->capacitorInput = null;
$this->showCapacitorInput = false;
$this->dispatch('focus-serial-number');
}
// public function processCapacitorInput()
// {
// $user = Filament::auth()->user();
// $operatorName = $user->name;
// if (! $this->capacitorInput) {
// return;
// }
// if (! preg_match('/^[^\/]+\/[^\/]+\/.+$/', $this->capacitorInput)) {
// Notification::make()
// ->title('Invalid Panel Box QR Format:')
// ->body("Scan the valid panel box QR '$this->capacitorInput' to proceed!")
// ->danger()
// // ->duration(3000)
// ->seconds(2)
// ->send();
// $this->capacitorInput = '';
// return;
// }
// $parts = explode('/', $this->capacitorInput);
// $supplier = $parts[0];
// $itemCode = $parts[1];
// $serialNumber = implode('/', array_slice($parts, 2)); // Keep rest of the string
// $existsInStickerMaster = StickerMaster::where('panel_box_code', $itemCode)->where('plant_id', $this->plantId)->whereHas('item', function ($query) {
// $query->where('code', $this->currentItemCode);
// })
// ->exists();
// if (! $existsInStickerMaster) {
// Notification::make()
// ->title('Unknown: Panel Box Code')
// ->body("Unknown panel box code: $itemCode found for item code: $this->currentItemCode")
// ->danger()
// // ->duration(4000)
// ->seconds(2)
// ->send();
// $this->capacitorInput = '';
// return;
// }
// foreach ($this->invoiceData as &$row) {
// if (($row['code'] ?? '') === $this->currentItemCode && ($row['serial_number'] ?? '') === $this->currentSerialNumber) {
// $row['panel_box_supplier'] = $supplier;
// $row['panel_box_code'] = $itemCode;
// $row['panel_box_serial_number'] = $serialNumber;
// $row['capacitor_scanned_status'] = 1;
// // $row['scanned_status_set'] = true;
// $matchingValidation = InvoiceValidation::with('stickerMaster.item')
// ->where('serial_number', $this->currentSerialNumber)
// ->where('plant_id', $this->plantId)
// ->get()
// ->first(function ($validation) {
// return $validation->stickerMaster?->item?->code === $this->currentItemCode;
// });
// // dd($matchingValidation);
// if ($matchingValidation) {
// $hasMotorQr = $matchingValidation->stickerMasterRelation->tube_sticker_motor ?? null;
// $hasPumpQr = $matchingValidation->stickerMasterRelation->tube_sticker_pump ?? null;
// $hasPumpSetQr = $matchingValidation->stickerMasterRelation->tube_sticker_pumpset ?? null;
// // $hasCapacitorQr = $matchingValidation->stickerMasterRelation->panel_box_code ?? null;
// $hadMotorQr = $matchingValidation->motor_scanned_status ?? null;
// $hadPumpQr = $matchingValidation->pump_scanned_status ?? null;
// $hadPumpSetQr = $matchingValidation->scanned_status_set ?? null;
// // $hadCapacitorQr = $matchingValidation->capacitor_scanned_status ?? null;
// $packCnt = 1;
// $scanCnt = 1;
// // if ($hadMotorQr === $hasMotorQr && $hadPumpQr === $hasPumpQr && $hadPumpSetQr === $hasPumpSetQr)
// if ($hasMotorQr || $hasPumpQr || $hasPumpSetQr) {
// $packCnt = $hasMotorQr ? $packCnt + 1 : $packCnt;
// $packCnt = $hasPumpQr ? $packCnt + 1 : $packCnt;
// $packCnt = $hasPumpSetQr ? $packCnt + 1 : $packCnt;
// $scanCnt = $hadMotorQr ? $scanCnt + 1 : $scanCnt;
// $scanCnt = $hadPumpQr ? $scanCnt + 1 : $scanCnt;
// $scanCnt = $hadPumpSetQr ? $scanCnt + 1 : $scanCnt;
// if ($packCnt === $scanCnt) {
// $matchingValidation->update([
// 'panel_box_supplier' => $supplier,
// 'panel_box_code' => $itemCode,
// 'panel_box_serial_number' => $serialNumber,
// 'capacitor_scanned_status' => 1,
// 'scanned_status' => 'Scanned',
// 'operator_id' => $operatorName,
// ]);
// } else {
// $matchingValidation->update([
// 'panel_box_supplier' => $supplier,
// 'panel_box_code' => $itemCode,
// 'panel_box_serial_number' => $serialNumber,
// 'capacitor_scanned_status' => 1,
// 'operator_id' => $operatorName,
// ]);
// }
// } else {
// $matchingValidation->update([
// 'panel_box_supplier' => $supplier,
// 'panel_box_code' => $itemCode,
// 'panel_box_serial_number' => $serialNumber,
// 'capacitor_scanned_status' => 1,
// 'scanned_status' => 'Scanned',
// 'operator_id' => $operatorName,
// ]);
// }
// // Notification::make()
// // ->title('Success: Capacitor QR')
// // // ->title("Panel box code scanned: $itemCode")
// // ->body("'Capacitor' QR scanned status updated, Scan next QR.")
// // ->success() // commented
// // ->seconds(2)
// // ->send();
// $totalQuantity = InvoiceValidation::where('invoice_number', $matchingValidation->invoice_number)->where('plant_id', $this->plantId)->count();
// $scannedQuantity = InvoiceValidation::where('invoice_number', $matchingValidation->invoice_number)->where('plant_id', $this->plantId)->where('scanned_status', 'Scanned')->count();
// // $this->form->fill([
// // 'plant_id' => $matchingValidation->plant_id,
// // 'invoice_number' => $matchingValidation->invoice_number,
// // 'serial_number' => null,
// // 'total_quantity' => $totalQuantity,
// // 'scanned_quantity'=> $scannedQuantity,
// // ]);
// if ($totalQuantity === $scannedQuantity) {
// Notification::make()
// ->title('Completed: Serial Invoice')
// ->body("Serial invoice '$matchingValidation->invoice_number' completed the scanning process.<br>Scan the next 'Serial Invoice' to proceed!")
// ->success()
// ->seconds(2)
// ->send();
// $this->loadCompletedData($matchingValidation->invoice_number, $matchingValidation->plant_id, true);
// } else {
// $this->loadData($matchingValidation->invoice_number, $matchingValidation->plant_id, false);
// }
// }
// break;
// }
// }
// $this->showCapacitorInput = false;
// $this->capacitorInput = '';
// $this->dispatch('updateScannedQuantity');
// // $this->loadData($this->invoiceNumber, $this->plantId);
// $this->dispatch('focus-serial-number');
// }
public function processCapacitorInput()
{
$user = Filament::auth()->user();
@@ -801,14 +339,12 @@ class InvoiceDataTable extends Component
if (! preg_match('/^[^\/]+\/[^\/]+\/.+$/', $this->capacitorInput)) {
Notification::make()
->title('Invalid Panel Box QR Format:')
->body("Scan the valid panel box QR '$this->capacitorInput' to proceed!")
->body('Scan the valid panel box QR code to proceed!')
->danger()
// ->duration(3000)
->seconds(2)
->send();
$this->capacitorInput = '';
return;
}
@@ -835,19 +371,10 @@ class InvoiceDataTable extends Component
return;
}
$this->package = InvoiceValidation::with('stickerMasterRelation')
->where('invoice_number', $this->invoiceNumber)
->where('plant_id', $this->plantId)
->get();
foreach ($this->package as &$row) {
$stickerCode = $row->stickerMasterRelation?->item?->code ?? null;
$serialNo = $row->serial_number ?? null;
if ($stickerCode === $this->currentItemCode && $serialNo === $this->currentSerialNumber) {
foreach ($this->invoiceData as &$row) {
if (($row['code'] ?? '') === $this->currentItemCode && ($row['serial_number'] ?? '') === $this->currentSerialNumber) {
$row['panel_box_supplier'] = $supplier;
$row['panel_box_code'] = $itemCode;
$row['panel_box_item_code'] = $itemCode;
$row['panel_box_serial_number'] = $serialNumber;
$row['capacitor_scanned_status'] = 1;
// $row['scanned_status_set'] = true;
@@ -860,8 +387,6 @@ class InvoiceDataTable extends Component
return $validation->stickerMaster?->item?->code === $this->currentItemCode;
});
// dd($matchingValidation);
if ($matchingValidation) {
$hasMotorQr = $matchingValidation->stickerMasterRelation->tube_sticker_motor ?? null;
$hasPumpQr = $matchingValidation->stickerMasterRelation->tube_sticker_pump ?? null;
@@ -888,7 +413,7 @@ class InvoiceDataTable extends Component
if ($packCnt === $scanCnt) {
$matchingValidation->update([
'panel_box_supplier' => $supplier,
'panel_box_code' => $itemCode,
'panel_box_item_code' => $itemCode,
'panel_box_serial_number' => $serialNumber,
'capacitor_scanned_status' => 1,
'scanned_status' => 'Scanned',
@@ -897,7 +422,7 @@ class InvoiceDataTable extends Component
} else {
$matchingValidation->update([
'panel_box_supplier' => $supplier,
'panel_box_code' => $itemCode,
'panel_box_item_code' => $itemCode,
'panel_box_serial_number' => $serialNumber,
'capacitor_scanned_status' => 1,
'operator_id' => $operatorName,
@@ -906,7 +431,7 @@ class InvoiceDataTable extends Component
} else {
$matchingValidation->update([
'panel_box_supplier' => $supplier,
'panel_box_code' => $itemCode,
'panel_box_item_code' => $itemCode,
'panel_box_serial_number' => $serialNumber,
'capacitor_scanned_status' => 1,
'scanned_status' => 'Scanned',
@@ -955,15 +480,8 @@ class InvoiceDataTable extends Component
$this->dispatch('focus-serial-number');
}
// public function render()
// {
// return view('livewire.invoice-data-table');
// }
public function render()
{
return view('livewire.invoice-data-table', [
'records' => $this->invoiceRecords,
]);
return view('livewire.invoice-data-table');
}
}

View File

@@ -37,8 +37,7 @@ class SerialValidationData extends Component
'refreshEmptyInvoice' => 'loadEmptyData',
'refreshInvoiceData' => 'loadData',
'refreshMaterialInvoiceData' => 'loadMaterialData',
'focusCapacitor' => 'focusCapacitorInput'
//'openCapacitorModal' => 'showCapacitorInputBox',
'openCapacitorModal' => 'showCapacitorInputBox',
];
public $capacitorInput = '';
@@ -49,8 +48,6 @@ class SerialValidationData extends Component
public $panel_box_serial_number;
public $itemcode;
public string $currentItemCode = '';
public string $currentSerialNumber = '';
@@ -67,11 +64,6 @@ class SerialValidationData extends Component
// // $this->showCapacitorInput = false;
// }
public function focusCapacitorInput($itemCode)
{
$this->dispatch('focus-capacitor-input', itemCode: $itemCode);
}
public function loadCompletedData($invoiceNumber, $plantId, $isSerial)
{

View File

@@ -1,115 +0,0 @@
<?php
namespace App\Mail;
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;
use Illuminate\Support\Facades\URL;
use Illuminate\Mail\Mailables\Attachment;
use Storage;
class CharacteristicApprovalMail extends Mailable
{
use Queueable, SerializesModels;
public $request;
public $approverName;
public $level;
public $pdfPath;
public $tableData;
/**
* Create a new message instance.
*/
public function __construct($request, $approverName, $level, $pdfPath = null, $characteristics = [])
{
$this->request = $request;
$this->approverName = $approverName;
$this->level = $level;
$this->pdfPath = $pdfPath;
$this->tableData = $characteristics;
}
/**
* Get the message envelope.
*/
public function envelope(): Envelope
{
return new Envelope(
subject: 'Characteristic Approval Mail',
);
}
/**
* Get the message content definition.
*/
public function content(): Content
{
return new Content(
view: 'mail.characteristic-approval',
with: [
'company' => 'CRI Digital Manufacturing Solutions',
'greeting' => 'Dear ' . $this->approverName . ',',
'request' => $this->request,
'tableData' => $this->tableData,
'approveUrl' => $this->approveUrl(),
'holdUrl' => $this->holdUrl(),
'rejectUrl' => $this->rejectUrl(),
'wishes' => 'Thanks & Regards,<br>CRI Digital Manufacturing Solutions',
]
);
}
protected function approveUrl()
{
return URL::signedRoute('characteristic.approve', [
'id' => $this->request->id,
'level' => $this->level
]);
}
protected function holdUrl()
{
return URL::signedRoute('characteristic.hold', [
'id' => $this->request->id,
'level' => $this->level
]);
}
protected function rejectUrl()
{
return URL::signedRoute('characteristic.reject', [
'id' => $this->request->id,
'level' => $this->level
]);
}
/**
* Get the attachments for the message.
*
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
*/
public function attachments(): array
{
if (! $this->pdfPath) {
return [];
}
if (! Storage::disk('local')->exists($this->pdfPath)) {
return [];
}
return [
Attachment::fromStorageDisk(
'local',
$this->pdfPath
)->as(basename($this->pdfPath)),
];
}
}

View File

@@ -14,7 +14,6 @@ class CharacteristicApproverMaster extends Model
'plant_id',
'machine_id',
'machine_name',
'characteristic_field',
'name1',
'mail1',
'name2',
@@ -24,6 +23,8 @@ class CharacteristicApproverMaster extends Model
'duration1',
'duration2',
'duration3',
'characteristic_field',
'created_at',
'updated_at',
'created_by',

View File

@@ -2,15 +2,13 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class CharacteristicValue extends Model
{
use Prunable;
use SoftDeletes;
protected $fillable = [
@@ -47,9 +45,4 @@ class CharacteristicValue extends Model
{
return $this->belongsTo(Machine::class);
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,15 +2,12 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class ClassCharacteristic extends Model
{
use Prunable;
use SoftDeletes;
protected $fillable = [
@@ -182,9 +179,4 @@ class ClassCharacteristic extends Model
{
return $this->belongsTo(Machine::class);
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,15 +2,12 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class EbReading extends Model
{
use Prunable;
use SoftDeletes;
protected $fillable = [
@@ -69,9 +66,4 @@ class EbReading extends Model
{
return $this->belongsTo(Plant::class);
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,15 +2,12 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class GuardPatrolEntry extends Model
{
use Prunable;
use SoftDeletes;
protected $fillable = [
@@ -30,24 +27,13 @@ class GuardPatrolEntry extends Model
public function guardNames(): BelongsTo
{
// return $this->belongsTo(CheckPointName::class);
//return $this->belongsTo(CheckPointName::class);
return $this->belongsTo(GuardName::class, 'guard_name_id');
}
public function checkPointNames(): BelongsTo
{
// return $this->belongsTo(CheckPointName::class);
//return $this->belongsTo(CheckPointName::class);
return $this->belongsTo(CheckPointName::class, 'check_point_name_id');
}
public function prunable(): Builder
{
// // Start of two months ago (first day of that month)
// $startOfTwoMonthsAgo = now()->subMonthsNoOverflow(6)->startOfMonth();
// // End of previous month (last day of last month)
// $endOfPrevMonth = now()->subMonthNoOverflow()->endOfMonth();
// return static::whereBetween('created_at', [$startOfTwoMonthsAgo, $endOfPrevMonth]);
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,33 +2,28 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class InvoiceDataValidation extends Model
{
use Prunable;
use SoftDeletes;
protected $dates = ['deleted_at'];
protected $fillable = [
'plant_id',
'distribution_channel_desc',
'customer_code',
'document_number',
'document_date',
'customer_trade_name',
'customer_location',
'location',
'remark',
'created_at',
'created_by',
'updated_by',
'updated_at',
"plant_id",
"distribution_channel_desc",
"customer_code",
"document_number",
"document_date",
"customer_trade_name",
"customer_location",
"location",
"created_at",
"created_by",
"updated_by",
"updated_at"
];
public function plant(): BelongsTo
@@ -36,8 +31,4 @@ class InvoiceDataValidation extends Model
return $this->belongsTo(Plant::class);
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,53 +2,45 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class InvoiceInTransit extends Model
{
use Prunable;
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',
"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);
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,37 +2,27 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class InvoiceOutValidation extends Model
{
use Prunable;
use SoftDeletes;
// protected $dates = ['deleted_at'];
protected $fillable = [
'plant_id',
'qr_code',
'scanned_at',
'scanned_by',
'created_at',
'created_by',
'updated_by',
'updated_at',
"plant_id",
"qr_code",
"scanned_at",
"scanned_by",
"created_at",
"created_by",
"updated_by",
"updated_at"
];
public function plant(): BelongsTo
{
return $this->belongsTo(Plant::class);
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,28 +2,24 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class InvoiceValidation extends Model
{
use Prunable;
use SoftDeletes;
protected $fillable = [
'sticker_master_id',
'plant_id',
'invoice_number',
'invoice_number',
'serial_number',
'motor_scanned_status',
'pump_scanned_status',
'capacitor_scanned_status',
'scanned_status_set',
'scanned_status',
'panel_box_code',
'panel_box_supplier',
'panel_box_serial_number',
'load_rate',
@@ -31,8 +27,6 @@ class InvoiceValidation extends Model
'batch_number',
'quantity',
'operator_id',
'created_by',
'updated_by',
];
public function plant(): BelongsTo
@@ -44,14 +38,11 @@ class InvoiceValidation extends Model
{
return $this->belongsTo(StickerMaster::class);
}
public function stickerMasterRelation()
{
return $this->belongsTo(StickerMaster::class, 'sticker_master_id');
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,40 +2,32 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class LocatorInvoiceValidation extends Model
{
use Prunable;
use SoftDeletes;
protected $fillable = [
'plant_id',
'invoice_number',
'invoice_number',
'serial_number',
'pallet_number',
'locator_number',
'scanned_status',
'upload_status',
'created_at',
'updated_at',
'scanned_at',
'created_by',
'scanned_by',
'updated_by',
'pallet_number',
'locator_number',
'scanned_status',
'upload_status',
'created_at',
'updated_at',
'scanned_at',
'created_by',
'scanned_by',
'updated_by',
];
public function plant(): BelongsTo
{
return $this->belongsTo(Plant::class);
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,42 +2,39 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class MfmReading extends Model
{
use Prunable;
use SoftDeletes;
protected $fillable = [
'plant_id',
'mfm_meter_id',
'apparent_energy_received',
'apparent_energy_received',
'reactive_energy_received',
'active_energy_received',
'active_power_r',
'active_power_y',
'active_power_b',
'active_power_y',
'active_power_b',
'active_power_total',
'voltage_ry',
'voltage_yb',
'voltage_ry',
'voltage_yb',
'voltage_br',
'current_r',
'current_y',
'current_y',
'current_b',
'current_n',
'voltage_r_n',
'voltage_y_n',
'voltage_r_n',
'voltage_y_n',
'voltage_b_n',
'frequency',
'power_factor_r',
'frequency',
'power_factor_r',
'power_factor_y',
'power_factor_b',
'power_factor_total',
'power_factor_total',
'created_at',
'updated_at',
];
@@ -51,9 +48,4 @@ class MfmReading extends Model
{
return $this->belongsTo(MfmMeter::class, 'mfm_meter_id');
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,39 +2,31 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class PalletValidation extends Model
{
use Prunable;
use SoftDeletes;
protected $fillable = [
'plant_id',
'pallet_number',
'pallet_number',
'serial_number',
'pallet_status',
'locator_number',
'pallet_status',
'locator_number',
'locator_quantity',
'created_at',
'updated_at',
'scanned_at',
'created_by',
'scanned_by',
'updated_by',
'created_at',
'updated_at',
'scanned_at',
'created_by',
'scanned_by',
'updated_by',
];
public function plant(): BelongsTo
{
return $this->belongsTo(Plant::class);
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,20 +2,16 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class ProcessOrder extends Model
{
use Prunable;
use SoftDeletes;
protected $fillable = [
'plant_id',
'line_id',
'item_id',
'process_order',
'coil_number',
@@ -23,12 +19,10 @@ class ProcessOrder extends Model
'received_quantity',
'sfg_number',
'machine_name',
'scrap_quantity',
'rework_status',
'created_at',
'created_by',
'updated_at',
'updated_by',
'updated_at',
];
public function plant(): BelongsTo
@@ -36,18 +30,8 @@ class ProcessOrder extends Model
return $this->belongsTo(Plant::class);
}
public function line(): BelongsTo
{
return $this->belongsTo(Line::class);
}
public function item(): BelongsTo
public function item()
{
return $this->belongsTo(Item::class, 'item_id');
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,29 +2,24 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class ProductionLineStop extends Model
{
use Prunable;
use SoftDeletes;
protected $fillable = [
'plant_id',
'line_id',
'shift_id',
'linestop_id',
'from_datetime',
'to_datetime',
'stop_hour',
'stop_min',
'operator_id',
'created_at',
'updated_at',
"plant_id",
"shift_id",
"line_id",
"linestop_id",
"from_datetime",
"to_datetime",
"stop_hour",
"stop_min",
"operator_id",
];
public function plant(): BelongsTo
@@ -53,8 +48,5 @@ class ProductionLineStop extends Model
// return $this->belongsTo(LineStop::class, 'linestop_id');
// }
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,26 +2,22 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class ProductionPlan extends Model
{
use Prunable;
use SoftDeletes;
protected $fillable = [
'plant_id',
'shift_id',
'line_id',
'plan_quantity',
'production_quantity',
'operator_id',
'created_at',
'updated_at',
"plant_id",
"shift_id",
"created_at",
"line_id",
"plan_quantity",
"production_quantity",
"operator_id",
];
public function plant(): BelongsTo
@@ -38,9 +34,4 @@ class ProductionPlan extends Model
{
return $this->belongsTo(Line::class);
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -4,33 +4,30 @@ namespace App\Models;
use Carbon\Carbon;
use Filament\Facades\Filament;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class ProductionQuantity extends Model
{
use Prunable;
use SoftDeletes;
public static $importing = false; // Add this flag
protected $fillable = [
'plant_id',
'shift_id',
'line_id',
'item_id',
'serial_number',
'production_order',
'operator_id',
"plant_id",
"shift_id",
"line_id",
"item_id",
"serial_number",
"production_order",
"operator_id",
// "success_status",
// "notok_at",
// "no_of_employee",
// "list_of_employee",
'created_at',
'updated_at',
"created_at",
"updated_at"
];
public function plant(): BelongsTo
@@ -69,7 +66,8 @@ class ProductionQuantity extends Model
->latest()
->first();
if (! $productionPlan) {
if (!$productionPlan)
{
$productionPlan = ProductionPlan::where('plant_id', $productionQuantity->plant_id)
->where('shift_id', $productionQuantity->shift_id)
->where('line_id', $productionQuantity->line_id)
@@ -90,9 +88,4 @@ class ProductionQuantity extends Model
}
});
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,22 +2,19 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class QualityValidation extends Model
{
use Prunable;
use SoftDeletes;
protected $fillable = [
'sticker_master_id',
'plant_id',
'plant_id',
'line_id',
'production_order',
'production_order',
'serial_number_motor',
'serial_number_pump',
'serial_number_pumpset',
@@ -59,9 +56,4 @@ class QualityValidation extends Model
{
return $this->belongsTo(Line::class);
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,15 +2,12 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class RequestCharacteristic extends Model
{
use Prunable;
use SoftDeletes;
protected $fillable = [
@@ -51,6 +48,7 @@ class RequestCharacteristic extends Model
return $this->belongsTo(Item::class);
}
public function machine(): BelongsTo
{
return $this->belongsTo(Machine::class);
@@ -93,8 +91,9 @@ class RequestCharacteristic extends Model
);
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,33 +2,30 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class ReworkLocatorInvoiceValidation extends Model
{
use Prunable;
use SoftDeletes;
protected $fillable = [
'plant_id',
'invoice_number',
'serial_number',
'pallet_number',
'locator_number',
'scanned_status',
'upload_status',
'created_by',
'scanned_by',
'updated_by',
'reworked_by',
'created_at',
'updated_at',
'scanned_at',
'reworked_at',
'invoice_number',
'serial_number',
'pallet_number',
'locator_number',
'scanned_status',
'upload_status',
'created_by',
'scanned_by',
'updated_by',
'reworked_by',
'created_at',
'updated_at',
'scanned_at',
'reworked_at',
];
public function plant(): BelongsTo
@@ -36,8 +33,4 @@ class ReworkLocatorInvoiceValidation extends Model
return $this->belongsTo(Plant::class);
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,21 +2,19 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class SerialValidation extends Model
{
use Prunable;
use SoftDeletes;
protected $fillable = [
'sticker_master_id',
'plant_id',
'invoice_number',
'invoice_number',
'serial_number',
'motor_scanned_status',
'pump_scanned_status',
@@ -46,9 +44,4 @@ class SerialValidation extends Model
{
return $this->belongsTo(StickerMaster::class, 'sticker_master_id');
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,15 +2,14 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class StickerPrinting extends Model
{
use Prunable;
//
use SoftDeletes;
protected $fillable = [
@@ -27,9 +26,4 @@ class StickerPrinting extends Model
{
return $this->belongsTo(Plant::class);
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,38 +2,30 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class TempLiveReading extends Model
{
use Prunable;
use SoftDeletes;
use SoftDeletes;
protected $fillable = [
'plant_id',
'mfm_meter_id',
'register_data',
'register_data',
'created_at',
'updated_at',
'created_by',
'updated_at',
'created_by',
];
public function plant(): BelongsTo
{
return $this->belongsTo(Plant::class);
}
public function mfmMeter(): BelongsTo
{
return $this->belongsTo(MfmMeter::class, 'mfm_meter_id');
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,69 +2,66 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class TestingPanelReading extends Model
{
use Prunable;
use SoftDeletes;
protected $fillable = [
'plant_id',
'line_id',
'motor_testing_master_id',
'machine_id',
'output',
'serial_number',
'line_id',
'motor_testing_master_id',
'machine_id',
'output',
'serial_number',
'winded_serial_number',
'before_fr_volt',
'before_fr_cur',
'before_fr_pow',
'before_fr_res_ry',
'before_fr_res_yb',
'before_fr_res_br',
'before_fr_ir',
'before_fr_ir_r',
'before_fr_ir_y',
'before_fr_ir_b',
'before_fr_freq',
'before_fr_speed',
'after_fr_vol',
'after_fr_cur',
'after_fr_pow',
'after_fr_ir_hot',
'after_fr_ir_hot_r',
'after_fr_ir_hot_y',
'after_fr_ir_hot_b',
'after_fr_ir_cool',
'after_fr_ir_cool_r',
'after_fr_ir_cool_y',
'after_fr_ir_cool_b',
'after_fr_freq',
'after_fr_speed',
'after_fr_leak_cur',
'locked_rt_volt',
'locked_rt_cur',
'locked_rt_pow',
'no_load_pickup_volt',
'room_temperature',
'hv_test',
'batch_number',
'batch_count',
'result',
'remark',
'rework_count',
'before_fr_volt',
'before_fr_cur',
'before_fr_pow',
'before_fr_res_ry',
'before_fr_res_yb',
'before_fr_res_br',
'before_fr_ir',
'before_fr_ir_r',
'before_fr_ir_y',
'before_fr_ir_b',
'before_fr_freq',
'before_fr_speed',
'after_fr_vol',
'after_fr_cur',
'after_fr_pow',
'after_fr_ir_hot',
'after_fr_ir_hot_r',
'after_fr_ir_hot_y',
'after_fr_ir_hot_b',
'after_fr_ir_cool',
'after_fr_ir_cool_r',
'after_fr_ir_cool_y',
'after_fr_ir_cool_b',
'after_fr_freq',
'after_fr_speed',
'after_fr_leak_cur',
'locked_rt_volt',
'locked_rt_cur',
'locked_rt_pow',
'no_load_pickup_volt',
'room_temperature',
'hv_test',
'batch_number',
'batch_count',
'result',
'remark',
'rework_count',
'update_count',
'output_flag',
'tested_by',
'updated_by',
'tested_by',
'updated_by',
'created_at',
'updated_at',
'scanned_at',
'scanned_at',
];
public function plant(): BelongsTo
@@ -72,11 +69,10 @@ class TestingPanelReading extends Model
return $this->belongsTo(Plant::class);
}
public function line(): BelongsTo
public function line(): BelongsTo
{
return $this->belongsTo(Line::class);
}
public function machine(): BelongsTo
{
return $this->belongsTo(Machine::class);
@@ -87,13 +83,8 @@ class TestingPanelReading extends Model
return $this->belongsTo(Item::class);
}
public function motorTestingMaster()
public function motorTestingMaster()
{
return $this->belongsTo(MotorTestingMaster::class);
}
public function prunable(): Builder
{
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -2,15 +2,12 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Prunable;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class WeightValidation extends Model
{
use Prunable;
use SoftDeletes;
protected $fillable = [
@@ -25,8 +22,6 @@ class WeightValidation extends Model
'bundle_number',
'picked_weight',
'scanned_by',
'created_at',
'updated_at',
];
public function plant(): BelongsTo
@@ -38,13 +33,4 @@ class WeightValidation extends Model
{
return $this->belongsTo(Item::class);
}
public function prunable(): Builder
{
// $startOfTwoMonthsAgo = now()->subMonthsNoOverflow(3)->startOfMonth();
// $endOfPrevMonth = now()->subMonthNoOverflow()->endOfMonth();
// return static::whereBetween('created_at', [$startOfTwoMonthsAgo, $endOfPrevMonth]);
return static::where('created_at', '<=', now()->subMonthsNoOverflow(6));
}
}

View File

@@ -1,61 +0,0 @@
<?php
namespace App\Observers;
use App\Jobs\SendApprover1MailJob;
use App\Models\RequestCharacteristic;
use App\Models\CharacteristicApproverMaster;
use App\Mail\CharacteristicApprovalMail;
use Illuminate\Support\Facades\Mail;
class RequestCharacteristicObserver
{
/**
* Handle the RequestCharacteristic "created" event.
*/
public function created(RequestCharacteristic $request): void
{
// Only if all statuses are NULL
if (
!is_null($request->approver_status1) ||
!is_null($request->approver_status2) ||
!is_null($request->approver_status3)
) {
return;
}
SendApprover1MailJob::dispatch($request);
}
/**
* Handle the RequestCharacteristic "updated" event.
*/
public function updated(RequestCharacteristic $requestCharacteristic): void
{
//
}
/**
* Handle the RequestCharacteristic "deleted" event.
*/
public function deleted(RequestCharacteristic $requestCharacteristic): void
{
//
}
/**
* Handle the RequestCharacteristic "restored" event.
*/
public function restored(RequestCharacteristic $requestCharacteristic): void
{
//
}
/**
* Handle the RequestCharacteristic "force deleted" event.
*/
public function forceDeleted(RequestCharacteristic $requestCharacteristic): void
{
//
}
}

View File

@@ -32,7 +32,7 @@
"tpetry/laravel-postgresql-enhanced": "^2.3"
},
"require-dev": {
"barryvdh/laravel-debugbar": "^3.15",
"barryvdh/laravel-debugbar": "^4.0",
"barryvdh/laravel-ide-helper": "^3.5",
"beyondcode/laravel-dump-server": "^2.1",
"fakerphp/faker": "^1.23",

View File

@@ -1,192 +0,0 @@
<?php
return [
/*
|---------------------------------------------------------------------------
| Class Namespace
|---------------------------------------------------------------------------
|
| This value sets the root class namespace for Livewire component classes in
| your application. This value will change where component auto-discovery
| finds components. It's also referenced by the file creation commands.
|
*/
'class_namespace' => 'App\\Livewire',
/*
|---------------------------------------------------------------------------
| View Path
|---------------------------------------------------------------------------
|
| This value is used to specify where Livewire component Blade templates are
| stored when running file creation commands like `artisan make:livewire`.
| It is also used if you choose to omit a component's render() method.
|
*/
'view_path' => resource_path('views/livewire'),
/*
|---------------------------------------------------------------------------
| Layout
|---------------------------------------------------------------------------
| The view that will be used as the layout when rendering a single component
| as an entire page via `Route::get('/post/create', CreatePost::class);`.
| In this case, the view returned by CreatePost will render into $slot.
|
*/
'layout' => 'components.layouts.app',
/*
|---------------------------------------------------------------------------
| Lazy Loading Placeholder
|---------------------------------------------------------------------------
| Livewire allows you to lazy load components that would otherwise slow down
| the initial page load. Every component can have a custom placeholder or
| you can define the default placeholder view for all components below.
|
*/
'lazy_placeholder' => null,
/*
|---------------------------------------------------------------------------
| Temporary File Uploads
|---------------------------------------------------------------------------
|
| Livewire handles file uploads by storing uploads in a temporary directory
| before the file is stored permanently. All file uploads are directed to
| a global endpoint for temporary storage. You may configure this below:
|
*/
// 'temporary_file_upload' => [
// 'disk' => null, // Example: 'local', 's3' | Default: 'default'
// 'rules' => null, // Example: ['file', 'mimes:png,jpg'] | Default: ['required', 'file', 'max:12288'] (12MB)
// 'directory' => null, // Example: 'tmp' | Default: 'livewire-tmp'
// 'middleware' => null, // Example: 'throttle:5,1' | Default: 'throttle:60,1'
// 'preview_mimes' => [ // Supported file types for temporary pre-signed file URLs...
// 'png', 'gif', 'bmp', 'svg', 'wav', 'mp4',
// 'mov', 'avi', 'wmv', 'mp3', 'm4a',
// 'jpg', 'jpeg', 'mpga', 'webp', 'wma',
// ],
// 'max_upload_time' => 5, // Max duration (in minutes) before an upload is invalidated...
// 'cleanup' => true, // Should cleanup temporary uploads older than 24 hrs...
// ],
'temporary_file_upload' => [
'max_upload_file_size' => 20480, // 20 MB
],
/*
|---------------------------------------------------------------------------
| Render On Redirect
|---------------------------------------------------------------------------
|
| This value determines if Livewire will run a component's `render()` method
| after a redirect has been triggered using something like `redirect(...)`
| Setting this to true will render the view once more before redirecting
|
*/
'render_on_redirect' => false,
/*
|---------------------------------------------------------------------------
| Eloquent Model Binding
|---------------------------------------------------------------------------
|
| Previous versions of Livewire supported binding directly to eloquent model
| properties using wire:model by default. However, this behavior has been
| deemed too "magical" and has therefore been put under a feature flag.
|
*/
'legacy_model_binding' => false,
/*
|---------------------------------------------------------------------------
| Auto-inject Frontend Assets
|---------------------------------------------------------------------------
|
| By default, Livewire automatically injects its JavaScript and CSS into the
| <head> and <body> of pages containing Livewire components. By disabling
| this behavior, you need to use @livewireStyles and @livewireScripts.
|
*/
'inject_assets' => true,
/*
|---------------------------------------------------------------------------
| Navigate (SPA mode)
|---------------------------------------------------------------------------
|
| By adding `wire:navigate` to links in your Livewire application, Livewire
| will prevent the default link handling and instead request those pages
| via AJAX, creating an SPA-like effect. Configure this behavior here.
|
*/
'navigate' => [
'show_progress_bar' => true,
'progress_bar_color' => '#2299dd',
],
/*
|---------------------------------------------------------------------------
| HTML Morph Markers
|---------------------------------------------------------------------------
|
| Livewire intelligently "morphs" existing HTML into the newly rendered HTML
| after each update. To make this process more reliable, Livewire injects
| "markers" into the rendered Blade surrounding @if, @class & @foreach.
|
*/
'inject_morph_markers' => true,
/*
|---------------------------------------------------------------------------
| Smart Wire Keys
|---------------------------------------------------------------------------
|
| Livewire uses loops and keys used within loops to generate smart keys that
| are applied to nested components that don't have them. This makes using
| nested components more reliable by ensuring that they all have keys.
|
*/
'smart_wire_keys' => false,
/*
|---------------------------------------------------------------------------
| Pagination Theme
|---------------------------------------------------------------------------
|
| When enabling Livewire's pagination feature by using the `WithPagination`
| trait, Livewire will use Tailwind templates to render pagination views
| on the page. If you want Bootstrap CSS, you can specify: "bootstrap"
|
*/
'pagination_theme' => 'tailwind',
/*
|---------------------------------------------------------------------------
| Release Token
|---------------------------------------------------------------------------
|
| This token is stored client-side and sent along with each request to check
| a users session to see if a new release has invalidated it. If there is
| a mismatch it will throw an error and prompt for a browser refresh.
|
*/
'release_token' => 'a',
];

View File

@@ -1,6 +1,7 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
@@ -26,20 +27,19 @@ return new class extends Migration
scanned_status_set TEXT DEFAULT NULL,
scanned_status TEXT DEFAULT NULL,
panel_box_code TEXT DEFAULT NULL,
panel_box_supplier TEXT DEFAULT NULL,
panel_box_serial_number TEXT DEFAULT NULL,
load_rate INT NOT NULL DEFAULT (0),
upload_status TEXT NOT NULL DEFAULT 'N',
batch_number TEXT DEFAULT NULL,
quantity INT 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,
UNIQUE (plant_id, serial_number),
@@ -48,7 +48,7 @@ return new class extends Migration
);
SQL;
DB::statement($sql);
DB::statement($sql);
}
/**

View File

@@ -1,33 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
$sql = <<<'SQL'
ALTER TABLE process_orders
ADD COLUMN line_id BIGINT DEFAULT NULL,
ADD CONSTRAINT process_orders_line_id_fkey
FOREIGN KEY (line_id) REFERENCES lines(id);
SQL;
DB::statement($sql);
}
/**
* Reverse the migrations.
*/
public function down(): void
{
// Schema::table('process_orders', function (Blueprint $table) {
// //
// });
}
};

View File

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

View File

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

View File

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

View File

@@ -1,45 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
$sql1 = <<<'SQL'
ALTER TABLE invoice_validations
ADD COLUMN panel_box_code TEXT DEFAULT NULL
SQL;
DB::statement($sql1);
$sql2 = <<<'SQL'
ALTER TABLE invoice_validations
ADD COLUMN created_by TEXT DEFAULT NULL
SQL;
DB::statement($sql2);
$sql3 = <<<'SQL'
ALTER TABLE invoice_validations
ADD COLUMN updated_by TEXT DEFAULT NULL
SQL;
DB::statement($sql3);
}
/**
* Reverse the migrations.
*/
public function down(): void
{
// Schema::table('invoice_validations', function (Blueprint $table) {
// //
// });
}
};

View File

@@ -1,91 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Action Already Taken</title>
<style>
body {
font-family: Arial, sans-serif;
background-color: #f4f6f8;
margin: 0;
padding: 0;
}
.container {
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
}
.card {
background: #ffffff;
width: 420px;
padding: 30px;
border-radius: 8px;
text-align: center;
box-shadow: 0 6px 20px rgba(0,0,0,0.1);
}
.icon {
font-size: 50px;
margin-bottom: 10px;
color: #ff9800;
}
h2 {
margin: 10px 0;
color: #333;
}
.status {
margin-top: 15px;
padding: 10px;
border-radius: 6px;
font-weight: bold;
font-size: 16px;
}
.status.Approved {
background-color: #e8f5e9;
color: #2e7d32;
}
.status.Hold {
background-color: #fff3e0;
color: #ef6c00;
}
.status.Rejected {
background-color: #fdecea;
color: #c62828;
}
.note {
margin-top: 15px;
font-size: 14px;
color: #666;
}
</style>
</head>
<body>
<div class="container">
<div class="card">
<div class="icon">⚠️</div>
<h2>Action Already Taken</h2>
<div class="status {{ $status }}">
Status: {{ $status }}
</div>
<p class="note">
This request has already been processed.<br>
No further action is required.
</p>
</div>
</div>
</body>
</html>

View File

@@ -1,98 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>Request On Hold</title>
<meta name="csrf-token" content="{{ csrf_token() }}">
</head>
<body style="font-family: Arial, sans-serif; background-color: #f4f4f4; margin:0; padding:0;">
<table width="100%" cellpadding="0" cellspacing="0" style="padding: 20px 0;">
<tr>
<td align="center">
<!-- Card container -->
<table width="600" cellpadding="0" cellspacing="0" style="background-color: #ffffff; border-radius: 8px; box-shadow: 0 2px 6px rgba(0,0,0,0.1); border: 1px solid #e0e0e0;">
<tr>
<td style="padding: 30px; text-align: center;">
<!-- Header -->
<div style="font-size: 40px;">🟠</div>
<h2 style="color: #FF8800; margin: 10px 0 20px; font-size: 24px;">Request On Hold</h2>
<!-- Message -->
<p style="font-size: 16px; color: #555555; line-height: 1.5;">
Your request has been temporarily put on hold.
</p>
<!-- Remark Textbox -->
<div style="margin-top: 20px; text-align: left;">
<label for="remark" style="font-size: 14px; color: #333;">Remark <span style="color:red;">*</span></label>
<textarea id="remark" style="width:100%; height:100px; padding:10px; margin-top:5px; border:1px solid #ddd; border-radius:5px;"></textarea>
<div id="remarkError" style="color:red; font-size:12px; display:none; margin-top:5px;">
Remark is mandatory.
</div>
</div>
<!-- Buttons -->
<div style="margin-top: 20px;">
{{-- <button onclick="holdRequest()" style="padding: 10px 20px; margin-right: 10px; background-color:#FF8800; color:#fff; border:none; border-radius:5px; cursor:pointer;">
Hold
</button> --}}
<input type="hidden" id="requestId" value="{{ request()->query('id') }}">
<input type="hidden" id="level" value="{{ request()->query('level') }}">
<button onclick="saveRemark()" style="padding: 10px 20px; background-color:#4CAF50; color:#fff; border:none; border-radius:5px; cursor:pointer;">
Save Remark
</button>
</div>
</td>
</tr>
<!-- Footer -->
<tr>
<td style="padding: 15px; text-align: center; font-size: 12px; color: #999999;">
CRI Digital Manufacturing Solutions<br>
&copy; 2026 All Rights Reserved
</td>
</tr>
</table>
</td>
</tr>
</table>
<script>
function saveRemark() {
const remark = document.getElementById("remark").value.trim();
const id = document.getElementById("requestId").value;
const level = document.getElementById("level").value;
fetch('/characteristic/hold-save', {
method: 'POST',
credentials: 'same-origin',
headers: {
'Content-Type': 'application/json',
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content
},
body: JSON.stringify({
id: id,
level: level,
remark: remark
})
})
.then(res => {
if (!res.ok) {
throw new Error("HTTP error " + res.status);
}
return res.json();
})
.then(data => {
alert('Hold saved successfully!');
window.location.href = "/approval/hold-success";
})
.catch(err => {
console.error(err);
alert('Error saving hold!');
});
}
</script>
</body>
</html>

View File

@@ -1,36 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>Request On Hold</title>
</head>
<body style="font-family: Arial, sans-serif; background-color: #f4f4f4; margin:0; padding:0;">
<table width="100%" cellpadding="0" cellspacing="0" style="padding: 20px 0;">
<tr>
<td align="center">
<!-- Card container -->
<table width="600" cellpadding="0" cellspacing="0" style="background-color: #ffffff; border-radius: 8px; box-shadow: 0 2px 6px rgba(0,0,0,0.1); border: 1px solid #e0e0e0;">
<tr>
<td style="padding: 30px; text-align: center;">
<!-- Header -->
<div style="font-size: 40px;">🟠</div>
<h2 style="color: #FF8800; margin: 10px 0 20px; font-size: 24px;">Request On Hold</h2>
<!-- Message -->
<p style="font-size: 16px; color: #555555; line-height: 1.5;">
Your request has been temporarily put on hold.
</p>
</td>
</tr>
<!-- Footer -->
<tr>
<td style="padding: 15px; text-align: center; font-size: 12px; color: #999999;">
CRI Digital Manufacturing Solutions<br>
&copy; 2026 All Rights Reserved
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>

View File

@@ -1,98 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>Request On Reject</title>
<meta name="csrf-token" content="{{ csrf_token() }}">
</head>
<body style="font-family: Arial, sans-serif; background-color: #f4f4f4; margin:0; padding:0;">
<table width="100%" cellpadding="0" cellspacing="0" style="padding: 20px 0;">
<tr>
<td align="center">
<!-- Card container -->
<table width="600" cellpadding="0" cellspacing="0" style="background-color: #ffffff; border-radius: 8px; box-shadow: 0 2px 6px rgba(0,0,0,0.1); border: 1px solid #e0e0e0;">
<tr>
<td style="padding: 30px; text-align: center;">
<!-- Header -->
<div style="font-size: 40px;">🟠</div>
<h2 style="color: #FF0000; margin: 10px 0 20px; font-size: 24px;">Request On Reject</h2>
<!-- Message -->
<p style="font-size: 16px; color: #555555; line-height: 1.5;">
Your request has been temporarily put on reject.
</p>
<!-- Remark Textbox -->
<div style="margin-top: 20px; text-align: left;">
<label for="remark" style="font-size: 14px; color: #333;">Remark <span style="color:red;">*</span></label>
<textarea id="remark" style="width:100%; height:100px; padding:10px; margin-top:5px; border:1px solid #ddd; border-radius:5px;"></textarea>
<div id="remarkError" style="color:red; font-size:12px; display:none; margin-top:5px;">
Remark is mandatory.
</div>
</div>
<!-- Buttons -->
<div style="margin-top: 20px;">
{{-- <button onclick="holdRequest()" style="padding: 10px 20px; margin-right: 10px; background-color:#FF8800; color:#fff; border:none; border-radius:5px; cursor:pointer;">
Hold
</button> --}}
<input type="hidden" id="requestId" value="{{ request()->query('id') }}">
<input type="hidden" id="level" value="{{ request()->query('level') }}">
<button onclick="saveRemark()" style="padding: 10px 20px; background-color:#4CAF50; color:#fff; border:none; border-radius:5px; cursor:pointer;">
Save Remark
</button>
</div>
</td>
</tr>
<!-- Footer -->
<tr>
<td style="padding: 15px; text-align: center; font-size: 12px; color: #999999;">
CRI Digital Manufacturing Solutions<br>
&copy; 2026 All Rights Reserved
</td>
</tr>
</table>
</td>
</tr>
</table>
<script>
function saveRemark() {
const remark = document.getElementById("remark").value.trim();
const id = document.getElementById("requestId").value;
const level = document.getElementById("level").value;
fetch('/characteristic/reject-save', {
method: 'POST',
credentials: 'same-origin',
headers: {
'Content-Type': 'application/json',
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content
},
body: JSON.stringify({
id: id,
level: level,
remark: remark
})
})
.then(res => {
if (!res.ok) {
throw new Error("HTTP error " + res.status);
}
return res.json();
})
.then(data => {
alert('Reject saved successfully!');
window.location.href = "/approval/reject-success";
})
.catch(err => {
console.error(err);
alert('Error saving reject!');
});
}
</script>
</body>
</html>

View File

@@ -1,59 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>Rejected</title>
<style>
body {
font-family: Arial, sans-serif;
background: #f6f6f6;
padding: 20px;
}
.card {
background: #ffffff;
padding: 20px;
max-width: 500px;
margin: 50px auto;
border-radius: 6px;
text-align: center;
box-shadow: 0 0 10px rgba(0,0,0,.1);
}
.rejected {
color: red;
font-size: 20px;
font-weight: bold;
}
.footer {
font-size: 12px;
color: #999999;
text-align: center;
margin-top: 20px;
}
a.button {
display: inline-block;
margin-top: 15px;
padding: 10px 20px;
background-color: red;
color: #ffffff;
text-decoration: none;
border-radius: 5px;
font-weight: bold;
}
</style>
</head>
<body>
<div class="card">
<div class="rejected"> Rejected Successfully</div>
<p>The rejection has been recorded.</p>
<p>You may now close this tab.</p>
<!-- Footer -->
<div class="footer">
CRI Digital Manufacturing Solutions<br>
&copy; 2026 All Rights Reserved
</div>
</div>
</body>
</html>

View File

@@ -1,48 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>Approval Recorded</title>
<style>
body {
font-family: Arial, sans-serif;
background: #f6f6f6;
padding: 20px;
}
.card {
background: #ffffff;
padding: 20px;
max-width: 500px;
margin: 50px auto;
border-radius: 6px;
text-align: center;
box-shadow: 0 0 10px rgba(0,0,0,.1);
}
.success {
color: green;
font-size: 18px;
font-weight: bold;
}
.footer {
font-size: 12px;
color: #999999;
text-align: center;
margin-top: 20px;
}
</style>
</head>
<body>
<div class="card">
<div class="success"> Approval Successful</div>
<p>Your action has been recorded.</p>
<p>You may now close this tab.</p>
<!-- Footer -->
<div class="footer">
CRI Digital Manufacturing Solutions<br>
&copy; 2026 All Rights Reserved
</div>
</div>
</body>
</html>

View File

@@ -1,126 +1,19 @@
<x-filament-panels::page>
<!-- HEADER -->
<div class="mb-8">
<h1 class="text-4xl font-bold tracking-tight">
CRI Digital Manufacturing IIoT Platform
</h1>
<p class="text-lg text-gray-600 mt-2">
Complete visibility, traceability, and control across your manufacturing operations
</p>
</div>
<h1 class="text-3xl font-bold mb-6">Welcome to CRI Digital Manufacturing IIOT</h1>
<!-- BANNER -->
{{-- <div class="w-full overflow-hidden rounded-2xl shadow mb-10"> --}}
<div class="w-full overflow-hidden rounded-xl shadow">
<img
src="{{ asset('images/iiot-banner.jpg') }}"
alt="CRI Digital Manufacturing IIoT"
class="w-full h-72 object-cover"
>
</div>
<div class="w-full overflow-hidden rounded-xl shadow">
<img
src="{{ asset('images/iiot-banner.jpg') }}"
alt="CRI Digital Manufacturing IIoT"
class="w-full h-64 object-cover"
>
</div>
<!-- INTRO -->
<div class="max-w-4xl mb-10">
<p class="text-lg text-gray-700 mb-4">
CRI Digital Manufacturing IIoT is built to deliver
<strong>end-to-end traceability, real-time insights, and operational transparency</strong>
across plants, lines, and production processes.
</p>
<p class="text-lg text-gray-700">
The platform ensures <strong>right quality and on-time delivery</strong> by enabling
complete tracking of materials, production orders, and finished goods—helping teams
make faster, data-driven decisions with confidence.
</p>
</div>
<!-- KEY PILLARS -->
<div class="grid grid-cols-1 md:grid-cols-4 gap-6 mb-10">
<div class="bg-white rounded-xl border p-6 shadow-sm">
<h3 class="text-lg font-semibold mb-2">🔍 Traceability</h3>
<p class="text-gray-600">
Track materials, batches, and serials from input to dispatch.
</p>
</div>
<div class="bg-white rounded-xl border p-6 shadow-sm">
<h3 class="text-lg font-semibold mb-2"> Quality Assurance</h3>
<p class="text-gray-600">
Validate process data and ensure first-time-right production.
</p>
</div>
<div class="bg-white rounded-xl border p-6 shadow-sm">
<h3 class="text-lg font-semibold mb-2"> On-Time Delivery</h3>
<p class="text-gray-600">
Identify delays early and meet production commitments.
</p>
</div>
<div class="bg-white rounded-xl border p-6 shadow-sm">
<h3 class="text-lg font-semibold mb-2">📊 Real-Time Insights</h3>
<p class="text-gray-600">
Monitor performance and take quick corrective actions.
</p>
</div>
</div>
<!-- SUPPORT -->
<div class="bg-white rounded-xl border p-6 shadow-sm">
<h2 class="text-2xl font-semibold mb-3">24×7 Support</h2>
<p class="text-gray-700 mb-2">
Our dedicated IIoT support team is available round-the-clock to ensure
uninterrupted operations and quick issue resolution.
</p>
<p class="text-lg font-medium text-gray-900">
📞 Support Landline: <span class="font-semibold">0422 711 7179</span>
</p>
{{-- <p class="text-lg font-medium text-gray-900">
📞 Technical Support Contact: <span class="font-semibold">9952468104 / 9100832269</span>
</p> --}}
</div>
{{-- <div class="bg-white rounded-xl border p-6 shadow-sm">
<h2 class="text-2xl font-semibold mb-4">24×7 Support</h2>
<p class="text-lg text-gray-700 mb-4">
Our support structure is designed to ensure quick resolution based on the type
of issue whether it is on-site, application-related, or infrastructure-related.
</p>
<div class="space-y-3">
<p class="text-lg font-medium text-gray-900">
🏭 <strong>Plant & On-Site Support</strong> <br>
<span class="text-gray-700">
For plant visits, industry-level issues, and on-ground validation
</span><br>
📞 <span class="font-semibold">8925899458 / 8925899459</span>
</p>
<p class="text-lg font-medium text-gray-900">
💻 <strong>Application & Logic Support</strong> <br>
<span class="text-gray-700">
For website errors, logic issues, and application-level problems
</span><br>
📞 <span class="font-semibold">9952468104 / 9100832269</span>
</p>
</div>
</div> --}}
<!-- TEAM -->
{{-- <div class="bg-white rounded-xl border p-6 shadow-sm">
<h2 class="text-2xl font-semibold mb-4">IIOT Team Members</h2>
<div class="grid grid-cols-2 md:grid-cols-3 gap-4 text-gray-700">
<div class="flex items-center gap-2">👤 Jothikumar</div>
<div class="flex items-center gap-2">👤 Jeithef Shibu</div>
<div class="flex items-center gap-2">👤 Dhanabalan</div>
<div class="flex items-center gap-2">👤 Ranjith</div>
<div class="flex items-center gap-2">👤 Srimathy</div>
<div class="flex items-center gap-2">👤 Gokul</div>
</div>
</div> --}}
<p class="text-lg text-gray-600 mb-6">
This dashboard provides real-time visibility into your manufacturing operations,
enabling you to monitor production, track performance, and make data-driven decisions
across plants and lines—all from one centralized platform.
</p>
</x-filament-panels::page>

View File

@@ -18,29 +18,9 @@
@endif
@endif
</h2>
<!-- Serial Number Search Bar -->
{{-- <div class="flex items-center space-x-2">
<input
type="text"
wire:model.debounce.500ms="serialSearch"
placeholder="Check Serial Number..."
class="border border-gray-300 rounded px-3 py-1 focus:ring-1 focus:ring-indigo-500 focus:border-indigo-500"
/>
<button
wire:click="checkSerialNumber"
class="bg-indigo-600 text-white px-3 py-1 rounded hover:bg-indigo-700"
>
Search
</button>
</div> --}}
</div>
<div class="mt-2">
<div class="mt-2">
<hr class="border-t-2 border-gray-300">
</div>
</div>
{{-- Modal for completed invoice--}}
@@ -64,11 +44,11 @@
@endif
{{-- Modal for serial invoice--}}
{{-- @if ($hasSearched)
@if ($hasSearched)
<div class="overflow-x-auto overflow-y-visible" style="height: 385px;">
<table class="min-w-[1500px] text-sm text-center border border-gray-300">
<table class="table-fixed min-w-[1500px] text-sm text-center border border-gray-300">
<table class="min-w-full text-sm text-center border border-gray-300">
{{-- <table class="min-w-[1500px] text-sm text-center border border-gray-300"> --}}
{{-- <table class="table-fixed min-w-[1500px] text-sm text-center border border-gray-300"> --}}
<table class="min-w-full text-sm text-center border border-gray-300">
<thead class="bg-gray-100 font-bold">
<tr>
<th class="border px-4 py-2">No</th>
@@ -81,7 +61,6 @@
<th class="border px-4 py-2">Scanned Status</th>
<th class="border px-4 py-2 w-[300px] whitespace-nowrap">Time Stamp</th>
<th class="border px-4 py-2">Operator ID</th>
<th class="border px-4 py-2">Panel Box Code</th>
<th class="border px-4 py-2">Panel Box Supplier</th>
<th class="border px-4 py-2">Panel Box Serial Number</th>
</tr>
@@ -99,7 +78,6 @@
<td class="border px-4 py-2">{{ $row['scanned_status'] ?? '' }}</td>
<td class="border px-4 py-2">{{ $row['created_at'] ?? '' }}</td>
<td class="border px-4 py-2">{{ $row['operator_id'] ?? '' }}</td>
<td class="border px-4 py-2">{{ $row['panel_box_code'] ?? '' }}</td>
<td class="border px-4 py-2">{{ $row['panel_box_supplier'] ?? '' }}</td>
<td class="border px-4 py-2">{{ $row['panel_box_serial_number'] ?? '' }}</td>
</tr>
@@ -113,61 +91,6 @@
</tbody>
</table>
</div>
@endif --}}
@if ($hasSearched)
<div class="overflow-x-auto" style="height: 385px;">
<table class="min-w-full text-sm text-center border border-gray-300">
<table class="table-fixed min-w-[1500px] text-sm text-center border border-gray-300">
<thead class="bg-gray-100 font-bold">
<tr>
<th class="border px-4 py-2">No</th>
<th class="border px-4 py-2">Material Code</th>
<th class="border px-4 py-2">Serial Number</th>
<th class="border px-4 py-2">Motor Scanned Status</th>
<th class="border px-4 py-2">Pump Scanned Status</th>
<th class="border px-4 py-2">Capacitor Scanned Status</th>
<th class="border px-4 py-2">Scanned Status Set</th>
<th class="border px-4 py-2">Scanned Status</th>
<th class="border px-4 py-2 w-[300px] whitespace-nowrap">Time Stamp</th>
<th class="border px-4 py-2">Operator ID</th>
<th class="border px-4 py-2">Panel Box Code</th>
<th class="border px-4 py-2">Panel Box Supplier</th>
<th class="border px-4 py-2">Panel Box Serial Number</th>
</tr>
</thead>
<tbody>
@forelse ($records as $index => $record)
<tr wire:key="inv-{{ $record->id }}" class="border-t">
<td class="border px-2 py-2">{{ $records->firstItem() + $index }}</td>
<td class="border px-2 py-2">{{ $record->stickerMasterRelation?->item?->code ?? 'N/A' }}</td>
<td class="border px-2 py-2">{{ $record->serial_number ?? 'N/A' }}</td>
<td class="border px-2 py-2">{{ $record->motor_scanned_status ? '1' : '' }}</td>
<td class="border px-2 py-2">{{ $record->pump_scanned_status ? '1' : '' }}</td>
<td class="border px-2 py-2">{{ $record->capacitor_scanned_status ? '1' : '' }}</td>
<td class="border px-2 py-2">{{ $record->scanned_status_set ? '1' : '' }}</td>
<td class="border px-2 py-2">{{ $record->scanned_status ?? '' }}</td>
<td class="border px-2 py-2 whitespace-nowrap">{{ optional($record->created_at)->format('d-m-Y H:i:s') }}</td>
<td class="border px-2 py-2">{{ $record->operator_id ?? '' }}</td>
<td class="border px-2 py-2">{{ $record->panel_box_code ?? '' }}</td>
<td class="border px-2 py-2">{{ $record->panel_box_supplier ?? '' }}</td>
<td class="border px-2 py-2">{{ $record->panel_box_serial_number ?? '' }}</td>
</tr>
@empty
<tr>
<td colspan="12" class="py-4 text-gray-500">
No data found for invoice <strong>{{ $invoiceNumber }}</strong>
</td>
</tr>
@endforelse
</tbody>
</table>
<div class="mt-3 flex justify-center">
{{ $records->onEachSide(3)->links() }}
</div>
</div>
@endif
{{-- Modal for Capacitor Input --}}
@@ -205,16 +128,6 @@
<script>
document.getElementById('capacitorInput').focus();
</script>
{{-- <script>
document.addEventListener('livewire:initialized', () => {
@this.on('focus-capacitor-input', () => {
setTimeout(() => {
const el = document.getElementById('capacitorInput');
if (el) el.focus();
}, 100);
});
});
</script> --}}
@endif
</div>

View File

@@ -1,88 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
{{-- <title>Invoice Data Report</title> --}}
</head>
<body>
<div style="text-align: center; font-weight: bold;">
{{ $company }}
</div>
<br>
<p>{!! $greeting !!}</p>
<table border="1" width="50%" cellpadding="6" cellspacing="0">
<tr>
<th width="30%">Title</th>
<th width="40%">Details</th>
</tr>
<tr>
<td>Requested DateTime</td>
<td>{{ $request->created_at->format('d-m-Y H:i:s') }}</td>
</tr>
<tr>
<td>Plant</td>
<td>{{ $request->plant->name ?? $request->plant_id }}</td>
</tr>
<tr>
<td>Item Code</td>
<td>{{ $request->item->code ?? $request->code }}</td>
</tr>
<tr>
<td>Job Number</td>
<td>{{ $request->aufnr }}</td>
</tr>
</table>
<br>
<table border="1" width="50%" cellpadding="6" cellspacing="0">
<tr>
<th>Characteristics Name</th>
<th>SAP Value</th>
<th>Update Value</th>
<th>WorkFlow ID</th>
</tr>
@forelse ($tableData as $char)
<tr>
{{-- <td>{{ $char['characteristic_name'] ?? '-' }}</td> --}}
<td>{{ strtoupper($char['characteristic_name'] ?? '-') }}</td>
<td>{{ $char['current_value'] ?? '-' }}</td>
<td>{{ $char['update_value'] ?? '-' }}</td>
<td>{{ $char['work_flow_id'] ?? '-' }}</td>
</tr>
@empty
<tr>
<td colspan="4">No Characteristics Found</td>
</tr>
@endforelse
</table>
<br>
<table border="1" width="50%" cellpadding="6" cellspacing="0">
<tr>
<th>Approver Name</th>
<th>Approve Status</th>
</tr>
<tr>
<td>{{ $approverName }}</td>
<td style="text-align: center;">
<a href="{{ $approveUrl }}">Approve</a> |
<a href="{{ $holdUrl }}">Hold</a> |
<a href="{{ $rejectUrl }}">Reject</a>
</td>
</tr>
</table>
<p>{!! $wishes !!}</p>
</div>
</body>
</html>

View File

@@ -24,7 +24,6 @@ use App\Http\Controllers\ModuleProductionLineStopController;
use App\Http\Controllers\ModuleProductionOrderDataController;
use App\Http\Controllers\ObdController;
use App\Http\Controllers\PalletController;
// use App\Http\Controllers\PalletPrintController;
use App\Http\Controllers\PdfController;
use App\Http\Controllers\PlantController;
use App\Http\Controllers\ProductionStickerReprintController;
@@ -76,7 +75,7 @@ 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}/{name}', [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'])->where('palletNo', '.*')->name('download-qr1-pdf');
Route::get('/download-qr1-pdf', [ProductionStickerReprintController::class, 'downloadQrPdf'])
@@ -205,12 +204,12 @@ Route::post('grmaster-sno-update', [PdfController::class, 'updateGR']);
Route::post('file/store', [SapFileController::class, 'store'])->name('file.store');
// routes/api.php
// Route::post('/characteristic/hold-save', [CharacteristicApprovalController::class, 'holdSave']);
// Route::post('send-telegram', [TelegramController::class, 'sendMessage']);
// Route::post('invoice-exit', [InvoiceValidationController::class, 'handle']);
// Route::get('/print-pallet/{pallet}/{plant}', [PalletPrintController::class, 'print'])
// ->name('print.pallet');
// Route::post('/characteristic/hold-save', [CharacteristicApprovalController::class, 'holdSave'])
// ->name('characteristic.hold.save');

View File

@@ -3,6 +3,8 @@
use Illuminate\Foundation\Inspiring;
use Illuminate\Support\Facades\Artisan;
Artisan::command('inspire', function () {
$this->comment(Inspiring::quote());
})->purpose('Display an inspiring quote');
@@ -11,11 +13,6 @@ Artisan::command('auto:scheduler', function () {
$this->call('custom:scheduler');
})->everyMinute()->withoutOverlapping();
Schedule::command('model:prune --pretend')// , ['--model' => WeightValidation::class]
->description('Deletable Old Records From Database')
->dailyAt('07:00')
->emailOutputTo('digitalmanufacturingiiot@gmail.com');
// app()->booted(function () {
// $schedule = app(Schedule::class);

View File

@@ -1,7 +1,7 @@
<?php
use App\Http\Controllers\CharacteristicApprovalController;
// use App\Http\Controllers\FileUploadController;
use App\Http\Controllers\FileUploadController;
use App\Models\EquipmentMaster;
use App\Models\User;
use Filament\Facades\Filament;
@@ -41,22 +41,11 @@ Route::get('/approval/reject-success', function () {
return view('approval.reject-success');
})->name('approval.reject.success');
Route::get('/characteristic/approve', [CharacteristicApprovalController::class, 'approveForm'])
Route::get('/characteristic/approve', [CharacteristicApprovalController::class, 'approve'])
->name('characteristic.approve')
->middleware('signed');
Route::post('/characteristic/approve-save', [CharacteristicApprovalController::class, 'approveSave'])
->name('characteristic.approve.save');
Route::get('/approval/approve-success', function () {
return view('approval.approve-success');
})->name('approval.approve.success');
// Route::get('/characteristic/approve', [CharacteristicApprovalController::class, 'approve'])
// ->name('characteristic.approve')
// ->middleware('signed');
// Route::post('/file-upload', [FileUploadController::class, 'upload'])->name('file.upload');
Route::post('/file-upload', [FileUploadController::class, 'upload'])->name('file.upload');
// Route::get('/characteristic/hold', [CharacteristicApprovalController::class, 'hold'])
// ->name('characteristic.hold')