469 Commits

Author SHA1 Message Date
dhanabalan
bfed40f535 Add Laravel Pint workflow for code style checks
Some checks failed
Laravel Pint / pint (pull_request) Failing after 2m3s
2025-07-28 16:04:45 +05:30
dhanabalan
83f98d9e83 Added import / export permissions to mfm meter and create permission to production sticker reprint page 2025-07-25 12:34:01 +05:30
dhanabalan
3d84661640 removed unwanted notification for production quantity 2025-07-25 11:43:26 +05:30
dhanabalan
26ecaf49ef Added sticker master get controller production reprint 2025-07-24 18:03:00 +05:30
dhanabalan
5fe2b74174 Aded filter list api for invoice 2025-07-22 11:11:26 +05:30
dhanabalan
ce901e3b78 Added scan_quantity and pend_quantity fields with respective validations 2025-07-18 20:37:11 +05:30
dhanabalan
31ad036d0e Updated duration for failure messages to 5 seconds and label changed for total sno quantity field 2025-07-18 19:11:51 +05:30
dhanabalan
c363faa357 Updated duration for failure messages to 5 seconds 2025-07-18 19:06:42 +05:30
dhanabalan
a71864905e Updated validation functionality on import 2025-07-18 19:04:30 +05:30
dhanabalan
c75ac4781f Updated duration for success message to 600 ms 2025-07-18 18:57:48 +05:30
dhanabalan
c76cf1fb98 Added permission for import and export file 2025-07-18 18:26:39 +05:30
dhanabalan
95a4ddf11e Added mfm parameter api controller 2025-07-18 18:25:32 +05:30
dhanabalan
c309bed7d9 Added mfm reading policy file 2025-07-18 18:24:15 +05:30
dhanabalan
b2dc9e7024 Added mfm reading resource file 2025-07-18 18:23:57 +05:30
dhanabalan
bff2601ddc Added Mfm reading model file 2025-07-18 18:22:54 +05:30
dhanabalan
e80812b82e Added mfm reading migration file 2025-07-18 18:22:31 +05:30
dhanabalan
81c7812ef6 Added mfm parameter exporter file 2025-07-18 18:18:59 +05:30
dhanabalan
14b5f4ae8b Added importer file for mfm parameter 2025-07-18 18:18:37 +05:30
dhanabalan
eb31e6a406 Added mfm parameter policy 2025-07-18 18:16:45 +05:30
dhanabalan
740ceff0f8 Added mfm parameter resource page 2025-07-18 18:16:15 +05:30
dhanabalan
ea1261fb01 Added mfm parameter model file 2025-07-18 18:15:13 +05:30
dhanabalan
74ad73622d Added mfm parameter migration file 2025-07-18 18:14:35 +05:30
dhanabalan
a62220c9d0 Added temp live reading policy 2025-07-18 18:06:04 +05:30
dhanabalan
a5036b7d6f Added temp live reading resource files 2025-07-18 18:05:27 +05:30
dhanabalan
27b8058ba8 Added templivereading model file 2025-07-18 18:03:55 +05:30
dhanabalan
58091726a4 Added temp live readings migration file 2025-07-18 18:02:55 +05:30
dhanabalan
6bdd210162 Added mfm meter policy file 2025-07-18 17:57:48 +05:30
dhanabalan
b9e3d463ed Added mfm meter resource file 2025-07-18 17:57:30 +05:30
dhanabalan
418e4fcf79 Added mfm meter model file 2025-07-18 17:56:34 +05:30
dhanabalan
33881a3978 Added mfm meter migration file 2025-07-18 17:55:52 +05:30
dhanabalan
9d4cf0e3d9 Increased font size and qr code size 2025-07-18 16:33:02 +05:30
dhanabalan
72704a4a3f Added focusing for capacitor input box in invoice validation 2025-07-16 18:20:31 +05:30
dhanabalan
a34b55267d Changed design in production quantity page 2025-07-16 17:39:15 +05:30
dhanabalan
b6dcb93402 Set duration for success message in production quantity page 2025-07-16 11:34:43 +05:30
dhanabalan
313dc012d5 issue solve for slow going process of item code in production quantity 2025-07-15 13:57:01 +05:30
dhanabalan
2541300910 removed live () in production quantity page 2025-07-15 13:48:30 +05:30
dhanabalan
d1894e0d35 Added logic for fg line concept in production mail alert 2025-07-15 10:56:14 +05:30
dhanabalan
e5143a0ce8 removed fg line in plnt line controller 2025-07-15 09:39:22 +05:30
dhanabalan
b1674bba53 Added FGnames list out api 2025-07-14 12:15:27 +05:30
dhanabalan
52a25fec8e Added FG Line in plant line controller 2025-07-14 11:20:56 +05:30
dhanabalan
dafe1ca458 Added gurad names get api for guard dashboard 2025-07-12 16:20:00 +05:30
dhanabalan
af384faa7c Added guard day count get api 2025-07-12 15:08:29 +05:30
dhanabalan
c6f61fa19a Added unique constraint fro invoice mail report 2025-07-12 14:35:29 +05:30
dhanabalan
aaa93e740b Added get api for invoice quantity for invoice module 2025-07-12 14:31:40 +05:30
dhanabalan
33acf73b5e Added invoice dashboard module get api 2025-07-12 14:03:12 +05:30
dhanabalan
ea5af41f7f Removed unwanted lines in final filter data in production dashboard 2025-07-12 11:36:24 +05:30
dhanabalan
c8ea502833 removed all lines options in production hourly chart 2025-07-12 11:35:30 +05:30
dhanabalan
7e317f6e5f Added status_description in production dashboard 2025-07-12 11:12:47 +05:30
dhanabalan
1465734acd Added all modules with fg count logic 2025-07-12 11:04:31 +05:30
dhanabalan
642053653c Added module production order controller get api 2025-07-12 09:15:42 +05:30
dhanabalan
27524c4d62 Updated validations and success durations and added serial_number maximum length should be 20 digit and clear field if invalid input 2025-07-11 18:23:52 +05:30
dhanabalan
9fa4c0dd49 Added this week nd this month and yesterday and today filter logic for hourly chart in production module 2025-07-11 17:47:09 +05:30
dhanabalan
4d5b14fe69 Added hourly chart logic for production in modules 2025-07-11 17:26:46 +05:30
dhanabalan
b4ca4a9fcd Added hourly data in production quantity in modules 2025-07-11 17:18:01 +05:30
dhanabalan
484bc6d070 Added proper status code for all the api modules 2025-07-11 16:01:37 +05:30
dhanabalan
b153a53f4b Added logic for all lines in modulefilterdataController and changed logic in module controller 2025-07-11 15:51:09 +05:30
dhanabalan
658dea8e72 Added all get api for modules data 2025-07-11 15:32:53 +05:30
dhanabalan
e934cdb193 Added module controller and api logic 2025-07-11 12:30:00 +05:30
dhanabalan
d61c61879f Added module list policy file 2025-07-11 12:27:33 +05:30
dhanabalan
4b597629aa Added module list resource page 2025-07-11 12:26:44 +05:30
dhanabalan
9173dcb50a Added module list model file 2025-07-11 12:26:17 +05:30
dhanabalan
4a17892865 Added module list migration file 2025-07-11 12:25:49 +05:30
dhanabalan
e9d967e2c2 Added logic for all plants in production report 2025-07-11 09:16:32 +05:30
dhanabalan
215e1302cc Added 0 instead of all plamnts in alert mail 2025-07-10 18:26:15 +05:30
dhanabalan
1f085b3f91 solved logic for invalid data type for all plants in alert mail 2025-07-10 18:25:45 +05:30
dhanabalan
ab9c3a80db Added logic in edit page for alert mail 2025-07-10 18:23:48 +05:30
dhanabalan
5f0c01176a Added logic for all plants in invoice report 2025-07-10 17:58:30 +05:30
dhanabalan
b73202e03f resolved logic invoice report 2025-07-10 17:46:34 +05:30
dhanabalan
6a8978f676 commented unwanted lines in production report 2025-07-10 17:07:46 +05:30
dhanabalan
61320dfae8 issue solved for production pln in production report 2025-07-10 17:06:59 +05:30
dhanabalan
7715a20c19 issue solved in qulaity data send to sap page 2025-07-10 16:54:35 +05:30
dhanabalan
bb41d72701 Added production sap data of filament page 2025-07-10 16:39:49 +05:30
dhanabalan
fcb6a945ff Added quality data sap of filament page 2025-07-10 16:39:05 +05:30
dhanabalan
2d2f0d3662 Added production data sap livewire page 2025-07-10 16:38:28 +05:30
dhanabalan
cb4605221c Added quality sap data livewire page 2025-07-10 16:36:55 +05:30
dhanabalan
5a8775c092 Added production data send to sap page 2025-07-10 16:36:00 +05:30
dhanabalan
bef0c986b2 Added Quality data send to sap page 2025-07-10 16:35:16 +05:30
dhanabalan
80163fb0ff Updated validation functionality on import 2025-07-10 16:20:07 +05:30
dhanabalan
170b784a9b Added plant in model file 2025-07-10 15:12:01 +05:30
dhanabalan
4311c64531 changed logici n production mail report 2025-07-10 15:08:32 +05:30
dhanabalan
3c9cc702d4 added plant column in alert mail rules migration file 2025-07-10 15:06:02 +05:30
dhanabalan
752c3cb0da changed logic for sending mails for only have schedule types in production report 2025-07-10 11:21:53 +05:30
dhanabalan
1597795c74 Commented success message 2025-07-10 10:21:53 +05:30
dhanabalan
d75dcdfdd1 Updated validation on import rework data 2025-07-09 21:03:46 +05:30
dhanabalan
b8738a2f6a Added serial_number minimum length should be 9 digit and notification display duration and updated validations 2025-07-09 20:57:06 +05:30
dhanabalan
4ac1823e5b Added serial_number minimum length should be 9 digit and notification display duration and updated validations 2025-07-09 19:35:39 +05:30
dhanabalan
eb2b857aa7 Updated column position in view report 2025-07-09 18:05:11 +05:30
dhanabalan
693e3a23a4 Added serial_number minimum length should be 9 digit and notification display duration 2025-07-09 17:27:41 +05:30
dhanabalan
49d2f1088f Removed colon symbol in notifications 2025-07-09 17:03:09 +05:30
dhanabalan
34b2a05166 Added serial_number minimum length should be 9 digit 2025-07-09 16:16:47 +05:30
dhanabalan
ee99ada3e7 Added notification display duration 2025-07-09 16:15:44 +05:30
dhanabalan
3665b63ff9 Commented scheduler run commands 2025-07-09 11:02:19 +05:30
dhanabalan
aeb3b694e4 Added filter functionality on view report 2025-07-09 11:00:31 +05:30
dhanabalan
a4d2c20451 Removed unwanted space line and updated indentations 2025-07-09 11:00:04 +05:30
dhanabalan
15849fc543 issue solve din production report send mail 2025-07-09 10:32:45 +05:30
dhanabalan
fec85824c2 changed logic for only production mail alert only 2025-07-09 10:30:06 +05:30
dhanabalan
6d6d3f2d60 chnaged logic for prooduction mail report 2025-07-09 10:18:57 +05:30
dhanabalan
29de91e03d Added logic for production mail report 2025-07-09 10:04:54 +05:30
dhanabalan
5ab109006e Added production mail and invoice mail report 2025-07-08 19:42:12 +05:30
dhanabalan
35aa2fab56 Added alert mail rule policy file 2025-07-08 19:03:22 +05:30
dhanabalan
a87bc6e909 Removed unwanted space line 2025-07-08 19:00:23 +05:30
dhanabalan
3818fa612e Updated navigation list order and import, export button color and navigation label 2025-07-08 18:59:23 +05:30
dhanabalan
0f6b62b47a Updated navigation list order 2025-07-08 18:58:11 +05:30
dhanabalan
656dd17603 Added validation functionality on import 2025-07-08 18:56:22 +05:30
dhanabalan
0c27bd4cfd Updated plant code instead of name on export 2025-07-08 18:56:09 +05:30
dhanabalan
c7779f49b7 Added validation functionality on import 2025-07-08 18:55:48 +05:30
dhanabalan
49c4f25c79 Updated plant code instead of name on export 2025-07-08 18:55:15 +05:30
dhanabalan
f37f62be46 Updated validation functionality on import 2025-07-08 18:54:50 +05:30
dhanabalan
5465364ffd Added validation functionality on import 2025-07-08 18:54:17 +05:30
dhanabalan
75963b3ce6 Updated plant code instead of name on export 2025-07-08 18:52:56 +05:30
dhanabalan
b36700af92 removed run in background for mail report 2025-07-08 18:08:47 +05:30
dhanabalan
5a654d1d40 Added custom logic in for mail report 2025-07-08 17:47:32 +05:30
dhanabalan
2f3b028b17 Commented schedule report lines 2025-07-08 17:27:05 +05:30
dhanabalan
904d850638 Issue resolved houlrly mail report 2025-07-08 17:09:59 +05:30
dhanabalan
f5e7bcb348 Added view reprint pallet number and send to sap permissions 2025-07-07 18:32:38 +05:30
dhanabalan
171c675014 issue solved in production report 2025-07-07 18:19:17 +05:30
dhanabalan
bd5bb7f54c Schedule List issues resolved 2025-07-07 17:58:46 +05:30
dhanabalan
74c3243c06 Added reprint functionality in pallet validation 2025-07-07 17:35:58 +05:30
dhanabalan
bd0eed07ac Added reprint functionality in pallet validation resource page 2025-07-07 17:22:34 +05:30
dhanabalan
b564e2debe Added mpdf storage in pallet controller 2025-07-07 14:39:29 +05:30
dhanabalan
4c8fa0bdd6 Updated plant code instead of plant name on export 2025-07-07 13:46:41 +05:30
dhanabalan
48ce6681ac Updated plant code instead of plant name on import 2025-07-07 13:43:11 +05:30
dhanabalan
cefebd9f86 Updated get latest update_count in post method functionality 2025-07-05 21:15:50 +05:30
dhanabalan
3a0185391a removed quality validation option from the form 2025-07-05 21:02:59 +05:30
dhanabalan
c38a417b85 Added navigation group for alert mail resource page 2025-07-05 21:01:08 +05:30
dhanabalan
cfe8ac3496 Added invoicemail ad productionmail report views pages and commands pages 2025-07-05 20:53:31 +05:30
dhanabalan
be79dcdc45 Added alertmailrule resource pages 2025-07-05 20:51:07 +05:30
dhanabalan
9398374f88 Added Alertmailrule model page 2025-07-05 20:50:26 +05:30
dhanabalan
43edf2ec5a Added alret mail rules migration file 2025-07-05 20:50:00 +05:30
dhanabalan
08b142e70f Commented unwanted lines 2025-07-05 18:33:42 +05:30
dhanabalan
de0de426f0 Updated validation functionality and failure messages in controller files 2025-07-05 18:25:11 +05:30
dhanabalan
3eb9f64fca Updated hv_test label in form design and report page 2025-07-05 17:06:51 +05:30
dhanabalan
7ff55f0b25 Updated locator_quantity validation on filter report 2025-07-04 18:07:34 +05:30
dhanabalan
3e0633def2 Updated generate pallet number functionality globally instead of plant wise 2025-07-04 17:45:16 +05:30
dhanabalan
cea7f86fed Removed unwanted line 2025-07-04 17:39:57 +05:30
dhanabalan
af3ae0803c Added locator validation functionality on resource page and importer file 2025-07-04 17:39:30 +05:30
dhanabalan
10b439f8e3 Added validation functionality on importer file 2025-07-03 17:01:50 +05:30
dhanabalan
fc6b3efd0a Updated machine label in exporter 2025-07-03 16:05:35 +05:30
dhanabalan
6372e293e2 Updated machine label header in importer 2025-07-03 16:03:21 +05:30
dhanabalan
c2817aefe4 Updated machine label in importer 2025-07-03 16:01:14 +05:30
dhanabalan
40ad560bca Uncommented user, plant, machine, sticker master controllers api path 2025-07-03 15:51:43 +05:30
dhanabalan
a5bc41beda Commented unwanted line 2025-07-03 15:20:12 +05:30
dhanabalan
ba48c1307e Added machine controller file 2025-07-03 15:13:59 +05:30
dhanabalan
d222fe5a3b Added laser_part_validation1 and laser_part_validation2 column in importer and exporter file 2025-07-03 14:42:13 +05:30
dhanabalan
aa4cec997d Added laser_part_validation1, laser_part_validation2 column and clear fields while plant change in resource file and display material type like Individual, Bundle, Quantity instead of 1, 2, 3 in view report 2025-07-03 14:18:39 +05:30
dhanabalan
c2c9470979 Added laser_part_validation1 and laser_part_validation2 column in model file 2025-07-03 13:52:16 +05:30
dhanabalan
6ea2fc3d23 Added work_center column in importer and exporter file 2025-07-03 13:49:03 +05:30
dhanabalan
04da674868 Added work_center column in resource file 2025-07-03 13:40:52 +05:30
dhanabalan
0174a8494d Added work_center column in model file 2025-07-03 13:38:05 +05:30
dhanabalan
bff1cb0d28 Removed pds_status and pds_description column in importer and exporter file 2025-07-03 13:36:59 +05:30
dhanabalan
5543938eae Added group_work_center column in importer and exporter file 2025-07-03 13:34:35 +05:30
dhanabalan
4addab5573 Added group_work_center column in resource file and plant column position changed in view report 2025-07-03 13:32:16 +05:30
dhanabalan
000c80c1e6 Added group_work_center column in model file 2025-07-03 13:26:23 +05:30
dhanabalan
aae2fafc1f Added laser_part_validation1 and laser_part_validation2 column in sticker_masters table 2025-07-03 12:25:08 +05:30
dhanabalan
e958a036c7 Added work_center column in machines table 2025-07-03 12:21:23 +05:30
dhanabalan
710ff318ef Added group_work_center column in lines table 2025-07-03 12:10:21 +05:30
dhanabalan
5ec4be082d Added output_flag column on view report 2025-07-03 11:42:33 +05:30
dhanabalan
955d143f52 Updated space alignment in testing panel readings migration 2025-07-03 11:08:08 +05:30
dhanabalan
5b287f974d Removed unwanted enter line space 2025-07-02 18:42:17 +05:30
dhanabalan
f5345fc2b8 Added policy files 2025-07-02 18:07:09 +05:30
dhanabalan
cd09b912ee Added hasMany relations for guard patrol entry 2025-07-02 18:03:26 +05:30
dhanabalan
008e9ff791 Added view invoice serial quantity dashboard permission 2025-07-02 17:58:58 +05:30
dhanabalan
a0c0588e49 Removed unwanted enter line space 2025-07-02 17:44:27 +05:30
dhanabalan
137341fc6c Added sticker master controller file 2025-07-02 17:43:30 +05:30
dhanabalan
33d22dec5b Added plant controller file 2025-07-02 17:26:33 +05:30
dhanabalan
231b65ff7a Added mpdf temp storage code 2025-07-02 17:24:19 +05:30
dhanabalan
102d9af638 Added invoice rework blade file 2025-07-02 17:22:35 +05:30
dhanabalan
b20bff9003 Updated colspan on empty data 2025-07-02 17:20:14 +05:30
dhanabalan
c8ad6f3dda Added generate pallet number api function 2025-07-02 17:10:59 +05:30
dhanabalan
062ab6d8a1 Added pallet controller file 2025-07-02 17:07:32 +05:30
dhanabalan
4d4414ffa7 Removed generate pallet number functionality 2025-07-02 17:06:29 +05:30
dhanabalan
4f87a0d318 Removed generate pallet pdf from testing panel controlled and added into api 2025-07-02 17:02:08 +05:30
dhanabalan
33f787c6ad Added filter functionality 2025-07-02 16:39:36 +05:30
dhanabalan
bf6874fe96 Added autofocus and ignore unique record checking on update 2025-07-02 16:28:38 +05:30
dhanabalan
3406dbc1c7 Removed unwanted enter line space 2025-07-02 16:23:23 +05:30
dhanabalan
e20ebfe667 Removed unwanted enter line space on filter report 2025-07-02 16:22:38 +05:30
dhanabalan
3012dd61bb Removed searchable functionality 2025-07-02 16:20:55 +05:30
dhanabalan
cdc8a5ce54 Updated from_datetime validation 2025-07-02 16:20:18 +05:30
dhanabalan
f3a4aa7411 Added unique validation rule 2025-07-02 16:14:07 +05:30
dhanabalan
2ae71b9bb8 Removed searchable functionality 2025-07-02 16:12:34 +05:30
dhanabalan
58fc922f24 Updated plant and item code position 2025-07-02 16:10:45 +05:30
dhanabalan
68c5c88fc8 Updated warning message to display unique codes only 2025-07-02 16:09:50 +05:30
dhanabalan
c4b4993e1d Updated readonly rule 2025-07-02 16:05:25 +05:30
dhanabalan
fd3ef4656c Added indentations 2025-07-02 16:04:47 +05:30
dhanabalan
6e7b847e89 Updated plant and line position 2025-07-02 16:03:29 +05:30
dhanabalan
0fbe279bf9 Added rework locator invoice validation importer 2025-07-02 16:02:23 +05:30
dhanabalan
8188cd6cef Updated block and plant position 2025-07-02 16:02:00 +05:30
dhanabalan
bdbfc8e024 Updated plant position 2025-07-02 16:01:41 +05:30
dhanabalan
c3f9c9f2c4 Updated plant and line position 2025-07-02 16:00:43 +05:30
dhanabalan
5cb2842954 Updated company position 2025-07-02 15:59:47 +05:30
dhanabalan
6a0f5b57a6 Added pallet validation importer 2025-07-02 15:59:15 +05:30
dhanabalan
690a6f8026 Updated plant position 2025-07-02 15:57:36 +05:30
dhanabalan
4392123c6a Added new column and updated exist column and changed its position 2025-07-02 15:57:10 +05:30
dhanabalan
008cb5d82b Updated plant position 2025-07-02 15:41:30 +05:30
dhanabalan
12169a1276 Updated plant and line position 2025-07-02 15:40:24 +05:30
dhanabalan
14a1909163 Updated operator_id position 2025-07-02 15:38:39 +05:30
dhanabalan
51e9c6ba90 Added rework locator invoice validation exporter 2025-07-02 15:30:39 +05:30
dhanabalan
88bc62c8f2 Added pallet validation exporter 2025-07-02 15:21:45 +05:30
dhanabalan
0cb0758f67 Updated lable names and changed its position 2025-07-02 15:20:33 +05:30
dhanabalan
123f67d9bc Updated plant name position to start 2025-07-02 15:14:27 +05:30
dhanabalan
85746af6f7 Updated operator_id position to end 2025-07-02 15:13:47 +05:30
dhanabalan
8f95147a30 Updated warning message if locator serial numbers not exist 2025-07-02 15:12:53 +05:30
dhanabalan
a33c73c2f2 Updated success and failure messages and notifications display seconds 2025-07-02 15:03:50 +05:30
dhanabalan
017088c380 Added create pallet from locator page and livewire pages and table 2025-07-02 13:06:00 +05:30
dhanabalan
148b6444b6 Added filter functionalty in rework locator invoice validation page 2025-07-02 11:20:56 +05:30
dhanabalan
49dbd357aa issue in passing id value instead of column name in pallet validation filter 2025-07-02 11:03:59 +05:30
dhanabalan
4a8802060a Added filter functionality in locator invoice validation page 2025-07-02 11:03:12 +05:30
dhanabalan
4d153fcfa7 Added filter functionality in pallet validation page 2025-07-02 10:25:17 +05:30
dhanabalan
a0db69a4c8 Added rework locator invoice validation livewire page and table 2025-07-01 15:12:12 +05:30
dhanabalan
b13b5dbb05 Added rework locator invoice validation resource pages 2025-07-01 15:10:35 +05:30
dhanabalan
fcf1fed70d Added rework locator invoice validation model file 2025-07-01 15:08:58 +05:30
dhanabalan
bdb9d9b9c3 Added rework locator invoice validation migration file 2025-07-01 15:05:28 +05:30
dhanabalan
5435261e40 Added invoice finder view page 2025-07-01 14:56:21 +05:30
dhanabalan
45d426b6b8 Added invoice finder pages and livewire pages 2025-07-01 14:54:52 +05:30
dhanabalan
2de993c6d0 Added locator invoice validation importer and exporter file 2025-07-01 14:44:08 +05:30
dhanabalan
95436af7da Added locator invoice validation livewire page and table 2025-07-01 14:42:55 +05:30
dhanabalan
d3ebee5020 Added locatorinvoicevalidation resource pages 2025-07-01 14:39:51 +05:30
dhanabalan
f3c3dff6a0 Added locator invoice validation model file 2025-07-01 14:37:03 +05:30
dhanabalan
829f5670ad Added locator invoice validation migration file 2025-07-01 14:35:06 +05:30
dhanabalan
b4a0893bfc Added Upload serial locator pages and livewire 2025-07-01 14:31:46 +05:30
dhanabalan
98c445a98a Added locator validation page and locator data table 2025-07-01 14:15:10 +05:30
dhanabalan
789bc6a173 Added mpdf permission 2025-07-01 14:04:34 +05:30
dhanabalan
6904a03e1f Add mpdf/qrcode for QR code support 2025-07-01 13:51:54 +05:30
dhanabalan
fb29148011 pallet pdf issue solved package 2025-07-01 13:47:52 +05:30
dhanabalan
e083c0e4a5 Added pallet data tables 2025-07-01 13:16:32 +05:30
dhanabalan
c2b193c5b8 Added pdf file for pallet validation resource page 2025-07-01 13:10:38 +05:30
dhanabalan
dde57f31c3 Added pallet validation resource pages 2025-07-01 13:07:40 +05:30
dhanabalan
62e66bf0c7 Added pallet validation model file 2025-07-01 13:04:20 +05:30
dhanabalan
33d78861fb Added pallet validation table migration file 2025-07-01 13:02:10 +05:30
dhanabalan
23fb2eed4d Added locator importer and exporter file 2025-07-01 12:49:27 +05:30
dhanabalan
0199c8977c Added locators resource file 2025-07-01 12:48:25 +05:30
dhanabalan
7d2ed7aff5 Added locators model file 2025-07-01 12:45:52 +05:30
dhanabalan
f52a38c133 Added locators table migration 2025-07-01 12:41:46 +05:30
dhanabalan
5fd8b7e6bf issue solved in invoice chart setted data label 2025-06-29 16:26:20 +05:30
dhanabalan
61973a424e Added dashboard blade page for invoice quantity 2025-06-29 16:19:13 +05:30
dhanabalan
ced01440f5 Added chart for invoice quantity 2025-06-29 16:17:44 +05:30
dhanabalan
cc48e4ae3d solvd issue for cumulative chart 2025-06-27 16:46:34 +05:30
dhanabalan
eb93a8602f solved total count issue in cumulative chart 2025-06-27 16:28:43 +05:30
dhanabalan
b798cbcbfd adjusted label position of the x axis bar in hourly production chart 2025-06-27 15:45:37 +05:30
dhanabalan
630b921a37 adjust position of label for day chart of patrol 2025-06-27 15:37:01 +05:30
dhanabalan
1945e71ae1 chenged label position of the x axis in production order count 2025-06-27 15:24:18 +05:30
dhanabalan
72a1eca400 Changed data label position of the production line count chart 2025-06-27 14:44:23 +05:30
dhanabalan
82b56c6cc9 adjusted positon of the label in hourly production chart 2025-06-27 14:31:20 +05:30
dhanabalan
04ed10d9e1 Added manifest file into production 2025-06-27 13:39:26 +05:30
dhanabalan
0fc1852ea2 Added chart js plugin package and sets static label 2025-06-27 12:46:29 +05:30
dhanabalan
fea6573a7a issue solved in hourly chart patrol 2025-06-27 08:43:47 +05:30
dhanabalan
723d424b88 Updated view guard patrol entry dashboard name into view guard patrol entry status dashboard 2025-06-26 16:27:09 +05:30
dhanabalan
f9a0aa9fa0 Updated dynamic sequence minutes calculation functionality and table design load functionality from fixed sequence 2025-06-26 16:25:56 +05:30
dhanabalan
934d449a6b Removed searchable functionality and Added created_by drop-down list on report page 2025-06-26 16:16:51 +05:30
dhanabalan
cf1387db7f Added redirect to create page url function 2025-06-26 15:55:35 +05:30
dhanabalan
a9af944c27 Updated permission name to view 2025-06-26 14:57:44 +05:30
dhanabalan
32313c0609 solved logic in hourly guard patrol 2025-06-25 17:50:55 +05:30
dhanabalan
b418e780b0 issue solved for multiple charts displayed in production line count 2025-06-25 15:38:11 +05:30
dhanabalan
edc8a8f37b Added dashboard for patrol day count 2025-06-25 14:29:46 +05:30
dhanabalan
cbfe7a56bb Added guard hourly patrol chart 2025-06-25 14:23:52 +05:30
dhanabalan
3a796857b0 Added guard patrol day count chart 2025-06-25 10:34:11 +05:30
dhanabalan
88cde40215 Added report filter functionality and removed reader_code on report 2025-06-24 17:41:44 +05:30
dhanabalan
97d43ac8cf Added from-to patrol time within sequence title on guard_patrol_entry_data_table 2025-06-24 17:32:00 +05:30
dhanabalan
be466cfdc2 Removed session functionality and Updated page heading 2025-06-24 17:20:00 +05:30
dhanabalan
932488fdc3 Removed reader_code on import / export and disabled created at/by, updated at/by 2025-06-24 17:18:11 +05:30
dhanabalan
ad5f52c72b Updated permission seeder 2025-06-23 19:07:18 +05:30
dhanabalan
19510d8348 Added GuardPatrolEntry Dashboard and Added masters with transaction Policy 2025-06-23 18:57:05 +05:30
dhanabalan
ecf6d494de Added guard_patrol_entry importer and exporter file 2025-06-23 18:43:05 +05:30
dhanabalan
21c1d097aa Added guard_patrol_entry resource files 2025-06-23 18:41:46 +05:30
dhanabalan
1ea961a3b8 Added guard_patrol_entry model file 2025-06-23 18:39:22 +05:30
dhanabalan
72df3fe3c3 Added guard_patrol_entries table migration 2025-06-23 18:38:32 +05:30
dhanabalan
ea4e2c929f Updated passing checkPointNames 'id' instead of 'name' 2025-06-23 18:36:11 +05:30
dhanabalan
09b69b9aa3 Added check_point_time importer and exporter file 2025-06-23 18:28:19 +05:30
dhanabalan
56a8058094 Added check_point_time resource files 2025-06-23 18:27:25 +05:30
dhanabalan
30c8804127 Added check_point_time model file 2025-06-23 18:24:26 +05:30
dhanabalan
eae2d49e25 Added check_point_times table migration 2025-06-23 18:23:09 +05:30
dhanabalan
be6b20fb26 Updated exampleHeader on importer file 2025-06-23 18:20:47 +05:30
dhanabalan
2492564c7a Updated CheckPointNameImporter from CheckPointNameExporter on ImportAction 2025-06-23 18:17:10 +05:30
dhanabalan
a205762649 Added check_point_name importer and exporter file 2025-06-23 18:09:07 +05:30
dhanabalan
40a9f14c53 Added check_point_name resource files 2025-06-23 18:07:02 +05:30
dhanabalan
0193298675 Added check_point_name model file 2025-06-23 18:05:28 +05:30
dhanabalan
48b6a0e839 Added check_point_names table migration 2025-06-23 18:01:59 +05:30
dhanabalan
16d559683a Added guard_name importer and exporter file 2025-06-23 17:49:04 +05:30
dhanabalan
5eba607944 Added guard_name resource files 2025-06-23 17:48:18 +05:30
dhanabalan
7510fc3d77 Added guard_name model file 2025-06-23 17:45:41 +05:30
dhanabalan
c39bcaee02 Updated label and variable declarion for default zero 2025-06-23 17:44:20 +05:30
dhanabalan
4f2e811abb Added guard_names table migration 2025-06-23 17:42:38 +05:30
dhanabalan
05ac6c7712 Added block name column on report view 2025-06-21 10:36:31 +05:30
dhanabalan
5f7911b5c2 Added block name column and changed operator_id position on export 2025-06-21 10:35:10 +05:30
dhanabalan
0651ee40e9 Added Operator_ID column in report page 2025-06-20 09:02:00 +05:30
dhanabalan
c3cc345166 Changed success status code 2025-06-16 12:38:57 +05:30
dhanabalan
16aa118ef1 Updated get func. removed plant-code header and added production-order header and changed success response 2025-06-16 12:33:48 +05:30
dhanabalan
a46a5d437c Added method for 'obd/get-test-datas' GET API 2025-06-15 11:19:31 +05:30
dhanabalan
08654025c6 Added test GET API functionality for 'obd/get-test-datas' 2025-06-15 11:08:07 +05:30
dhanabalan
809d31d7e7 Added cri logo for isi pdf 2025-06-07 16:44:54 +05:30
dhanabalan
cac691c82d Issue solved in filter in connection type 2025-06-07 16:36:58 +05:30
dhanabalan
88802d8a11 bundle number issue solved for obd number post 2025-06-06 15:02:40 +05:30
dhanabalan
894f2a0e85 Added routine and category values in get method 2025-06-03 19:32:54 +05:30
dhanabalan
dec8a5b972 Added table categoryto show in list 2025-06-03 16:44:23 +05:30
dhanabalan
29c092a860 Added category column for items masters 2025-06-03 16:35:02 +05:30
dhanabalan
7760c64ed3 Added column routine_test_time for motor testing masters table 2025-06-03 16:32:31 +05:30
dhanabalan
ce4f9d7246 Added logic for recently loaded data for lal text input boxes 2025-06-03 12:56:43 +05:30
dhanabalan
22b653fc03 Added machine column in testing panel readings 2025-06-02 14:33:53 +05:30
dhanabalan
906e68e876 Added a3 size for all pdf 2025-06-02 14:28:37 +05:30
dhanabalan
136ccffa5f Added autosize for all pdf testing panel readings 2025-06-02 14:16:32 +05:30
dhanabalan
c1985f11c3 Modified size of the pdf for three phase 2025-06-02 14:08:53 +05:30
dhanabalan
98de344917 Added auto size for motor type column for three phase 2025-06-02 14:05:45 +05:30
dhanabalan
47d103659c Added page number for three phase pdf 2025-06-02 13:08:59 +05:30
dhanabalan
38106496bc Added Page numbers for pdf for isi and non isi 2025-06-02 13:06:06 +05:30
dhanabalan
b74b362622 Added insulation resistance type for motor testing masters 2025-06-02 11:48:44 +05:30
dhanabalan
d99c8f2cb3 issue solved in edit screen of item code in testing panel readings 2025-06-02 11:26:53 +05:30
dhanabalan
7d91e8976c Added Permissions for import and export buttons for machines and configurations 2025-05-31 17:43:50 +05:30
dhanabalan
c83be6936b Added import and export for configurations 2025-05-31 17:42:54 +05:30
dhanabalan
5a850a11a9 Added import and export for machine 2025-05-31 17:42:13 +05:30
dhanabalan
35501f2bec Updated item foreign key on belongsTo 2025-05-31 17:34:13 +05:30
dhanabalan
be47d48931 Added id column to load default plant, line, machine with its validation and using motor_testing_master_id instead of item_id remove item_id functionality 2025-05-31 17:33:19 +05:30
dhanabalan
5f79050b3f Added testingPanelReadings hasMany relation 2025-05-31 16:48:18 +05:30
dhanabalan
0fa0a9c128 Added motorTestingMasters hasMany relation 2025-05-31 16:42:28 +05:30
dhanabalan
bb019e0b13 Added Row Number and label on exporter 2025-05-31 16:41:06 +05:30
dhanabalan
abc50de038 Label Changed from Item to Item Code 2025-05-31 16:39:28 +05:30
dhanabalan
044d27336d Added id column to load default plant with its validation functionality 2025-05-31 16:10:56 +05:30
dhanabalan
376d0800dd Added id column to load default plant and line with its validation functionality 2025-05-31 16:02:08 +05:30
dhanabalan
e8bac66e51 Update validation functionality for phase and connection conflicts 2025-05-31 13:06:17 +05:30
dhanabalan
dc32cf623c Updated sortable, searchable, and hiddenByDef. func. in report table 2025-05-31 13:05:03 +05:30
dhanabalan
4fa053e6e5 changed position of updated count column 2025-05-31 12:11:32 +05:30
dhanabalan
9201eae044 Added Updated Count column in list table and removed sortable for unwanted columns 2025-05-31 12:09:34 +05:30
dhanabalan
6dcc4def51 Example itemCode updated 2025-05-31 11:53:29 +05:30
dhanabalan
fc0963a3cb Added into masters navigation group 2025-05-31 11:47:24 +05:30
dhanabalan
df6b5af920 Added testingPanelReadings hasMany relation 2025-05-31 11:06:15 +05:30
dhanabalan
26c76eb539 Added testingPanelReadings hasMany relation 2025-05-31 11:05:52 +05:30
dhanabalan
84ac80a18a Added testingPanelReadings hasMany relation 2025-05-31 11:05:34 +05:30
dhanabalan
c826a0da3d Added Row Number, label, alignment on filter report 2025-05-31 11:03:49 +05:30
dhanabalan
c60a78d85a Added Row Number, label, alignment on filter report and view rights for Importer and Exporter 2025-05-31 11:02:15 +05:30
dhanabalan
5b450adbda Added Row Number, label, alignment on filter report and view rights for Importer and Exporter 2025-05-31 11:01:19 +05:30
dhanabalan
8ebf76f91c Updated select query for production_order, serial_number columns on filter report 2025-05-31 11:00:49 +05:30
dhanabalan
21d70380a8 Added Row Number, alignment on filter report 2025-05-31 10:52:07 +05:30
dhanabalan
f3ffe4bff6 Added Row Number, label, alignment on filter report 2025-05-31 10:46:56 +05:30
dhanabalan
64af4215aa Added Row Number, label, alignment on filter report and view rights for Importer and Exporter 2025-05-31 10:45:28 +05:30
dhanabalan
c2c91e1427 Added Row Number, label, alignment on filter report and view rights for Importer and Exporter 2025-05-31 10:41:55 +05:30
dhanabalan
fd8f82c3b1 Added Row Number, label, alignment on filter report and view rights for Importer and Exporter 2025-05-31 10:40:26 +05:30
dhanabalan
2bd69214d6 Added Row Number, label, alignment on filter report and view rights for Importer and Exporter 2025-05-31 10:38:32 +05:30
dhanabalan
58f98c7632 Added Row Number on report 2025-05-31 10:37:18 +05:30
dhanabalan
ce80f8e7e5 Added Row Number, label, alignment on filter report and view rights for Importer and Exporter 2025-05-31 10:34:50 +05:30
dhanabalan
37d6c174c3 Added Row Number, label, alignment on filter report and view rights for Importer and Exporter 2025-05-31 10:33:31 +05:30
dhanabalan
7757347407 Updated item code get func. (if plant exist) 2025-05-31 10:28:33 +05:30
dhanabalan
2b02e01cca Updated item code get func. (if plant exist) 2025-05-31 10:25:25 +05:30
dhanabalan
390740bbd0 Added Row Number on stickerMaster exporter and plant name position changed 2025-05-31 10:23:04 +05:30
dhanabalan
561c2d7bf2 Added Row Number on productionPlan exporter 2025-05-31 10:21:02 +05:30
dhanabalan
9b1a0d5b58 Added Row Number on productionQuantity exporter 2025-05-31 10:19:20 +05:30
dhanabalan
580ca9d569 Added Row Number on productionLineStop exporter 2025-05-31 10:18:56 +05:30
dhanabalan
ad06e0d4d2 Added Row Number on item exporter 2025-05-31 10:17:26 +05:30
dhanabalan
e3c651d22b Added Row Number on invoiceValidation exporter 2025-05-31 10:17:10 +05:30
dhanabalan
75212ea2b1 Added company, plant, block, shift, lineStop exporter 2025-05-31 10:15:51 +05:30
dhanabalan
670b47bc31 Added export testing_panel_readings pdf templates and images 2025-05-31 10:10:31 +05:30
dhanabalan
03cbd6f877 Updated permission name of hourly_production page 2025-05-31 10:03:19 +05:30
dhanabalan
7bf910c800 Added testing_Panel_controller file with GET and POST API method 2025-05-31 09:57:26 +05:30
dhanabalan
bbdd05bed0 Updated hourly count dashboard permission name and Added view rights to testing master and testing panel reading 2025-05-31 09:49:40 +05:30
dhanabalan
3ec4cd3c3b Added testing_panel_readings migration, model, resource with dependencies, importer, exporter 2025-05-31 09:39:13 +05:30
dhanabalan
79ff0b10a7 Added motor_testing_master migration, model, resource with dependencies, importer, exporter 2025-05-31 09:16:39 +05:30
dhanabalan
2c90676f62 Added configuration migration, model, resource with dependencies 2025-05-31 09:03:19 +05:30
dhanabalan
46eaa273c3 Added machine migration, model, resource with dependencies 2025-05-31 09:00:11 +05:30
dhanabalan
68060fe5fc Added line_id foreign key 2025-05-28 17:28:07 +05:30
dhanabalan
5e2ecd2460 Added FG Line for Cumulative Chart for production line count 2025-05-28 17:26:20 +05:30
dhanabalan
3c70cd0260 Added FG Line validations in Hourly Production Count Chart 2025-05-28 17:22:13 +05:30
dhanabalan
f641602533 Added line_id foreign and Line BelongsTo relation 2025-05-28 17:18:58 +05:30
dhanabalan
fd6aea01ed Added Line column with its validation and Line filter func. and Row Number 2025-05-28 17:03:00 +05:30
dhanabalan
f6d7394ebd Added Line column and updated sticker_master_id column name with its func. 2025-05-28 16:57:06 +05:30
dhanabalan
6b39fc7236 Added Line column and Row Number column 2025-05-28 16:53:16 +05:30
dhanabalan
2fbae54e6b Added LineExporter file 2025-05-28 16:51:27 +05:30
dhanabalan
6477c7d47a Added 11 default line types and Row Number column and Exporter func. and View rights for Import / Export 2025-05-28 16:50:14 +05:30
dhanabalan
68dd7d2a7a Removed unwanted messag content in post obd api 2025-05-28 08:23:30 +05:30
dhanabalan
37278f2754 Added heat number field as mandatory in post api 2025-05-27 19:15:01 +05:30
dhanabalan
a2972d5c6d Resolved jsomn response array structure in post obd 2025-05-27 19:07:02 +05:30
dhanabalan
01f2180fa9 Updated redirect URL to PDS login page instead of laravel welcome page 2025-05-27 18:32:08 +05:30
dhanabalan
569290658d Removed required condition for heat_number column and its position changed and Removed heat_number column on Import OBD Weight Invoice 2025-05-27 18:19:42 +05:30
dhanabalan
bfbb9f98ea Added Heat number in post api obd and removed heat number in get api obd 2025-05-27 18:14:02 +05:30
dhanabalan
3ad53185d1 Modified post response message for obd data 2025-05-24 20:33:51 +05:30
dhanabalan
de6e38bc5f Added import and export permissions 2025-05-24 19:21:28 +05:30
dhanabalan
af5ede975b Policy file added 2025-05-24 19:20:17 +05:30
dhanabalan
7ea8231c90 Importer file added 2025-05-24 19:16:53 +05:30
dhanabalan
1bf5f0b31a Exporter file added 2025-05-24 19:16:10 +05:30
dhanabalan
9347dbf466 Updated report columns and filter func. and Added import obd invoice, import obd weight invoice, export obd weight invoice 2025-05-24 19:15:05 +05:30
dhanabalan
023d2e13fb Added obd message 2025-05-23 16:47:07 +05:30
dhanabalan
af793faf0d Commented success message on qr scanning 2025-05-20 10:03:11 +05:30
dhanabalan
ff75934526 Removed commented text and Updated query functionality from DB to Model 2025-05-20 10:01:30 +05:30
dhanabalan
338449f3f8 Commented success message on qr scanning 2025-05-20 09:38:13 +05:30
dhanabalan
1af5a7d0b6 Report table column order changed and Added passing invoice name without extension while import to check status on database 2025-05-20 09:31:34 +05:30
dhanabalan
b4116c7492 Added Validations for post and obd data 2025-05-16 18:21:14 +05:30
dhanabalan
6b17578f40 Added Actual Weight structure in get response 2025-05-16 17:12:58 +05:30
dhanabalan
e64d1c982d Added Api directory 2025-05-15 18:09:53 +05:30
dhanabalan
23a258add9 Added OBD post and get data 2025-05-15 17:17:44 +05:30
dhanabalan
55cecbc9ba Updated invoice chart removed DB 2025-05-15 14:33:00 +05:30
dhanabalan
524d9a1960 Updated this_month logic in invoice chart 2025-05-15 14:14:53 +05:30
dhanabalan
db9185f7e0 designed chart fr production quantity 2025-05-12 20:11:25 +05:30
dhanabalan
5718db1399 designed production quantity reports table 2025-05-12 20:10:58 +05:30
dhanabalan
74ef122ee9 designed chart 2025-05-12 20:10:27 +05:30
dhanabalan
a72840d4a3 Removed space 2025-05-12 20:09:25 +05:30
dhanabalan
8368099b93 Removed unwanted plugin data js code 2025-05-12 20:07:27 +05:30
dhanabalan
21ce9c76e8 Updated session plant and line and overriding issue solved 2025-05-12 20:05:54 +05:30
dhanabalan
e198b6e613 Updated session plant and line and overriding issue solved 2025-05-12 20:03:52 +05:30
dhanabalan
fe55962670 Commented unused code 2025-05-12 20:01:46 +05:30
dhanabalan
79be8aec91 Updated session forget func. and recent_qr func. and added sap_msg_status, sap_msg_description columns 2025-05-12 19:56:09 +05:30
dhanabalan
25f13a6d49 Removed updateOrCreate 'admin' user from userSeeder 2025-05-12 19:53:05 +05:30
dhanabalan
1842b525a6 Added import / export button and manualy created productionQuantities page permissions 2025-05-12 19:51:33 +05:30
dhanabalan
efde2c357a Added adminSeeder call method into databaseSeeder 2025-05-12 19:50:07 +05:30
dhanabalan
3f7d1b28f0 Added admin user within adminSeeder page 2025-05-12 19:49:25 +05:30
dhanabalan
b81d0a0de0 Added block_reference column and updated sample data and updated validation func. on import 2025-05-12 19:48:05 +05:30
dhanabalan
fb3ce483c7 Added production_order, uom, sap_msg_status, sap_msg_description, operator_id column 2025-05-12 19:44:18 +05:30
dhanabalan
7d5371cac4 Updated validation func. on import 2025-05-12 19:41:46 +05:30
dhanabalan
db08e07e48 Added uom column and updated validation func. on import 2025-05-12 19:40:33 +05:30
dhanabalan
6f22d0baf0 Added uom column and disabled 'deleted_at' column by default 2025-05-12 19:39:50 +05:30
dhanabalan
401edadee7 Added uom column and updated columnSpan alignments 2025-05-12 19:38:36 +05:30
dhanabalan
fe94bfa109 Commented 'chart-js-plugins' codes 2025-05-12 19:37:00 +05:30
dhanabalan
a57c53ae9f Updated notification duration and Added sap_msg_status, sap_msg_description columns in create production quantity page 2025-05-12 19:35:59 +05:30
dhanabalan
877a4a4696 Updated getRedirectUrl func. in create quality_validations page 2025-05-12 19:33:15 +05:30
dhanabalan
76b17d4abc Added create, edit, list, view pages to weight_validations resource 2025-05-12 19:31:49 +05:30
dhanabalan
2855622746 Added uom column into items model and hasMany relation to productionQuantities 2025-05-12 19:28:56 +05:30
dhanabalan
956c3466f9 Added importer and exporter for quality_validations page 2025-05-12 19:26:37 +05:30
dhanabalan
8d872498f4 Added uom, sap_msg_status, sap_msg_description, serial_number columns into quality_validations resource page and updated scanned serial number comparison func. using serial_number column and updated filter func. 2025-05-12 19:23:26 +05:30
dhanabalan
96d6398f59 Added uom, sap_msg_status, sap_msg_description, serial_number columns into quality_validations model 2025-05-12 19:19:50 +05:30
dhanabalan
fce8620087 Added weight_validations model and resource page 2025-05-12 19:18:51 +05:30
dhanabalan
80c65e6a32 Added sap_msg_status, sap_msg_description columns in create page and Added uom column, report filter func. 2025-05-12 19:16:40 +05:30
dhanabalan
e6563c9e31 Removed searchable and added report filter func. and visible rights added for import / export buttons and readonly mode updated to production_quantity control 2025-05-12 19:11:11 +05:30
dhanabalan
e86abbc88e Updated report filter func. and visible rights added for import / export buttons 2025-05-12 19:06:52 +05:30
dhanabalan
bf4304cacf Removed unwanted space 2025-05-12 19:00:56 +05:30
dhanabalan
b062239007 Added weight_validations migration 2025-05-12 18:58:31 +05:30
dhanabalan
6f5e1f708c Added sap_msg_status, sap_msg_description columns into production_quantities table 2025-05-12 18:57:37 +05:30
dhanabalan
ae902267ef Added uom column into items table 2025-05-12 18:56:38 +05:30
dhanabalan
0334adb52c Added uom, sap_msg_status, sap_msg_description, serial_number columns into quality_validations table 2025-05-12 18:55:50 +05:30
dhanabalan
0b82f33837 Updated import validation (get block_id if plant exist otherwise ignore) 2025-05-10 11:28:18 +05:30
dhanabalan
0ea9d49ead Added import validation functionality and block_reference column and Updated sample data 2025-05-10 11:25:25 +05:30
dhanabalan
7c9c2672a2 Added operator_id column on export 2025-05-10 10:24:49 +05:30
dhanabalan
6b057ed2c4 Added operator_id column on exporter 2025-05-10 09:37:17 +05:30
dhanabalan
2dcb2ac227 Removed operator_id on production_plan update 2025-05-10 09:32:26 +05:30
dhanabalan
64e74b8d67 Updated completed invoice count chart query 2025-05-10 08:42:58 +05:30
dhanabalan
e6438cf46d Added import validation functionality and block_reference column and Updated sample data 2025-05-10 08:34:27 +05:30
dhanabalan
e6cc03aeef Removed block disabled option on edit 2025-05-08 10:18:49 +05:30
dhanabalan
5609d6e381 Removed pluck('serial_number')->first() on sNo exist() query checking and Updated 'delete()' method to 'forceDelete()' method 2025-05-06 20:18:20 +05:30
dhanabalan
73df86f269 Updated import validation functionality 2025-05-06 12:44:52 +05:30
dhanabalan
b0149f6d61 Updated import validation functionality 2025-05-06 12:42:53 +05:30
dhanabalan
eb81eed835 Updated import validation functionality 2025-05-06 12:41:34 +05:30
dhanabalan
daf81cd0c0 Added import validation functionality 2025-05-06 12:38:06 +05:30
dhanabalan
4108a438c7 Updated import validation functionality 2025-05-06 12:35:20 +05:30
dhanabalan
f698909cd2 Added import validation functionality 2025-05-06 12:32:22 +05:30
dhanabalan
75f97e7a2b Restrict duplicate warning on update 2025-05-06 12:26:42 +05:30
dhanabalan
a189c58352 Removed 'lines' hasMany relations 2025-05-06 12:21:20 +05:30
dhanabalan
43180d77b2 Added hasMany relation 2025-05-06 12:19:47 +05:30
dhanabalan
f08714e2a3 Added hasMany relations 2025-05-06 12:17:49 +05:30
dhanabalan
af5a107295 Updated hasMany relation 2025-05-06 12:13:28 +05:30
dhanabalan
21b0276cfd Notification duration changed and RegEx pattern changed isMarkM or isMarkP or isMarkC or isMarkPs and Added invalid quantity material qr format warning and Restricted duplicate material qr 2025-05-06 12:12:24 +05:30
dhanabalan
504b110ff3 Converted from durations to seconds to Notifications 2025-05-06 11:31:29 +05:30
dhanabalan
2477b88ea5 Removed searchable func. and added filters func. to view report 2025-05-06 11:17:53 +05:30
dhanabalan
0a1c222372 Disable by default to 'deleted_at' column 2025-05-06 11:11:53 +05:30
dhanabalan
ed97baae03 Column position change and disable by default to 'deleted_at' column 2025-05-06 11:10:58 +05:30
dhanabalan
91580cacf1 Updated blade file for hourly and production quantity 2025-04-28 12:51:07 +05:30
dhanabalan
fe53cb1bcd Updated chart for avoiding conflicts 2025-04-28 12:49:36 +05:30
dhanabalan
e5df28c85d to avoid conflicts between two dashboard pages 2025-04-28 12:48:51 +05:30
dhanabalan
cbbf35eec9 Added operator_id on update to capacitor scanning 2025-04-28 00:47:14 +05:30
dhanabalan
550792372a Hide update_invoice button on scanning and Added operate_id on update and Added material_type 3 func. 2025-04-28 00:43:30 +05:30
dhanabalan
be9457c4e2 Added ProductionQuantity data grid 2025-04-28 00:41:07 +05:30
dhanabalan
09acb4453c Added admin seeder and Updated User seeder 2025-04-28 00:35:28 +05:30
dhanabalan
0971c25a5c Added material_type 3 2025-04-28 00:33:03 +05:30
dhanabalan
04c44ae416 Added import time and size limit 2025-04-28 00:32:28 +05:30
dhanabalan
85329ff557 Updated code visible func. and '3->quantity' in material type 2025-04-28 00:30:53 +05:30
dhanabalan
f014d9fd42 Updated navigation order / label and Added export pdf func. and commented chart func. 2025-04-28 00:28:42 +05:30
dhanabalan
4633066b13 Updated navigation order and Added export pdf func. 2025-04-28 00:23:04 +05:30
dhanabalan
79b889ec39 Updated navigation order and filter report and Added export pdf func. 2025-04-28 00:22:44 +05:30
dhanabalan
a6b9f88101 Hide update_invoice toggle button on scanning 2025-04-28 00:19:43 +05:30
dhanabalan
a275e18d0b Added production_order, operate_id column and skip insert when invalid plant-line-shift-item on import 2025-04-28 00:18:03 +05:30
dhanabalan
9aacf25eb5 Added operate_id on import 2025-04-28 00:15:29 +05:30
dhanabalan
2c1efb1bf0 Updated skip logic if duplicate plant found 2025-04-28 00:14:33 +05:30
dhanabalan
c8e2a9c7b9 Updated skip logic if plant not found 2025-04-28 00:14:18 +05:30
dhanabalan
38c37c74ed Updated skip logic if plant not found 2025-04-28 00:12:29 +05:30
dhanabalan
e328569cc1 Package for export pdf 2025-04-28 00:11:34 +05:30
365 changed files with 51276 additions and 1872 deletions

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

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

View File

@@ -0,0 +1,164 @@
<?php
namespace App\Console\Commands;
use App\Models\AlertMailRule;
use Illuminate\Console\Scheduling\Schedule;
class ScheduleList
{
// public function schedule(Schedule $schedule): void
// {
// // Invoice Report Scheduling
// $scheduleType = AlertMailRule::where('module', 'InvoiceValidation')
// ->where('rule_name', 'InvoiceMail')
// ->value('schedule_type');
// switch ($scheduleType) {
// case 'Live':
// $schedule->command('send:invoice-report')->everyMinute()->runInBackground();
// break;
// case 'Hourly':
// $schedule->command('send:invoice-report')->hourly()->runInBackground();
// break;
// // case 'Daily':
// // $schedule->command('send:invoice-report')->daily()->runInBackground(); //->dailyAt('07:59')
// // break;
// case 'Daily':
// $schedule->command('send:invoice-report')->dailyAt('07:59')->runInBackground(); //->dailyAt('07:59')
// break;
// default:
// $schedule->command('send:invoice-report')->hourly()->runInBackground();
// break;
// }
// $SerialscheduleType = AlertMailRule::where('module', 'InvoiceValidation')
// ->where('rule_name', 'SerialInvoiceMail')
// ->value('schedule_type');
// switch ($SerialscheduleType) {
// case 'Live':
// $schedule->command('send:invoice-report')->everyMinute()->runInBackground();
// break;
// case 'Hourly':
// $schedule->command('send:invoice-report')->hourly()->runInBackground();
// break;
// // case 'Daily':
// // $schedule->command('send:invoice-report')->daily()->runInBackground(); //->dailyAt('07:59')
// // break;
// case 'Daily':
// $schedule->command('send:invoice-report')->dailyAt('07:59')->runInBackground(); //->dailyAt('07:59')
// break;
// default:
// $schedule->command('send:invoice-report')->hourly()->runInBackground();
// break;
// }
// $materialscheduleType = AlertMailRule::where('module', 'InvoiceValidation')
// ->where('rule_name', 'MaterialInvoiceMail')
// ->value('schedule_type');
// switch ($materialscheduleType) {
// case 'Live':
// $schedule->command('send:invoice-report')->everyMinute()->runInBackground();
// break;
// case 'Hourly':
// $schedule->command('send:invoice-report')->hourly()->runInBackground();
// break;
// // case 'Daily':
// // $schedule->command('send:invoice-report')->daily()->runInBackground(); //->dailyAt('07:59')
// // break;
// case 'Daily':
// $schedule->command('send:invoice-report')->dailyAt('07:59')->runInBackground(); //->dailyAt('07:59')
// break;
// default:
// $schedule->command('send:invoice-report')->hourly()->runInBackground();
// break;
// }
// // Production Report Scheduling
// $productionScheduleType = AlertMailRule::where('module', 'ProductionQuantities')
// ->where('rule_name', 'ProductionMail')
// ->value('schedule_type');
// switch ($productionScheduleType) {
// case 'Live':
// $schedule->command('send:production-report')->everyMinute()->runInBackground();
// break;
// case 'Hourly':
// $schedule->command('send:production-report')->hourly()->runInBackground();
// break;
// case 'Daily':
// $schedule->command('send:production-report')->dailyAt('07:59')->runInBackground();
// break;
// default:
// $schedule->command('send:production-report')->hourly()->runInBackground();
// break;
// }
// }
public function schedule(Schedule $schedule): void
{
// Define the rules you want to schedule
$rules = [
[
'module' => 'InvoiceValidation',
'rule_name' => 'InvoiceMail',
'argument' => 'InvoiceMail',
],
[
'module' => 'InvoiceValidation',
'rule_name' => 'SerialInvoiceMail',
'argument' => 'SerialInvoiceMail',
],
[
'module' => 'InvoiceValidation',
'rule_name' => 'MaterialInvoiceMail',
'argument' => 'MaterialInvoiceMail',
],
];
// Loop through each rule and schedule accordingly
foreach ($rules as $rule) {
$scheduleType = AlertMailRule::where('module', $rule['module'])
->where('rule_name', $rule['rule_name'])
->value('schedule_type');
switch ($scheduleType) {
case 'Live':
$schedule->command("send:invoice-report {$rule['argument']}")->everyMinute()->runInBackground();
break;
case 'Hourly':
$schedule->command("send:invoice-report {$rule['argument']}")->hourly()->runInBackground();
break;
case 'Daily':
$schedule->command("send:invoice-report {$rule['argument']}")->dailyAt('07:59')->runInBackground();
break;
default:
$schedule->command("send:invoice-report {$rule['argument']}")->hourly()->runInBackground();
break;
}
}
// Production Report Scheduling
$productionScheduleType = AlertMailRule::where('module', 'ProductionQuantities')
->where('rule_name', 'ProductionMail')
->value('schedule_type');
switch ($productionScheduleType) {
case 'Live':
$schedule->command('send:production-report')->everyMinute()->runInBackground();
break;
case 'Hourly':
$schedule->command('send:production-report')->hourly()->runInBackground();
break;
case 'Daily':
$schedule->command('send:production-report')->dailyAt('07:59')->runInBackground();
break;
default:
$schedule->command('send:production-report')->hourly()->runInBackground();
break;
}
}
}

View File

@@ -0,0 +1,405 @@
<?php
namespace App\Console\Commands;
use App\Models\InvoiceValidation;
use App\Models\Plant;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Mail;
use App\Mail\test;
class SendInvoiceReport extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
// protected $signature = 'app:send-invoice-report';
protected $signature = 'send:invoice-report{schedule_type} {plant}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Command description';
/**
* Execute the console command.
*/
// public function handle()
// {
// $schedule = $this->argument('schedule_type');
// $plantid = $this->argument('plant');
// $mailRules = \App\Models\AlertMailRule::where('module', 'InvoiceValidation')->get()->groupBy('rule_name');
// $startDate = now()->setTime(8, 0, 0);
// $endDate = now()->copy()->addDay()->setTime(8, 0, 0);
// $plants = InvoiceValidation::select('plant_id')->distinct()->pluck('plant_id');
// $serialTableData = [];
// $materialTableData = [];
// $bundleTableData = [];
// $noSerial = 1;
// $noMaterial = 1;
// $noBundle = 1;
// foreach ($plants as $plantId) {
// $plant = Plant::find($plantId);
// $plantName = $plant ? $plant->name : $plantId;
// //..Serial Invoice
// $totalSerialCount = InvoiceValidation::where('plant_id', $plantId)
// ->whereNull('quantity')
// ->whereBetween('created_at', [$startDate, $endDate])
// ->distinct('invoice_number')
// ->count('invoice_number');
// $scannedSerialCount = InvoiceValidation::select('invoice_number')
// ->where('plant_id', $plantId)
// ->whereNull('quantity')
// ->whereBetween('updated_at', [$startDate, $endDate])
// ->groupBy('invoice_number')
// ->havingRaw(
// "COUNT(*) = SUM(CASE WHEN scanned_status = 'Scanned' THEN 1 ELSE 0 END)"
// )
// ->count();
// $serialTableData[] = [
// 'no' => $noSerial++,
// 'plant' => $plantName,
// 'totalInvoice' => $totalSerialCount,
// 'scannedInvoice' => $scannedSerialCount,
// ];
// //..Individual Invoice
// $TotalMatCount = InvoiceValidation::where('plant_id', $plantId)
// ->where('quantity', 1)
// ->whereBetween('created_at', [$startDate, $endDate])
// ->distinct('invoice_number')
// ->count('invoice_number');
// $scannedMatCount = InvoiceValidation::select('invoice_number')
// ->where('plant_id', $plantId)
// ->where('quantity', 1)
// ->whereBetween('updated_at', [$startDate, $endDate])
// ->groupBy('invoice_number')
// ->havingRaw(
// "COUNT(*) = SUM(CASE WHEN serial_number IS NOT NULL AND serial_number != '' THEN 1 ELSE 0 END)"
// )
// ->count();
// $materialTableData[] = [
// 'no' => $noMaterial++,
// 'plant' => $plantName,
// 'totalInvoice' => $TotalMatCount,
// 'scannedInvoice' => $scannedMatCount,
// ];
// //..BUndle Invoice
// $totalBundleCount = InvoiceValidation::where('plant_id', $plantId)
// ->where('quantity', '>', 1)
// ->whereBetween('created_at', [$startDate, $endDate])
// ->distinct('invoice_number')
// ->count('invoice_number');
// $scannedBundleCount = InvoiceValidation::select('invoice_number')
// ->where('plant_id', $plantId)
// ->where('quantity', '>', 1)
// ->whereBetween('updated_at', [$startDate, $endDate])
// ->groupBy('invoice_number')
// ->havingRaw(
// "COUNT(*) = SUM(CASE WHEN serial_number IS NOT NULL AND serial_number != '' THEN 1 ELSE 0 END)"
// )
// ->count();
// $bundleTableData[] = [
// 'no' => $noBundle++,
// 'plant' => $plantName,
// 'totalInvoice' => $totalBundleCount,
// 'scannedInvoice' => $scannedBundleCount,
// ];
// }
// // Send to SerialInvoiceMail recipients
// if ($mailRules->has('SerialInvoiceMail')) {
// $emails = $mailRules['SerialInvoiceMail']->pluck('email')->unique()->toArray();
// foreach ($emails as $email) {
// Mail::to($email)->send(new test($serialTableData, [], []));
// }
// }
// // Send to MaterialInvoiceMail recipients (material + bundle table)
// if ($mailRules->has('MaterialInvoiceMail')) {
// $emails = $mailRules['MaterialInvoiceMail']->pluck('email')->unique()->toArray();
// foreach ($emails as $email) {
// Mail::to($email)->send(new test([], $materialTableData, $bundleTableData));
// }
// }
// // Send to InvoiceMail recipients (all three tables)
// if ($mailRules->has('InvoiceMail')) {
// $emails = $mailRules['InvoiceMail']->pluck('email')->unique()->toArray();
// foreach ($emails as $email) {
// Mail::to($email)->send(new test($serialTableData, $materialTableData, $bundleTableData));
// }
// }
// //$this->info(json_encode($materialTableData));
// }
// public function handle()
// {
// $schedule = $this->argument('schedule_type');
// $plantId = $this->argument('plant');
// $mailRules = \App\Models\AlertMailRule::where('module', 'InvoiceValidation')->get()->groupBy('rule_name');
// $startDate = now()->setTime(8, 0, 0);
// $endDate = now()->copy()->addDay()->setTime(8, 0, 0);
// $serialTableData = [];
// $materialTableData = [];
// $bundleTableData = [];
// $plant = Plant::find($plantId);
// $plantName = $plant ? $plant->name : $plantId;
// // Serial Invoice
// $totalSerialCount = InvoiceValidation::where('plant_id', $plantId)
// ->whereNull('quantity')
// ->whereBetween('created_at', [$startDate, $endDate])
// ->distinct('invoice_number')
// ->count('invoice_number');
// $scannedSerialCount = InvoiceValidation::select('invoice_number')
// ->where('plant_id', $plantId)
// ->whereNull('quantity')
// ->whereBetween('updated_at', [$startDate, $endDate])
// ->groupBy('invoice_number')
// ->havingRaw(
// "COUNT(*) = SUM(CASE WHEN scanned_status = 'Scanned' THEN 1 ELSE 0 END)"
// )
// ->count();
// $serialTableData[] = [
// 'no' => 1,
// 'plant' => $plantName,
// 'totalInvoice' => $totalSerialCount,
// 'scannedInvoice' => $scannedSerialCount,
// ];
// // Individual Material Invoice
// $TotalMatCount = InvoiceValidation::where('plant_id', $plantId)
// ->where('quantity', 1)
// ->whereBetween('created_at', [$startDate, $endDate])
// ->distinct('invoice_number')
// ->count('invoice_number');
// $scannedMatCount = InvoiceValidation::select('invoice_number')
// ->where('plant_id', $plantId)
// ->where('quantity', 1)
// ->whereBetween('updated_at', [$startDate, $endDate])
// ->groupBy('invoice_number')
// ->havingRaw(
// "COUNT(*) = SUM(CASE WHEN serial_number IS NOT NULL AND serial_number != '' THEN 1 ELSE 0 END)"
// )
// ->count();
// $materialTableData[] = [
// 'no' => 1,
// 'plant' => $plantName,
// 'totalInvoice' => $TotalMatCount,
// 'scannedInvoice' => $scannedMatCount,
// ];
// // Bundle Invoice
// $totalBundleCount = InvoiceValidation::where('plant_id', $plantId)
// ->where('quantity', '>', 1)
// ->whereBetween('created_at', [$startDate, $endDate])
// ->distinct('invoice_number')
// ->count('invoice_number');
// $scannedBundleCount = InvoiceValidation::select('invoice_number')
// ->where('plant_id', $plantId)
// ->where('quantity', '>', 1)
// ->whereBetween('updated_at', [$startDate, $endDate])
// ->groupBy('invoice_number')
// ->havingRaw(
// "COUNT(*) = SUM(CASE WHEN serial_number IS NOT NULL AND serial_number != '' THEN 1 ELSE 0 END)"
// )
// ->count();
// $bundleTableData[] = [
// 'no' => 1,
// 'plant' => $plantName,
// 'totalInvoice' => $totalBundleCount,
// 'scannedInvoice' => $scannedBundleCount,
// ];
// // Send to SerialInvoiceMail recipients
// if ($mailRules->has('SerialInvoiceMail')) {
// $emails = $mailRules['SerialInvoiceMail']->pluck('email')->unique()->toArray();
// foreach ($emails as $email) {
// Mail::to($email)->send(new test($serialTableData, [], []));
// }
// }
// // Send to MaterialInvoiceMail recipients (material + bundle table)
// if ($mailRules->has('MaterialInvoiceMail')) {
// $emails = $mailRules['MaterialInvoiceMail']->pluck('email')->unique()->toArray();
// foreach ($emails as $email) {
// Mail::to($email)->send(new test([], $materialTableData, $bundleTableData));
// }
// }
// // Send to InvoiceMail recipients (all three tables)
// if ($mailRules->has('InvoiceMail')) {
// $emails = $mailRules['InvoiceMail']->pluck('email')->unique()->toArray();
// foreach ($emails as $email) {
// Mail::to($email)->send(new test($serialTableData, $materialTableData, $bundleTableData));
// }
// }
// // $this->table(
// // ['No', 'Plant', 'Total Invoice', 'Scanned Invoice'],
// // $serialTableData
// // );
// }
public function handle()
{
$schedule = $this->argument('schedule_type');
$plantIdArg = (int) $this->argument('plant'); // can be 0 for all plants
$mailRules = \App\Models\AlertMailRule::where('module', 'InvoiceValidation')->get()->groupBy('rule_name');
$startDate = now()->setTime(8, 0, 0);
$endDate = now()->copy()->addDay()->setTime(8, 0, 0);
$serialTableData = [];
$materialTableData = [];
$bundleTableData = [];
// Get plant IDs: either one plant or all
$plantIds = $plantIdArg == 0
? InvoiceValidation::select('plant_id')->distinct()->pluck('plant_id')->toArray()
: [$plantIdArg];
$no = 1;
foreach ($plantIds as $plantId) {
$plant = Plant::find($plantId);
$plantName = $plant ? $plant->name : $plantId;
// Serial Invoice
$totalSerialCount = InvoiceValidation::where('plant_id', $plantId)
->whereNull('quantity')
->whereBetween('created_at', [$startDate, $endDate])
->distinct('invoice_number')
->count('invoice_number');
$scannedSerialCount = InvoiceValidation::select('invoice_number')
->where('plant_id', $plantId)
->whereNull('quantity')
->whereBetween('updated_at', [$startDate, $endDate])
->groupBy('invoice_number')
->havingRaw("COUNT(*) = SUM(CASE WHEN scanned_status = 'Scanned' THEN 1 ELSE 0 END)")
->count();
$serialTableData[] = [
'no' => $no,
'plant' => $plantName,
'totalInvoice' => $totalSerialCount,
'scannedInvoice' => $scannedSerialCount,
];
// Material Invoice
$totalMatCount = InvoiceValidation::where('plant_id', $plantId)
->where('quantity', 1)
->whereBetween('created_at', [$startDate, $endDate])
->distinct('invoice_number')
->count('invoice_number');
$scannedMatCount = InvoiceValidation::select('invoice_number')
->where('plant_id', $plantId)
->where('quantity', 1)
->whereBetween('updated_at', [$startDate, $endDate])
->groupBy('invoice_number')
->havingRaw("COUNT(*) = SUM(CASE WHEN serial_number IS NOT NULL AND serial_number != '' THEN 1 ELSE 0 END)")
->count();
$materialTableData[] = [
'no' => $no,
'plant' => $plantName,
'totalInvoice' => $totalMatCount,
'scannedInvoice' => $scannedMatCount,
];
// Bundle Invoice
$totalBundleCount = InvoiceValidation::where('plant_id', $plantId)
->where('quantity', '>', 1)
->whereBetween('created_at', [$startDate, $endDate])
->distinct('invoice_number')
->count('invoice_number');
$scannedBundleCount = InvoiceValidation::select('invoice_number')
->where('plant_id', $plantId)
->where('quantity', '>', 1)
->whereBetween('updated_at', [$startDate, $endDate])
->groupBy('invoice_number')
->havingRaw("COUNT(*) = SUM(CASE WHEN serial_number IS NOT NULL AND serial_number != '' THEN 1 ELSE 0 END)")
->count();
$bundleTableData[] = [
'no' => $no,
'plant' => $plantName,
'totalInvoice' => $totalBundleCount,
'scannedInvoice' => $scannedBundleCount,
];
$no++;
}
// Send to SerialInvoiceMail recipients
if ($mailRules->has('SerialInvoiceMail')) {
$emails = $mailRules['SerialInvoiceMail']->pluck('email')->unique()->toArray();
foreach ($emails as $email) {
Mail::to($email)->send(new test($serialTableData, [], []));
}
}
// Send to MaterialInvoiceMail recipients (material + bundle table)
if ($mailRules->has('MaterialInvoiceMail')) {
$emails = $mailRules['MaterialInvoiceMail']->pluck('email')->unique()->toArray();
foreach ($emails as $email) {
Mail::to($email)->send(new test([], $materialTableData, $bundleTableData));
}
}
// Send to InvoiceMail recipients (all three tables)
if ($mailRules->has('InvoiceMail')) {
$emails = $mailRules['InvoiceMail']->pluck('email')->unique()->toArray();
foreach ($emails as $email) {
Mail::to($email)->send(new test($serialTableData, $materialTableData, $bundleTableData));
}
}
// Show preview in console
$this->info('--- Serial Invoice Table ---');
$this->table(['#', 'Plant', 'Total Invoice', 'Scanned Invoice'], $serialTableData);
$this->info('--- Material Invoice Table ---');
$this->table(['#', 'Plant', 'Total Invoice', 'Scanned Invoice'], $materialTableData);
$this->info('--- Bundle Invoice Table ---');
$this->table(['#', 'Plant', 'Total Invoice', 'Scanned Invoice'], $bundleTableData);
}
}

View File

@@ -0,0 +1,247 @@
<?php
namespace App\Console\Commands;
use App\Models\InvoiceValidation;
use App\Models\Plant;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Mail;
use App\Mail\ProductionMail;
use App\Models\Line;
use App\Models\ProductionPlan;
use App\Models\ProductionQuantity;
use DB;
class SendProductionReport extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
//protected $signature = 'send:production-report';
protected $signature = 'send:production-report {schedule_type} {plant}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Command description';
/**
* Execute the console command.
*/
// public function handle()
// {
// $scheduleType = $this->argument('schedule_type');
// $plantId = $this->argument('plant');
// $mailRules = \App\Models\AlertMailRule::where('module', 'ProductionQuantities')
// ->where('rule_name', 'ProductionMail')
// ->where('plant', $plantId)
// ->where('schedule_type', $scheduleType)
// ->get();
// $emails = $mailRules->pluck('email')->unique()->toArray();
// $plant = Plant::find($plantId);
// if (!$plant) {
// $this->error("Invalid plant ID: $plantId");
// return;
// }
// $lines = Line::where('plant_id', $plantId)->get();
// $startDate = now()->setTime(8, 0, 0);
// $endDate = now()->copy()->addDay()->setTime(8, 0, 0);
// $PlanstartDate = now()->setTime(8, 0, 0);
// $planendDate = now()->copy()->addDay()->setTime(7, 59, 00);
// $tableData = [];
// $no = 1;
// foreach ($lines as $line) {
// $lineId = $line->id;
// $lineName = $line->name;
// $targetQuantity = ProductionPlan::where('plant_id', $plantId)
// ->where('line_id', $lineId)
// ->whereBetween('created_at', [$PlanstartDate, $planendDate])
// ->sum('plan_quantity');
// $productionQuantity = ProductionQuantity::where('plant_id', $plantId)
// ->where('line_id', $lineId)
// ->whereBetween('created_at', [$startDate, $endDate])
// ->count();
// $tableData[] = [
// 'no' => $no++,
// 'plant' => $plant->name,
// 'line' => $lineName,
// 'targetQuantity' => $targetQuantity,
// 'productionQuantity' => $productionQuantity,
// ];
// }
// // $this->table(
// // ['No', 'Plant', 'Line', 'Target Quantity', 'Production Quantity'],
// // $tableData
// // );
// if (!empty($emails)) {
// foreach ($emails as $email) {
// Mail::to($email)->send(new ProductionMail($tableData));
// }
// } else {
// $this->info('No recipients found for ProductionMailAlert.');
// }
// $this->info("Production report sent to " . count($emails) . " recipient(s).");
// }
public function handle()
{
$scheduleType = $this->argument('schedule_type');
$plantId = (int) $this->argument('plant'); // cast to int for safety
// Fetch mail rules based on schedule type
$mailRules = \App\Models\AlertMailRule::where('module', 'ProductionQuantities')
->where('rule_name', 'ProductionMail')
->where('schedule_type', $scheduleType)
->where('plant', $plantId)
->get();
$emails = $mailRules->pluck('email')->unique()->toArray();
$plants = $plantId == 0
? Plant::all()
: Plant::where('id', $plantId)->get();
if ($plants->isEmpty()) {
$this->error("No valid plant(s) found.");
return;
}
// $startDate = now()->setTime(8, 0, 0);
// $endDate = now()->copy()->addDay()->setTime(8, 0, 0);
if (strtolower($scheduleType) == 'daily')
{
$startDate = now()->subDay()->setTime(8, 0, 0);
$endDate = now()->setTime(8, 0, 0);
}
else
{
$startDate = now()->setTime(8, 0, 0);
$endDate = now()->copy()->addDay()->setTime(8, 0, 0);
}
$PlanstartDate = now()->setTime(8, 0, 0);
$planendDate = now()->copy()->addDay()->setTime(7, 59, 0);
$tableData = [];
$no = 1;
// foreach ($plants as $plant) {
// $lines = Line::where('plant_id', $plant->id)->get();
// foreach ($lines as $line) {
// $targetQuantity = ProductionPlan::where('plant_id', $plant->id)
// ->where('line_id', $line->id)
// ->whereBetween('created_at', [$PlanstartDate, $planendDate])
// ->sum('plan_quantity');
// $productionQuantity = ProductionQuantity::where('plant_id', $plant->id)
// ->where('line_id', $line->id)
// ->whereBetween('created_at', [$startDate, $endDate])
// ->count();
// $tableData[] = [
// 'no' => $no++,
// 'plant' => $plant->name,
// 'line' => $line->name,
// 'targetQuantity' => $targetQuantity,
// 'productionQuantity' => $productionQuantity,
// ];
// }
// }
// $fgTableData = []; // store FG Line related data
// foreach ($plants as $plant) {
// // ✅ Only get FG Lines
// $fgLines = Line::where('plant_id', $plant->id)
// ->where('type', 'FG Line')
// ->get();
// foreach ($fgLines as $line) {
// $validationCount = \App\Models\QualityValidation::where('plant_id', $plant->id)
// ->where('line_id', $line->id)
// ->whereBetween('created_at', [$startDate, $endDate])
// ->count();
// $fgTableData[] = [
// 'no' => $no++,
// 'plant' => $plant->name,
// 'line' => $line->name,
// 'targetQuantity' => $targetQuantity,
// 'productionQuantity' => $validationCount,
// ];
// }
// }
foreach ($plants as $plant)
{
$lines = Line::where('plant_id', $plant->id)->get();
foreach ($lines as $line) {
$targetQuantity = ProductionPlan::where('plant_id', $plant->id)
->where('line_id', $line->id)
->whereBetween('created_at', [$PlanstartDate, $planendDate])
->sum('plan_quantity');
if (strtolower($line->type) === 'fg line') {
$productionQuantity = \App\Models\QualityValidation::where('plant_id', $plant->id)
->where('line_id', $line->id)
->whereBetween('created_at', [$startDate, $endDate])
->count();
} else {
$productionQuantity = ProductionQuantity::where('plant_id', $plant->id)
->where('line_id', $line->id)
->whereBetween('created_at', [$startDate, $endDate])
->count();
}
$tableData[] = [
'no' => $no++,
'plant' => $plant->name,
'line' => $line->name,
'targetQuantity' => $targetQuantity,
'productionQuantity' => $productionQuantity,
];
}
}
///$this->table(['No', 'Plant', 'Line', 'Target Quantity', 'Production Quantity'], $fgTableData);
$this->table(['No', 'Plant', 'Line', 'Target Quantity', 'Production Quantity'], $tableData);
if (!empty($emails)) {
foreach ($emails as $email) {
Mail::to($email)->send(new ProductionMail($tableData));
}
} else {
$this->info('No recipients found for ProductionMailAlert.');
}
$this->info("Production report sent to " . count($emails) . " recipient(s).");
}
}

View File

@@ -0,0 +1,51 @@
<?php
namespace App\Filament\Exports;
use App\Models\Block;
use Filament\Actions\Exports\ExportColumn;
use Filament\Actions\Exports\Exporter;
use Filament\Actions\Exports\Models\Export;
class BlockExporter extends Exporter
{
protected static ?string $model = Block::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.name')
->label('PLANT'),
ExportColumn::make('name')
->label('NAME'),
ExportColumn::make('created_at')
->label('CREATED AT'),
ExportColumn::make('updated_at')
->label('UPDATED AT'),
ExportColumn::make('deleted_at')
->enabledByDefault(false)
->label('DELETED AT'),
];
}
public static function getCompletedNotificationBody(Export $export): string
{
$body = 'Your block export has completed and ' . number_format($export->successful_rows) . ' ' . str('row')->plural($export->successful_rows) . ' exported.';
if ($failedRowsCount = $export->getFailedRowsCount()) {
$body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to export.';
}
return $body;
}
}

View File

@@ -0,0 +1,53 @@
<?php
namespace App\Filament\Exports;
use App\Models\CheckPointName;
use Filament\Actions\Exports\ExportColumn;
use Filament\Actions\Exports\Exporter;
use Filament\Actions\Exports\Models\Export;
class CheckPointNameExporter extends Exporter
{
protected static ?string $model = CheckPointName::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.name')
->label('PLANT'),
ExportColumn::make('name')
->label('CHECK POINT NAME'),
ExportColumn::make('created_at')
->label('CREATED AT'),
ExportColumn::make('created_by')
->label('CREATED BY'),
ExportColumn::make('updated_at')
->label('UPDATED AT'),
ExportColumn::make('deleted_at')
->enabledByDefault(false)
->label('DELETED AT'),
];
}
public static function getCompletedNotificationBody(Export $export): string
{
$body = 'Your check point name export has completed and ' . number_format($export->successful_rows) . ' ' . str('row')->plural($export->successful_rows) . ' exported.';
if ($failedRowsCount = $export->getFailedRowsCount()) {
$body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to export.';
}
return $body;
}
}

View File

@@ -0,0 +1,61 @@
<?php
namespace App\Filament\Exports;
use App\Models\CheckPointTime;
use Filament\Actions\Exports\ExportColumn;
use Filament\Actions\Exports\Exporter;
use Filament\Actions\Exports\Models\Export;
class CheckPointTimeExporter extends Exporter
{
protected static ?string $model = CheckPointTime::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.name')
->label('PLANT'),
ExportColumn::make('checkPointNames1.name')
->label('CHECK POINT 1'),
ExportColumn::make('checkPointNames2.name')
->label('CHECK POINT 2'),
ExportColumn::make('sequence_number')
->label('SEQUENCE NUMBER'),
ExportColumn::make('time_lapse')
->label('TIME LAPSE'),
ExportColumn::make('time_lapse_cushioning')
->label('TIME LAPSE CUSHIONING'),
ExportColumn::make('created_at')
->label('CREATED AT'),
ExportColumn::make('created_by')
->label('CREATED BY'),
ExportColumn::make('updated_at')
->label('UPDATED AT'),
ExportColumn::make('deleted_at')
->enabledByDefault(false)
->label('DELETED AT'),
];
}
public static function getCompletedNotificationBody(Export $export): string
{
$body = 'Your check point time export has completed and ' . number_format($export->successful_rows) . ' ' . str('row')->plural($export->successful_rows) . ' exported.';
if ($failedRowsCount = $export->getFailedRowsCount()) {
$body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to export.';
}
return $body;
}
}

View File

@@ -0,0 +1,49 @@
<?php
namespace App\Filament\Exports;
use App\Models\Company;
use Filament\Actions\Exports\ExportColumn;
use Filament\Actions\Exports\Exporter;
use Filament\Actions\Exports\Models\Export;
class CompanyExporter extends Exporter
{
protected static ?string $model = Company::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('name')
->label('NAME'),
ExportColumn::make('created_at')
->label('CREATED AT'),
ExportColumn::make('updated_at')
->label('UPDATED AT'),
ExportColumn::make('deleted_at')
->enabledByDefault(false)
->label('DELETED AT'),
];
}
public static function getCompletedNotificationBody(Export $export): string
{
$body = 'Your company export has completed and ' . number_format($export->successful_rows) . ' ' . str('row')->plural($export->successful_rows) . ' exported.';
if ($failedRowsCount = $export->getFailedRowsCount()) {
$body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to export.';
}
return $body;
}
}

View File

@@ -0,0 +1,57 @@
<?php
namespace App\Filament\Exports;
use App\Models\Configuration;
use Filament\Actions\Exports\ExportColumn;
use Filament\Actions\Exports\Exporter;
use Filament\Actions\Exports\Models\Export;
class ConfigurationExporter extends Exporter
{
protected static ?string $model = Configuration::class;
public static function getColumns(): array
{
static $rowNumber = 0;
return [
ExportColumn::make('no')
->label('NO')
->state(function ($record) use (&$rowNumber) {
// Increment and return the row number
return ++$rowNumber;
}),
ExportColumn::make('plant.name')
->label('PLANT'),
ExportColumn::make('line.name')
->label('LINE'),
ExportColumn::make('c_type')
->label('TYPE'),
ExportColumn::make('c_group')
->label('GROUP'),
ExportColumn::make('c_name')
->label('NAME'),
ExportColumn::make('c_value')
->label('VALUE'),
ExportColumn::make('created_at')
->label('CREATED AT'),
ExportColumn::make('updated_at')
->label('UPDATED AT'),
ExportColumn::make('deleted_at')
->enabledByDefault(false)
->label('DELETED AT'),
];
}
public static function getCompletedNotificationBody(Export $export): string
{
$body = 'Your configuration export has completed and ' . number_format($export->successful_rows) . ' ' . str('row')->plural($export->successful_rows) . ' exported.';
if ($failedRowsCount = $export->getFailedRowsCount()) {
$body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to export.';
}
return $body;
}
}

View File

@@ -0,0 +1,57 @@
<?php
namespace App\Filament\Exports;
use App\Models\GuardName;
use Filament\Actions\Exports\ExportColumn;
use Filament\Actions\Exports\Exporter;
use Filament\Actions\Exports\Models\Export;
class GuardNameExporter extends Exporter
{
protected static ?string $model = GuardName::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.name')
->label('PLANT'),
ExportColumn::make('name')
->label('GUARD NAME'),
ExportColumn::make('identification1')
->label('IDENTIFICATION 1'),
ExportColumn::make('identification2')
->label('IDENTIFICATION 2'),
ExportColumn::make('created_at')
->label('CREATED AT'),
ExportColumn::make('created_by')
->label('CREATED BY'),
ExportColumn::make('updated_at')
->label('UPDATED AT'),
ExportColumn::make('deleted_at')
->enabledByDefault(false)
->label('DELETED AT'),
];
}
public static function getCompletedNotificationBody(Export $export): string
{
$body = 'Your guard name export has completed and ' . number_format($export->successful_rows) . ' ' . str('row')->plural($export->successful_rows) . ' exported.';
if ($failedRowsCount = $export->getFailedRowsCount()) {
$body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to export.';
}
return $body;
}
}

View File

@@ -0,0 +1,65 @@
<?php
namespace App\Filament\Exports;
use App\Models\GuardPatrolEntry;
use Filament\Actions\Exports\ExportColumn;
use Filament\Actions\Exports\Exporter;
use Filament\Actions\Exports\Models\Export;
class GuardPatrolEntryExporter extends Exporter
{
protected static ?string $model = GuardPatrolEntry::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('id')
// ->label('ID'),
ExportColumn::make('plant.name')
->label('PLANT'),
ExportColumn::make('guardNames.name')
->label('GUARD NAME'),
ExportColumn::make('checkPointNames.name')
->label('CHECK POINT NAME'),
// ExportColumn::make('reader_code')
// ->label('READER CODE'),
ExportColumn::make('patrol_time')
->label('PATROL TIME'),
ExportColumn::make('created_at')
->enabledByDefault(false)
->label('CREATED AT'),
ExportColumn::make('created_by')
->enabledByDefault(false)
->label('CREATED BY'),
ExportColumn::make('updated_at')
->enabledByDefault(false)
->label('UPDATED AT'),
ExportColumn::make('Updated_by')
->enabledByDefault(false)
->label('UPDATED BY'),
ExportColumn::make('deleted_at')
->enabledByDefault(false)
->label('DELETED AT'),
];
}
public static function getCompletedNotificationBody(Export $export): string
{
$body = 'Your guard patrol entry 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

@@ -13,25 +13,33 @@ class InvoiceValidationExporter extends Exporter
public static function getColumns(): array
{
static $rowNumber = 0;
return [
ExportColumn::make('id')
->label('ID'),
ExportColumn::make('stickerMaster.item.code')
->label('ITEM CODE'),
// 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.name')
->label('PLANT'),
ExportColumn::make('invoice_number')
->label('INVOICE NUMBER'),
ExportColumn::make('serial_number')
->label('SERIAL NUMBER'),
ExportColumn::make('stickerMaster.item.code')
->label('ITEM CODE'),
ExportColumn::make('motor_scanned_status')
->label('MOTOR SCANNED STATUS'),
ExportColumn::make('pump_scanned_status')
->label('PUMP SCANNED STATUS'),
ExportColumn::make('scanned_status_set')
->label('PUMPSET SCANNED STATUS'),
ExportColumn::make('capacitor_scanned_status')
->label('CAPACITOR SCANNED STATUS'),
ExportColumn::make('scanned_status_set')
->label('SCANNED STATUS SET'),
ExportColumn::make('scanned_status')
->label('SCANNED STATUS'),
ExportColumn::make('panel_box_supplier')
@@ -46,6 +54,8 @@ class InvoiceValidationExporter extends Exporter
->label('BATCH NUMBER'),
ExportColumn::make('quantity')
->label('QUANTITY'),
ExportColumn::make('operator_id')
->label('OPERATOR ID'),
ExportColumn::make('created_at')
->label('CREATED AT'),
//->dateTimeFormat('d-m-Y H:i:s'),
@@ -53,10 +63,9 @@ class InvoiceValidationExporter extends Exporter
->label('UPDATED AT'),
//->dateTimeFormat('d-m-Y H:i:s'),
ExportColumn::make('deleted_at')
->enabledByDefault(false)
->label('DELETED AT'),
//->dateTimeFormat('d-m-Y H:i:s'),
ExportColumn::make('operator_id')
->label('OPERATOR ID'),
];
}

View File

@@ -13,23 +13,35 @@ class ItemExporter extends Exporter
public static function getColumns(): array
{
static $rowNumber = 0;
return [
ExportColumn::make('id')
->label('ID'),
// 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.name')
->label('PLANT'),
ExportColumn::make('category')
->label('CATEGORY'),
ExportColumn::make('code')
->label('CODE'),
ExportColumn::make('description')
->label('DESCRIPTION'),
ExportColumn::make('hourly_quantity')
->label('HOURLY QUANTITY'),
ExportColumn::make('plant.name')
->label('PLANT'),
ExportColumn::make('uom')
->label('UNIT OF MEASURE'),
ExportColumn::make('created_at')
->label('CREATED AT'),
ExportColumn::make('updated_at')
->label('UPDATED AT'),
ExportColumn::make('deleted_at')
// ->enabledByDefault(false)
->enabledByDefault(false)
->label('DELETED AT'),
];
}

View File

@@ -0,0 +1,55 @@
<?php
namespace App\Filament\Exports;
use App\Models\Line;
use Filament\Actions\Exports\ExportColumn;
use Filament\Actions\Exports\Exporter;
use Filament\Actions\Exports\Models\Export;
class LineExporter extends Exporter
{
protected static ?string $model = Line::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.name')
->label('PLANT'),
ExportColumn::make('name')
->label('NAME'),
ExportColumn::make('type')
->label('TYPE'),
ExportColumn::make('group_work_center')
->label('GROUP WORK CENTER'),
ExportColumn::make('created_at')
->label('CREATED AT'),
ExportColumn::make('updated_at')
->label('UPDATED AT'),
ExportColumn::make('deleted_at')
->enabledByDefault(false)
->label('DELETED AT'),
];
}
public static function getCompletedNotificationBody(Export $export): string
{
$body = 'Your line export has completed and ' . number_format($export->successful_rows) . ' ' . str('row')->plural($export->successful_rows) . ' exported.';
if ($failedRowsCount = $export->getFailedRowsCount()) {
$body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to export.';
}
return $body;
}
}

View File

@@ -0,0 +1,51 @@
<?php
namespace App\Filament\Exports;
use App\Models\LineStop;
use Filament\Actions\Exports\ExportColumn;
use Filament\Actions\Exports\Exporter;
use Filament\Actions\Exports\Models\Export;
class LineStopExporter extends Exporter
{
protected static ?string $model = LineStop::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('code')
->label('LINE STOP CODE'),
ExportColumn::make('reason')
->label('LINE STOP REASON'),
ExportColumn::make('created_at')
->label('CREATED AT'),
ExportColumn::make('updated_at')
->label('UPDATED AT'),
ExportColumn::make('deleted_at')
->enabledByDefault(false)
->label('DELETED AT'),
];
}
public static function getCompletedNotificationBody(Export $export): string
{
$body = 'Your line stop export has completed and ' . number_format($export->successful_rows) . ' ' . str('row')->plural($export->successful_rows) . ' exported.';
if ($failedRowsCount = $export->getFailedRowsCount()) {
$body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to export.';
}
return $body;
}
}

View File

@@ -0,0 +1,55 @@
<?php
namespace App\Filament\Exports;
use App\Models\Locator;
use Filament\Actions\Exports\ExportColumn;
use Filament\Actions\Exports\Exporter;
use Filament\Actions\Exports\Models\Export;
class LocatorExporter extends Exporter
{
protected static ?string $model = Locator::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('locator_number')
->label('LOCATOR NUMBER'),
ExportColumn::make('locator_quantity')
->label('LOCATOR QUANTITY'),
ExportColumn::make('operator_id')
->label('OPERATOR ID'),
ExportColumn::make('created_at')
->label('CREATED AT'),
ExportColumn::make('updated_at')
->label('UPDATED AT'),
ExportColumn::make('deleted_at')
->enabledByDefault(false)
->label('DELETED AT'),
];
}
public static function getCompletedNotificationBody(Export $export): string
{
$body = 'Your locator export has completed and ' . number_format($export->successful_rows) . ' ' . str('row')->plural($export->successful_rows) . ' exported.';
if ($failedRowsCount = $export->getFailedRowsCount()) {
$body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to export.';
}
return $body;
}
}

View File

@@ -0,0 +1,68 @@
<?php
namespace App\Filament\Exports;
use App\Models\LocatorInvoiceValidation;
use Filament\Actions\Exports\ExportColumn;
use Filament\Actions\Exports\Exporter;
use Filament\Actions\Exports\Models\Export;
class LocatorInvoiceValidationExporter extends Exporter
{
protected static ?string $model = LocatorInvoiceValidation::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('invoice_number')
->label('INVOICE NUMBER'),
ExportColumn::make('serial_number')
->label('SERIAL NUMBER'),
ExportColumn::make('pallet_number')
->label('PALLET NUMBER'),
ExportColumn::make('locator_number')
->label('LOCATOR NUMBER'),
ExportColumn::make('scanned_status')
->label('SCANNED STATUS'),
ExportColumn::make('upload_status')
->label('UPLOAD STATUS'),
ExportColumn::make('created_by')
->label('CREATED BY'),
ExportColumn::make('created_at')
->label('CREATED AT'),
ExportColumn::make('updated_by')
->label('UPDATED BY'),
ExportColumn::make('updated_at')
->label('UPDATED AT'),
ExportColumn::make('scanned_by')
->label('SCANNED BY'),
ExportColumn::make('scanned_at')
->label('SCANNED AT'),
ExportColumn::make('deleted_at')
->label('DELETED AT')
->enabledByDefault(false),
];
}
public static function getCompletedNotificationBody(Export $export): string
{
$body = 'Your locator invoice validation export has completed and ' . number_format($export->successful_rows) . ' ' . str('row')->plural($export->successful_rows) . ' exported.';
if ($failedRowsCount = $export->getFailedRowsCount()) {
$body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to export.';
}
return $body;
}
}

View File

@@ -0,0 +1,53 @@
<?php
namespace App\Filament\Exports;
use App\Models\Machine;
use Filament\Actions\Exports\ExportColumn;
use Filament\Actions\Exports\Exporter;
use Filament\Actions\Exports\Models\Export;
class MachineExporter extends Exporter
{
protected static ?string $model = Machine::class;
public static function getColumns(): array
{
static $rowNumber = 0;
return [
ExportColumn::make('no')
->label('NO')
->state(function ($record) use (&$rowNumber) {
// Increment and return the row number
return ++$rowNumber;
}),
ExportColumn::make('plant.name')
->label('PLANT'),
ExportColumn::make('line.name')
->label('LINE'),
ExportColumn::make('name')
->label('MACHINE'),
ExportColumn::make('work_center')
->label('WORK CENTER'),
ExportColumn::make('created_at')
->label('CREATED AT'),
ExportColumn::make('updated_at')
->label('UPDATED AT'),
ExportColumn::make('deleted_at')
->enabledByDefault(false)
->label('DELETED AT'),
];
}
public static function getCompletedNotificationBody(Export $export): string
{
$body = 'Your machine export has completed and ' . number_format($export->successful_rows) . ' ' . str('row')->plural($export->successful_rows) . ' exported.';
if ($failedRowsCount = $export->getFailedRowsCount()) {
$body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to export.';
}
return $body;
}
}

View File

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

View File

@@ -0,0 +1,115 @@
<?php
namespace App\Filament\Exports;
use App\Models\MotorTestingMaster;
use Filament\Actions\Exports\ExportColumn;
use Filament\Actions\Exports\Exporter;
use Filament\Actions\Exports\Models\Export;
class MotorTestingMasterExporter extends Exporter
{
protected static ?string $model = MotorTestingMaster::class;
public static function getColumns(): array
{
static $rowNumber = 0;
return [
ExportColumn::make('no')
->label('NO')
->state(function ($record) use (&$rowNumber) {
// Increment and return the row number
return ++$rowNumber;
}),
ExportColumn::make('plant.name')
->label('PLANT'),
ExportColumn::make('item.category')
->label('CATEGORY'),
ExportColumn::make('item.code')
->label('ITEM CODE'),
ExportColumn::make('item.description')
->label('DESCRIPTION'),
ExportColumn::make('isi_model')
->label('ISI MODEL'),
ExportColumn::make('phase')
->label('PHASE'),
ExportColumn::make('hp')
->label('HP'),
ExportColumn::make('kw')
->label('KW'),
ExportColumn::make('volt')
->label('VOLT'),
ExportColumn::make('current')
->label('CURRENT'),
ExportColumn::make('rpm')
->label('RPM'),
ExportColumn::make('torque')
->label('TORQUE'),
ExportColumn::make('frequency')
->label('FREQUENCY'),
ExportColumn::make('connection')
->label('CONNECTION'),
ExportColumn::make('ins_res_limit')
->label('INSULATION RESISTANCE LIMIT'),
ExportColumn::make('ins_res_type')
->label('INSULATION RESISTANCE TYPE'),
ExportColumn::make('routine_test_time')
->label('ROUTINE TEST TIME'),
ExportColumn::make('res_ry_ll')
->label('RESISTANCE RY LL'),
ExportColumn::make('res_ry_ul')
->label('RESISTANCE RY UL'),
ExportColumn::make('res_yb_ll')
->label('RESISTANCE YB LL'),
ExportColumn::make('res_yb_ul')
->label('RESISTANCE YB UL'),
ExportColumn::make('res_br_ll')
->label('RESISTANCE BR LL'),
ExportColumn::make('res_br_ul')
->label('RESISTANCE BR UL'),
ExportColumn::make('lock_volt_limit')
->label('LOCK VOLT Limit'),
ExportColumn::make('leak_cur_limit')
->label('Leak CURRENT Limit'),
ExportColumn::make('lock_cur_ll')
->label('LOCK CURRENT LL'),
ExportColumn::make('lock_cur_ul')
->label('LOCK CURRENT UL'),
ExportColumn::make('noload_cur_ll')
->label('NO LOAD CURRENT LL'),
ExportColumn::make('noload_cur_ul')
->label('NO LOAD CURRENT UL'),
ExportColumn::make('noload_pow_ll')
->label('NO LOAD POWER LL'),
ExportColumn::make('noload_pow_ul')
->label('NO LOAD POWER UL'),
ExportColumn::make('noload_spd_ll')
->label('NO LOAD SPEED LL'),
ExportColumn::make('noload_spd_ul')
->label('NO LOAD SPEED UL'),
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 motor testing master export has completed and ' . number_format($export->successful_rows) . ' ' . str('row')->plural($export->successful_rows) . ' exported.';
if ($failedRowsCount = $export->getFailedRowsCount()) {
$body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to export.';
}
return $body;
}
}

View File

@@ -0,0 +1,67 @@
<?php
namespace App\Filament\Exports;
use App\Models\PalletValidation;
use Filament\Actions\Exports\ExportColumn;
use Filament\Actions\Exports\Exporter;
use Filament\Actions\Exports\Models\Export;
class PalletValidationExporter extends Exporter
{
protected static ?string $model = PalletValidation::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('pallet_number')
->label('PALLET NUMBER'),
ExportColumn::make('serial_number')
->label('SERIAL NUMBER'),
ExportColumn::make('pallet_status')
->label('PALLET STATUS'),
ExportColumn::make('locator_number')
->label('LOCATOR NUMBER'),
ExportColumn::make('locator_quantity')
->label('LOCATOR QUANTITY'),
ExportColumn::make('created_by')
->label('CREATED BY'),
ExportColumn::make('created_at')
->label('CREATED AT'),
ExportColumn::make('updated_by')
->label('UPDATED BY'),
ExportColumn::make('updated_at')
->label('UPDATED AT'),
ExportColumn::make('scanned_by')
->label('SCANNED BY'),
ExportColumn::make('scanned_at')
->label('SCANNED AT'),
ExportColumn::make('deleted_at')
->label('DELETED AT')
->enabledByDefault(false),
];
}
public static function getCompletedNotificationBody(Export $export): string
{
$body = 'Your pallet validation export has completed and ' . number_format($export->successful_rows) . ' ' . str('row')->plural($export->successful_rows) . ' exported.';
if ($failedRowsCount = $export->getFailedRowsCount()) {
$body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to export.';
}
return $body;
}
}

View File

@@ -0,0 +1,55 @@
<?php
namespace App\Filament\Exports;
use App\Models\Plant;
use Filament\Actions\Exports\ExportColumn;
use Filament\Actions\Exports\Exporter;
use Filament\Actions\Exports\Models\Export;
class PlantExporter extends Exporter
{
protected static ?string $model = Plant::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('company.name')
->label('COMPANY'),
ExportColumn::make('code')
->label('CODE'),
ExportColumn::make('name')
->label('NAME'),
ExportColumn::make('address')
->label('ADDRESS'),
ExportColumn::make('created_at')
->label('CREATED AT'),
ExportColumn::make('updated_at')
->label('UPDATED AT'),
ExportColumn::make('deleted_at')
->enabledByDefault(false)
->label('DELETED AT'),
];
}
public static function getCompletedNotificationBody(Export $export): string
{
$body = 'Your plant 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

@@ -13,9 +13,17 @@ class ProductionLineStopExporter extends Exporter
public static function getColumns(): array
{
static $rowNumber = 0;
return [
ExportColumn::make('id')
->label('ID'),
// 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('linestop.code')
->label('CODE'),
ExportColumn::make('linestop.reason')
@@ -30,15 +38,20 @@ class ProductionLineStopExporter extends Exporter
->label('STOP MINUTE'),
ExportColumn::make('line.name')
->label('LINE'),
ExportColumn::make('shift.block.name')
->label('BLOCK'),
ExportColumn::make('shift.name')
->label('SHIFT'),
ExportColumn::make('plant.name')
->label('PLANT'),
ExportColumn::make('operator_id')
->label('OPERATOR ID'),
ExportColumn::make('created_at')
->label('CREATED AT'),
ExportColumn::make('updated_at')
->label('UPDATED AT'),
ExportColumn::make('deleted_at')
->enabledByDefault(false)
->label('DELETED AT'),
];
}

View File

@@ -13,24 +13,37 @@ class ProductionPlanExporter extends Exporter
public static function getColumns(): array
{
static $rowNumber = 0;
return [
ExportColumn::make('id')
->label('ID'),
// 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('plan_quantity')
->label('PLAN QUANTITY'),
ExportColumn::make('production_quantity')
->label('PRODUCTION QUANTITY'),
ExportColumn::make('line.name')
->label('LINE'),
ExportColumn::make('shift.block.name')
->label('BLOCK'),
ExportColumn::make('shift.name')
->label('SHIFT'),
ExportColumn::make('plant.name')
->label('PLANT'),
ExportColumn::make('operator_id')
->label('OPERATOR ID'),
ExportColumn::make('created_at')
->label('CREATED AT'),
ExportColumn::make('updated_at')
->label('UPDATED AT'),
ExportColumn::make('deleted_at')
->enabledByDefault(false)
->label('DELETED AT'),
];
}

View File

@@ -13,24 +13,45 @@ class ProductionQuantityExporter extends Exporter
public static function getColumns(): array
{
static $rowNumber = 0;
return [
ExportColumn::make('id')
->label('ID'),
ExportColumn::make('item.code')
->label('ITEM CODE'),
// 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('production_order')
->label('PRODUCTION ORDER'),
ExportColumn::make('serial_number')
->label('SERIAL NUMBER'),
ExportColumn::make('item.code')
->label('ITEM CODE'),
ExportColumn::make('item.uom')
->label('UNIT OF MEASURE'),
ExportColumn::make('line.name')
->label('LINE'),
ExportColumn::make('shift.block.name')
->label('BLOCK'),
ExportColumn::make('shift.name')
->label('SHIFT'),
ExportColumn::make('plant.name')
->label('PLANT'),
ExportColumn::make('sap_msg_status')
->label('SAP MESSAGE STATUS'),
ExportColumn::make('sap_msg_description')
->label('SAP MESSAGE DESCRIPTION'),
ExportColumn::make('operator_id')
->label('OPERATOR ID'),
ExportColumn::make('created_at')
->label('CREATED AT'),
ExportColumn::make('updated_at')
->label('UPDATED AT'),
ExportColumn::make('deleted_at')
->enabledByDefault(false)
->label('DELETED AT'),
];
}

View File

@@ -0,0 +1,101 @@
<?php
namespace App\Filament\Exports;
use App\Models\QualityValidation;
use Filament\Actions\Exports\ExportColumn;
use Filament\Actions\Exports\Exporter;
use Filament\Actions\Exports\Models\Export;
class QualityValidationExporter extends Exporter
{
protected static ?string $model = QualityValidation::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.name')
->label('PLANT'),
ExportColumn::make('line.name')
->label('LINE'),
ExportColumn::make('production_order')
->label('PRODUCTION ORDER'),
ExportColumn::make('serial_number')
->label('SERIAL NUMBER'),
ExportColumn::make('stickerMaster.item.code')
->label('ITEM CODE'),
ExportColumn::make('uom')
->label('UNIT OF MEASURE'),
ExportColumn::make('serial_number_motor')
->label('SERIAL NUMBER MOTOR'),
ExportColumn::make('serial_number_pump')
->label('SERIAL NUMBER PUMP'),
ExportColumn::make('serial_number_pumpset')
->label('SERIAL NUMBER PUMPSET'),
ExportColumn::make('pack_slip_motor')
->label('PACK SLIP MOTOR'),
ExportColumn::make('pack_slip_pump')
->label('PACK SLIP PUMP'),
ExportColumn::make('pack_slip_pumpset')
->label('PACK SLIP PUMPSET'),
ExportColumn::make('name_plate_motor')
->label('NAME PLATE MOTOR'),
ExportColumn::make('name_plate_pump')
->label('NAME PLATE PUMP'),
ExportColumn::make('name_plate_pumpset')
->label('NAME PLATE PUMPSET'),
ExportColumn::make('tube_sticker_motor')
->label('TUBE STICKER MOTOR'),
ExportColumn::make('tube_sticker_pump')
->label('TUBE STICKER PUMP'),
ExportColumn::make('tube_sticker_pumpset')
->label('TUBE STICKER PUMPSET'),
ExportColumn::make('warranty_card')
->label('WARRANTY CARD'),
ExportColumn::make('part_validation1')
->label('PART VALIDATION 1'),
ExportColumn::make('part_validation2')
->label('PART VALIDATION 2'),
ExportColumn::make('part_validation3')
->label('PART VALIDATION 3'),
ExportColumn::make('part_validation4')
->label('PART VALIDATION 4'),
ExportColumn::make('part_validation5')
->label('PART VALIDATION 5'),
ExportColumn::make('sap_msg_status')
->label('SAP MESSAGE STATUS'),
ExportColumn::make('sap_msg_description')
->label('SAP MESSAGE DESCRIPTION'),
ExportColumn::make('operator_id')
->label('OPERATOR ID'),
ExportColumn::make('created_at')
->label('CREATED AT'),
ExportColumn::make('updated_at')
->label('UPDATED AT'),
ExportColumn::make('deleted_at')
->label('DELETED AT')
->enabledByDefault(false),
];
}
public static function getCompletedNotificationBody(Export $export): string
{
$body = 'Your quality validation export has completed and ' . number_format($export->successful_rows) . ' ' . str('row')->plural($export->successful_rows) . ' exported.';
if ($failedRowsCount = $export->getFailedRowsCount()) {
$body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to export.';
}
return $body;
}
}

View File

@@ -0,0 +1,73 @@
<?php
namespace App\Filament\Exports;
use App\Models\ReworkLocatorInvoiceValidation;
use Filament\Actions\Exports\ExportColumn;
use Filament\Actions\Exports\Exporter;
use Filament\Actions\Exports\Models\Export;
class ReworkLocatorInvoiceValidationExporter extends Exporter
{
protected static ?string $model = ReworkLocatorInvoiceValidation::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('invoice_number')
->label('INVOICE NUMBER'),
ExportColumn::make('serial_number')
->label('SERIAL NUMBER'),
ExportColumn::make('pallet_number')
->label('PALLET NUMBER'),
ExportColumn::make('locator_number')
->label('LOCATOR NUMBER'),
ExportColumn::make('scanned_status')
->label('SCANNED STATUS'),
ExportColumn::make('upload_status')
->label('UPLOAD STATUS'),
ExportColumn::make('created_by')
->label('CREATED BY'),
ExportColumn::make('created_at')
->label('CREATED AT'),
ExportColumn::make('scanned_by')
->label('SCANNED BY'),
ExportColumn::make('scanned_at')
->label('SCANNED AT'),
ExportColumn::make('updated_by')
->label('UPDATED BY'),
ExportColumn::make('updated_at')
->label('UPDATED AT'),
ExportColumn::make('reworked_by')
->label('REWORKED BY'),
ExportColumn::make('reworked_at')
->label('REWORKED AT'),
ExportColumn::make('deleted_at')
->label('DELETED AT')
->enabledByDefault(false),
];
}
public static function getCompletedNotificationBody(Export $export): string
{
$body = 'Your rework locator invoice validation export has completed and ' . number_format($export->successful_rows) . ' ' . str('row')->plural($export->successful_rows) . ' exported.';
if ($failedRowsCount = $export->getFailedRowsCount()) {
$body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to export.';
}
return $body;
}
}

View File

@@ -0,0 +1,61 @@
<?php
namespace App\Filament\Exports;
use App\Models\Shift;
use Filament\Actions\Exports\ExportColumn;
use Filament\Actions\Exports\Exporter;
use Filament\Actions\Exports\Models\Export;
class ShiftExporter extends Exporter
{
protected static ?string $model = Shift::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('block.name')
->label('BLOCK'),
ExportColumn::make('plant.name')
->label('PLANT'),
ExportColumn::make('name')
->label('NAME'),
ExportColumn::make('start_time')
->label('START TIME'),
ExportColumn::make('duration')
->label('DURATION'),
ExportColumn::make('end_time')
->label('END TIME'),
ExportColumn::make('created_at')
->label('CREATED AT'),
ExportColumn::make('updated_at')
->label('UPDATED AT'),
ExportColumn::make('deleted_at')
->label('DELETED AT')
->enabledByDefault(false),
ExportColumn::make('status')
->label('STATUS'),
];
}
public static function getCompletedNotificationBody(Export $export): string
{
$body = 'Your shift 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

@@ -13,13 +13,21 @@ class StickerMasterExporter extends Exporter
public static function getColumns(): array
{
static $rowNumber = 0;
return [
// ExportColumn::make('id')
// ->label('ID'),
ExportColumn::make('item.code')
->label('ITEM CODE'),
ExportColumn::make('no')
->label('NO')
->state(function ($record) use (&$rowNumber) {
// Increment and return the row number
return ++$rowNumber;
}),
ExportColumn::make('plant.name')
->label('PLANT'),
ExportColumn::make('item.code')
->label('ITEM CODE'),
ExportColumn::make('serial_number_motor')
->label('SERIAL NUMBER MOTOR'),
ExportColumn::make('serial_number_pump')
@@ -56,19 +64,24 @@ class StickerMasterExporter extends Exporter
->label('PART VALIDATION 4'),
ExportColumn::make('part_validation5')
->label('PART VALIDATION 5'),
ExportColumn::make('laser_part_validation1')
->label('LASER PART VALIDATION 1'),
ExportColumn::make('laser_part_validation2')
->label('LASER PART VALIDATION 2'),
ExportColumn::make('panel_box_code')
->label('PANEL BOX CODE'),
ExportColumn::make('load_rate')
->label('LOAD RATE'),
ExportColumn::make('bundle_quantity')
->label('BUNDLE QUANTITY'),
ExportColumn::make('material_type')
->label('MATERIAL TYPE'),
ExportColumn::make('bundle_quantity')
->label('BUNDLE QUANTITY'),
ExportColumn::make('created_at')
->label('CREATED AT'),
ExportColumn::make('updated_at')
->label('UPDATED AT'),
ExportColumn::make('deleted_at')
->enabledByDefault(false)
->label('DELETED AT'),
];
}

View File

@@ -0,0 +1,155 @@
<?php
namespace App\Filament\Exports;
use App\Models\TestingPanelReading;
use Filament\Actions\Exports\ExportColumn;
use Filament\Actions\Exports\Exporter;
use Filament\Actions\Exports\Models\Export;
class TestingPanelReadingExporter extends Exporter
{
protected static ?string $model = TestingPanelReading::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.name')
->label('PLANT'),
ExportColumn::make('line.name')
->label('LINE'),
ExportColumn::make('machine.name')
->label('MACHINE'),
ExportColumn::make('item.code')
->label('ITEM CODE'),
ExportColumn::make('item.description')
->label('MODEL'),
ExportColumn::make('output')
->label('OUTPUT'),
ExportColumn::make('serial_number')
->label('SERIAL NUMBER'),
ExportColumn::make('item.kw')
->label('KW'),
ExportColumn::make('item.hp')
->label('HP'),
ExportColumn::make('item.phase')
->label('PHASE'),
ExportColumn::make('item.connection')
->label('CONNECTION'),
ExportColumn::make('item.isi_model')
->label('ISI MODEL'),
ExportColumn::make('before_fr_volt')
->label('BEFORE FR VOLT'),
ExportColumn::make('before_fr_cur')
->label('BEFORE FR CURRENT'),
ExportColumn::make('before_fr_pow')
->label('BEFORE FR POWER'),
ExportColumn::make('before_fr_res_ry')
->label('BEFORE FR RESISTANCE RY'),
ExportColumn::make('before_fr_res_yb')
->label('BEFORE FR RESISTANCE YB'),
ExportColumn::make('before_fr_res_br')
->label('BEFORE FR RESISTANCE BR'),
ExportColumn::make('before_fr_ir')
->label('BEFORE FR IR'),
ExportColumn::make('before_fr_ir_r')
->label('BEFORE FR IR R'),
ExportColumn::make('before_fr_ir_y')
->label('BEFORE FR IR Y'),
ExportColumn::make('before_fr_ir_b')
->label('BEFORE FR IR B'),
ExportColumn::make('before_fr_freq')
->label('BEFORE FR FREQUENCY'),
ExportColumn::make('before_fr_speed')
->label('BEFORE FR SPEED'),
ExportColumn::make('after_fr_vol')
->label('AFTER FR VOLT'),
ExportColumn::make('after_fr_cur')
->label('AFTER FR CURRENT'),
ExportColumn::make('after_fr_pow')
->label('AFTER FR POWER'),
ExportColumn::make('after_fr_ir_hot')
->label('AFTER FR IR HOT'),
ExportColumn::make('after_fr_ir_hot_r')
->label('AFTER FR IR HOT R'),
ExportColumn::make('after_fr_ir_hot_y')
->label('AFTER FR IR HOT Y'),
ExportColumn::make('after_fr_ir_hot_b')
->label('AFTER FR IR HOT B'),
ExportColumn::make('after_fr_ir_cool')
->label('AFTER FR IR COOL'),
ExportColumn::make('after_fr_ir_cool_r')
->label('AFTER FR IR COOL R'),
ExportColumn::make('after_fr_ir_cool_y')
->label('AFTER FR IR COOL Y'),
ExportColumn::make('after_fr_ir_cool_b')
->label('AFTER FR IR COOL B'),
ExportColumn::make('after_fr_freq')
->label('AFTER FR FREQUENCY'),
ExportColumn::make('after_fr_speed')
->label('AFTER FR SPEED'),
ExportColumn::make('after_fr_leak_cur')
->label('AFTER FR LEAK CURRENT'),
ExportColumn::make('locked_rt_volt')
->label('LOCKED RT VOLT'),
ExportColumn::make('locked_rt_cur')
->label('LOCKED RT CURRENT'),
ExportColumn::make('locked_rt_pow')
->label('LOCKED RT POWER'),
ExportColumn::make('no_load_pickup_volt')
->label('NO LOAD PICKUP VOLT'),
ExportColumn::make('room_temperature')
->label('ROOM TEMPERATURE'),
ExportColumn::make('hv_test')
->label('HIGH VOLTAGE TEST'),
ExportColumn::make('batch_number')
->label('BATCH NUMBER'),
ExportColumn::make('batch_count')
->label('BATCH COUNT'),
ExportColumn::make('result')
->label('RESULT'),
ExportColumn::make('remark')
->label('REMARK'),
ExportColumn::make('rework_count')
->label('REWORK COUNT'),
ExportColumn::make('update_count')
->label('UPDATE COUNT'),
ExportColumn::make('output_flag')
->label('OUTPUT FLAG'),
ExportColumn::make('tested_by')
->label('TESTED BY'),
ExportColumn::make('updated_by')
->label('UPDATED BY'),
ExportColumn::make('created_at')
->label('CREATED AT'),
ExportColumn::make('updated_at')
->label('UPDATED AT'),
ExportColumn::make('scanned_at')
->label('SCANNED AT'),
ExportColumn::make('deleted_at')
->enabledByDefault(false)
->label('DELETED AT'),
];
}
public static function getCompletedNotificationBody(Export $export): string
{
$body = 'Your testing panel reading export has completed and ' . number_format($export->successful_rows) . ' ' . str('row')->plural($export->successful_rows) . ' exported.';
if ($failedRowsCount = $export->getFailedRowsCount()) {
$body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to export.';
}
return $body;
}
}

View File

@@ -0,0 +1,69 @@
<?php
namespace App\Filament\Exports;
use App\Models\WeightValidation;
use Filament\Actions\Exports\ExportColumn;
use Filament\Actions\Exports\Exporter;
use Filament\Actions\Exports\Models\Export;
class WeightValidationExporter extends Exporter
{
protected static ?string $model = WeightValidation::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.name')
->label('PLANT'),
ExportColumn::make('item.code')
->label('ITEM CODE'),
ExportColumn::make('obd_number')
->label('OBD NUMBER'),
ExportColumn::make('line_number')
->label('LINE NUMBER'),
ExportColumn::make('batch_number')
->label('BATCH NUMBER'),
ExportColumn::make('heat_number')
->label('HEAT NUMBER'),
ExportColumn::make('obd_weight')
->label('ACTUAL WEIGHT'),
ExportColumn::make('vehicle_number')
->label('VEHICLE NUMBER'),
ExportColumn::make('bundle_number')
->label('BUNDLE NUMBER'),
ExportColumn::make('picked_weight')
->label('PICKED WEIGHT'),
ExportColumn::make('scanned_by')
->label('SCANNED BY'),
ExportColumn::make('created_at')
->label('CREATED AT'),
ExportColumn::make('updated_at')
->label('UPDATED AT'),
ExportColumn::make('deleted_at')
->enabledByDefault(false)
->label('DELETED AT'),
];
}
public static function getCompletedNotificationBody(Export $export): string
{
$body = 'Your weight validation export has completed and ' . number_format($export->successful_rows) . ' ' . str('row')->plural($export->successful_rows) . ' exported.';
if ($failedRowsCount = $export->getFailedRowsCount()) {
$body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to export.';
}
return $body;
}
}

View File

@@ -3,10 +3,13 @@
namespace App\Filament\Imports;
use App\Models\Block;
use App\Models\Plant;
use Filament\Actions\Imports\Exceptions\RowImportFailedException;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
use Notification;
use Str;
class BlockImporter extends Importer
{
@@ -33,12 +36,23 @@ class BlockImporter extends Importer
public function resolveRecord(): ?Block
{
$plant = \App\Models\Plant::where('name', $this->data['plant'])->first();
$warnMsg = [];
$plant = Plant::where('name', $this->data['plant'])->first();
if (!$plant) {
$warnMsg[] = "Plant not found";
// $warnMsg[] = "Plant '" . $this->data['plant'] . "' not found";
}
if (Str::length($this->data['name']) < 0) {
$warnMsg[] = "Block name not found";
}
if (!empty($warnMsg)) {
throw new RowImportFailedException(implode(', ', $warnMsg));
}
return Block::updateOrCreate([
'name' => $this->data['name'],
'plant_id' => $plant->id
]
);
'name' => $this->data['name'],
'plant_id' => $plant->id
]);
// return Block::firstOrNew([
// // Update existing records, matching them by `$this->data['column_name']`
// 'email' => $this->data['email'],

View File

@@ -0,0 +1,87 @@
<?php
namespace App\Filament\Imports;
use App\Models\CheckPointName;
use App\Models\Plant;
use Filament\Actions\Imports\Exceptions\RowImportFailedException;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
use Filament\Facades\Filament;
use Str;
class CheckPointNameImporter extends Importer
{
protected static ?string $model = CheckPointName::class;
public static function getColumns(): array
{
return [
ImportColumn::make('plant')
->requiredMapping()
->exampleHeader('Plant Name')
->example('Ransar Industries-I')
->label('Plant Name')
->relationship(resolveUsing: 'name')
->rules(['required']),
ImportColumn::make('name')
->requiredMapping()
->exampleHeader('Check Point Name')
->example('STP BACKSIDE')
->label('Check Point Name')
->rules(['required']),
ImportColumn::make('created_by')
->requiredMapping()
->exampleHeader('Created By')
->example(Filament::auth()->user()->name ?? 'Admin')
->label('Created By')
->rules(['required']),
];
}
public function resolveRecord(): ?CheckPointName
{
$warnMsg = [];
$plant = Plant::where('name', $this->data['plant'])->first();
if (!$plant) {
$warnMsg[] = "Plant not found"; // '" . $this->data['plant'] . "'
}
if (Str::length($this->data['name']) < 3) { // || !ctype_alnum($this->data['name'])
$warnMsg[] = "Invalid check point name found";
}
$createdBy = $this->data['created_by'];
if (Str::length($createdBy) < 3) { // || !ctype_alnum($createdBy)
$warnMsg[] = "Invalid created by name found";
}
if (!empty($warnMsg)) {
throw new RowImportFailedException(implode(', ', $warnMsg));
}
return CheckPointName::updateOrCreate([
'name' => $this->data['name'],
'plant_id' => $plant->id
],
[
'created_by' => $this->data['created_by']
]
);
// // return CheckPointName::firstOrNew([
// // // Update existing records, matching them by `$this->data['column_name']`
// // 'email' => $this->data['email'],
// // ]);
// return new CheckPointName();
}
public static function getCompletedNotificationBody(Import $import): string
{
$body = 'Your check point name import has completed and ' . number_format($import->successful_rows) . ' ' . str('row')->plural($import->successful_rows) . ' imported.';
if ($failedRowsCount = $import->getFailedRowsCount()) {
$body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to import.';
}
return $body;
}
}

View File

@@ -0,0 +1,153 @@
<?php
namespace App\Filament\Imports;
use App\Models\CheckPointName;
use App\Models\CheckPointTime;
use App\Models\Plant;
use Filament\Actions\Imports\Exceptions\RowImportFailedException;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
use Filament\Facades\Filament;
use Str;
class CheckPointTimeImporter extends Importer
{
protected static ?string $model = CheckPointTime::class;
public static function getColumns(): array
{
return [
ImportColumn::make('plant')
->requiredMapping()
->exampleHeader('Plant Name')
->example('Ransar Industries-I')
->label('Plant Name')
->relationship(resolveUsing: 'name')
->rules(['required']),
ImportColumn::make('checkPointNames1')
->requiredMapping()
->exampleHeader('Check Point 1')
->example('STP BACKSIDE')
->label('Check Point 1')
->relationship(resolveUsing: 'name')
->rules(['required']),
ImportColumn::make('checkPointNames2')
->requiredMapping()
->exampleHeader('Check Point 2')
->example('CANTEEN')
->label('Check Point 2')
->relationship(resolveUsing: 'name')
->rules(['required']),
ImportColumn::make('sequence_number')
->requiredMapping()
->exampleHeader('Sequence Number')
->example('1')
->label('Sequence Number')
->integer()
->rules(['required']),
ImportColumn::make('time_lapse')
->requiredMapping()
->exampleHeader('Time Lapse')
->example('1')
->label('Time Lapse')
->integer()
->rules(['required']),
ImportColumn::make('time_lapse_cushioning')
->requiredMapping()
->exampleHeader('Time Lapse Cushioning')
->example('1')
->label('Time Lapse Cushioning')
->integer()
->rules(['required']),
ImportColumn::make('created_by')
->requiredMapping()
->exampleHeader('Created By')
->example(Filament::auth()->user()->name ?? 'Admin')
->label('Created By')
->rules(['required']),
];
}
public function resolveRecord(): ?CheckPointTime
{
$warnMsg = [];
$plant = Plant::where('name', $this->data['plant'])->first();
$checkPointNames1 = null;
$checkPointNames2 = null;
if (!$plant) {
$warnMsg[] = "Plant not found"; // '" . $this->data['plant'] . "'
}
else
{
$checkPointNames1 = CheckPointName::where('name', $this->data['checkPointNames1'])->first();
if (!$checkPointNames1) {
$warnMsg[] = "Check point 1 not found";
}
else
{
$checkPointNames2 = CheckPointName::where('name', $this->data['checkPointNames2'])->first();
if (!$checkPointNames2) {
$warnMsg[] = "Check point 2 not found";
}
else
{
if ($checkPointNames1->id === $checkPointNames2->id) {
$warnMsg[] = "Check point 1 and 2 can't be the same";
}
}
}
}
if (Str::length($this->data['sequence_number']) < 1 || !is_numeric($this->data['sequence_number']) || $this->data['sequence_number'] <= 0) {
$warnMsg[] = "Invalid sequence number found";
}
if (Str::length($this->data['time_lapse']) < 1 || !is_numeric($this->data['time_lapse']) || $this->data['time_lapse'] <= 0) {
$warnMsg[] = "Invalid time lapse found";
}
if (Str::length($this->data['time_lapse_cushioning']) < 1 || !is_numeric($this->data['time_lapse_cushioning']) || $this->data['time_lapse_cushioning'] <= 0) {
$warnMsg[] = "Invalid time lapse cushioning found";
}
$createdBy = $this->data['created_by'];
if (Str::length($createdBy) < 3) { // || !ctype_alnum($createdBy)
$warnMsg[] = "Invalid created by name found";
}
if (!empty($warnMsg)) {
throw new RowImportFailedException(implode(', ', $warnMsg));
}
return CheckPointTime::updateOrCreate([
'plant_id' => $plant->id,
'check_point1_id' => $checkPointNames1->id,
'check_point2_id' => $checkPointNames2->id,
'sequence_number' => $this->data['sequence_number']
],
[
'time_lapse' => $this->data['time_lapse'],
'time_lapse_cushioning' => $this->data['time_lapse_cushioning'],
'created_by' => $this->data['created_by']
]
);
// // return CheckPointTime::firstOrNew([
// // // Update existing records, matching them by `$this->data['column_name']`
// // 'email' => $this->data['email'],
// // ]);
// return new CheckPointTime();
}
public static function getCompletedNotificationBody(Import $import): string
{
$body = 'Your check point time 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

@@ -3,9 +3,11 @@
namespace App\Filament\Imports;
use App\Models\Company;
use Filament\Actions\Imports\Exceptions\RowImportFailedException;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
use Str;
class CompanyImporter extends Importer
{
@@ -25,6 +27,9 @@ class CompanyImporter extends Importer
public function resolveRecord(): ?Company
{
if (Str::length($this->data['name']) < 0) {
throw new RowImportFailedException("Company name not found");
}
return Company::updateOrCreate([
'name' => $this->data['name']
]

View File

@@ -0,0 +1,78 @@
<?php
namespace App\Filament\Imports;
use App\Models\Configuration;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
class ConfigurationImporter extends Importer
{
protected static ?string $model = Configuration::class;
public static function getColumns(): array
{
return [
ImportColumn::make('c_type')
->requiredMapping()
->exampleHeader('Type')
->example(['Testing Panel Readings'])
->label('Type')
->rules(['required']),
ImportColumn::make('c_group')
->requiredMapping()
->exampleHeader('Group')
->example(['LMC_WINDED'])
->label('Group')
->rules(['required']),
ImportColumn::make('c_name')
->requiredMapping()
->exampleHeader('Name')
->example(['MOTOR_PHASE'])
->label('Name')
->rules(['required']),
ImportColumn::make('c_value')
->requiredMapping()
->exampleHeader('Value')
->example(['Single'])
->label('Value')
->rules(['required']),
ImportColumn::make('line')
->requiredMapping()
->relationship(resolveUsing: 'name')
->exampleHeader('Plant')
->example(['4 inch pump line'])
->label('Line')
->rules(['required']),
ImportColumn::make('plant')
->requiredMapping()
->relationship(resolveUsing: 'name')
->exampleHeader('Plant')
->example(['Ransar Industries-I'])
->label('Plant')
->rules(['required']),
];
}
public function resolveRecord(): ?Configuration
{
// return Configuration::firstOrNew([
// // Update existing records, matching them by `$this->data['column_name']`
// 'email' => $this->data['email'],
// ]);
return new Configuration();
}
public static function getCompletedNotificationBody(Import $import): string
{
$body = 'Your configuration import has completed and ' . number_format($import->successful_rows) . ' ' . str('row')->plural($import->successful_rows) . ' imported.';
if ($failedRowsCount = $import->getFailedRowsCount()) {
$body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to import.';
}
return $body;
}
}

View File

@@ -0,0 +1,103 @@
<?php
namespace App\Filament\Imports;
use App\Models\GuardName;
use App\Models\Plant;
use Filament\Actions\Imports\Exceptions\RowImportFailedException;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
use Filament\Facades\Filament;
use Str;
class GuardNameImporter extends Importer
{
protected static ?string $model = GuardName::class;
public static function getColumns(): array
{
return [
ImportColumn::make('plant')
->requiredMapping()
->exampleHeader('Plant Name')
->example('Ransar Industries-I')
->label('Plant Name')
->relationship(resolveUsing: 'name')
->rules(['required']),
ImportColumn::make('name')
->requiredMapping()
->exampleHeader('Guard Name')
->example('Shivaram')
->label('Guard Name')
->rules(['required']),
ImportColumn::make('identification1')
->requiredMapping()
->exampleHeader('Identification 1')
->example('1234567890123456')
->label('Identification 1')
->rules(['required']),
ImportColumn::make('identification2')
->requiredMapping()
->exampleHeader('Identification 2')
->example('')
->label('Identification 2'),
ImportColumn::make('created_by')
->requiredMapping()
->exampleHeader('Created By')
->example(Filament::auth()->user()->name ?? 'Admin')
->label('Created By')
->rules(['required']),
];
}
public function resolveRecord(): ?GuardName
{
$warnMsg = [];
$plant = Plant::where('name', $this->data['plant'])->first();
if (!$plant) {
$warnMsg[] = "Plant not found"; // '" . $this->data['plant'] . "'
}
if (Str::length($this->data['name']) < 3) { // || !ctype_alnum($this->data['name'])
$warnMsg[] = "Invalid guard name found";
}
if (Str::length($this->data['identification1']) < 5) {
$warnMsg[] = "Invalid identification-1 found";
}
$createdBy = $this->data['created_by'];
if (Str::length($createdBy) < 3) { // || !ctype_alnum($createdBy)
$warnMsg[] = "Invalid created by name found";
}
if (!empty($warnMsg)) {
throw new RowImportFailedException(implode(', ', $warnMsg));
}
return GuardName::updateOrCreate([
'name' => $this->data['name'],
'plant_id' => $plant->id
],
[
'identification1' => $this->data['identification1'],
'identification2' => $this->data['identification2'],
'created_by' => $this->data['created_by']
]
);
// // return GuardName::firstOrNew([
// // // Update existing records, matching them by `$this->data['column_name']`
// // 'email' => $this->data['email'],
// // ]);
//return new GuardName();
}
public static function getCompletedNotificationBody(Import $import): string
{
$body = 'Your guard name import has completed and ' . number_format($import->successful_rows) . ' ' . str('row')->plural($import->successful_rows) . ' imported.';
if ($failedRowsCount = $import->getFailedRowsCount()) {
$body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to import.';
}
return $body;
}
}

View File

@@ -0,0 +1,160 @@
<?php
namespace App\Filament\Imports;
use App\Models\CheckPointName;
use App\Models\GuardName;
use App\Models\GuardPatrolEntry;
use App\Models\Plant;
use Carbon\Carbon;
use Filament\Actions\Imports\Exceptions\RowImportFailedException;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
use Filament\Facades\Filament;
use Str;
class GuardPatrolEntryImporter extends Importer
{
protected static ?string $model = GuardPatrolEntry::class;
public static function getColumns(): array
{
return [
ImportColumn::make('plant')
->requiredMapping()
->exampleHeader('Plant Name')
->example('Ransar Industries-I')
->label('Plant Name')
->relationship(resolveUsing: 'name')
->rules(['required']),
ImportColumn::make('guardNames')
->requiredMapping()
->exampleHeader('Guard Name')
->example('ARUMUGAM - HG')
->label('Guard Name')
->relationship(resolveUsing: 'name')
->rules(['required']),
ImportColumn::make('checkPointNames')
->requiredMapping()
->exampleHeader('Check Point Name')
->example('STP BACKSIDE')
->label('Check Point Name')
->relationship(resolveUsing: 'name')
->rules(['required']),
// ImportColumn::make('reader_code')
// ->requiredMapping()
// ->exampleHeader('Reader Code')
// ->example('0C03-25010112')
// ->label('Reader Code'),
ImportColumn::make('patrol_time')
->requiredMapping()
->exampleHeader('Patrol Time')
->example('01-01-2025 08:00:00')
->label('Patrol Time')
->rules(['required']),
// ImportColumn::make('created_by')
// ->requiredMapping()
// ->exampleHeader('Created By')
// ->example(Filament::auth()->user()->name ?? 'Admin')
// ->label('Created By')
// ->rules(['required']),
// ImportColumn::make('updated_by')
// ->requiredMapping()
// ->rules(['required']),
];
}
public function resolveRecord(): ?GuardPatrolEntry
{
$warnMsg = [];
$plant = Plant::where('name', $this->data['plant'])->first();
$guardNames = null;
$checkPointNames = null;
$patrolDateTime = null; //$fdateTime = null;
if (!$plant) {
$warnMsg[] = "Plant not found"; // '" . $this->data['plant'] . "'
}
else
{
$guardNames = GuardName::where('plant_id', $plant->id)->where('name', $this->data['guardNames'])->first();
if (!$guardNames) {
$warnMsg[] = "Guard name not found";
}
else
{
$checkPointNames = CheckPointName::where('plant_id', $plant->id)->where('name', $this->data['checkPointNames'])->first();
if (!$checkPointNames) {
$warnMsg[] = "Check point name not found";
}
else
{
$patrolTime = $this->data['patrol_time'];//$fromDate = $this->data['from_datetime'];
$formats = ['d-m-Y H:i', 'd-m-Y H:i:s']; //'07-05-2025 08:00' or '07-05-2025 08:00:00'
foreach ($formats as $format) {
try {
$patrolDateTime = Carbon::createFromFormat($format, $patrolTime);
break;
} catch (\Exception $e) {
// Optionally collect warning messages
// $warnMsg[] = "Date format mismatch with format: $format";
}
}
if (!isset($patrolDateTime)) {
// throw new \Exception('Invalid date time format');
$warnMsg[] = "Invalid 'Patrol DateTime' format. Expected DD-MM-YYYY HH:MM:SS";
}
else
{
$guardEntryFound = GuardPatrolEntry::where('plant_id', $plant->id)->where('guard_name_id', $guardNames->id)->where('check_point_name_id', $checkPointNames->id)->where('patrol_time', $patrolDateTime->format('Y-m-d H:i:s'))->first();
if ($guardEntryFound) {
$warnMsg[] = "Duplicate guard patrol entry found";
}
}
}
}
}
$createdBy = Filament::auth()->user()->name;// ?? 'Admin'
if (!$createdBy) {
$warnMsg[] = "Invalid created by name found";
}
if (!empty($warnMsg)) {
throw new RowImportFailedException(implode(', ', $warnMsg));
}
GuardPatrolEntry::updateOrCreate([
'plant_id' => $plant->id,
'guard_name_id' => $guardNames->id,
'check_point_name_id' => $checkPointNames->id,
'patrol_time' => $patrolDateTime->format('Y-m-d H:i:s')
],
[
'reader_code' => null,
'created_by' => $createdBy,
'updated_by' => $createdBy
]
);
return null;
// // return GuardPatrolEntry::firstOrNew([
// // // Update existing records, matching them by `$this->data['column_name']`
// // 'email' => $this->data['email'],
// // ]);
// return new GuardPatrolEntry();
}
public static function getCompletedNotificationBody(Import $import): string
{
$body = 'Your guard patrol entry 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

@@ -3,9 +3,12 @@
namespace App\Filament\Imports;
use App\Models\Item;
use App\Models\Plant;
use Filament\Actions\Imports\Exceptions\RowImportFailedException;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
use Str;
class ItemImporter extends Importer
{
@@ -14,6 +17,11 @@ class ItemImporter extends Importer
public static function getColumns(): array
{
return [
ImportColumn::make('category')
->requiredMapping()
->exampleHeader('Category')
->example('Submersible Motor')
->label('Category'),
ImportColumn::make('code')
->requiredMapping()
->exampleHeader('Item Code')
@@ -33,6 +41,11 @@ class ItemImporter extends Importer
->label('Hourly Quantity')
->numeric()
->rules(['required', 'integer']),
ImportColumn::make('uom')
->requiredMapping()
->exampleHeader('Unit of Measure')
->example('EA')
->label('Unit of Measure'),
ImportColumn::make('plant')
->requiredMapping()
->exampleHeader('Plant Name')
@@ -45,14 +58,37 @@ class ItemImporter extends Importer
public function resolveRecord(): ?Item
{
$plant = \App\Models\Plant::where('name', $this->data['plant'])->first();
$warnMsg = [];
$iCode = trim($this->data['code']);
$description = trim($this->data['description']);
$plant = Plant::where('name', $this->data['plant'])->first();
if (!$plant) {
$warnMsg[] = "Plant not found"; // '" . $this->data['plant'] . "'
}
if (Str::length($iCode) < 6 || !ctype_alnum($iCode)) {
$warnMsg[] = "Invalid item code found";
}
// if (Str::length($this->data['uom']) <= 0) {
// $warnMsg[] = "Invalid unit of measure found";
// }
if (Str::length($description) < 5) {
$warnMsg[] = "Invalid description found";
}
if (Str::length($this->data['hourly_quantity']) < 0 || !is_numeric($this->data['hourly_quantity']) || $this->data['hourly_quantity'] <= 0) {
$warnMsg[] = "Invalid hourly quantity found";
}
if (!empty($warnMsg)) {
throw new RowImportFailedException(implode(', ', $warnMsg));
}
return Item::updateOrCreate([
'code' => $this->data['code'],
'code' => $iCode,
'plant_id' => $plant->id
],
[
'description' => $this->data['description'],
'hourly_quantity' => $this->data['hourly_quantity']
'category' => trim($this->data['category']),
'description' => $description,
'hourly_quantity' => $this->data['hourly_quantity'],
'uom' => trim($this->data['uom'])
]
);
// return new Item;

View File

@@ -3,9 +3,12 @@
namespace App\Filament\Imports;
use App\Models\Line;
use App\Models\Plant;
use Filament\Actions\Imports\Exceptions\RowImportFailedException;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
use Str;
class LineImporter extends Importer
{
@@ -26,6 +29,11 @@ class LineImporter extends Importer
->example('Domestic Assembly')
->label('Line Type')
->rules(['required']),
ImportColumn::make('group_work_center')
->requiredMapping()
->exampleHeader('Group Work Center')
->example('RMGCEABC')
->label('Group Work Center'),
ImportColumn::make('plant')
->requiredMapping()
->exampleHeader('Plant Name')
@@ -38,13 +46,27 @@ class LineImporter extends Importer
public function resolveRecord(): ?Line
{
$plant = \App\Models\Plant::where('name', $this->data['plant'])->first();
$warnMsg = [];
$plant = Plant::where('name', $this->data['plant'])->first();
if (!$plant) {
$warnMsg[] = "Plant '" . $this->data['plant'] . "' not found";
}
if (Str::length($this->data['name']) < 0) {
$warnMsg[] = "Line name not found";
}
if (Str::length($this->data['type']) < 0) {
$warnMsg[] = "Line type not found";
}
if (!empty($warnMsg)) {
throw new RowImportFailedException(implode(', ', $warnMsg));
}
return Line::updateOrCreate([
'name' => $this->data['name'],
'plant_id' => $plant->id
],
[
'type' => $this->data['type']
'type' => $this->data['type'],
'group_work_center' => $this->data['group_work_center']
]
);
// return Line::firstOrNew([

View File

@@ -3,9 +3,12 @@
namespace App\Filament\Imports;
use App\Models\LineStop;
use App\Models\Plant;
use Filament\Actions\Imports\Exceptions\RowImportFailedException;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
use Str;
class LineStopImporter extends Importer
{
@@ -31,6 +34,16 @@ class LineStopImporter extends Importer
public function resolveRecord(): ?LineStop
{
$warnMsg = [];
if (Str::length($this->data['code']) < 6 || !ctype_alnum($this->data['code'])) {
$warnMsg[] = "Invalid line stop code found";
}
if (Str::length($this->data['reason']) < 5) {
$warnMsg[] = "Invalid line stop reason found";
}
if (!empty($warnMsg)) {
throw new RowImportFailedException(implode(', ', $warnMsg));
}
return LineStop::updateOrCreate([
'code' => $this->data['code']
],

View File

@@ -0,0 +1,125 @@
<?php
namespace App\Filament\Imports;
use App\Models\Locator;
use App\Models\PalletValidation;
use App\Models\Plant;
use App\Models\User;
use Filament\Actions\Imports\Exceptions\RowImportFailedException;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
use Filament\Facades\Filament;
use Str;
class LocatorImporter extends Importer
{
protected static ?string $model = Locator::class;
public static function getColumns(): array
{
return [
ImportColumn::make('locator_number')
->requiredMapping()
->exampleHeader('Locator Number')
->example(['W01-A1A'])
->label('Locator Number')
->rules(['required']),
ImportColumn::make('locator_quantity')
->requiredMapping()
->numeric()
->exampleHeader('Locator Quantity')
->example(['0'])
->label('Locator Quantity')
->rules(['required', 'integer']),
ImportColumn::make('operator_id')
->requiredMapping()
->exampleHeader('Operator ID')
->example(['Admin'])
->label('Operator ID')
->rules(['required']),
ImportColumn::make('plant')
->requiredMapping()
->relationship(resolveUsing: 'code')
->exampleHeader('Plant Code')
->example(['1000'])
->label('Plant Code')
->rules(['required']),
];
}
public function resolveRecord(): ?Locator
{
$warnMsg = [];
$plantCod = $this->data['plant'];
$plant = null;
$user = null;
$locator = $this->data['locator_number'];
// $locatorQuantity = $this->data['locator_quantity'];
$palletQuantity = 0;
if (Str::length($plantCod) < 4 || !is_numeric($plantCod) || !preg_match('/^[1-9]\d{3,}$/', $plantCod)) {
$warnMsg[] = "Invalid plant code found";
}
else
{
$plant = Plant::where('code', $plantCod)->first();
if (!$plant) {
$warnMsg[] = "Plant not found";
}
else
{
$user = Filament::auth()->user()->name;
if (Str::length($locator) < 7) {
$warnMsg[] = "Invalid locator number found";
}
else {
// $locat = Locator::where('name', $locator)->where('plant_id', $plant->id)->first();
$palletQuantity = PalletValidation::where('locator_number', $locator)->where('plant_id', $plant->id)->distinct('pallet_number')->count('pallet_number');
}
}
}
// if (Str::length($locatorQuantity) < 0 || !is_numeric($locatorQuantity) || $locatorQuantity < 0 || $locatorQuantity > 2) {
// $warnMsg[] = "Invalid locator quantity found";
// }
// $user = User::where('name', $user)->first();
// if (!$user) {
// $warnMsg[] = "Operator ID not found";
// }
if (!empty($warnMsg)) {
throw new RowImportFailedException(implode(', ', $warnMsg));
}
Locator::updateOrCreate(
[
'plant_id' => $plant->id,
'locator_number' => $locator
],
[
'locator_quantity' => $palletQuantity,
'operator_id' => $user
]
);
return null;
// // return Locator::firstOrNew([
// // // Update existing records, matching them by `$this->data['column_name']`
// // 'email' => $this->data['email'],
// // ]);
// return new Locator();
}
public static function getCompletedNotificationBody(Import $import): string
{
$body = 'Your locator import has completed and ' . number_format($import->successful_rows) . ' ' . str('row')->plural($import->successful_rows) . ' imported.';
if ($failedRowsCount = $import->getFailedRowsCount()) {
$body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to import.';
}
return $body;
}
}

View File

@@ -0,0 +1,271 @@
<?php
namespace App\Filament\Imports;
use App\Models\LocatorInvoiceValidation;
use App\Models\Plant;
use App\Models\User;
use Carbon\Carbon;
use Filament\Actions\Imports\Exceptions\RowImportFailedException;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
use Filament\Facades\Filament;
use Str;
class LocatorInvoiceValidationImporter extends Importer
{
protected static ?string $model = LocatorInvoiceValidation::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('invoice_number')
->requiredMapping()
->exampleHeader('Invoice Number')
->example('3RA002514')
->label('Invoice Number')
->rules(['required']),
ImportColumn::make('serial_number')
->requiredMapping()
->exampleHeader('Serial Number')
->example('2514121551420')
->label('Serial Number')
->rules(['required']),
ImportColumn::make('pallet_number')
->requiredMapping()
->exampleHeader('Pallet Number')
->example('EP-2506001')
->label('Pallet Number'),
ImportColumn::make('locator_number')
->requiredMapping()
->exampleHeader('Locator Number')
->example('W05-D1B')
->label('Locator Number'),
ImportColumn::make('scanned_status')
->requiredMapping()
->exampleHeader('Scanned Status')
->example('')
->label('Scanned Status'),
ImportColumn::make('upload_status')
->requiredMapping()
->exampleHeader('Upload Status')
->example('Y')
->label('Upload Status'),
ImportColumn::make('created_at')
->requiredMapping()
->exampleHeader('Created At')
->example('2025-06-17 01:42:16')
->label('Created At')
->rules(['required']),
ImportColumn::make('scanned_at')
->requiredMapping()
->exampleHeader('Scanned At')
->example('2025-06-17 08:42:16')
->label('Scanned At'),
ImportColumn::make('updated_at')
->requiredMapping()
->exampleHeader('Updated At')
->example('2025-06-17 08:42:16')
->label('Updated At'),
ImportColumn::make('created_by')
->requiredMapping()
->exampleHeader('Created by')
->example('RAW012345')
->label('Created by')
->rules(['required']),
ImportColumn::make('scanned_by')
->requiredMapping()
->exampleHeader('Scanned by')
->example('RAW012345')
->label('Scanned by'),
ImportColumn::make('updated_by')
->requiredMapping()
->exampleHeader('Updated by')
->example('RAW012345')
->label('Updated by'),
];
}
public function resolveRecord(): ?LocatorInvoiceValidation
{
$warnMsg = [];
$plantCod = $this->data['plant'];
$plant = null;
$invoiceNo = $this->data['invoice_number'];
$serialNo = $this->data['serial_number'];
$palletNo = $this->data['pallet_number'];
$locatorNo = $this->data['locator_number'];
$scannedStat = $this->data['scanned_status'];
$uploadStat = $this->data['upload_status'];
$createdAt = $this->data['created_at'];
$scannedAt = $this->data['scanned_at'];
$updatedAt = $this->data['updated_at'];
$cDateTime = null;
$sDateTime = null;
$uDateTime = null;
$createdBy = $this->data['created_by'];
$scannedBy = $this->data['scanned_by'];
$updatedBy = $this->data['updated_by'];
if (Str::length($plantCod) < 4 || !is_numeric($plantCod) || !preg_match('/^[1-9]\d{3,}$/', $plantCod)) {
$warnMsg[] = "Invalid plant code found";
}
else
{
$plant = Plant::where('code', $this->data['plant'])->first();
if (!$plant) {
$warnMsg[] = "Plant not found";
}
else
{
if (Str::length($invoiceNo) < 5 || !ctype_alnum($invoiceNo)) {
$warnMsg[] = "Invalid invoice number found";
}
if (Str::length($serialNo) < 9 || Str::length($serialNo) > 20 || !ctype_alnum($serialNo)) {
$warnMsg[] = "Invalid serial number found";
}
if (Str::length($palletNo) > 0 && Str::length($palletNo) < 10) {
$warnMsg[] = "Invalid pallet number found";
}
if (Str::length($locatorNo) > 0 && Str::length($locatorNo) < 7) {
$warnMsg[] = "Invalid locator number found";
}
if (Str::length($scannedStat) > 0 && $scannedStat != 'Scanned') {
$warnMsg[] = "Invalid scanned status found";
}
if ($uploadStat != 'Y' && $uploadStat != 'N') {
$warnMsg[] = "Invalid upload status found";
}
$created = User::where('name', $createdBy)->first();
if (!$created) {
$warnMsg[] = "Created by not found";
}
if (Str::length($scannedBy) > 0) {
$scanned = User::where('name', $scannedBy)->first();
if (!$scanned) {
$warnMsg[] = "Scanned by not found";
}
}
if (Str::length($updatedBy) > 0) {
$updated = User::where('name', $updatedBy)->first();
if (!$updated) {
$warnMsg[] = "Updated by not found";
}
}
$formats = ['d-m-Y H:i', 'd-m-Y H:i:s']; //'07-05-2025 08:00' or '07-05-2025 08:00:00'
foreach ($formats as $format) {
try {
$cDateTime = Carbon::createFromFormat($format, $createdAt);
break;
} catch (\Exception $e) {
// Optionally collect warning messages
// $warnMsg[] = "Date format mismatch with format: $format";
}
}
if (!isset($cDateTime)) {
// throw new \Exception('Invalid date time format');
$warnMsg[] = "Invalid 'Created DateTime' format. Expected DD-MM-YYYY HH:MM:SS";
}
if (Str::length($scannedAt) > 0)
{
foreach ($formats as $format) {
try {
$sDateTime = Carbon::createFromFormat($format, $scannedAt);
break;
} catch (\Exception $e) {
// Optionally collect warning messages
// $warnMsg[] = "Date format mismatch with format: $format";
}
}
if (!isset($sDateTime)) {
$warnMsg[] = "Invalid 'Scanned DateTime' format. Expected DD-MM-YYYY HH:MM:SS";
}
}
if (Str::length($updatedAt) > 0)
{
foreach ($formats as $format) {
try {
$uDateTime = Carbon::createFromFormat($format, $updatedAt);
break;
} catch (\Exception $e) {
// Optionally collect warning messages
// $warnMsg[] = "Date format mismatch with format: $format";
}
}
if (!isset($uDateTime)) {
$warnMsg[] = "Invalid 'Updated DateTime' format. Expected DD-MM-YYYY HH:MM:SS";
}
else
{
if (isset($cDateTime) && isset($uDateTime)) {
if ($cDateTime->greaterThan($uDateTime)) {
$warnMsg[] = "'Created DataTime' is greater than 'Updated DateTime'.";
}
}
}
}
}
}
// if (!is_numeric($locatorQuantity) || $locatorQuantity < 0 || $locatorQuantity > 2) {
// $warnMsg[] = "Invalid locator quantity found";
// }
if (!empty($warnMsg)) {
throw new RowImportFailedException(implode(', ', $warnMsg));
}
LocatorInvoiceValidation::updateOrCreate(
[
'plant_id' => $plant->id,
'serial_number' => $serialNo
],
[
'invoice_number' => $invoiceNo,
'pallet_number' => $palletNo,
'locator_number' => $locatorNo,
'scanned_status' => $scannedStat,
'upload_status' => $uploadStat,
'created_at' => $cDateTime->format('Y-m-d H:i:s'),
'scanned_at' => (Str::length($scannedAt) > 0) ? $sDateTime->format('Y-m-d H:i:s') : null,
'updated_at' => (Str::length($updatedAt) > 0) ? $uDateTime->format('Y-m-d H:i:s') : null,
'created_by' => $createdBy,
'scanned_by' => $scannedBy,
'updated_by' => $updatedBy
]
);
return null;
// // return LocatorInvoiceValidation::firstOrNew([
// // // Update existing records, matching them by `$this->data['column_name']`
// // 'email' => $this->data['email'],
// // ]);
// return new LocatorInvoiceValidation();
}
public static function getCompletedNotificationBody(Import $import): string
{
$body = 'Your locator invoice validation import has completed and ' . number_format($import->successful_rows) . ' ' . str('row')->plural($import->successful_rows) . ' imported.';
if ($failedRowsCount = $import->getFailedRowsCount()) {
$body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to import.';
}
return $body;
}
}

View File

@@ -0,0 +1,111 @@
<?php
namespace App\Filament\Imports;
use App\Models\Line;
use App\Models\Machine;
use App\Models\Plant;
use Filament\Actions\Imports\Exceptions\RowImportFailedException;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
use Str;
class MachineImporter extends Importer
{
protected static ?string $model = Machine::class;
public static function getColumns(): array
{
return [
ImportColumn::make('name')
->requiredMapping()
->exampleHeader('Machine')
->example(['1600251'])
->label('Machine')
->rules(['required']),
ImportColumn::make('work_center')
->requiredMapping()
->exampleHeader('Work Center')
->example('RMGCE001')
->label('Work Center'),
ImportColumn::make('line')
->requiredMapping()
->relationship(resolveUsing: 'name')
->exampleHeader('Line')
->example(['4 inch pump line'])
->label('Line')
->rules(['required']),
ImportColumn::make('plant')
->requiredMapping()
->relationship(resolveUsing: 'name')
->exampleHeader('Plant')
->example(['Ransar Industries-I'])
->label('Plant')
->rules(['required']),
];
}
public function resolveRecord(): ?Machine
{
$warnMsg = [];
$plant = Plant::where('name', $this->data['plant'])->first();
$line = null;
$machine = $this->data['name'];
$workCenter = $this->data['work_center'];
if (!$plant) {
$warnMsg[] = "Plant not found";
}
else {
$line = Line::where('name', $this->data['line'])->where('plant_id', $plant->id)->first();
if ($line) {
$grpWrkCnr = $line->group_work_center;
if (!$grpWrkCnr || Str::length($grpWrkCnr) < 1)
{
$warnMsg[] = "Group work center line not found";
}
}
else
{
$warnMsg[] = "Line not found";
}
}
if (Str::length($machine) <= 0) {
$warnMsg[] = "Machine name not found";
}
if (!empty($warnMsg)) {
throw new RowImportFailedException(implode(', ', $warnMsg));
}
Machine::updateOrCreate(
[
'name' => $machine,
'plant_id' => $plant->id,
'line_id' => $line->id
],
[
'work_center' => $workCenter
]
);
return null;
// // return Machine::firstOrNew([
// // // Update existing records, matching them by `$this->data['column_name']`
// // 'email' => $this->data['email'],
// // ]);
// return new Machine();
}
public static function getCompletedNotificationBody(Import $import): string
{
$body = 'Your machine import has completed and ' . number_format($import->successful_rows) . ' ' . str('row')->plural($import->successful_rows) . ' imported.';
if ($failedRowsCount = $import->getFailedRowsCount()) {
$body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to import.';
}
return $body;
}
}

View File

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

View File

@@ -0,0 +1,241 @@
<?php
namespace App\Filament\Imports;
use App\Models\MotorTestingMaster;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
use Filament\Facades\Filament;
class MotorTestingMasterImporter extends Importer
{
protected static ?string $model = MotorTestingMaster::class;
public static function getColumns(): array
{
return [
ImportColumn::make('item')
->requiredMapping()
->exampleHeader('Item Code')
->example(['123456','123457','123458'])
->label('Item Code')
->relationship(resolveUsing: 'code')
->rules(['required']),
ImportColumn::make('isi_model')
->boolean()
->exampleHeader('ISI Model')
->example(['Y','N','Y'])
->label('ISI Model')
->rules(['boolean']),
ImportColumn::make('phase')
->requiredMapping()
->exampleHeader('Phase')
->example(['Single','Three','Single'])
->label('Phase')
->rules(['required']),
ImportColumn::make('hp')
->requiredMapping()
->exampleHeader('HP')
->example(['5','10','5'])
->label('HP')
->rules(['required']),
ImportColumn::make('kw')
->requiredMapping()
->exampleHeader('KW')
->example(['5','7.5','5'])
->label('KW')
->rules(['required']),
ImportColumn::make('volt')
->requiredMapping()
->exampleHeader('Volt')
->example(['230','380','230'])
->label('Volt')
->rules(['required']),
ImportColumn::make('current')
->requiredMapping()
->exampleHeader('Current')
->example(['7','21.8','7'])
->label('Current')
->rules(['required']),
ImportColumn::make('rpm')
->requiredMapping()
->exampleHeader('RPM')
->example(['2500','3420','2500'])
->label('RPM')
->rules(['required']),
ImportColumn::make('torque')
->requiredMapping()
->exampleHeader('Torque')
->example(['0.5','1.25','0.5'])
->label('Torque')
->rules(['required']),
ImportColumn::make('frequency')
->requiredMapping()
->exampleHeader('Frequency')
->label('Frequency')
->example(['50','60','50'])
->rules(['required']),
ImportColumn::make('connection')
->requiredMapping()
->exampleHeader('Connection')
->label('Connection')
->example(['Star','Star-Delta','Delta'])
->rules(['required']),
ImportColumn::make('ins_res_limit')
->requiredMapping()
->exampleHeader('Insulation Resistance Limit')
->label('Insulation Resistance Limit')
->example(['1000','2','1000'])
->rules(['required']),
ImportColumn::make('ins_res_type')
->requiredMapping()
->exampleHeader('Insulation Resistance Type')
->label('Insulation Resistance Type')
->example(['O','G','O'])
->rules(['required']),
ImportColumn::make('routine_test_time')
->requiredMapping()
->exampleHeader('Routine Test Time')
->label('Routine Test Time')
->example(['00:40:00','00:40:00','00:40:00'])
->rules(['required']),
ImportColumn::make('res_ry_ll')
->requiredMapping()
->exampleHeader('Resistance RY LL')
->label('Resistance RY LL')
->example(['0.05','0.05','0.05'])
->rules(['required']),
ImportColumn::make('res_ry_ul')
->requiredMapping()
->exampleHeader('Resistance RY UL')
->label('Resistance RY UL')
->example(['99','99','99'])
->rules(['required']),
ImportColumn::make('res_yb_ll')
->requiredMapping()
->exampleHeader('Resistance YB LL')
->label('Resistance YB LL')
->example(['0.05','0.05','0.05'])
->rules(['required']),
ImportColumn::make('res_yb_ul')
->requiredMapping()
->exampleHeader('Resistance YB UL')
->label('Resistance YB UL')
->example(['99','99','99'])
->rules(['required']),
ImportColumn::make('res_br_ll')
->requiredMapping()
->exampleHeader('Resistance BR LL')
->label('Resistance BR LL')
->example(['0.05','0.05','0.05'])
->rules(['required']),
ImportColumn::make('res_br_ul')
->requiredMapping()
->exampleHeader('Resistance BR UL')
->label('Resistance BR UL')
->example(['99','99','99'])
->rules(['required']),
ImportColumn::make('lock_volt_limit')
->requiredMapping()
->exampleHeader('Lock Volt Limit')
->label('Lock Volt Limit')
->example(['80','100','80'])
->rules(['required']),
ImportColumn::make('leak_cur_limit')
->requiredMapping()
->exampleHeader('Leakage Current Limit')
->label('Leakage Current Limit')
->example(['50','50','50'])
->rules(['required']),
ImportColumn::make('lock_cur_ll')
->requiredMapping()
->exampleHeader('Lock Current LL')
->label('Lock Current LL')
->example(['10','12.5','10'])
->rules(['required']),
ImportColumn::make('lock_cur_ul')
->requiredMapping()
->exampleHeader('Lock Current UL')
->label('Lock Current UL')
->example(['15','14.6','15'])
->rules(['required']),
ImportColumn::make('noload_cur_ll')
->requiredMapping()
->exampleHeader('No Load Current LL')
->label('No Load Current LL')
->example(['3','5.9','3'])
->rules(['required']),
ImportColumn::make('noload_cur_ul')
->requiredMapping()
->exampleHeader('No Load Current UL')
->label('No Load Current UL')
->example(['15','6.9','15'])
->rules(['required']),
ImportColumn::make('noload_pow_ll')
->requiredMapping()
->exampleHeader('No Load Power LL')
->label('No Load Power LL')
->example(['250','850','250'])
->rules(['required']),
ImportColumn::make('noload_pow_ul')
->requiredMapping()
->exampleHeader('No Load Power UL')
->label('No Load Power UL')
->example(['500','1200','500'])
->rules(['required']),
ImportColumn::make('noload_spd_ll')
->requiredMapping()
->exampleHeader('No Load Speed LL')
->label('No Load Speed LL')
->example(['2000','2500','2000'])
->rules(['required']),
ImportColumn::make('noload_spd_ul')
->requiredMapping()
->exampleHeader('No Load Speed UL')
->label('No Load Speed UL')
->example(['4000','3500','4000'])
->rules(['required']),
ImportColumn::make('plant')
->requiredMapping()
->exampleHeader('Plant')
->example(['Ransar Industries-I','Ransar Industries-I','Ransar Industries-I'])
->label('Plant')
->relationship(resolveUsing: 'name')
->rules(['required']),
ImportColumn::make('created_by')
->requiredMapping()
->exampleHeader('Created By')
->example([Filament::auth()->user()->name, Filament::auth()->user()->name, Filament::auth()->user()->name])
->label('Created By')
->rules(['required']),
ImportColumn::make('updated_by')
->requiredMapping()
->exampleHeader('Updated By')
->example([Filament::auth()->user()->name, Filament::auth()->user()->name, Filament::auth()->user()->name])
->label('Updated By')
->rules(['required']),
];
}
public function resolveRecord(): ?MotorTestingMaster
{
// return MotorTestingMaster::firstOrNew([
// // Update existing records, matching them by `$this->data['column_name']`
// 'email' => $this->data['email'],
// ]);
return new MotorTestingMaster();
}
public static function getCompletedNotificationBody(Import $import): string
{
$body = 'Your motor testing master import has completed and ' . number_format($import->successful_rows) . ' ' . str('row')->plural($import->successful_rows) . ' imported.';
if ($failedRowsCount = $import->getFailedRowsCount()) {
$body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to import.';
}
return $body;
}
}

View File

@@ -0,0 +1,257 @@
<?php
namespace App\Filament\Imports;
use App\Models\PalletValidation;
use App\Models\Plant;
use App\Models\User;
use Carbon\Carbon;
use Filament\Actions\Imports\Exceptions\RowImportFailedException;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
use Str;
class PalletValidationImporter extends Importer
{
protected static ?string $model = PalletValidation::class;
public static function getColumns(): array
{
return [
ImportColumn::make('plant')
->requiredMapping()
->label('Plant Code')
->exampleHeader('Plant Code')
->example('1000')
->relationship(resolveUsing: 'code')
->rules(['required']),
ImportColumn::make('serial_number')
->requiredMapping()
->label('Serial Number')
->exampleHeader('Serial Number')
->example('12345678901234')
->rules(['required']),
ImportColumn::make('pallet_number')
->requiredMapping()
->label('Pallet Number')
->exampleHeader('Pallet Number')
->example('EP-2507001'),
ImportColumn::make('pallet_status')
->requiredMapping()
->label('Pallet Status')
->exampleHeader('Pallet Status')
->example('Completed'),
ImportColumn::make('locator_number')
->requiredMapping()
->label('Locator Number')
->exampleHeader('Locator Number')
->example('W05-D1B'),
ImportColumn::make('locator_quantity')
->requiredMapping()
->label('Locator Quantity')
->exampleHeader('Locator Quantity')
->example(1)
->rules(['required']),
ImportColumn::make('created_at')
->requiredMapping()
->label('Created At')
->exampleHeader('Created At')
->example('01-01-2025 08:00:00')
->rules(['required']),
ImportColumn::make('scanned_at')
->requiredMapping()
->label('Scanned At')
->exampleHeader('Scanned At')
->example('01-01-2025 08:00:00')
->rules(['required']),
ImportColumn::make('updated_at')
->requiredMapping()
->label('Updated At')
->exampleHeader('Updated At')
->example('01-01-2025 08:00:00')
->rules(['required']),
ImportColumn::make('created_by')
->requiredMapping()
->label('Created By')
->exampleHeader('Created By')
->example('Admin')
->rules(['required']),
ImportColumn::make('scanned_by')
->requiredMapping()
->label('Scanned By')
->exampleHeader('Scanned By')
->example('Admin')
->rules(['required']),
ImportColumn::make('updated_by')
->requiredMapping()
->label('Updated By')
->exampleHeader('Updated By')
->example('Admin'),
];
}
public function resolveRecord(): ?PalletValidation
{
$warnMsg = [];
$plantCod = $this->data['plant'];
$plant = null;
$serialNo = $this->data['serial_number'];
$palletNo = $this->data['pallet_number'];
$palletStat = $this->data['pallet_status'];
$locatorNo = $this->data['locator_number'];
$locatorQty = $this->data['locator_quantity'];
$createdAt = $this->data['created_at'];
$scannedAt = $this->data['scanned_at'];
$updatedAt = $this->data['updated_at'];
$cDateTime = null;
$sDateTime = null;
$uDateTime = null;
$createdBy = $this->data['created_by'];
$scannedBy = $this->data['scanned_by'];
$updatedBy = $this->data['updated_by'];
if (Str::length($plantCod) < 4 || !is_numeric($plantCod) || !preg_match('/^[1-9]\d{3,}$/', $plantCod)) {
$warnMsg[] = "Invalid plant code found";
}
else
{
$plant = Plant::where('code', $this->data['plant'])->first();
if (!$plant) {
$warnMsg[] = "Plant not found";
}
else
{
if (Str::length($serialNo) < 9 || Str::length($serialNo) > 20 || !ctype_alnum($serialNo)) {
$warnMsg[] = "Invalid serial number found";
}
if (Str::length($palletNo) > 0 && Str::length($palletNo) < 10) {
$warnMsg[] = "Invalid pallet number found";
}
if (Str::length($palletStat) > 0 && $palletStat != 'Completed') {
$warnMsg[] = "Invalid pallet status found";
}
if (Str::length($locatorNo) > 0 && Str::length($locatorNo) < 7) {
$warnMsg[] = "Invalid locator number found";
}
if (Str::length($palletNo) <= 0 && Str::length($locatorNo) <= 0) {
$warnMsg[] = "Pallet and locator number found";
}
if (Str::length($locatorQty) < 0 || !is_numeric($locatorQty) || $locatorQty < 0 || $locatorQty > 2) {
$warnMsg[] = "Invalid locator quantity found";
}
$created = User::where('name', $createdBy)->first();
if (!$created) {
$warnMsg[] = "Created by not found";
}
$scanned = User::where('name', $scannedBy)->first();
if (!$scanned) {
$warnMsg[] = "Scanned by not found";
}
$updated = User::where('name', $updatedBy)->first();
if (!$updated) {
$warnMsg[] = "Updated by not found";
}
$formats = ['d-m-Y H:i', 'd-m-Y H:i:s']; //'07-05-2025 08:00' or '07-05-2025 08:00:00'
foreach ($formats as $format) {
try {
$cDateTime = Carbon::createFromFormat($format, $createdAt);
break;
} catch (\Exception $e) {
// Optionally collect warning messages
// $warnMsg[] = "Date format mismatch with format: $format";
}
}
if (!isset($cDateTime)) {
// throw new \Exception('Invalid date time format');
$warnMsg[] = "Invalid 'Created DateTime' format. Expected DD-MM-YYYY HH:MM:SS";
}
foreach ($formats as $format) {
try {
$sDateTime = Carbon::createFromFormat($format, $scannedAt);
break;
} catch (\Exception $e) {
// Optionally collect warning messages
// $warnMsg[] = "Date format mismatch with format: $format";
}
}
if (!isset($sDateTime)) {
$warnMsg[] = "Invalid 'Scanned DateTime' format. Expected DD-MM-YYYY HH:MM:SS";
}
foreach ($formats as $format) {
try
{
$uDateTime = Carbon::createFromFormat($format, $updatedAt);
break;
} catch (\Exception $e) {
// Optionally collect warning messages
// $warnMsg[] = "Date format mismatch with format: $format";
}
}
if (!isset($uDateTime)) {
$warnMsg[] = "Invalid 'Updated DateTime' format. Expected DD-MM-YYYY HH:MM:SS";
}
else
{
if (isset($cDateTime) && isset($uDateTime)) {
if ($cDateTime->greaterThan($uDateTime)) {
$warnMsg[] = "'Created DataTime' is greater than 'Updated DateTime'.";
}
}
}
}
}
// if (!is_numeric($locatorQuantity) || $locatorQuantity < 0 || $locatorQuantity > 2) {
// $warnMsg[] = "Invalid locator quantity found";
// }
if (!empty($warnMsg)) {
throw new RowImportFailedException(implode(', ', $warnMsg));
}
PalletValidation::updateOrCreate(
[
'plant_id' => $plant->id,
'serial_number' => $serialNo
],
[
'pallet_number' => $palletNo,
'pallet_status' => $palletStat,
'locator_number' => $locatorNo,
'locator_quantity' => $locatorQty,
'created_at' => $cDateTime->format('Y-m-d H:i:s'),
'scanned_at' => $sDateTime->format('Y-m-d H:i:s'),
'updated_at' => $uDateTime->format('Y-m-d H:i:s'),
'created_by' => $createdBy,
'scanned_by' => $scannedBy,
'updated_by' => $updatedBy
]
);
return null;
// // return PalletValidation::firstOrNew([
// // // Update existing records, matching them by `$this->data['column_name']`
// // 'email' => $this->data['email'],
// // ]);
// return new PalletValidation();
}
public static function getCompletedNotificationBody(Import $import): string
{
$body = 'Your pallet validation 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

@@ -2,10 +2,13 @@
namespace App\Filament\Imports;
use App\Models\Company;
use App\Models\Plant;
use Filament\Actions\Imports\Exceptions\RowImportFailedException;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
use Str;
class PlantImporter extends Importer
{
@@ -21,13 +24,6 @@ class PlantImporter extends Importer
->example('1000')
->label('Plant Code')
->rules(['required']), //, 'integer'
ImportColumn::make('company')
->requiredMapping()
->exampleHeader('Company Name')
->example('C.R.I. Pumps Private Limited')
->label('Company Name')
->relationship(resolveUsing:'name')
->rules(['required']),
ImportColumn::make('name')
->requiredMapping()
->exampleHeader('Plant Name')
@@ -40,12 +36,48 @@ class PlantImporter extends Importer
->example('7/51-A, Keeranatham Road, Saravanampatty, Coimbatore - 641035')
->label('Plant Address')
->rules(['required']),
ImportColumn::make('company')
->requiredMapping()
->exampleHeader('Company Name')
->example('C.R.I. Pumps Private Limited')
->label('Company Name')
->relationship(resolveUsing:'name')
->rules(['required']),
];
}
public function resolveRecord(): ?Plant
{
$company = \App\Models\Company::where('name', $this->data['company'])->first();
$warnMsg = [];
$company = Company::where('name', $this->data['company'])->first();
if (!$company) {
$warnMsg[] = "Company name not found";
}
if (Str::length($this->data['name']) < 0) {
$warnMsg[] = "Plant name not found";
}
if (Str::length($this->data['code']) < 4 || !is_numeric($this->data['code']) || !preg_match('/^[1-9]\d{3,}$/', $this->data['code'])) {
$warnMsg[] = "Invalid plant code found";
}
if (Str::length($this->data['address']) < 3) {
$warnMsg[] = "Invalid address found";
}
if (!empty($warnMsg)) {
throw new RowImportFailedException(implode(', ', $warnMsg));
}
$plantCN = Plant::where('code', $this->data['code'])->where('name', $this->data['name'])->first();
if (!$plantCN) {
$plantCode = Plant::where('code', $this->data['code'])->first();
$plantName = Plant::where('name', $this->data['name'])->first();
if ($plantName) {
throw new RowImportFailedException("Duplicate plant name found");
}
else if ($plantCode) {
throw new RowImportFailedException("Duplicate plant code found");
}
}
return Plant::updateOrCreate([
'code' => $this->data['code'],
'name' => $this->data['name'],

View File

@@ -2,10 +2,19 @@
namespace App\Filament\Imports;
use App\Models\Block;
use App\Models\Line;
use App\Models\LineStop;
use App\Models\Plant;
use App\Models\ProductionLineStop;
use App\Models\Shift;
use App\Models\User;
use Carbon\Carbon;
use Filament\Actions\Imports\Exceptions\RowImportFailedException;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
use Filament\Facades\Filament;
class ProductionLineStopImporter extends Importer
{
@@ -17,68 +26,206 @@ class ProductionLineStopImporter extends Importer
ImportColumn::make('from_datetime')
->requiredMapping()
->exampleHeader('From DateTime')
->example('06-02-2025 00:00:00')
->example(['01-01-2025 00:00:00', '01-01-2025 20:00:00'])
->label('From DateTime')
->rules(['required']),
->rules(['required']), //, 'date_format:"d-m-Y H:i:s"'
ImportColumn::make('to_datetime')
->requiredMapping()
->exampleHeader('To DateTime')
->example('06-02-2025 01:25:00')
->example(['01-01-2025 01:25:00', '01-01-2025 21:00:00'])
->label('To DateTime')
->rules(['required']),
ImportColumn::make('stop_hour')
->requiredMapping()
->exampleHeader('Stop Hour')
->example('1')
->example(['1', '1'])
->label('Stop Hour')
->numeric()
->rules(['required', 'integer']),
ImportColumn::make('stop_min')
->requiredMapping()
->exampleHeader('Stop Min')
->example('25')
->example(['25','0'])
->label('Stop Min')
->numeric()
->rules(['required', 'integer']),
ImportColumn::make('linestop')
->requiredMapping()
->exampleHeader('Line Stop Code')
->example('A7R')
->example(['A7R', 'A1R'])
->label('Line Stop Code')
->relationship(resolveUsing:'code')
->rules(['required']),
ImportColumn::make('line')
->requiredMapping()
->exampleHeader('Line Name')
->example('4 inch pump line')
->example(['4 inch pump line', '4 inch pump line'])
->label('Line Name')
->relationship(resolveUsing:'name')
->rules(['required']),
ImportColumn::make('block_reference')
->requiredMapping() // Or optionalMapping() if not always present
->exampleHeader('Block Name')
->example(['Block A', 'Block A'])
->label('Block Name')
->rules(['required']), // Or remove if not required
ImportColumn::make('shift')
->requiredMapping()
->exampleHeader('Shift Name')
->example('Day')
->example(['Day', 'Night'])
->label('Shift Name')
->relationship(resolveUsing:'name')
->relationship(resolveUsing: 'name')
->rules(['required']),
ImportColumn::make('plant')
->requiredMapping()
->exampleHeader('Plant Name')
->example('Ransar Industries-I')
->example(['Ransar Industries-I', 'Ransar Industries-I'])
->label('Plant Name')
->relationship(resolveUsing:'name')
->rules(['required']),
ImportColumn::make('operator_id')
->requiredMapping()
->exampleHeader('Operator ID')
->example([Filament::auth()->user()->name, Filament::auth()->user()->name])
->label('Operator ID')
->rules(['required']),
];
}
public function resolveRecord(): ?ProductionLineStop
{
$warnMsg = [];
$plant = Plant::where('name', $this->data['plant'])->first();
$line = null;
$block = null;
if (!$plant) {
$warnMsg[] = "Plant not found";
}
else {
$line = Line::where('name', $this->data['line'])->where('plant_id', $plant->id)->first();
//block_reference
$block = Block::where('name', $this->data['block_reference'])->where('plant_id', $plant->id)->first();
}
if (!$line) {
$warnMsg[] = "Line not found";
}
$shift = null;
if (!$block) {
$warnMsg[] = "Block not found";
}
else {
$shift = Shift::where('name', $this->data['shift'])->where('plant_id', $plant->id)->where('block_id', $block->id)->first();
}
//$shift = Shift::where('id', $this->data['shift'])->where('plant_id', $plant->id)->first();
if (!$shift) {
$warnMsg[] = "Shift not found";
}
$linestop = LineStop::where('code', $this->data['linestop'])->first();
if (!$linestop) {
$warnMsg[] = "Line stop code not found";
}
$stophour = is_numeric($this->data['stop_hour']) && $this->data['stop_hour'] >= 0;
$stopmin = is_numeric($this->data['stop_min']) && $this->data['stop_min'] >= 0 && $this->data['stop_min'] <= 60;
if (!$stophour && !$stopmin) {
$warnMsg[] = "Invalid stop hour/minute found";
}
else if (!$stophour) {
$warnMsg[] = "Invalid stop hour found";
}
else if (!$stopmin) {
$warnMsg[] = "Invalid stop min found";
}
else {
$stophour = (int)$this->data['stop_hour'];
$stopmin = (int)$this->data['stop_min'];
if ($stophour == 0 && $stopmin == 0) {
$warnMsg[] = "Invalid stop hour/minute found";
}
}
$validHourMin = ($stophour == 0 && $stopmin == 0) ? false : true;
if (!$validHourMin) {
$warnMsg[] = "Invalid stop hour/minute found";
}
$fromDate = $this->data['from_datetime'];
$toDate = $this->data['to_datetime'];
$formats = ['d-m-Y H:i', 'd-m-Y H:i:s']; //'07-05-2025 08:00' or '07-05-2025 08:00:00'
$fdateTime = null;
$tdateTime = null;
// Try parsing with multiple formats
foreach ($formats as $format) {
try {
$fdateTime = Carbon::createFromFormat($format, $fromDate);
break;
} catch (\Exception $e) {
// Optionally collect warning messages
// $warnMsg[] = "Date format mismatch with format: $format";
}
}
foreach ($formats as $format) {
try {
$tdateTime = Carbon::createFromFormat($format, $toDate);
break;
} catch (\Exception $e) {
// Optionally collect warning messages
// $warnMsg[] = "Date format mismatch with format: $format";
}
}
// $fDateOnly = '';
if (!isset($fdateTime)) {
// throw new \Exception('Invalid date time format');
$warnMsg[] = "Invalid 'From DateTime' format. Expected DD-MM-YYYY HH:MM:SS";
}
// else {
// $fDateOnly = $fdateTime->toDateString();
// }
if (!isset($tdateTime)) {
$warnMsg[] = "Invalid 'To DateTime' format. Expected DD-MM-YYYY HH:MM:SS";
}
if (isset($fdateTime) && isset($tdateTime)) {
if ($fdateTime->greaterThan($tdateTime)) {
$warnMsg[] = "'From DataTime' is greater than 'To DateTime'.";
}
}
// if (!$fromDate) { // || $fromDate->format('d-m-Y H:i') !== $from)
// $warnMsg[] = "Invalid 'From DateTime' format. Expected DD-MM-YYYY HH:MM:SS";
// }
// else if (!$toDate) { // || $toDate->format('d-m-Y H:i') !== $to
// $warnMsg[] = "Invalid 'To DateTime' format. Expected DD-MM-YYYY HH:MM:SS";
// }
$user = User::where('name', $this->data['operator_id'])->first();
if (!$user) {
$warnMsg[] = "Operator ID not found";
}
if (!empty($warnMsg)) {
throw new RowImportFailedException(implode(', ', $warnMsg));
}
ProductionLineStop::updateOrCreate([
'plant_id' => $plant->id,
'line_id' => $line->id,
'shift_id' => $shift->id,
'linestop_id' => $linestop->id,
'from_datetime' => $fdateTime->format('Y-m-d H:i:s'),//$this->data['from_datetime'],
'to_datetime' => $tdateTime->format('Y-m-d H:i:s'),//$this->data['to_datetime'],
'stop_hour' => (int)$this->data['stop_hour'],
'stop_min' => (int)$this->data['stop_min'],
'operator_id' => $this->data['operator_id'],
]);
return null;
// return ProductionLineStop::firstOrNew([
// // Update existing records, matching them by `$this->data['column_name']`
// 'email' => $this->data['email'],
// ]);
return new ProductionLineStop();
// return new ProductionLineStop();
}
public static function getCompletedNotificationBody(Import $import): string

View File

@@ -2,10 +2,19 @@
namespace App\Filament\Imports;
use App\Models\Block;
use App\Models\Line;
use App\Models\Plant;
use App\Models\ProductionPlan;
use App\Models\Shift;
use App\Models\User;
use Carbon\Carbon;
use Filament\Actions\Imports\Exceptions\RowImportFailedException;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
use Filament\Facades\Filament;
use Str;
class ProductionPlanImporter extends Importer
{
@@ -17,61 +26,206 @@ class ProductionPlanImporter extends Importer
ImportColumn::make('created_at')
->requiredMapping()
->exampleHeader('Created DateTime')
->example('30-01-2025 16:44:00')
->example(['01-01-2025 08:00:00', '01-01-2025 19:30:00'])
->label('Created DateTime')
->rules(['required']),
ImportColumn::make('plan_quantity')
->requiredMapping()
->exampleHeader('Plan Quantity')
->example('500')
->example(['500', '450'])
->label('Plan Quantity')
->numeric()
->rules(['required', 'integer']),
ImportColumn::make('production_quantity')
->requiredMapping()
->exampleHeader('Production Quantity')
->example('501')
->example(['0', '0'])
->label('Production Quantity')
->numeric()
->rules(['required', 'integer']),
ImportColumn::make('line')
->requiredMapping()
->exampleHeader('Line Name')
->example('4 inch pump line')
->example(['4 inch pump line', '4 inch pump line'])
->label('Line Name')
->relationship(resolveUsing:'name')
->rules(['required']),
ImportColumn::make('block_reference')
->requiredMapping() // Or optionalMapping() if not always present
->exampleHeader('Block Name')
->example(['Block A', 'Block A'])
->label('Block Name')
->rules(['required']), // Or remove if not required
ImportColumn::make('shift')
->requiredMapping()
->exampleHeader('Shift Name')
->example('Day')
->label('Shift Name')
->relationship(resolveUsing:'name')
->exampleHeader('Shift Name') //ID
->example(['Day', 'Night']) //'2', '7'
->label('Shift Name') // ID
->relationship(resolveUsing: 'name')
->rules(['required']),
ImportColumn::make('plant')
->requiredMapping()
->exampleHeader('Plant Name')
->example('Ransar Industries-I')
->example(['Ransar Industries-I', 'Ransar Industries-I'])
->label('Plant Name')
->relationship(resolveUsing:'name')
->rules(['required']),
ImportColumn::make('updated_at')
->requiredMapping()
->exampleHeader('Updated DateTime')
->example('30-01-2025 19:11:00')
->example(['01-01-2025 08:00:00', '01-01-2025 19:30:00'])
->label('Updated DateTime')
->rules(['required']),
ImportColumn::make('operator_id')
->requiredMapping()
->exampleHeader('Operator ID')
->example([Filament::auth()->user()->name, Filament::auth()->user()->name])
->label('Operator ID')
->rules(['required']),
];
}
public function resolveRecord(): ?ProductionPlan
{
$warnMsg = [];
$plant = Plant::where('name', $this->data['plant'])->first();
$line = null;
$block = null;
if (!$plant) {
$warnMsg[] = "Plant not found";
}
else {
$line = Line::where('name', $this->data['line'])->where('plant_id', $plant->id)->first();
//block_reference
$block = Block::where('name', $this->data['block_reference'])->where('plant_id', $plant->id)->first();
}
if (!$line) {
$warnMsg[] = "Line not found";
}
$shift = null;
if (!$block) {
$warnMsg[] = "Block not found";
}
else {
$shift = Shift::where('name', $this->data['shift'])->where('plant_id', $plant->id)->where('block_id', $block->id)->first();
}
//$shift = Shift::where('id', $this->data['shift'])->where('plant_id', $plant->id)->first();
if (!$shift) {
$warnMsg[] = "Shift not found";
}
if (Str::length($this->data['plan_quantity']) < 0 || !is_numeric($this->data['plan_quantity']) || $this->data['plan_quantity'] <= 0) {
$warnMsg[] = "Invalid plan quantity found";
}
if (Str::length($this->data['production_quantity']) < 0 || !is_numeric($this->data['production_quantity']) || $this->data['production_quantity'] < 0) {
$warnMsg[] = "Invalid production quantity found";
}
$fromDate = $this->data['created_at'];
$toDate = $this->data['updated_at'];
$formats = ['d-m-Y H:i', 'd-m-Y H:i:s']; //'07-05-2025 08:00' or '07-05-2025 08:00:00'
$fdateTime = null;
$tdateTime = null;
// Try parsing with multiple formats
foreach ($formats as $format) {
try {
$fdateTime = Carbon::createFromFormat($format, $fromDate);
break;
} catch (\Exception $e) {
// Optionally collect warning messages
// $warnMsg[] = "Date format mismatch with format: $format";
}
}
foreach ($formats as $format) {
try {
$tdateTime = Carbon::createFromFormat($format, $toDate);
break;
} catch (\Exception $e) {
// Optionally collect warning messages
// $warnMsg[] = "Date format mismatch with format: $format";
}
}
$fDateOnly = '';
if (!isset($fdateTime)) {
// throw new \Exception('Invalid date time format');
$warnMsg[] = "Invalid 'Created DateTime' format. Expected DD-MM-YYYY HH:MM:SS";
}
else {
$fDateOnly = $fdateTime->toDateString();
}
if (!isset($tdateTime)) {
$warnMsg[] = "Invalid 'Updated DateTime' format. Expected DD-MM-YYYY HH:MM:SS";
}
if (isset($fdateTime) && isset($tdateTime)) {
if ($fdateTime->greaterThan($tdateTime)) {
$warnMsg[] = "'Created DataTime' is greater than 'Updated DateTime'.";
}
}
// if (!$fromDate) {
// $warnMsg[] = "Invalid 'Created DateTime' format. Expected DD-MM-YYYY HH:MM:SS";
// }
// else if (!$toDate) {
// $warnMsg[] = "Invalid 'Updated DateTime' format. Expected DD-MM-YYYY HH:MM:SS";
// }
$user = User::where('name', $this->data['operator_id'])->first();
if (!$user) {
$warnMsg[] = "Operator ID not found";
}
if (!empty($warnMsg)) {
throw new RowImportFailedException(implode(', ', $warnMsg));
}
else { //if (empty($warnMsg))
$productionPlan = ProductionPlan::where('plant_id', $plant->id)
->where('shift_id', $shift->id)
->where('line_id', $line->id)
->whereDate('created_at', $fDateOnly)
// ->where('plan_quantity', $productionQuantity->plan_quantity)
->latest()
->first();
if ($productionPlan) {
// if($productionPlan->production_quantity)
// {
// throw new RowImportFailedException("{$productionPlan->created_at}, {$productionPlan->production_quantity}");
// }
// $warnMsg[] = "Production plan already exist on '{$fDateOnly}'!";
$productionPlan->update([
'plan_quantity' => $this->data['plan_quantity'],
// 'production_quantity' => $productionPlan->production_quantity,
// 'created_at' => $productionPlan->created_at,//$fdateTime->format('Y-m-d H:i:s'),
// 'updated_at' => $tdateTime->format('Y-m-d H:i:s'),
'operator_id' => $this->data['operator_id'],
]);
$productionPlan->save();
return null;
}
}
ProductionPlan::updateOrCreate([
'plant_id' => $plant->id,
'line_id' => $line->id,
'shift_id' => $shift->id,
'plan_quantity' => $this->data['plan_quantity'],
'production_quantity' => $this->data['production_quantity'],
'created_at' => $fdateTime->format('Y-m-d H:i:s'),//$this->data['created_at'],
'updated_at' => $tdateTime->format('Y-m-d H:i:s'),//$this->data['updated_at'],
'operator_id' => $this->data['operator_id'],
]);
return null;
// return ProductionPlan::firstOrNew([
// // Update existing records, matching them by `$this->data['column_name']`
// 'email' => $this->data['email'],
// ]);
return new ProductionPlan();
// return new ProductionPlan();
}
public static function getCompletedNotificationBody(Import $import): string

View File

@@ -2,11 +2,21 @@
namespace App\Filament\Imports;
use App\Models\Block;
use App\Models\Item;
use App\Models\Line;
use App\Models\Plant;
use App\Models\ProductionQuantity;
use App\Models\Shift;
use App\Models\User;
use Carbon\Carbon;
use Filament\Actions\Imports\Exceptions\RowImportFailedException;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
use Filament\Facades\Filament;
use Illuminate\Database\Eloquent\Model;
use Str;
class ProductionQuantityImporter extends Importer
{
@@ -18,66 +28,210 @@ class ProductionQuantityImporter extends Importer
ImportColumn::make('created_at')
->requiredMapping()
->exampleHeader('Created DateTime')
->example('12-02-2025 15:51:00')
->example(['01-01-2025 08:00:00', '01-01-2025 19:30:00'])
->label('Created DateTime')
->rules(['required']),
// ImportColumn::make('hourly_quantity')
// ->requiredMapping()
// ->exampleHeader('Hourly Quantity')
// ->label('Hourly Quantity')
// ->numeric()
// ->rules(['required', 'integer']),
ImportColumn::make('production_order')
->requiredMapping()
->exampleHeader('Production Order')
->example(['1234567', '1234567'])
->label('Production Order')
->numeric(),
ImportColumn::make('item')
->requiredMapping()
->exampleHeader('Item Code')
->example('123456')
->example(['123456', '123456'])
->label('Item Code')
->relationship(resolveUsing:'code')
->rules(['required']),
ImportColumn::make('serial_number')
->requiredMapping()
->exampleHeader('Serial Number')
->example('12345678901234')
->example(['12345678901234', '12345678902234'])
->label('Serial Number')
->rules(['required']),
ImportColumn::make('line')
->requiredMapping()
->exampleHeader('Line Name')
->example('4 inch pump line')
->example(['4 inch pump line', '4 inch pump line'])
->label('Line Name')
->relationship(resolveUsing:'name')
->rules(['required']),
ImportColumn::make('block_reference')
->requiredMapping() // Or optionalMapping() if not always present
->exampleHeader('Block Name')
->example(['Block A', 'Block A'])
->label('Block Name')
->rules(['required']), // Or remove if not required
ImportColumn::make('shift')
->requiredMapping()
->exampleHeader('Shift Name')
->example('Day')
->example(['Day', 'Night'])
->label('Shift Name')
->relationship(resolveUsing:'name')
->rules(['required']),
ImportColumn::make('plant')
->requiredMapping()
->exampleHeader('Plant Name')
->example('Ransar Industries-I')
->example(['Ransar Industries-I', 'Ransar Industries-I'])
->label('Plant Name')
->relationship(resolveUsing:'name')
->rules(['required']),
ImportColumn::make('updated_at')
->requiredMapping()
->exampleHeader('Updated DateTime')
->example('12-02-2025 15:51:00')
->example(['01-01-2025 08:00:00', '01-01-2025 19:30:00'])
->label('Updated DateTime')
->rules(['required']),
ImportColumn::make('operator_id')
->requiredMapping()
->exampleHeader('Operator ID')
->example([Filament::auth()->user()->name, Filament::auth()->user()->name])
->label('Operator ID')
->rules(['required']),
];
}
public function resolveRecord(): ?ProductionQuantity
{
// return ProductionQuantity::firstOrNew([
// // Update existing records, matching them by `$this->data['column_name']`
// 'email' => $this->data['email'],
// ]);
$warnMsg = [];
$plant = Plant::where('name', $this->data['plant'])->first();
$line = null;
$block = null;
if (!$plant) {
$warnMsg[] = "Plant not found";
}
else {
$line = Line::where('name', $this->data['line'])->where('plant_id', $plant->id)->first();
//block_reference
$block = Block::where('name', $this->data['block_reference'])->where('plant_id', $plant->id)->first();
}
if (!$line) {
$warnMsg[] = "Line not found";
}
$shift = null;
if (!$block) {
$warnMsg[] = "Block not found";
}
else {
$shift = Shift::where('name', $this->data['shift'])->where('plant_id', $plant->id)->where('block_id', $block->id)->first();
}
//$shift = Shift::where('id', $this->data['shift'])->where('plant_id', $plant->id)->first();
if (!$shift) {
$warnMsg[] = "Shift not found";
}
$item = null;
if ($plant) {
$item = Item::where('code', $this->data['item'])->where('plant_id', $plant->id)->first();
}
if (!$item) {
$warnMsg[] = "Item not found";
}
if (Str::length($this->data['serial_number']) < 9 || !ctype_alnum($this->data['serial_number'])) {
$warnMsg[] = "Invalid serial number found";
}
if (Str::length($this->data['production_order']) > 0 && (Str::length($this->data['production_order']) < 7 || !is_numeric($this->data['production_order']))) {
$warnMsg[] = "Invalid production order found";
}
return new ProductionQuantity();
$fromDate = $this->data['created_at'];
$toDate = $this->data['updated_at'];
$formats = ['d-m-Y H:i', 'd-m-Y H:i:s']; //'07-05-2025 08:00' or '07-05-2025 08:00:00'
$fdateTime = null;
$tdateTime = null;
// Try parsing with multiple formats
foreach ($formats as $format) {
try {
$fdateTime = Carbon::createFromFormat($format, $fromDate);
break;
} catch (\Exception $e) {
// Optionally collect warning messages
// $warnMsg[] = "Date format mismatch with format: $format";
}
}
foreach ($formats as $format) {
try {
$tdateTime = Carbon::createFromFormat($format, $toDate);
break;
} catch (\Exception $e) {
// Optionally collect warning messages
// $warnMsg[] = "Date format mismatch with format: $format";
}
}
// $fDateOnly = '';
if (!isset($fdateTime)) {
// throw new \Exception('Invalid date time format');
$warnMsg[] = "Invalid 'Created DateTime' format. Expected DD-MM-YYYY HH:MM:SS";
}
// else {
// $fDateOnly = $fdateTime->toDateString();
// }
if (!isset($tdateTime)) {
$warnMsg[] = "Invalid 'Updated DateTime' format. Expected DD-MM-YYYY HH:MM:SS";
}
if (isset($fdateTime) && isset($tdateTime)) {
if ($fdateTime->greaterThan($tdateTime)) {
$warnMsg[] = "'Created DataTime' is greater than 'Updated DateTime'.";
}
}
// if (!$fromDate) {
// $warnMsg[] = "Invalid 'Created DateTime' format. Expected DD-MM-YYYY HH:MM:SS";
// }
// else if (!$toDate) {
// $warnMsg[] = "Invalid 'Updated DateTime' format. Expected DD-MM-YYYY HH:MM:SS";
// }
$user = User::where('name', $this->data['operator_id'])->first();
if (!$user) {
$warnMsg[] = "Operator ID not found";
}
if (!empty($warnMsg)) {
throw new RowImportFailedException(implode(', ', $warnMsg));
}
else { //if (empty($warnMsg))
$productionQuan = ProductionQuantity::where('plant_id', $plant->id)
->where('serial_number', $this->data['serial_number'])
->latest()
->first();
if ($productionQuan) {
throw new RowImportFailedException("Serial number already exist!");
}
}
ProductionQuantity::updateOrCreate([
'serial_number' => $this->data['serial_number'],
'plant_id' => $plant->id,
'shift_id' => $shift->id,
'line_id' => $line->id,
'item_id' => $item->id,
'production_order' => $this->data['production_order'] ?? null,
'created_at' => $fdateTime->format('Y-m-d H:i:s'),//$this->data['created_at'],
'updated_at' => $tdateTime->format('Y-m-d H:i:s'),//$this->data['updated_at'],
'operator_id' => $this->data['operator_id'],
]);
// ProductionQuantity::updateOrCreate([
// 'serial_number' => $this->data['serial_number'],
// 'plant_id' => $plant->id,
// ],
// [
// 'shift_id' => $shift->id,
// 'line_id' => $line->id,
// 'item_id' => $item->id,
// 'production_order' => $this->data['production_order'] ?? null,
// 'created_at' => $fdateTime->format('Y-m-d H:i:s'),//$this->data['created_at'],
// 'updated_at' => $tdateTime->format('Y-m-d H:i:s'),//$this->data['updated_at'],
// 'operator_id' => $this->data['operator_id'],
// ]);
return null;
// return new ProductionQuantity();
}
public static function getCompletedNotificationBody(Import $import): string
@@ -118,21 +272,21 @@ class ProductionQuantityImporter extends Importer
// Relationship resolvers
private function resolveItemId(string $code): int
{
return \App\Models\Item::where('code', $code)->first()->id;
return Item::where('code', $code)->first()->id;
}
private function resolveLineId(string $name): int
{
return \App\Models\Line::where('name', $name)->first()->id;
return Line::where('name', $name)->first()->id;
}
private function resolveShiftId(string $name): int
{
return \App\Models\Shift::where('name', $name)->first()->id;
return Shift::where('name', $name)->first()->id;
}
private function resolvePlantId(string $name): int
{
return \App\Models\Plant::where('name', $name)->first()->id;
return Plant::where('name', $name)->first()->id;
}
}

View File

@@ -0,0 +1,331 @@
<?php
namespace App\Filament\Imports;
use App\Models\Item;
use App\Models\Line;
use App\Models\Plant;
use App\Models\QualityValidation;
use App\Models\StickerMaster;
use App\Models\User;
use Carbon\Carbon;
use Filament\Actions\Imports\Exceptions\RowImportFailedException;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
use Filament\Facades\Filament;
use Illuminate\Validation\Rule;
use Str;
class QualityValidationImporter extends Importer
{
protected static ?string $model = QualityValidation::class;
public static function getColumns(): array
{
return [
ImportColumn::make('created_at')
->requiredMapping()
->exampleHeader('Created DateTime')
->example('12-02-2025 15:51:00')
->label('Created DateTime')
->rules(['required']),
ImportColumn::make('sticker_master_id_code') // stickerMaster.item
->requiredMapping()
->exampleHeader('Item Code')
->example('123456')
->label('Item Code'),
// ->relationship(
// name: 'stickerMaster',
// resolveUsing: function ($state) {
// $state = trim($state);
// $item = Item::where('code', $state)->first();
// return $item
// ? StickerMaster::where('item_id', $item->id)->value('id')
// : null;
// }
// ),
ImportColumn::make('production_order')
->requiredMapping()
->exampleHeader('Production Order')
->example('1234567')
->label('Production Order')
->rules(['required']),
ImportColumn::make('serial_number')
->requiredMapping()
->exampleHeader('Serial Number')
->example('1234567890123')
->label('Serial Number'),
ImportColumn::make('serial_number_motor')
->requiredMapping()
->exampleHeader('Serial Number Motor')
->example('1')
->label('Serial Number Motor'),
ImportColumn::make('serial_number_pump')
->requiredMapping()
->exampleHeader('Serial Number Pump')
->example('1')
->label('Serial Number Pump'),
ImportColumn::make('serial_number_pumpset')
->requiredMapping()
->exampleHeader('Serial Number PumpSet')
->example('1')
->label('Serial Number PumpSet'),
ImportColumn::make('pack_slip_motor')
->requiredMapping()
->exampleHeader('Pack Slip Motor')
->example('1')
->label('Pack Slip Motor'),
ImportColumn::make('pack_slip_pump')
->requiredMapping()
->exampleHeader('Pack Slip Pump')
->example('1')
->label('Pack Slip Pump'),
ImportColumn::make('pack_slip_pumpset')
->requiredMapping()
->exampleHeader('Pack Slip PumpSet')
->example('1')
->label('Pack Slip PumpSet'),
ImportColumn::make('name_plate_motor')
->requiredMapping()
->exampleHeader('Name Plate Motor')
->example('1')
->label('Name Plate Motor'),
ImportColumn::make('name_plate_pump')
->requiredMapping()
->exampleHeader('Name Plate Pump')
->example('1')
->label('Name Plate Pump'),
ImportColumn::make('name_plate_pumpset')
->requiredMapping()
->exampleHeader('Name Plate PumpSet')
->example('1')
->label('Name Plate PumpSet'),
ImportColumn::make('tube_sticker_motor')
->requiredMapping()
->exampleHeader('Tube Sticker Motor')
->example('1')
->label('Tube Sticker Motor'),
ImportColumn::make('tube_sticker_pump')
->requiredMapping()
->exampleHeader('Tube Sticker Pump')
->example('1')
->label('Tube Sticker Pump'),
ImportColumn::make('tube_sticker_pumpset')
->requiredMapping()
->exampleHeader('Tube Sticker PumpSet')
->example('1')
->label('Tube Sticker PumpSet'),
ImportColumn::make('warranty_card')
->requiredMapping()
->exampleHeader('Warranty Card')
->example('1')
->label('Warranty Card'),
ImportColumn::make('part_validation1')
->requiredMapping()
->exampleHeader('Part Validation 1')
->example('12345')
->label('Part Validation 1'),
ImportColumn::make('part_validation2')
->requiredMapping()
->exampleHeader('Part Validation 2')
->example('54321')
->label('Part Validation 2'),
ImportColumn::make('part_validation3')
->requiredMapping()
->exampleHeader('Part Validation 3')
->example('12345')
->label('Part Validation 3'),
ImportColumn::make('part_validation4')
->requiredMapping()
->exampleHeader('Part Validation 4')
->example('')
->label('Part Validation 4'),
ImportColumn::make('part_validation5')
->requiredMapping()
->exampleHeader('Part Validation 5')
->example('')
->label('Part Validation 5'),
ImportColumn::make('uom')
->requiredMapping()
->exampleHeader('Unit of Measure')
->example('EA')
->label('Unit of Measure'),
ImportColumn::make('line')
->requiredMapping()
->exampleHeader('Line Name')
->example('4 inch pump line')
->label('Line Name')
->relationship(resolveUsing:'name')
->rules(['required']),
ImportColumn::make('plant')
->requiredMapping()
->exampleHeader('Plant Name')
->example('Ransar Industries-I')
->label('Plant Name')
->relationship(resolveUsing:'name')
->rules(['required']),
ImportColumn::make('updated_at')
->requiredMapping()
->exampleHeader('Updated DateTime')
->example('12-02-2025 15:51:00')
->label('Updated DateTime')
->rules(['required']),
ImportColumn::make('operator_id')
->requiredMapping()
->exampleHeader('Operator ID')
->example(Filament::auth()->user()->name)
->label('Operator ID')
->rules(['required']),
];
}
public function resolveRecord(): ?QualityValidation
{
$warnMsg = [];
$plant = Plant::where('name', $this->data['plant'])->first();
$line = null;
$stickMaster = null;
if (!$plant) {
$warnMsg[] = "Plant not found";
}
else {
$line = Line::where('name', $this->data['line'])->where('plant_id', $plant->id)->first();
$uniqueCode = trim($this->data['sticker_master_id_code']);// stickerMaster.item
$stickMaster = StickerMaster::select('id')->with('item')
->whereHas('item', function ($query) use ($uniqueCode, $plant) {
$query->where('code', $uniqueCode)->where('plant_id', $plant->id);
})->value('id');
}
if (!$line) {
$warnMsg[] = "Line not found";
}
if (!$stickMaster) {
$warnMsg[] = "Sticker item code not found";
}
if (!is_numeric($this->data['production_order']) || Str::length($this->data['production_order']) < 7) {
$warnMsg[] = "Invalid production order found";
}
if (!ctype_alnum($this->data['serial_number']) || Str::length($this->data['serial_number']) < 9) {
$warnMsg[] = "Invalid serial number found";
}
// dd($stickMaster);
// if (Str::length($this->data['uom']) < 1) {
// $warnMsg[] = "Invalid unit of measure found";
// }
$user = User::where('name', $this->data['operator_id'])->first();
if (!$user) {
$warnMsg[] = "Operator ID not found";
}
$fromDate = $this->data['created_at'];
$toDate = $this->data['updated_at'];
$formats = ['d-m-Y H:i', 'd-m-Y H:i:s']; //'07-05-2025 08:00' or '07-05-2025 08:00:00'
$fdateTime = null;
$tdateTime = null;
// Try parsing with multiple formats
foreach ($formats as $format) {
try {
$fdateTime = Carbon::createFromFormat($format, $fromDate);
break;
} catch (\Exception $e) {
// Optionally collect warning messages
// $warnMsg[] = "Date format mismatch with format: $format";
}
}
foreach ($formats as $format) {
try {
$tdateTime = Carbon::createFromFormat($format, $toDate);
break;
} catch (\Exception $e) {
// Optionally collect warning messages
// $warnMsg[] = "Date format mismatch with format: $format";
}
}
// $fDateOnly = '';
if (!isset($fdateTime)) {
// throw new \Exception('Invalid date time format');
$warnMsg[] = "Invalid 'Created DateTime' format. Expected DD-MM-YYYY HH:MM:SS";
}
// else {
// $fDateOnly = $fdateTime->toDateString();
// }
if (!isset($tdateTime)) {
$warnMsg[] = "Invalid 'Updated DateTime' format. Expected DD-MM-YYYY HH:MM:SS";
}
if (isset($fdateTime) && isset($tdateTime)) {
if ($fdateTime->greaterThan($tdateTime)) {
$warnMsg[] = "'Created DataTime' is greater than 'Updated DateTime'.";
}
}
// if (!$fromDate) {
// $warnMsg[] = "Invalid 'Created DateTime' format. Expected DD-MM-YYYY HH:MM:SS";
// }
// else if (!$toDate) {
// $warnMsg[] = "Invalid 'Updated DateTime' format. Expected DD-MM-YYYY HH:MM:SS";
// }
if (!empty($warnMsg)) {
throw new RowImportFailedException(implode(', ', $warnMsg));
}
QualityValidation::updateOrCreate([
'plant_id' => $plant->id,
'line_id' => $line->id,
'sticker_master_id' => $stickMaster,//->id
'uom' => $this->data['uom'],
'production_order' => $this->data['production_order'],
'serial_number' => $this->data['serial_number'],
'serial_number_motor' => $this->data['serial_number_motor'],
'serial_number_pump' => $this->data['serial_number_pump'],
'serial_number_pumpset' => $this->data['serial_number_pumpset'],
'pack_slip_motor' => $this->data['pack_slip_motor'],
'pack_slip_pump' => $this->data['pack_slip_pump'],
'pack_slip_pumpset' => $this->data['pack_slip_pumpset'],
'name_plate_motor' => $this->data['name_plate_motor'],
'name_plate_pump' => $this->data['name_plate_pump'],
'name_plate_pumpset' => $this->data['name_plate_pumpset'],
'tube_sticker_motor' => $this->data['tube_sticker_motor'],
'tube_sticker_pump' => $this->data['tube_sticker_pump'],
'tube_sticker_pumpset' => $this->data['tube_sticker_pumpset'],
'warranty_card' => $this->data['warranty_card'],
'part_validation1' => $this->data['part_validation1'],
'part_validation2' => $this->data['part_validation2'],
'part_validation3' => $this->data['part_validation3'],
'part_validation4' => $this->data['part_validation4'],
'part_validation5' => $this->data['part_validation5'],
'created_at' => $fdateTime->format('Y-m-d H:i:s'),//$this->data['created_at'],
'updated_at' => $tdateTime->format('Y-m-d H:i:s'),//$this->data['updated_at'],
'operator_id' => $this->data['operator_id'],
]);
return null;
// return QualityValidation::firstOrNew([
// // Update existing records, matching them by `$this->data['column_name']`
// 'email' => $this->data['email'],
// ]);
// return new QualityValidation();
}
public static function getCompletedNotificationBody(Import $import): string
{
$body = 'Your quality validation import has completed and ' . number_format($import->successful_rows) . ' ' . str('row')->plural($import->successful_rows) . ' imported.';
if ($failedRowsCount = $import->getFailedRowsCount()) {
$body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to import.';
}
return $body;
}
}

View File

@@ -0,0 +1,308 @@
<?php
namespace App\Filament\Imports;
use App\Models\Plant;
use App\Models\ReworkLocatorInvoiceValidation;
use App\Models\User;
use Carbon\Carbon;
use Filament\Actions\Imports\Exceptions\RowImportFailedException;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
use Str;
class ReworkLocatorInvoiceValidationImporter extends Importer
{
protected static ?string $model = ReworkLocatorInvoiceValidation::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('invoice_number')
->requiredMapping()
->exampleHeader('Invoice Number')
->example('3RA002514')
->label('Invoice Number')
->rules(['required']),
ImportColumn::make('serial_number')
->requiredMapping()
->exampleHeader('Serial Number')
->example('25145441154545')
->label('Serial Number')
->rules(['required']),
ImportColumn::make('pallet_number')
->requiredMapping()
->exampleHeader('Pallet Number')
->example('')
->label('Pallet Number'),
ImportColumn::make('locator_number')
->requiredMapping()
->exampleHeader('Locator Number')
->example('')
->label('Locator Number'),
ImportColumn::make('scanned_status')
->requiredMapping()
->exampleHeader('Scanned Status')
->example('')
->label('Scanned Status')
->rules(['required']),
ImportColumn::make('upload_status')
->requiredMapping()
->exampleHeader('Upload Status')
->example('Y')
->label('Upload Status')
->rules(['required']),
ImportColumn::make('created_at')
->requiredMapping()
->exampleHeader('Created At')
->example('2025-06-17 08:42:16')
->label('Created At')
->rules(['required']),
ImportColumn::make('scanned_at')
->requiredMapping()
->exampleHeader('Scanned At')
->example('2025-06-17 08:42:16')
->label('Scanned At')
->rules(['required']),
ImportColumn::make('updated_at')
->requiredMapping()
->exampleHeader('Updated At')
->example('2025-06-17 08:42:16')
->label('Updated At')
->rules(['required']),
ImportColumn::make('reworked_at')
->requiredMapping()
->exampleHeader('Reworked At')
->example('2025-06-17 08:42:16')
->label('Reworked At')
->rules(['required']),
ImportColumn::make('created_by')
->requiredMapping()
->exampleHeader('Created By')
->example('admin')
->label('Created By')
->rules(['required']),
ImportColumn::make('scanned_by')
->requiredMapping()
->exampleHeader('Scanned By')
->example('admin')
->label('Scanned By')
->rules(['required']),
ImportColumn::make('updated_by')
->requiredMapping()
->exampleHeader('Updated By')
->example('admin')
->label('Updated By'),
ImportColumn::make('reworked_by')
->requiredMapping()
->exampleHeader('Reworked By')
->example('admin')
->label('Reworked By')
->rules(['required']),
];
}
public function resolveRecord(): ?ReworkLocatorInvoiceValidation
{
$warnMsg = [];
$plantCod = $this->data['plant'];
$plant = null;
$invoiceNo = $this->data['invoice_number'];
$serialNo = $this->data['serial_number'];
$palletNo = $this->data['pallet_number'];
$locatorNo = $this->data['locator_number'];
$scannedStat = $this->data['scanned_status'];
$uploadStat = $this->data['upload_status'];
$createdAt = $this->data['created_at'];
$scannedAt = $this->data['scanned_at'];
$updatedAt = $this->data['updated_at'];
$reworkedAt = $this->data['reworked_at'];
$cDateTime = null;
$sDateTime = null;
$uDateTime = null;
$rDateTime = null;
$createdBy = $this->data['created_by'];
$scannedBy = $this->data['scanned_by'];
$updatedBy = $this->data['updated_by'];
$reworkedBy = $this->data['reworked_by'];
if (Str::length($plantCod) < 4 || !is_numeric($plantCod) || !preg_match('/^[1-9]\d{3,}$/', $plantCod)) {
$warnMsg[] = "Invalid plant code found";
}
else
{
$plant = Plant::where('code', $this->data['plant'])->first();
if (!$plant) {
$warnMsg[] = "Plant not found";
}
else
{
if (Str::length($invoiceNo) < 5 || !ctype_alnum($invoiceNo)) {
$warnMsg[] = "Invalid invoice number found";
}
if (Str::length($serialNo) < 9 || Str::length($serialNo) > 20 || !ctype_alnum($serialNo)) {
$warnMsg[] = "Invalid serial number found";
}
if (Str::length($palletNo) > 0 && Str::length($palletNo) < 10) {
$warnMsg[] = "Invalid pallet number found";
}
if (Str::length($locatorNo) > 0 && Str::length($locatorNo) < 7) {
$warnMsg[] = "Invalid locator number found";
}
if ($scannedStat != 'Scanned') {
$warnMsg[] = "Invalid scanned status found";
}
if ($uploadStat != 'Y' && $uploadStat != 'N') {
$warnMsg[] = "Invalid upload status found";
}
$created = User::where('name', $createdBy)->first();
if (!$created) {
$warnMsg[] = "Created by not found";
}
$scanned = User::where('name', $scannedBy)->first();
if (!$scanned) {
$warnMsg[] = "Scanned by not found";
}
if (Str::length($updatedBy) > 0) {
$updated = User::where('name', $updatedBy)->first();
if (!$updated) {
$warnMsg[] = "Updated by not found";
}
}
$reworked = User::where('name', $reworkedBy)->first();
if (!$reworked) {
$warnMsg[] = "Reworked by not found";
}
$formats = ['d-m-Y H:i', 'd-m-Y H:i:s']; //'07-05-2025 08:00' or '07-05-2025 08:00:00'
foreach ($formats as $format) {
try {
$cDateTime = Carbon::createFromFormat($format, $createdAt);
break;
} catch (\Exception $e) {
// Optionally collect warning messages
// $warnMsg[] = "Date format mismatch with format: $format";
}
}
if (!isset($cDateTime)) {
// throw new \Exception('Invalid date time format');
$warnMsg[] = "Invalid 'Created DateTime' format. Expected DD-MM-YYYY HH:MM:SS";
}
foreach ($formats as $format) {
try {
$sDateTime = Carbon::createFromFormat($format, $scannedAt);
break;
} catch (\Exception $e) {
// Optionally collect warning messages
// $warnMsg[] = "Date format mismatch with format: $format";
}
}
if (!isset($sDateTime)) {
$warnMsg[] = "Invalid 'Scanned DateTime' format. Expected DD-MM-YYYY HH:MM:SS";
}
foreach ($formats as $format) {
try {
$uDateTime = Carbon::createFromFormat($format, $updatedAt);
break;
} catch (\Exception $e) {
// Optionally collect warning messages
// $warnMsg[] = "Date format mismatch with format: $format";
}
}
if (!isset($uDateTime)) {
$warnMsg[] = "Invalid 'Updated DateTime' format. Expected DD-MM-YYYY HH:MM:SS";
}
else
{
if (isset($cDateTime) && isset($uDateTime)) {
if ($cDateTime->greaterThan($uDateTime)) {
$warnMsg[] = "'Created DataTime' is greater than 'Updated DateTime'.";
}
}
}
foreach ($formats as $format) {
try {
$rDateTime = Carbon::createFromFormat($format, $reworkedAt);
break;
} catch (\Exception $e) {
// Optionally collect warning messages
// $warnMsg[] = "Date format mismatch with format: $format";
}
}
if (!isset($rDateTime)) {
$warnMsg[] = "Invalid 'Reworked DateTime' format. Expected DD-MM-YYYY HH:MM:SS";
}
else
{
if (isset($cDateTime) && isset($rDateTime)) {
if ($cDateTime->greaterThan($rDateTime)) {
$warnMsg[] = "'Created DataTime' is greater than 'Reworked DateTime'.";
}
}
}
}
}
// if (!is_numeric($locatorQuantity) || $locatorQuantity < 0 || $locatorQuantity > 2) {
// $warnMsg[] = "Invalid locator quantity found";
// }
if (!empty($warnMsg)) {
throw new RowImportFailedException(implode(', ', $warnMsg));
}
ReworkLocatorInvoiceValidation::updateOrCreate(
[
'plant_id' => $plant->id,
'serial_number' => $serialNo,
'invoice_number' => $invoiceNo,
'pallet_number' => $palletNo,
'locator_number' => $locatorNo,
'scanned_status' => $scannedStat,
'upload_status' => $uploadStat,
'created_at' => $cDateTime->format('Y-m-d H:i:s'),
'scanned_at' => $sDateTime->format('Y-m-d H:i:s'),
'updated_at' => $uDateTime->format('Y-m-d H:i:s'),
'reworked_at' => $rDateTime->format('Y-m-d H:i:s'),
'created_by' => $createdBy,
'scanned_by' => $scannedBy,
'updated_by' => $updatedBy,
'reworked_by' => $reworkedBy
]
);
return null;
// // return ReworkLocatorInvoiceValidation::firstOrNew([
// // // Update existing records, matching them by `$this->data['column_name']`
// // 'email' => $this->data['email'],
// // ]);
// return new ReworkLocatorInvoiceValidation();
}
public static function getCompletedNotificationBody(Import $import): string
{
$body = 'Your rework locator invoice validation 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

@@ -2,10 +2,14 @@
namespace App\Filament\Imports;
use App\Models\Block;
use App\Models\Plant;
use App\Models\Shift;
use Filament\Actions\Imports\Exceptions\RowImportFailedException;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
use Str;
class ShiftImporter extends Importer
{
@@ -20,20 +24,6 @@ class ShiftImporter extends Importer
->example('Day')
->label('Shift Name')
->rules(['required']),
ImportColumn::make('block')
->requiredMapping()
->exampleHeader('Block Name')
->example('Block A')
->label('Block Name')
->relationship(resolveUsing:'name')
->rules(['required']),
ImportColumn::make('plant')
->requiredMapping()
->exampleHeader('Plant Name')
->example('Ransar Industries-I')
->label('Plant Name')
->relationship(resolveUsing:'name')
->rules(['required']),
ImportColumn::make('start_time')
->requiredMapping()
->exampleHeader('Start Time')
@@ -53,6 +43,20 @@ class ShiftImporter extends Importer
->example('19:30:00')
->label('End Time')
->rules(['required']),
ImportColumn::make('block')
->requiredMapping()
->exampleHeader('Block Name')
->example('Block A')
->label('Block Name')
->relationship(resolveUsing:'name')
->rules(['required']),
ImportColumn::make('plant')
->requiredMapping()
->exampleHeader('Plant Name')
->example('Ransar Industries-I')
->label('Plant Name')
->relationship(resolveUsing:'name')
->rules(['required']),
ImportColumn::make('status')
->requiredMapping()
->exampleHeader('Active Status')
@@ -64,12 +68,30 @@ class ShiftImporter extends Importer
public function resolveRecord(): ?Shift
{
$plant = \App\Models\Plant::where('name', $this->data['plant'])->first();
$block = \App\Models\Block::where('name', $this->data['block'])->where('plant_id', $plant->id)->first();
$warnMsg = [];
$plant = Plant::where('name', $this->data['plant'])->first();
if (!$plant) {
$warnMsg[] = "Plant not found";
}
$block = Block::where('name', $this->data['block'])->where('plant_id', $plant->id)->first();
if (!$block) {
$warnMsg[] = "Block not found";
}
if (Str::length($this->data['duration']) < 0 || !is_numeric($this->data['duration'])) {
$warnMsg[] = "Invalid duration found";
}
if (Str::length($this->data['start_time']) < 0) {
$warnMsg[] = "Invalid start time found";
}
if (Str::length($this->data['end_time']) < 0) {
$warnMsg[] = "Invalid end time found";
}
if (Str::length($this->data['status']) < 0 || $this->data['status'] != 'Active') {
$warnMsg[] = "Invalid shift status found";
}
if (!$plant || !$block) {
// Optionally handle missing plant/block
return null;
if (!empty($warnMsg)) {
throw new RowImportFailedException(implode(', ', $warnMsg));
}
$shift = Shift::where('name', $this->data['name'])

View File

@@ -2,10 +2,14 @@
namespace App\Filament\Imports;
use App\Models\Item;
use App\Models\Plant;
use App\Models\StickerMaster;
use Filament\Actions\Imports\Exceptions\RowImportFailedException;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
use Str;
class StickerMasterImporter extends Importer
{
@@ -21,7 +25,130 @@ class StickerMasterImporter extends Importer
->label('ITEM CODE')
->relationship(resolveUsing: 'code')
->rules(['required']),
ImportColumn::make('serial_number_motor')
// ->requiredMapping()
->exampleHeader('Serial Number Motor')
->label('SERIAL NUMBER MOTOR')
->example('1'),
ImportColumn::make('serial_number_pump')
//->requiredMapping()
->exampleHeader('Serial Number Pump')
->label('SERIAL NUMBER PUMP')
->example('1'),
ImportColumn::make('serial_number_pumpset')
//->requiredMapping()
->exampleHeader('Serial Number PumpSet')
->label('SERIAL NUMBER PUMPSET')
->example(''),
ImportColumn::make('pack_slip_motor')
//->requiredMapping()
->exampleHeader('Pack Slip Motor')
->label('PACK SLIP MOTOR')
->example('1'),
ImportColumn::make('pack_slip_pump')
//->requiredMapping()
->exampleHeader('Pack Slip Pump')
->label('PACK SLIP PUMP')
->example('1'),
ImportColumn::make('pack_slip_pumpset')
//->requiredMapping()
->exampleHeader('Pack Slip PumpSet')
->label('PACK SLIP PUMPSET')
->example(''),
ImportColumn::make('name_plate_motor')
// ->requiredMapping()
->exampleHeader('Name Plate Motor')
->label('NAME PLATE MOTOR')
->example('1'),
ImportColumn::make('name_plate_pump')
// ->requiredMapping()
->exampleHeader('Name Plate Pump')
->label('NAME PLATE PUMP')
->example('1'),
ImportColumn::make('name_plate_pumpset')
// ->requiredMapping()
->exampleHeader('Name Plate PumpSet')
->label('NAME PLATE PUMPSET')
->example(''),
ImportColumn::make('tube_sticker_motor')
// ->requiredMapping()
->exampleHeader('Tube Sticker Motor')
->label('TUBE STICKER MOTOR')
->example('1'),
ImportColumn::make('tube_sticker_pump')
// ->requiredMapping()
->exampleHeader('Tube Sticker Pump')
->label('TUBE STICKER PUMP')
->example('1'),
ImportColumn::make('tube_sticker_pumpset')
// ->requiredMapping()
->exampleHeader('Tube Sticker PumpSet')
->label('TUBE STICKER PUMPSET')
->example(''),
ImportColumn::make('warranty_card')
// ->requiredMapping()
->exampleHeader('Warranty Card')
->label('WARRANTY CARD')
->example('1'),
ImportColumn::make('part_validation1')
// ->requiredMapping()
->exampleHeader('Part Validation 1')
->label('PART VALIDATION 1')
->example('12345'),
ImportColumn::make('part_validation2')
// ->requiredMapping()
->exampleHeader('Part Validation 2')
->label('PART VALIDATION 2')
->example('23456'),
ImportColumn::make('part_validation3')
// ->requiredMapping()
->exampleHeader('Part Validation 3')
->label('PART VALIDATION 3')
->example('34567'),
ImportColumn::make('part_validation4')
// ->requiredMapping()
->exampleHeader('Part Validation 4')
->label('PART VALIDATION 4')
->example('45678'),
ImportColumn::make('part_validation5')
// ->requiredMapping()
->exampleHeader('Part Validation 5')
->label('PART VALIDATION 5')
->example('56789'),
ImportColumn::make('laser_part_validation1')
// ->requiredMapping()
->exampleHeader('Laser Part Validation 1')
->label('LASER PART VALIDATION 1')
->example('67890'),
ImportColumn::make('laser_part_validation2')
// ->requiredMapping()
->exampleHeader('Laser Part Validation 2')
->label('LASER PART VALIDATION 2')
->example('78901'),
ImportColumn::make('panel_box_code')
// ->requiredMapping()
->exampleHeader('Panel Box Code')
->label('PANEL BOX CODE')
->example('123456'),
ImportColumn::make('load_rate')
->requiredMapping()
->integer()
->exampleHeader('Load Rate')
->label('LOAD RATE')
->example('0')
->rules(['required']),
ImportColumn::make('material_type')
// ->requiredMapping()
->integer()
->exampleHeader('Material Type')
->label('MATERIAL TYPE')
->example(''),
ImportColumn::make('bundle_quantity')
// ->requiredMapping()
->integer()
->exampleHeader('Bundle Quantity')
->label('BUNDLE QUANTITY')
->example(''),
ImportColumn::make('plant')
->requiredMapping()
->exampleHeader('Plant Name')
@@ -29,196 +156,120 @@ class StickerMasterImporter extends Importer
->label('PLANT NAME')
->relationship(resolveUsing: 'name')
->rules(['required']),
ImportColumn::make('serial_number_motor')
// ->requiredMapping()
->exampleHeader('Serial Number Motor')
->label('SERIAL NUMBER MOTOR')
->example('1'),
ImportColumn::make('serial_number_pump')
//->requiredMapping()
->exampleHeader('Serial Number Pump')
->label('SERIAL NUMBER PUMP')
->example('1'),
ImportColumn::make('serial_number_pumpset')
//->requiredMapping()
->exampleHeader('Serial Number PumpSet')
->label('SERIAL NUMBER PUMPSET')
->example(''),
ImportColumn::make('pack_slip_motor')
//->requiredMapping()
->exampleHeader('Pack Slip Motor')
->label('PACK SLIP MOTOR')
->example('1'),
ImportColumn::make('pack_slip_pump')
//->requiredMapping()
->exampleHeader('Pack Slip Pump')
->label('PACK SLIP PUMP')
->example('1'),
ImportColumn::make('pack_slip_pumpset')
//->requiredMapping()
->exampleHeader('Pack Slip PumpSet')
->label('PACK SLIP PUMPSET')
->example(''),
ImportColumn::make('name_plate_motor')
// ->requiredMapping()
->exampleHeader('Name Plate Motor')
->label('NAME PLATE MOTOR')
->example('1'),
ImportColumn::make('name_plate_pump')
// ->requiredMapping()
->exampleHeader('Name Plate Pump')
->label('NAME PLATE PUMP')
->example('1'),
ImportColumn::make('name_plate_pumpset')
// ->requiredMapping()
->exampleHeader('Name Plate PumpSet')
->label('NAME PLATE PUMPSET')
->example(''),
ImportColumn::make('tube_sticker_motor')
// ->requiredMapping()
->exampleHeader('Tube Sticker Motor')
->label('TUBE STICKER MOTOR')
->example('1'),
ImportColumn::make('tube_sticker_pump')
// ->requiredMapping()
->exampleHeader('Tube Sticker Pump')
->label('TUBE STICKER PUMP')
->example('1'),
ImportColumn::make('tube_sticker_pumpset')
// ->requiredMapping()
->exampleHeader('Tube Sticker PumpSet')
->label('TUBE STICKER PUMPSET')
->example(''),
ImportColumn::make('warranty_card')
// ->requiredMapping()
->exampleHeader('Warranty Card')
->label('WARRANTY CARD')
->example('1'),
ImportColumn::make('part_validation1')
// ->requiredMapping()
->exampleHeader('Part Validation 1')
->label('PART VALIDATION 1')
->example('12345'),
ImportColumn::make('part_validation2')
// ->requiredMapping()
->exampleHeader('Part Validation 2')
->label('PART VALIDATION 2')
->example('23456'),
ImportColumn::make('part_validation3')
// ->requiredMapping()
->exampleHeader('Part Validation 3')
->label('PART VALIDATION 3')
->example('34567'),
ImportColumn::make('part_validation4')
// ->requiredMapping()
->exampleHeader('Part Validation 4')
->label('PART VALIDATION 4')
->example('45678'),
ImportColumn::make('part_validation5')
// ->requiredMapping()
->exampleHeader('Part Validation 5')
->label('PART VALIDATION 5')
->example('56789'),
ImportColumn::make('panel_box_code')
//->requiredMapping()
->exampleHeader('Panel Box Code')
->label('PANEL BOX CODE')
->example('123456'),
ImportColumn::make('load_rate')
// ->requiredMapping()
->integer()
->exampleHeader('Load Rate')
->label('LOAD RATE')
->example('0'),
ImportColumn::make('bundle_quantity')
// ->requiredMapping()
->integer()
->exampleHeader('Bundle Quantity')
->label('BUNDLE QUANTITY')
->example(''),
ImportColumn::make('material_type')
// ->requiredMapping()
->integer()
->exampleHeader('Material Type')
->label('MATERIAL TYPE')
->example(''),
];
}
public function resolveRecord(): ?StickerMaster
{
$item = \App\Models\Item::where('code', $this->data['item'])->first();
$plant = \App\Models\Plant::where('name', $this->data['plant'])->first();
if (!$plant || !$item) {
// Optionally handle missing plant/block
return null;
$warnMsg = [];
$item = null;
$plant = Plant::where('name', $this->data['plant'])->first();
if (!$plant) {
$warnMsg[] = "Plant not found";
}
return StickerMaster::updateOrCreate([
'item_id' => $item->id,
'plant_id' => $plant->id
],
[
'serial_number_motor' => $this->data['serial_number_motor'],
'serial_number_pump' => $this->data['serial_number_pump'],
'serial_number_pumpset' => $this->data['serial_number_pumpset'],
'pack_slip_motor' => $this->data['pack_slip_motor'],
'pack_slip_pump' => $this->data['pack_slip_pump'],
'pack_slip_pumpset' => $this->data['pack_slip_pumpset'],
'name_plate_motor' => $this->data['name_plate_motor'],
'name_plate_pump' => $this->data['name_plate_pump'],
'name_plate_pumpset' => $this->data['name_plate_pumpset'],
'tube_sticker_motor' => $this->data['tube_sticker_motor'],
'tube_sticker_pump' => $this->data['tube_sticker_pump'],
'tube_sticker_pumpset' => $this->data['tube_sticker_pumpset'],
'warranty_card' => $this->data['warranty_card'],
'part_validation1' => $this->data['part_validation1'],
'part_validation2' => $this->data['part_validation2'],
'part_validation3' => $this->data['part_validation3'],
'part_validation4' => $this->data['part_validation4'],
'part_validation5' => $this->data['part_validation5'],
'panel_box_code' => $this->data['panel_box_code'],
'load_rate' => $this->data['load_rate'],
'bundle_quantity' => $this->data['bundle_quantity'],
'material_type' => $this->data['material_type']
]
);
else
{
$item = Item::where('code', $this->data['item'])->where('plant_id', $plant->id)->first();
if (!$item) {
$warnMsg[] = "Item code not found";
}
else
{
if (Str::length($this->data['serial_number_motor']) > 0 && $this->data['serial_number_motor'] != '1') {
$warnMsg[] = "Serial number motor must be 1 or empty";
}
if (Str::length($this->data['serial_number_pump']) > 0 && $this->data['serial_number_pump'] != '1') {
$warnMsg[] = "Serial number pump must be 1 or empty";
}
if (Str::length($this->data['serial_number_pumpset']) > 0 && $this->data['serial_number_pumpset'] != '1') {
$warnMsg[] = "Serial number pumpset must be 1 or empty";
}
if (Str::length($this->data['pack_slip_motor']) > 0 && $this->data['pack_slip_motor'] != '1') {
$warnMsg[] = "Pack slip motor must be 1 or empty";
}
if (Str::length($this->data['pack_slip_pump']) > 0 && $this->data['pack_slip_pump'] != '1') {
$warnMsg[] = "Pack slip pump must be 1 or empty";
}
if (Str::length($this->data['pack_slip_pumpset']) > 0 && $this->data['pack_slip_pumpset'] != '1') {
$warnMsg[] = "Pack slip pumpset must be 1 or empty";
}
if (Str::length($this->data['name_plate_motor']) > 0 && $this->data['name_plate_motor'] != '1') {
$warnMsg[] = "Name plate motor must be 1 or empty";
}
if (Str::length($this->data['name_plate_pump']) > 0 && $this->data['name_plate_pump'] != '1') {
$warnMsg[] = "Name plate pump must be 1 or empty";
}
if (Str::length($this->data['name_plate_pumpset']) > 0 && $this->data['name_plate_pumpset'] != '1') {
$warnMsg[] = "Name plate pumpset must be 1 or empty";
}
if (Str::length($this->data['tube_sticker_motor']) > 0 && $this->data['tube_sticker_motor'] != '1') {
$warnMsg[] = "Tube sticker motor must be 1 or empty";
}
if (Str::length($this->data['tube_sticker_pump']) > 0 && $this->data['tube_sticker_pump'] != '1') {
$warnMsg[] = "Tube sticker pump must be 1 or empty";
}
if (Str::length($this->data['tube_sticker_pumpset']) > 0 && $this->data['tube_sticker_pumpset'] != '1') {
$warnMsg[] = "Tube sticker pumpset must be 1 or empty";
}
if (Str::length($this->data['warranty_card']) > 0 && $this->data['warranty_card'] != '1') {
$warnMsg[] = "Warranty card must be 1 or empty";
}
if (Str::length($this->data['panel_box_code']) > 0 && (Str::length($this->data['panel_box_code']) < 6 || !ctype_alnum($this->data['panel_box_code']))) {
$warnMsg[] = "Invalid panel box code found";
}
if (Str::length($this->data['load_rate']) < 0 || !is_numeric($this->data['load_rate']) || $this->data['load_rate'] < 0) {
$warnMsg[] = "Load rate must be greater than or equal to 0";
}
if (Str::length($this->data['bundle_quantity']) > 0 && (!is_numeric($this->data['bundle_quantity']) || $this->data['bundle_quantity'] <= 1)) {
$warnMsg[] = "Bundle quantity must be greater than or equal to '2' or empty";
}
if (Str::length($this->data['material_type']) > 0 && $this->data['material_type'] != '1' && $this->data['material_type'] != '2' && $this->data['material_type'] != '3') { //($this->data['material_type'] != null) &&
$warnMsg[] = "Material type must be 1 or 2 or 3 or empty";
}
}
}
if (!empty($warnMsg)) {
throw new RowImportFailedException(implode(', ', $warnMsg));
}
StickerMaster::updateOrCreate([
'item_id' => $item->id,
'plant_id' => $plant->id
],
[
'serial_number_motor' => $this->data['serial_number_motor'],
'serial_number_pump' => $this->data['serial_number_pump'],
'serial_number_pumpset' => $this->data['serial_number_pumpset'],
'pack_slip_motor' => $this->data['pack_slip_motor'],
'pack_slip_pump' => $this->data['pack_slip_pump'],
'pack_slip_pumpset' => $this->data['pack_slip_pumpset'],
'name_plate_motor' => $this->data['name_plate_motor'],
'name_plate_pump' => $this->data['name_plate_pump'],
'name_plate_pumpset' => $this->data['name_plate_pumpset'],
'tube_sticker_motor' => $this->data['tube_sticker_motor'],
'tube_sticker_pump' => $this->data['tube_sticker_pump'],
'tube_sticker_pumpset' => $this->data['tube_sticker_pumpset'],
'warranty_card' => $this->data['warranty_card'],
'part_validation1' => $this->data['part_validation1'],
'part_validation2' => $this->data['part_validation2'],
'part_validation3' => $this->data['part_validation3'],
'part_validation4' => $this->data['part_validation4'],
'part_validation5' => $this->data['part_validation5'],
'laser_part_validation1' => $this->data['laser_part_validation1'],
'laser_part_validation2' => $this->data['laser_part_validation2'],
'panel_box_code' => $this->data['panel_box_code'],
'load_rate' => $this->data['load_rate'],
'bundle_quantity' => $this->data['bundle_quantity'],
'material_type' => $this->data['material_type']
]);
return null;
// return StickerMaster::firstOrNew([
// // Update existing records, matching them by `$this->data['column_name']`
// 'email' => $this->data['email'],
// ]);
return new StickerMaster();
// return new StickerMaster();
}
public static function getCompletedNotificationBody(Import $import): string

View File

@@ -0,0 +1,114 @@
<?php
namespace App\Filament\Imports;
use App\Models\TestingPanelReading;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
class TestingPanelReadingImporter extends Importer
{
protected static ?string $model = TestingPanelReading::class;
public static function getColumns(): array
{
return [
ImportColumn::make('item')
->requiredMapping()
->relationship()
->rules(['required']),
ImportColumn::make('machine')
->requiredMapping()
->relationship()
->rules(['required']),
ImportColumn::make('output')
->requiredMapping()
->rules(['required']),
ImportColumn::make('serial_number')
->requiredMapping()
->rules(['required']),
ImportColumn::make('before_fr_volt'),
ImportColumn::make('before_fr_cur'),
ImportColumn::make('before_fr_pow'),
ImportColumn::make('before_fr_res_ry'),
ImportColumn::make('before_fr_res_yb'),
ImportColumn::make('before_fr_res_br'),
ImportColumn::make('before_fr_ir'),
ImportColumn::make('before_fr_ir_r'),
ImportColumn::make('before_fr_ir_y'),
ImportColumn::make('before_fr_ir_b'),
ImportColumn::make('before_fr_freq'),
ImportColumn::make('before_fr_speed'),
ImportColumn::make('after_fr_vol'),
ImportColumn::make('after_fr_cur'),
ImportColumn::make('after_fr_pow'),
ImportColumn::make('after_fr_ir_hot'),
ImportColumn::make('after_fr_ir_hot_r'),
ImportColumn::make('after_fr_ir_hot_y'),
ImportColumn::make('after_fr_ir_hot_b'),
ImportColumn::make('after_fr_ir_cool'),
ImportColumn::make('after_fr_ir_cool_r'),
ImportColumn::make('after_fr_ir_cool_y'),
ImportColumn::make('after_fr_ir_cool_b'),
ImportColumn::make('after_fr_freq'),
ImportColumn::make('after_fr_speed'),
ImportColumn::make('after_fr_leak_cur'),
ImportColumn::make('locked_rt_volt'),
ImportColumn::make('locked_rt_cur'),
ImportColumn::make('locked_rt_pow'),
ImportColumn::make('no_load_pickup_volt'),
ImportColumn::make('room_temperature'),
ImportColumn::make('hv_test'),
ImportColumn::make('batch_number'),
ImportColumn::make('batch_count')
->requiredMapping()
->rules(['required']),
ImportColumn::make('result'),
ImportColumn::make('remark'),
ImportColumn::make('rework_count')
->requiredMapping()
->rules(['required']),
ImportColumn::make('update_count')
->requiredMapping()
->rules(['required']),
ImportColumn::make('output_flag')
->requiredMapping()
->rules(['required']),
ImportColumn::make('line')
->requiredMapping()
->relationship()
->rules(['required']),
ImportColumn::make('plant')
->requiredMapping()
->relationship()
->rules(['required']),
ImportColumn::make('tested_by'),
ImportColumn::make('updated_by'),
ImportColumn::make('scanned_at')
->requiredMapping()
->rules(['required']),
];
}
public function resolveRecord(): ?TestingPanelReading
{
// return TestingPanelReading::firstOrNew([
// // Update existing records, matching them by `$this->data['column_name']`
// 'email' => $this->data['email'],
// ]);
return new TestingPanelReading();
}
public static function getCompletedNotificationBody(Import $import): string
{
$body = 'Your testing panel reading import has completed and ' . number_format($import->successful_rows) . ' ' . str('row')->plural($import->successful_rows) . ' imported.';
if ($failedRowsCount = $import->getFailedRowsCount()) {
$body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to import.';
}
return $body;
}
}

View File

@@ -0,0 +1,191 @@
<?php
namespace App\Filament\Imports;
use App\Models\Item;
use App\Models\Plant;
use App\Models\WeightValidation;
use Filament\Actions\Imports\Exceptions\RowImportFailedException;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
use Str;
class WeightValidationImporter extends Importer
{
protected static ?string $model = WeightValidation::class;
public static function getColumns(): array
{
return [
ImportColumn::make('item')
->requiredMapping()
->exampleHeader('Item Code')
->example('123456')
->label('ITEM CODE')
->relationship(resolveUsing: 'code')
->rules(['required']),
ImportColumn::make('obd_number')
->requiredMapping()
->exampleHeader('OBD Number')
->example('3RA00352')
->label('OBD Number')
->rules(['required']),
ImportColumn::make('line_number')
->requiredMapping()
->exampleHeader('Line Number')
->example('1')
->label('Line Number')
->rules(['required']),
ImportColumn::make('batch_number')
->requiredMapping()
->exampleHeader('Batch Number')
->example('2021217')
->label('Batch Number')
->rules(['required']),
ImportColumn::make('heat_number')
->requiredMapping()
->exampleHeader('Heat Number')
->example('RSL-D1390')
->label('Heat Number')
->rules(['required']),
ImportColumn::make('obd_weight')
->requiredMapping()
->exampleHeader('Actual Weight')
->example('3540.00')
->label('Actual Weight')
->rules(['required']),
ImportColumn::make('vehicle_number')
->requiredMapping()
->exampleHeader('Vehicle Number')
->example('TN54AB1234')
->label('Vehicle Number')
->rules(['required']),
ImportColumn::make('bundle_number')
->requiredMapping()
->exampleHeader('Bundle Number')
->example('1')
->label('Bundle Number')
->rules(['required']),
ImportColumn::make('picked_weight')
->requiredMapping()
->exampleHeader('Picked Weight')
->example('1')
->label('Picked Weight')
->rules(['required']),
ImportColumn::make('plant')
->requiredMapping()
->exampleHeader('Plant Name')
->example('Ransar Industries-I')
->label('PLANT NAME')
->relationship(resolveUsing: 'name')
->rules(['required']),
ImportColumn::make('scanned_by')
->requiredMapping()
->exampleHeader('Scanned By')
->example('User-1')
->label('Scanned By')
->rules(['required']),
];
}
public function resolveRecord(): ?WeightValidation
{
$warnMsg = [];
$plant = Plant::where('name', $this->data['plant'])->first();
if (!$plant) {
$warnMsg[] = "Plant not found";
}
$item = null;
if ($plant) {
if (Str::length($this->data['item']) < 6 || !ctype_alnum($this->data['item'])) {
$warnMsg[] = "Invalid item code found";
}
else
{
$item = Item::where('code', $this->data['item'])->where('plant_id', $plant->id)->first();
if (!$item) {
$warnMsg[] = "Item code not found";
}
}
}
else { //if (!$item)
$warnMsg[] = "Item code not found";
}
$obdNum = $this->data['obd_number'];
if (Str::length($obdNum) < 8 || !ctype_alnum($obdNum)) {
$warnMsg[] = "Invalid OBD number found";
}
$lineNum = $this->data['line_number'];
if (Str::length($lineNum) < 1 || !is_numeric($lineNum)) {
$warnMsg[] = "Invalid line number found";
}
$batchNum = $this->data['batch_number'];
if (Str::length($batchNum) < 8 || !is_numeric($batchNum)) {
$warnMsg[] = "Invalid batch number found";
}
$heatNum = $this->data['heat_number'];
if (Str::length($heatNum) < 4) {
$warnMsg[] = "Invalid heat number found";
}
$actWeight = $this->data['obd_weight'];
if (Str::length($actWeight) < 1 || !is_numeric($actWeight)) {
$warnMsg[] = "Invalid actual weight found";
}
$vehicleNum = $this->data['vehicle_number'];
if (Str::length($vehicleNum) < 10 || !ctype_alnum($vehicleNum)) {
$warnMsg[] = "Invalid vehicle number found";
}
$bundleNum = $this->data['bundle_number'];
if (Str::length($bundleNum) < 1 || !is_numeric($bundleNum)) {
$warnMsg[] = "Invalid bundle number found";
}
$pickWeight = $this->data['picked_weight'];
if (Str::length($pickWeight) < 1 || !is_numeric($pickWeight)) {
$warnMsg[] = "Invalid picked weight found";
}
$scanBy = $this->data['scanned_by'];
if (Str::length($scanBy) < 3 || !ctype_alnum($scanBy)) {
$warnMsg[] = "Invalid scanned by name found";
}
if (!empty($warnMsg)) {
throw new RowImportFailedException(implode(', ', $warnMsg));
}
return WeightValidation::updateOrCreate([
'plant_id' => $plant->id,
'obd_number' => $obdNum,
'line_number' => $lineNum
],
[
'item_id' => $item->id,
'batch_number' => $batchNum,
'heat_number' => $heatNum,
'obd_weight' => $actWeight,
'vehicle_number' => $vehicleNum,
'bundle_number' => $bundleNum,
'picked_weight' => $pickWeight,
'scanned_by' => $scanBy
]
);
// return WeightValidation::firstOrNew([
// // Update existing records, matching them by `$this->data['column_name']`
// 'email' => $this->data['email'],
// ]);
// return new WeightValidation();
}
public static function getCompletedNotificationBody(Import $import): string
{
$body = 'Your weight validation 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

@@ -37,7 +37,7 @@ class Dashboard extends \Filament\Pages\Dashboard
->reactive()
->afterStateUpdated(function ($state) {
session(['selected_plant' => $state]); // fixed typo
$this->dispatch('cumulativeChart'); // custom Livewire event
//$this->dispatch('cumulativeChart'); // custom Livewire event
}),
]);
@@ -53,6 +53,15 @@ class Dashboard extends \Filament\Pages\Dashboard
{
return 'Production Line Count';
}
public function getWidgets(): array
{
$widgets = [];
if (CumulativeChart::canView()) {
$widgets[] = CumulativeChart::class;
}
return $widgets;
}
public static function canAccess(): bool
{

View File

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

View File

@@ -0,0 +1,71 @@
<?php
namespace App\Filament\Pages;
use App\Filament\Widgets\GuardPatrolDayChart;
use App\Models\Plant;
use Filament\Pages\Page;
use Filament\Pages\Dashboard\Concerns\HasFiltersForm;
use Filament\Forms\Form;
use Filament\Forms\Components\Select;
use Illuminate\Support\Facades\Auth;
class GuardPatrolDayCount extends Page
{
protected static ?string $navigationIcon = 'heroicon-o-document-text';
protected static string $view = 'filament.pages.guard-patrol-day-count';
protected static ?string $navigationGroup = 'Guard DashBoard';
use HasFiltersForm;
public function mount(): void
{
session()->forget(['selected_plant']);
$this->filtersForm->fill([
'plant' => null
]);
}
public function filtersForm(Form $form): Form
{
return $form
->statePath('filters')
->schema([
Select::make('plant')
->options(Plant::pluck('name', 'id'))
->label('Select Plant')
->reactive()
->afterStateUpdated(function ($state) {
session(['selected_plant' => $state]);
$this->dispatch('patrolEntryChart');
}),
]);
}
public static function getNavigationLabel(): string
{
return 'Guard Patrol Day Count';
}
public function getHeading(): string
{
return 'Guard Patrol Day Chart';
}
public function getWidgets(): array
{
return [
GuardPatrolDayChart::class,
];
}
public static function canAccess(): bool
{
return Auth::check() && Auth::user()->can('view guard patrol day count dashboard');
}
}

View File

@@ -0,0 +1,115 @@
<?php
namespace App\Filament\Pages;
use App\Models\GuardPatrolEntry;
use App\Models\Plant;
use Carbon\Carbon;
use Filament\Forms\Components\DatePicker;
use Filament\Forms\Components\DateTimePicker;
use Filament\Forms\Components\Select;
use Filament\Forms\Form;
use Filament\Pages\Dashboard\Concerns\HasFiltersForm;
use Filament\Pages\Page;
use Illuminate\Support\Facades\Auth;
class GuardPatrolEntryDashboard extends Page
{
use HasFiltersForm;
protected static ?string $navigationIcon = 'heroicon-o-document-text';
protected static ?string $navigationGroup = 'Guard DashBoard';
protected static string $view = 'filament.pages.guard-patrol-entry-dashboard';
public function mount(): void
{
// session()->forget(['select_guard_plant', 'select_guard_date']);
$this->filtersForm->fill([
'plant' => null,
'date' => null,
]);
}
public function filtersForm(Form $form): Form
{
return $form
->statePath('filters') // Explicitly set where to store form data
->schema([
Select::make('plant')
->options(Plant::pluck('name', 'id'))
->label('Select Plant')
->reactive()
->required()
->afterStateUpdated(function ($state, callable $set, callable $get){
// $this->dispatch('invoiceChart');
if(!$state)
{
$set('date', now()->format('Y-m-d')); // H:i:s
// session(['select_guard_plant' => $state]);
// session(['select_guard_date' => $get('date')]);
} else {
if(!$get('date'))
{
$set('date', now()->format('Y-m-d'));
// session(['select_guard_plant' => $state]);
// session(['select_guard_date' => $get('date')]);
}
// else {
// session(['select_guard_plant' => $state]);
// session(['select_guard_date' => $get('date')]);
// }
}
$this->dispatch('loadGuardData', $state, $get('date')); //->format('Y-m-d')
}),
DatePicker::make('date')
->label('Select Date')
->placeholder('Select Date')
->reactive()
->required()
->beforeOrEqual(now())
->default(now()->format('Y-m-d'))
->afterStateUpdated(function ($state, callable $set, callable $get){
if(!$get('plant'))
{
$set('date', now()->format('Y-m-d'));
// session(['select_guard_plant' => $get('plant')]);
// session(['select_guard_date' => $state]);
} else {
if(!$get('date'))
{
$set('date', now()->format('Y-m-d'));
// session(['select_guard_plant' => $get('plant')]);
// session(['select_guard_date' => $state]);
}
// else {
// $records = GuardPatrolEntry::whereDate('patrol_time', $state)->where('plant_id', $get('plant'))->orderBy('patrol_time', 'asc')->first(); //desc
// //dd($get('plant'), $state, $records->patrol_time);//->toTimeString()
// session(['select_guard_plant' => $get('plant')]);
// session(['select_guard_date' => $state]);
// }
}
// $this->dispatch('invoiceChart');
$this->dispatch('loadGuardData', $get('plant'), $state);//->format('Y-m-d')
})
])
->columns(2);
}
public static function getNavigationLabel(): string
{
return 'Guard Patrol Status Table';
}
public function getHeading(): string
{
return 'Guard Patrol Entry Status';
}
public static function canAccess(): bool
{
return Auth::check() && Auth::user()->can('view guard patrol entry status dashboard');
}
}

View File

@@ -0,0 +1,266 @@
<?php
namespace App\Filament\Pages;
use App\Filament\Widgets\GuardPatrolHourlyChart;
use App\Models\CheckPointName;
use App\Models\CheckPointTime;
use App\Models\GuardPatrolEntry;
use App\Models\Plant;
use Carbon\Carbon;
use Filament\Pages\Page;
use Filament\Pages\Dashboard\Concerns\HasFiltersForm;
use Filament\Forms\Form;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\DatePicker;
use Illuminate\Support\Facades\Auth;
class GuardPatrolHourlyCount extends Page
{
protected static ?string $navigationIcon = 'heroicon-o-document-text';
protected static string $view = 'filament.pages.guard-patrol-hourly-count';
protected static ?string $navigationGroup = 'Guard DashBoard';
use HasFiltersForm;
public function mount(): void
{
session()->forget(['selected_plant']);
session()->forget(['selected_date']);
session()->forget(['selected_name']);
session()->forget(['selected_time']);
session()->forget(['valid_sessions']);
$this->filtersForm->fill([
'plant' => null,
'date' => null,
'time_range' => null,
'guard_name' => null
]);
}
public function filtersForm(Form $form): Form
{
return $form
->statePath('filters')
->schema([
Select::make('plant')
->options(Plant::pluck('name', 'id'))
->label('Select Plant')
->reactive()
->required()
->afterStateUpdated(function ($state,callable $set) {
if (is_null($state)) {
session()->forget('selected_plant');
} else {
session(['selected_plant' => $state]);
}
session(['selected_plant' => $state]);
$set('date', null);
session()->forget('selected_date');
$set('guard_name', null);
session()->forget('selected_name');
$set('time_range', null);
session()->forget('selected_time');
session()->forget('valid_sessions');
// $this->dispatch('patrolEntryChart');
}),
DatePicker::make('date')
->label('Select Date')
->placeholder('Select Date')
->reactive()
->required()
->beforeOrEqual(now())
->default(now()->format('Y-m-d'))
->afterStateUpdated(function ($state,callable $set) {
session(['selected_date' => $state]);
$set('guard_name', null);
session()->forget('selected_name');
$set('time_range', null);
session()->forget('selected_time');
session()->forget('valid_sessions');
// $this->dispatch('patrolEntryChart');
}),
Select::make('guard_name')
->label('Guard Name')
->options(function (callable $get) {
$plantId = $get('plant');
$Date = $get('date');
if (!$plantId || !$Date) {
return [];
}
return GuardPatrolEntry::with('guardNames')->where('plant_id', $plantId)
->whereDate('patrol_time', $Date)->orderBy('patrol_time','asc')
->get()
->unique('guard_name_id')
->pluck('guardNames.name', 'guard_name_id')
->toArray();
})
->reactive()
->required()
->afterStateUpdated(function ($state,callable $set)
{
if (is_null($state))
{
session()->forget('selected_name');
}
else
{
session(['selected_name' => $state]);
}
// Clear the time range field and its session
$set('time_range', null);
session()->forget('selected_time');
session()->forget('valid_sessions');
}),
// Select::make('time_range')
// ->label('Patrol Time Range')
// ->options(function (callable $get) {
// $plantId = $get('plant');
// $guardId = $get('guard_name');
// $date = $get('date');
// if (!$plantId || !$guardId || !$date) {
// return [];
// }
// $patrols = GuardPatrolEntry::where('plant_id', $plantId)
// ->where('guard_name_id', $guardId)
// ->whereDate('patrol_time', $date)
// ->orderBy('patrol_time', 'asc')
// ->get(['patrol_time']);
// if ($patrols->isEmpty())
// {
// return [];
// }
// $chunkSize = CheckPointTime::where('plant_id', $plantId)->count()+ 1;;
// $chunks = $patrols->chunk($chunkSize);
// $options = [];
// foreach ($chunks as $index => $chunk) {
// $first = $chunk->first();
// $last = $chunk->last();
// $start = Carbon::parse($first->patrol_time)->format('H:i:s');
// $end = Carbon::parse($last->patrol_time)->format('H:i:s');
// $timeRange = "$start - $end";
// $options[$timeRange] = $timeRange;
// }
// return $options;
// })
// ->reactive()
// ->required()
// ->afterStateUpdated(function ($state) {
// session(['selected_time' => $state]);
// })
Select::make('time_range')
->label('Patrol Time Range')
->options(function (callable $get) {
$plantId = $get('plant');
$guardId = $get('guard_name');
$date = $get('date');
if (!$plantId || !$guardId || !$date) {
session(['valid_sessions' => []]);
return [];
}
// Get patrols with checkpoints
$patrols = GuardPatrolEntry::where('plant_id', $plantId)
->where('guard_name_id', $guardId)
->whereDate('patrol_time', $date)
->orderBy('patrol_time', 'asc')
->get(['patrol_time', 'check_point_name_id']);
if ($patrols->isEmpty()) {
session(['valid_sessions' => []]);
return [];
}
// Get checkpoint sequence
$checkPointTimes = CheckPointTime::where('plant_id', $plantId)
->orderBy('sequence_number')
->get(['check_point1_id', 'check_point2_id']);
// Build expected sequence
$expectedSequence = [];
foreach ($checkPointTimes as $row) {
$expectedSequence[] = $row->check_point1_id;
}
if ($checkPointTimes->isNotEmpty()) {
$expectedSequence[] = $checkPointTimes->last()->check_point2_id;
}
$chunkSize = $checkPointTimes->count() + 1;
$chunks = $patrols->chunk($chunkSize);
$options = [];
$validSessions = [];
foreach ($chunks as $index => $chunk) {
$first = $chunk->first();
$last = $chunk->last();
$start = Carbon::parse($first->patrol_time)->format('H:i:s');
$end = Carbon::parse($last->patrol_time)->format('H:i:s');
$timeRange = "$start - $end";
// Validate sequence for this chunk
$currentSeqIndex = 0;
$isValid = true;
$anyMatch = false;
foreach ($chunk as $patrol) {
if ($currentSeqIndex < count($expectedSequence) &&
$patrol->check_point_name_id == $expectedSequence[$currentSeqIndex]) {
$currentSeqIndex++;
$anyMatch = true;
} else {
$isValid = false;
}
}
// Consider valid only if at least one checkpoint matches
$isValid = $isValid && $anyMatch;
$validSessions[$timeRange] = $isValid;
$options[$timeRange] = $timeRange;
}
session(['valid_sessions' => $validSessions]);
return $options;
})
->reactive()
->required()
->afterStateUpdated(function ($state) {
session(['selected_time' => $state]);
})
])
->columns(4);
}
public function getWidgets(): array
{
return [
GuardPatrolHourlyChart::class,
];
}
public static function canAccess(): bool
{
return Auth::check() && Auth::user()->can('view guard patrol hourly count dashboard');
}
}

View File

@@ -2,6 +2,7 @@
namespace App\Filament\Pages;
use App\Filament\Widgets\ItemOverview;
use App\Models\Plant;
use Filament\Forms\Components\Select;
use Filament\Forms\Form;
@@ -9,8 +10,9 @@ use Filament\Pages\Dashboard\Concerns\HasFiltersForm;
use Filament\Pages\Page;
use Filament\Tables\Concerns\HasFilters;
use Illuminate\Support\Facades\Auth;
use Filament\Pages\Dashboard;
class HourlyProduction extends Page
class HourlyProduction extends page
{
protected static ?string $navigationIcon = 'heroicon-o-document-text';
@@ -22,11 +24,15 @@ class HourlyProduction extends Page
public function mount(): void
{
session()->forget(['selected_plant', 'selected_line']);
session()->forget(['selected_plant', 'selected_line']);
session()->forget(['select_plant', 'select_line']);
$plantId = session('selected_plant', null); // Default to the first plant if not selected
$lineId = session('selected_line', null);
$this->filtersForm->fill([
//'plant' => Plant::first()?->id // Default to first plant
'plant' => null,
'line' => null,
'plant' => $plantId,
'line' => $lineId,
]);
}
@@ -42,9 +48,9 @@ class HourlyProduction extends Page
->reactive()
->afterStateUpdated(function ($state) {
session(['selected_plant' => $state]);
// dd(session('selected_plant'));
$this->triggerChartUpdate();
// Clear production quantity Dashboard session keys to avoid conflict
//session()->forget(['select_plant', 'select_line']);
$this->triggerChartUpdate();
}),
// Line Filter
@@ -72,11 +78,18 @@ class HourlyProduction extends Page
public static function getNavigationLabel(): string
{
return 'Hourly Production Count';
return 'Production Hourly Count';
}
public static function canAccess(): bool
{
return Auth::check() && Auth::user()->can('view production dashboard');
return Auth::check() && Auth::user()->can('view production hourly count dashboard');
}
public function getWidgets(): array
{
return [
ItemOverview::class,
];
}
}

View File

@@ -46,18 +46,18 @@ class InvoiceDashboard extends Page
$this->dispatch('invoiceChart');
}),
Select::make('invoice')
->options([
'serial_invoice' => 'Serial Invoice',
'individual_material' => 'Individual Material Invoice',
'bundle_material' => 'Bundle Material Invoice',
])
->label('Select Invoice')
->reactive()
->default(0)
->afterStateUpdated(function ($state) {
session(['select_invoice' => $state]);
$this->dispatch('invoiceChart');
})
->options([
'serial_invoice' => 'Serial Invoice',
'individual_material' => 'Individual Material Invoice',
'bundle_material' => 'Bundle Material Invoice',
])
->label('Select Invoice')
->reactive()
->default(0)
->afterStateUpdated(function ($state) {
session(['select_invoice' => $state]);
$this->dispatch('invoiceChart');
})
])
->columns(2);
}

View File

@@ -0,0 +1,220 @@
<?php
namespace App\Filament\Pages;
use App\Models\LocatorInvoiceValidation;
use App\Models\PalletValidation;
use App\Models\Plant;
use Illuminate\Support\Facades\Auth;
use Filament\Forms\Contracts\HasForms;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Pages\Page;
use Filament\Forms\Form;
use Filament\Forms\Components\Section;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Notifications\Notification;
class InvoiceFinder extends Page implements HasForms
{
protected static ?string $navigationIcon = 'heroicon-o-document-text';
protected static string $view = 'filament.pages.invoice-finder';
protected static ?string $navigationGroup = 'Export Dispatch';
protected static ?int $navigationSort = 6;
//use InteractsWithForms;
public $pId, $invoiceNumber;
public array $invoiceOverviewData = [];
public array $filters = [];
public function form(Form $form): Form
{
return $form
->statePath('filters')
->schema([
Section::make('') // You can give your section a title or leave it blank
->schema([
Select::make('plant_id')
->options(Plant::pluck('name', 'id'))
->label('Plant')
->reactive()
->required(),
TextInput::make('scan_invoice')
->label('Scan Invoice')
->required()
->reactive()
->extraAttributes([
'wire:keydown.enter' => 'processInvoiceNo($event.target.value)',
]),
TextInput::make('scan_quantity')
->label('Scanned Quantity ')
->readOnly()
->reactive(),
TextInput::make('pending_quantity')
->label('Pending Quantity')
->readOnly()
->reactive(),
TextInput::make('total_sno_quantity')
->label('Invoice Quantity')
->readOnly()
->reactive(),
])
->columns(5)
]);
}
public function processInvoiceNo($invoiceNo)
{
$plantId = $this->form->getState()['plant_id'];
if(!$invoiceNo)
{
Notification::make()
->title("Invoice number '$invoiceNo' can't be empty!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', '', [], [], [], [], $plantId);
$this->form->fill([
'plant_id' => $plantId,
'scan_invoice' => $invoiceNo,
'total_sno_quantity' => 0,
'pending_quantity' => 0,
'scan_quantity' => 0
]);
return;
}
$invoiceExists = LocatorInvoiceValidation::where('plant_id', $plantId)
->where('invoice_number', $invoiceNo)
->first();
if(!$invoiceExists)
{
Notification::make()
->title("Invoice number '$invoiceNo' does not exist in locator invoice table!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', '', [], [], [], [], $plantId);
$this->form->fill([
'plant_id' => $plantId,
'scan_invoice' => null,//$invoiceNo,
'total_sno_quantity' => 0,
'pending_quantity' => 0,
'scan_quantity' => 0
]);
return;
}
$invoiceCompleted = LocatorInvoiceValidation::where('plant_id', $plantId)
->where('invoice_number', $invoiceNo)
->whereNull('scanned_status')
->orWhere('scanned_status', '=','')
->first();
if(!$invoiceCompleted)
{
// $count = LocatorInvoiceValidation::where('invoice_number', $invoiceNo)
// ->where('plant_id', $plantId)
// ->count();
Notification::make()
->title("Invoice number '$invoiceNo' already completed the scanning process..!")
->success()
->duration(5000)
->send();
$this->dispatch('loadData', '', [], [], [], [], $plantId);
$this->form->fill([
'plant_id' => $plantId,
'scan_invoice' => null,//$invoiceNo,
'total_sno_quantity' => 0,//$count,
'pending_quantity' => 0,//0,
'scan_quantity' => 0//$count
]);
return;
}
$serialNumbers = LocatorInvoiceValidation::where('plant_id', $plantId)
->where('invoice_number', $invoiceNo)
->pluck('serial_number');
$notFoundSerials = [];
$incompleteSerials = [];
$scannedSerials = [];
$foundSerials = [];
foreach ($serialNumbers as $serial)
{
$locatorRecord = LocatorInvoiceValidation::where('serial_number', $serial)
->where('plant_id', $plantId)
->first();
//$scannedStatus = $locatorRecord->scanned_status ?? null;
if ($locatorRecord->scanned_status == 'Scanned')
{
$scannedSerials[] = $serial;
continue;
}
$palletRecord = palletValidation::where('serial_number', $serial)
->where('plant_id', $plantId)
->first();
if (!$palletRecord)
{
$notFoundSerials[] = $serial;
continue;
}
$palletStatus = $palletRecord->pallet_status ?? null;
if (strlen($palletRecord->pallet_number) > 1 && ($palletStatus == '' || $palletStatus == null))
{
$incompleteSerials[] = $serial;
continue;
}
$foundSerials[] = $serial;
}
$count = LocatorInvoiceValidation::where('invoice_number', $invoiceNo)
->where('plant_id', $plantId)
->count();
$pendingCount = LocatorInvoiceValidation::where('invoice_number', $invoiceNo)
->where('plant_id', $plantId)
->whereNull('scanned_status')
->orWhere('scanned_status', '=', '')
->count();
$scannedCount = LocatorInvoiceValidation::where('invoice_number', $invoiceNo)
->where('plant_id', $plantId)
->where('scanned_status', '=', 'Scanned')
->count();
$this->form->fill([
'plant_id' => $plantId,
'scan_invoice' => $invoiceNo,
'total_sno_quantity' => $count,
'pending_quantity' => $pendingCount,
'scan_quantity' => $scannedCount,
]);
$this->dispatch('loadData', $invoiceNo, $notFoundSerials, $incompleteSerials, $scannedSerials, $foundSerials, $plantId);
}
public static function canAccess(): bool
{
return Auth::check() && Auth::user()->can('view invoice finder page');
}
}

View File

@@ -0,0 +1,70 @@
<?php
namespace App\Filament\Pages;
use App\Models\Plant;
use Filament\Pages\Page;
use Filament\Pages\Dashboard\Concerns\HasFiltersForm;
use Filament\Forms\Form;
use Filament\Forms\Components\Select;
use Illuminate\Support\Facades\Auth;
class InvoiceQuantityDashboard extends Page
{
use HasFiltersForm;
protected static ?string $navigationIcon = 'heroicon-o-document-text';
protected static ?string $navigationGroup = 'Invoice DashBoard';
protected static string $view = 'filament.pages.invoice-quantity-dashboard';
public function mount(): void
{
session()->forget(['selec_plant', 'select_invoice']);
$this->filtersForm->fill([
'plant' => null,
'invoice' => null,
]);
}
public function filtersForm(Form $form): Form
{
return $form
->statePath('filters') // Explicitly set where to store form data
->schema([
Select::make('plant')
->options(Plant::pluck('name', 'id'))
->label('Select Plant')
->reactive()
->afterStateUpdated(function ($state) {
session(['selec_plant' => $state]);
$this->dispatch('invoiceChart');
}),
Select::make('invoice')
->options([
'serial_invoice' => 'Serial Invoice',
'individual_material' => 'Individual Material Invoice',
'bundle_material' => 'Bundle Material Invoice',
])
->label('Select Invoice')
->reactive()
->default(0)
->afterStateUpdated(function ($state) {
session(['select_invoice' => $state]);
$this->dispatch('invoiceChart');
})
])
->columns(2);
}
public static function getNavigationLabel(): string
{
return 'Invoice Quantity';
}
public static function canAccess(): bool
{
return Auth::check() && Auth::user()->can('view invoice serial quantity dashboard');
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

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

View File

@@ -20,6 +20,8 @@ use Route;
use Illuminate\Support\Facades\Request;
use Filament\Notifications\Notification;
use Illuminate\Support\Facades\Auth;
use Livewire\Attributes\On;
class ProductionQuantityPage extends Page implements HasForms
{
@@ -37,7 +39,7 @@ class ProductionQuantityPage extends Page implements HasForms
public $qrData, $pId, $bId, $sId, $lId, $iId, $succId, $sNoId, $succStat, $recQr, $prodOrder;
public $recent_qr, $clear_qr;
// public $recent_qr, $clear_qr;
use HasFiltersForm;
@@ -45,6 +47,7 @@ class ProductionQuantityPage extends Page implements HasForms
public function mount(): void
{
session()->forget(['select_plant', 'select_line']);
session()->forget(['selected_plant', 'selected_line']);
$this->filtersForm->fill([
'plant' => null,
'line' => null,
@@ -71,7 +74,7 @@ class ProductionQuantityPage extends Page implements HasForms
padding: 0 !important;
max-width: 100% !important;
/* overflow-y: auto; Allow vertical scrolling */
height: 100vh; /* Ensure full height of the viewport */
height: 100vh;
}
/* Expand page area fully */
@@ -80,6 +83,22 @@ class ProductionQuantityPage extends Page implements HasForms
max-width: 100% !important;
}
/* Expand main container to full screen but add margin */
/* .fi-main {
margin: 0.5rem -0.5rem !important; Top/Bottom: 0.5rem, Left/Right: 0.2rem
padding: 0rem !important;
max-width: calc(100% - 0.1rem) !important; /* Matches horizontal margin
height: calc(100vh - 1rem); Matches vertical margin
box-sizing: border-box;
}*/
/* Expand page area fully within the main container */
/* .fi-main > .fi-page {
padding: 0.2rem !important;
max-width: calc(100% - 0.1rem) !important;
box-sizing: border-box;
} */
/* Allow scroll on body again */
body {
overflow: auto;
@@ -113,7 +132,6 @@ class ProductionQuantityPage extends Page implements HasForms
->options(Plant::pluck('name', 'id'))
->label('Plant')
->reactive()
->live()
->required()
->columnSpan(1)
->default(function () {
@@ -124,6 +142,7 @@ class ProductionQuantityPage extends Page implements HasForms
$set('block_name', null);
session(['select_plant' => $state]);
if (!$plantId)
{
$set('pqPlantError', 'Please select a plant first.');
@@ -145,7 +164,7 @@ class ProductionQuantityPage extends Page implements HasForms
->label('Block')
->required()
// ->nullable()
->live()
->reactive()
->columnSpan(1)
->options(function (callable $get) {
if (!$get('plant_id')) {
@@ -156,7 +175,6 @@ class ProductionQuantityPage extends Page implements HasForms
->pluck('name', 'id')
->toArray();
})
->reactive()
->default(function () {
$latestShiftId = optional(ProductionQuantity::latest()->first())->shift_id;
return optional(Shift::where('id', $latestShiftId)->first())->block_id;
@@ -258,7 +276,6 @@ class ProductionQuantityPage extends Page implements HasForms
->toArray();
})
->reactive()
->live()
->default(function () {
return optional(ProductionQuantity::latest()->first())->line_id;
})
@@ -278,6 +295,7 @@ class ProductionQuantityPage extends Page implements HasForms
session(['select_line' => $state]);
// dd(session('select_line'));
$this->triggerChartUpdate();
@@ -304,9 +322,9 @@ class ProductionQuantityPage extends Page implements HasForms
TextInput::make('production_order')
->label('Production Order')
->reactive()
->live()
->required()
->columnSpan(1)
//->columnSpan(1)
->columnSpan(['default' => 1, 'sm' => 1])
->afterStateUpdated(function ($state, callable $get, callable $set): void {
$set('item_code', null);
$set('item_id', null);
@@ -320,27 +338,31 @@ class ProductionQuantityPage extends Page implements HasForms
// }
}),
TextInput::make('item_code')
->label('Item Code')
->columnSpan(1)
->autofocus(true)
->reactive()
->live()
->default(fn () => $this->clear_qr)
->extraAttributes([
'wire:keydown.enter' => 'processAllValues($event.target.value)',
]),
// TextInput::make('item_code')
// ->label('Item Code')
// ->columnSpan(1)
// ->autofocus(true)
// //->reactive()
// ->live(onBlur: true) // avoids per-keystroke triggering
// ->default(fn () => $this->clear_qr)
// ->extraAttributes([
// 'wire:keydown.enter' => 'processAllValues($event.target.value)',
// ]),
Hidden::make('serial_number')
->required(),
Hidden::make('success_msg')
->required(),
Hidden::make('item_id')
->required(),
Hidden::make('sap_msg_status'),
Hidden::make('sap_msg_description'),
TextInput::make('recent_qr')
->label('Last scanned QR')
->reactive()
->live()
->columnSpan(1)
->columnSpan(['default' => 1, 'sm' => 2])
//->columnSpan(2)
// ->default(function () {
// // Get the latest 'item_id' foreign key from 'production_quantities' table
// $latestProductionQuantity = ProductionQuantity::latest()->first();
@@ -354,12 +376,13 @@ class ProductionQuantityPage extends Page implements HasForms
// // Get the latest 'serial_number' from 'production_quantities' table
// $serialNumber = $latestProductionQuantity->serial_number;
// dd($itemCode, $serialNumber);
// // Combine 'code' and 'serial_number' into the desired format
// return $itemCode && $serialNumber ? "{$itemCode} | {$serialNumber}" : null;
// // return $itemCode && $serialNumber ? "{$itemCode} | {$serialNumber}" : null;
// $this->recQr = $itemCode && $serialNumber ? "{$itemCode} | {$serialNumber}" : null;
// })
// ->default(fn () => $this->recent_qr)
->default(fn () => $this->recQr)
->readOnly(true),
TextInput::make('id')
@@ -368,18 +391,26 @@ class ProductionQuantityPage extends Page implements HasForms
Hidden::make('operator_id')
->default(Filament::auth()->user()->name),
])
->columns(7);
// ->columns(6);
->columns(['default' => 1, 'sm' => 7]);
}
// Method to process the value when Enter is pressed
#[On('handleQrScan')]
public function handleQrScan($value)
{
$this->processAllValues($value);
}
public function processAllValues($formQRData)
{
//dd($formQRData);
//$formValues = [];
// This will get all form data from the request
$this->clear_qr = null;
//$this->clear_qr = null;
$this->qrData = null;
$this->iId = null;
$this->succId = null;
@@ -393,36 +424,14 @@ class ProductionQuantityPage extends Page implements HasForms
$user = Filament::auth()->user(); //->name
$operatorName = $user->name;
$this->qrData = $formQRData;
// dd($formData, $formQRData);
// dd($this->form->getState()['serial_number']);
// try {
// // Access the nested form data
// $componentData = json_decode($formValues['components'][0]['snapshot'], true);
// $formData = $componentData['data']['data'][0]; // Access first item in data array
$latestProductionQuantity = ProductionQuantity::latest()->first();
// // Extract specific values
// $this->qrData = $formQRData ?? $formData['item_code'];
// $this->pId = $formData['plant_id'] ?? null;
// $this->bId = $formData['block_name'] ?? null;
// $this->sId = $formData['shift_id'] ?? null;
// $this->lId = $formData['line_id'] ?? null;
// $this->iId = $formData['item_id'] ?? null;
// $this->succId = $formData['success_msg'] ?? null;
// // $this->sNoId = $formData['serial_number'] ?? null;
// $this->prodOrder = $formData['production_order'] ?? null;
// $this->recQr = $formData['recent_qr'] ?? null;
// $this->dispatch('plant-line-updated', $this->pId,$this->lId);
// } catch (\Exception $e) {
// //dd('Error parsing form data:', $e->getMessage(), $formValues);
// Notification::make()
// ->title("Error Parsing Form Data") // {$operatorName}
// ->body($e->getMessage())
// ->danger()
// // ->persistent()
// ->send();
// return;
// }
if ($latestProductionQuantity) {
$itemCode = optional(Item::find($latestProductionQuantity->item_id))->code;
$serialNumber = $latestProductionQuantity->serial_number;
$this->recQr = $itemCode && $serialNumber ? "{$itemCode} | {$serialNumber}" : null;
}
if (empty($formQRData)) {
$this->form->fill([
@@ -434,9 +443,12 @@ class ProductionQuantityPage extends Page implements HasForms
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> $this->prodOrder,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
Notification::make()
->title('Invalid QR')
->body("Scan the valid QR code.<br>(Ex: Item_Code|Serial_Number )")
@@ -456,6 +468,8 @@ class ProductionQuantityPage extends Page implements HasForms
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> null,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
@@ -476,6 +490,8 @@ class ProductionQuantityPage extends Page implements HasForms
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> null,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
@@ -496,6 +512,8 @@ class ProductionQuantityPage extends Page implements HasForms
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> null,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
@@ -516,6 +534,8 @@ class ProductionQuantityPage extends Page implements HasForms
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> null,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
@@ -536,6 +556,8 @@ class ProductionQuantityPage extends Page implements HasForms
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> null,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
@@ -557,6 +579,8 @@ class ProductionQuantityPage extends Page implements HasForms
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> null,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
@@ -579,6 +603,8 @@ class ProductionQuantityPage extends Page implements HasForms
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> null,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
@@ -633,6 +659,8 @@ class ProductionQuantityPage extends Page implements HasForms
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> $this->prodOrder,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
@@ -655,6 +683,8 @@ class ProductionQuantityPage extends Page implements HasForms
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> $this->prodOrder,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
@@ -700,6 +730,8 @@ class ProductionQuantityPage extends Page implements HasForms
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> $this->prodOrder,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
@@ -737,6 +769,8 @@ class ProductionQuantityPage extends Page implements HasForms
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> $this->prodOrder,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
@@ -762,6 +796,8 @@ class ProductionQuantityPage extends Page implements HasForms
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> $this->prodOrder,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
@@ -810,6 +846,8 @@ class ProductionQuantityPage extends Page implements HasForms
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> $this->prodOrder,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
@@ -854,6 +892,8 @@ class ProductionQuantityPage extends Page implements HasForms
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> $this->prodOrder,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
@@ -879,6 +919,8 @@ class ProductionQuantityPage extends Page implements HasForms
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> $this->prodOrder,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
@@ -905,6 +947,8 @@ class ProductionQuantityPage extends Page implements HasForms
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> $this->prodOrder,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
@@ -921,6 +965,8 @@ class ProductionQuantityPage extends Page implements HasForms
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> $this->prodOrder,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
@@ -948,6 +994,8 @@ class ProductionQuantityPage extends Page implements HasForms
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> $this->prodOrder,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
@@ -969,6 +1017,8 @@ class ProductionQuantityPage extends Page implements HasForms
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> $this->prodOrder,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
@@ -990,6 +1040,8 @@ class ProductionQuantityPage extends Page implements HasForms
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> $this->prodOrder,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
@@ -1012,6 +1064,8 @@ class ProductionQuantityPage extends Page implements HasForms
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> $this->prodOrder,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
@@ -1035,6 +1089,8 @@ class ProductionQuantityPage extends Page implements HasForms
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> $this->prodOrder,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
@@ -1057,6 +1113,8 @@ class ProductionQuantityPage extends Page implements HasForms
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> $this->prodOrder,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
@@ -1080,6 +1138,8 @@ class ProductionQuantityPage extends Page implements HasForms
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> $this->prodOrder,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
@@ -1109,6 +1169,8 @@ class ProductionQuantityPage extends Page implements HasForms
'serial_number'=> null,
'success_msg'=> 'Y',
'production_order'=> $this->prodOrder,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
@@ -1126,6 +1188,8 @@ class ProductionQuantityPage extends Page implements HasForms
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> $this->prodOrder,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
@@ -1148,6 +1212,8 @@ class ProductionQuantityPage extends Page implements HasForms
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> $this->prodOrder,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
@@ -1170,6 +1236,8 @@ class ProductionQuantityPage extends Page implements HasForms
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> $this->prodOrder,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $this->recQr,
]);
@@ -1211,10 +1279,12 @@ class ProductionQuantityPage extends Page implements HasForms
'shift_id'=> $this->sId,
'line_id'=> $this->lId,
'item_id'=> null,
// 'item_code'=> null,
//'item_code'=> null,
'serial_number'=> null,
'success_msg'=> null,
'production_order'=> $this->prodOrder,
'sap_msg_status' => null,
'sap_msg_description' => null,
'operator_id'=> $operatorName,
'recent_qr' => $itemCode.' | '.$this->sNoId,
]);
@@ -1223,6 +1293,7 @@ class ProductionQuantityPage extends Page implements HasForms
->title("Valid QR Found") // {$operatorName}
->body("Valid QR code scanned: {$this->qrData}.")
->success()
->duration(200)
->send();
}
}
@@ -1233,25 +1304,25 @@ class ProductionQuantityPage extends Page implements HasForms
// For example:
$model = ProductionQuantity::create($formValues);
// dd('Production Updated Event Dispatched');
// dd('Production Updated Event Dispatched');
$this->dispatch('productionUpdated');
// // Optionally, you can emit an event or perform a redirect after saving
// $this->emit('formSaved', $model->id);
}
public function triggerChartUpdate(): void
{
if (session()->has('select_plant') && session()->has('select_line')) {
$this->dispatch('filtersUpdated');
}
}
public function triggerChartUpdate(): void
{
if (session()->has('select_plant') && session()->has('select_line')) {
$this->dispatch('filtersUpdated');
}
}
// Override the getTitle method
public function getTitle(): string
{
return ''; // Return an empty string to remove the title
}
// Override the getTitle method
public function getTitle(): string
{
return ''; // Return an empty string to remove the title
}
public static function getNavigationLabel(): string
{

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,182 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Resources\AlertMailRuleResource\Pages;
use App\Filament\Resources\AlertMailRuleResource\RelationManagers;
use App\Models\AlertMailRule;
use App\Models\Plant;
use Dotenv\Exception\ValidationException;
use Filament\Facades\Filament;
use Filament\Forms;
use Filament\Forms\Components\Checkbox;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Forms\Components\Section;
use Illuminate\Validation\ValidationException as ValidationValidationException;
class AlertMailRuleResource extends Resource
{
protected static ?string $model = AlertMailRule::class;
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
protected static ?string $navigationGroup = 'Alert Mail';
public static function form(Form $form): Form
{
return $form
->schema([
Section::make('')
->schema([
Forms\Components\Select::make('plant')
->label('Plant')
->reactive()
->options(fn () => Plant::pluck('name', 'id')->toArray())
->required(fn ($get) => ! $get('is_active'))
->afterStateUpdated(fn ($state, callable $set) => $state ? $set('is_active', false) : null),
// ->options(fn () => Plant::pluck('id', 'name')->toArray()),
Forms\Components\Select::make('module')
->label('Module')
->required()
->options([
'InvoiceValidation' => 'InvoiceValidation',
'ProductionQuantities' => 'ProductionQuantities',
]),
Forms\Components\Select::make('rule_name')
->label('Rule Name')
->options([
'InvoiceMail' => 'Invoice Mail',
'SerialInvoiceMail' => 'Serial Invoice Mail',
'MaterialInvoiceMail' => 'Material Invoice Mail',
'ProductionMail' => 'Production Mail',
])
->required(),
Forms\Components\TextInput::make('email')
->label('Email')
->required(),
Forms\Components\Select::make('schedule_type')
->label('Schedule Type')
->required()
->options([
'Live' => 'Live',
'Hourly' => 'Hourly',
'Daily' => 'Daily',
]),
Checkbox::make('is_active')
->label('All Plants Reports')
->afterStateUpdated(fn ($state, callable $set) => $state ? $set('plant', null) : null)
->reactive(),
Forms\Components\Hidden::make('created_by')
->default(fn () => Filament::auth()->user()?->name),
Forms\Components\Hidden::make('updated_by')
->default(fn () => Filament::auth()->user()?->name),
])
->columns(5),
]);
}
// Optionally, also override for update/editing
// public static function mutateFormDataBeforeSave(array $data): array
// {
// dd('test');
// if ($data['is_active']) {
// $data['plant'] = 'All Plants';
// }
// return $data;
// }
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('id')
->label('ID')
->numeric()
->sortable(),
Tables\Columns\TextColumn::make('plant')
->label('Plant')
->sortable()
->formatStateUsing(function ($state) {
static $plants;
if (! $plants) {
$plants = Plant::pluck('name', 'id')->toArray();
}
return $plants[$state] ?? 'All Plants';
}),
Tables\Columns\TextColumn::make('module')
->label('Module')
->sortable(),
Tables\Columns\TextColumn::make('rule_name')
->label('Rule Name')
->sortable(),
Tables\Columns\TextColumn::make('email')
->label('Email')
->sortable(),
Tables\Columns\TextColumn::make('schedule_type')
->label('Schedule Type')
->sortable(),
Tables\Columns\TextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('created_by')
->label('Created By')
->sortable(),
Tables\Columns\TextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('updated_by')
->label('Updated By')
->sortable(),
Tables\Columns\TextColumn::make('deleted_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
Tables\Filters\TrashedFilter::make(),
])
->actions([
Tables\Actions\ViewAction::make(),
Tables\Actions\EditAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
Tables\Actions\ForceDeleteBulkAction::make(),
Tables\Actions\RestoreBulkAction::make(),
]),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListAlertMailRules::route('/'),
'create' => Pages\CreateAlertMailRule::route('/create'),
'view' => Pages\ViewAlertMailRule::route('/{record}'),
'edit' => Pages\EditAlertMailRule::route('/{record}/edit'),
];
}
public static function getEloquentQuery(): Builder
{
return parent::getEloquentQuery()
->withoutGlobalScopes([
SoftDeletingScope::class,
]);
}
}

View File

@@ -0,0 +1,22 @@
<?php
namespace App\Filament\Resources\AlertMailRuleResource\Pages;
use App\Filament\Resources\AlertMailRuleResource;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
class CreateAlertMailRule extends CreateRecord
{
protected static string $resource = AlertMailRuleResource::class;
protected function mutateFormDataBeforeCreate(array $data): array
{
if ($data['is_active']) {
$data['plant'] = 0;
}
return $data;
}
}

View File

@@ -0,0 +1,31 @@
<?php
namespace App\Filament\Resources\AlertMailRuleResource\Pages;
use App\Filament\Resources\AlertMailRuleResource;
use Filament\Actions;
use Filament\Resources\Pages\EditRecord;
class EditAlertMailRule extends EditRecord
{
protected static string $resource = AlertMailRuleResource::class;
protected function mutateFormDataBeforeSave(array $data): array
{
//dd('test');
if ($data['is_active']) {
$data['plant'] = 0;
}
return $data;
}
protected function getHeaderActions(): array
{
return [
Actions\ViewAction::make(),
Actions\DeleteAction::make(),
Actions\ForceDeleteAction::make(),
Actions\RestoreAction::make(),
];
}
}

View File

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

View File

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

View File

@@ -2,9 +2,11 @@
namespace App\Filament\Resources;
use App\Filament\Exports\BlockExporter;
use App\Filament\Imports\BlockImporter;
use App\Filament\Resources\BlockResource\Pages;
use App\Models\Block;
use Filament\Facades\Filament;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Forms\Get;
@@ -15,6 +17,7 @@ use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Forms\Components\Section;
use Filament\Tables\Actions\ExportAction;
use Illuminate\Validation\Rule;
class BlockResource extends Resource
@@ -99,27 +102,44 @@ class BlockResource extends Resource
{
return $table
->columns([
Tables\Columns\TextColumn::make('id')
->label('ID')
->numeric()
->sortable(),
// Tables\Columns\TextColumn::make('id')
// ->label('ID')
// ->numeric()
// ->sortable(),
Tables\Columns\TextColumn::make('No.')
->label('No.')
->getStateUsing(function ($record, $livewire, $column, $rowLoop) {
$paginator = $livewire->getTableRecords();
$perPage = method_exists($paginator, 'perPage') ? $paginator->perPage() : 10;
$currentPage = method_exists($paginator, 'currentPage') ? $paginator->currentPage() : 1;
return ($currentPage - 1) * $perPage + $rowLoop->iteration;
}),
Tables\Columns\TextColumn::make('name')
//->unique(ignoreRecord: true)
->label('Block')
->alignCenter()
->sortable()
->searchable(),
Tables\Columns\TextColumn::make('plant.name')
->label('Plant')
->alignCenter()
->sortable()
->searchable(),
Tables\Columns\TextColumn::make('created_at')
->label('Created At')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('updated_at')
->label('Updated At')
->dateTime()
->alignCenter()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('deleted_at')
->label('Deleted At')
->dateTime()
->alignCenter()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
@@ -139,7 +159,15 @@ class BlockResource extends Resource
])
->headerActions([
ImportAction::make()
->importer(BlockImporter::class),
->importer(BlockImporter::class)
->visible(function() {
return Filament::auth()->user()->can('view import block');
}),
ExportAction::make()
->exporter(BlockExporter::class)
->visible(function() {
return Filament::auth()->user()->can('view export block');
}),
]);
}

View File

@@ -0,0 +1,187 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Exports\CheckPointNameExporter;
use App\Filament\Imports\CheckPointNameImporter;
use App\Filament\Resources\CheckPointNameResource\Pages;
use App\Filament\Resources\CheckPointNameResource\RelationManagers;
use App\Models\CheckPointName;
use Filament\Facades\Filament;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Forms\Get;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Actions\ExportAction;
use Filament\Tables\Actions\ImportAction;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Illuminate\Validation\Rule;
class CheckPointNameResource extends Resource
{
protected static ?string $model = CheckPointName::class;
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
protected static ?string $navigationGroup = 'Master Entries';
protected static ?int $navigationSort = 14;
public static function form(Form $form): Form
{
return $form
->schema([
Forms\Components\Select::make('plant_id')
->label('Plant')
->relationship('plant', 'name')
->required()
->reactive()
->default(function () {
return optional(CheckPointName::where('created_by', Filament::auth()->user()?->name)->latest()->first())->plant_id;
})
->disabled(fn (Get $get) => !empty($get('id')))
->afterStateUpdated(function ($state, callable $set, callable $get) {
$plantId = $get('plant_id');
if (!$plantId) {
$set('cPnPlantError', 'Please select a plant first.');
return;
}
else
{
$set('cPnPlantError', null);
$set('created_by', Filament::auth()->user()?->name);
}
})
->extraAttributes(fn ($get) => [
'class' => $get('cPnPlantError') ? 'border-red-500' : '',
])
->hint(fn ($get) => $get('cPnPlantError') ? $get('cPnPlantError') : null)
->hintColor('danger'),
Forms\Components\TextInput::make('name')
->label('Name')
->required()
->reactive()
->afterStateUpdated(function ($state, callable $set, callable $get) {
$set('created_by', Filament::auth()->user()?->name);
})
->rule(function (callable $get) {
return Rule::unique('check_point_names', 'name')
->where('plant_id', $get('plant_id'))
->ignore($get('id'));
}),
Forms\Components\Hidden::make('created_by')
->default(fn () => Filament::auth()->user()?->name)
->required(),
Forms\Components\TextInput::make('id')
->hidden()
->reactive()
->afterStateUpdated(function ($state, callable $set, callable $get) {
$set('created_by', Filament::auth()->user()?->name);
})
->readOnly(),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('No.')
->label('No.')
->getStateUsing(function ($record, $livewire, $column, $rowLoop) {
$paginator = $livewire->getTableRecords();
$perPage = method_exists($paginator, 'perPage') ? $paginator->perPage() : 10;
$currentPage = method_exists($paginator, 'currentPage') ? $paginator->currentPage() : 1;
return ($currentPage - 1) * $perPage + $rowLoop->iteration;
}),
// Tables\Columns\TextColumn::make('id')
// ->label('ID')
// ->numeric()
// ->sortable(),
Tables\Columns\TextColumn::make('plant.name')
->label('Plant')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('name')
->label('Check Point Name')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('created_at')
->label('Created At')
->dateTime()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('created_by')
->label('Created By')
->searchable()
->alignCenter(),
Tables\Columns\TextColumn::make('updated_at')
->label('Updated At')
->dateTime()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('deleted_at')
->label('Deleted At')
->dateTime()
->alignCenter()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
Tables\Filters\TrashedFilter::make(),
])
->actions([
Tables\Actions\ViewAction::make(),
Tables\Actions\EditAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
Tables\Actions\ForceDeleteBulkAction::make(),
Tables\Actions\RestoreBulkAction::make(),
]),
])
->headerActions([
ImportAction::make()
->importer(CheckPointNameImporter::class)
->visible(function() {
return Filament::auth()->user()->can('view import check point name');
}),
ExportAction::make()
->exporter(CheckPointNameExporter::class)
->visible(function() {
return Filament::auth()->user()->can('view export check point name');
}),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListCheckPointNames::route('/'),
'create' => Pages\CreateCheckPointName::route('/create'),
'view' => Pages\ViewCheckPointName::route('/{record}'),
'edit' => Pages\EditCheckPointName::route('/{record}/edit'),
];
}
public static function getEloquentQuery(): Builder
{
return parent::getEloquentQuery()
->withoutGlobalScopes([
SoftDeletingScope::class,
]);
}
}

View File

@@ -0,0 +1,17 @@
<?php
namespace App\Filament\Resources\CheckPointNameResource\Pages;
use App\Filament\Resources\CheckPointNameResource;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
class CreateCheckPointName extends CreateRecord
{
protected static string $resource = CheckPointNameResource::class;
protected function getRedirectUrl(): string
{
return $this->getResource()::getUrl('create');
}
}

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,418 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Exports\CheckPointTimeExporter;
use App\Filament\Imports\CheckPointTimeImporter;
use App\Filament\Resources\CheckPointTimeResource\Pages;
use App\Filament\Resources\CheckPointTimeResource\RelationManagers;
use App\Models\CheckPointName;
use App\Models\CheckPointTime;
use Filament\Facades\Filament;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Forms\Get;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Actions\ExportAction;
use Filament\Tables\Actions\ImportAction;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Illuminate\Validation\Rule;
class CheckPointTimeResource extends Resource
{
protected static ?string $model = CheckPointTime::class;
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
protected static ?string $navigationGroup = 'Master Entries';
protected static ?int $navigationSort = 15;
public static function form(Form $form): Form
{
return $form
->schema([
Forms\Components\Select::make('plant_id')
->label('Plant')
->relationship('plant', 'name')
->required()
->reactive()
->default(function () {
return optional(CheckPointTime::where('created_by', Filament::auth()->user()?->name)->latest()->first())->plant_id;
})
->disabled(fn (Get $get) => !empty($get('id')))
->afterStateUpdated(function ($state, callable $set, callable $get) {
$plantId = $get('plant_id');
if (!$plantId) {
$set('cPtPlantError', 'Please select a plant first.');
return;
}
else
{
$set('cPtPlantError', null);
$set('created_by', Filament::auth()->user()?->name);
}
})
->extraAttributes(fn ($get) => [
'class' => $get('cPtPlantError') ? 'border-red-500' : '',
])
->hint(fn ($get) => $get('cPtPlantError') ? $get('cPtPlantError') : null)
->hintColor('danger'),
Forms\Components\TextInput::make('sequence_number')
->label('Sequence Number')
->required()
->reactive()
->integer()
->minValue(1)
->default(1)
->afterStateUpdated(function ($state, callable $set, callable $get) {
$set('created_by', Filament::auth()->user()?->name);
})
->rule(function (callable $get) {
return Rule::unique('check_point_times', 'sequence_number')
->where('plant_id', $get('plant_id'))
->ignore($get('id'));
//->where('check_point1_id', $get('check_point1_id'))
//->where('check_point2_id', $get('check_point2_id'))
}),
Forms\Components\Select::make('check_point1_id')
->label('Check Point Name 1')
// ->relationship('checkPointNames', 'name')
->options(function (callable $get) {
$plantId = $get('plant_id');
if (!$plantId) {
return [];
}
return CheckPointName::where('plant_id', $plantId)
->pluck('name', 'id')
->toArray();
})
->required()
->reactive()
->default(function () {
return optional(CheckPointTime::where('created_by', Filament::auth()->user()?->name)->latest()->first())->check_point1_id;
})
->disabled(fn (Get $get) => !empty($get('id')))
->afterStateUpdated(function ($state, callable $set, callable $get) {
$checkPoint1 = $get('check_point1_id');
$checkPoint2 = $get('check_point2_id');
if (!$checkPoint1) {
$set('cPtCheckPoint1Error', 'Please select a check point 1 first.');
return;
}
else
{
if ($checkPoint2 && $checkPoint1 == $checkPoint2) {
$set('cPtCheckPoint1Error', 'Duplicate check point 2 found.');
$set('check_point2_id', null);
return;
}
$set('cPtCheckPoint1Error', null);
$set('cPtCheckPoint2Error', null);
$set('created_by', Filament::auth()->user()?->name);
}
})
->extraAttributes(fn ($get) => [
'class' => $get('cPtCheckPoint1Error') ? 'border-red-500' : '',
])
->hint(fn ($get) => $get('cPtCheckPoint1Error') ? $get('cPtCheckPoint1Error') : null)
->hintColor('danger'),
Forms\Components\Select::make('check_point2_id')
->label('Check Point Name 2')
// ->relationship('checkPointNames', 'name')
->options(function (callable $get) {
$plantId = $get('plant_id');
if (!$plantId) {
return [];
}
return CheckPointName::where('plant_id', $plantId)
->pluck('name', 'id')
->toArray();
})
->required()
->reactive()
->default(function () {
return optional(CheckPointTime::where('created_by', Filament::auth()->user()?->name)->latest()->first())->check_point2_id;
})
->disabled(fn (Get $get) => !empty($get('id')))
->afterStateUpdated(function ($state, callable $set, callable $get) {
$checkPoint1 = $get('check_point1_id');
$checkPoint2 = $get('check_point2_id');
if (!$checkPoint2) {
$set('cPtCheckPoint2Error', 'Please select a check point 2 first.');
return;
}
else
{
if ($checkPoint1 && $checkPoint1 == $checkPoint2) {
$set('cPtCheckPoint2Error', 'Duplicate check point 2 found.');
$set('check_point2_id', null);
return;
}
$set('cPtCheckPoint1Error', null);
$set('cPtCheckPoint2Error', null);
$set('created_by', Filament::auth()->user()?->name);
}
})
->extraAttributes(fn ($get) => [
'class' => $get('cPtCheckPoint2Error') ? 'border-red-500' : '',
])
->hint(fn ($get) => $get('cPtCheckPoint2Error') ? $get('cPtCheckPoint2Error') : null)
->hintColor('danger')
->rule(function (callable $get) {
return Rule::unique('check_point_times', 'check_point2_id')
->where('check_point1_id', $get('check_point1_id'))
->where('plant_id', $get('plant_id'))
->ignore($get('id'));
}),
Forms\Components\TextInput::make('time_lapse')
->label('Time Lapse (in minutes)')
->required()
->integer()
->minValue(1)
->default(1)
->reactive()
->afterStateUpdated(function ($state, callable $set, callable $get) {
$timeLapse = $state;
$timeLapseCushioning = $get('time_lapse_cushioning');
if (!$timeLapse) {
$set('cPtTimeLapseError', 'Please enter a valid time lapse!');
$set('time_lapse_cushioning', null);
$set('min_cushioning', null);
$set('max_cushioning', null);
return;
}
elseif(!$timeLapseCushioning)
{
// $set('cPtTimeLapseError', 'Please enter a valid time lapse cushioning!');
$set('time_lapse_cushioning', 1);
$set('cPtTimeLapseError', null);
$set('min_cushioning', $timeLapse - 1);
$set('max_cushioning', $timeLapse + 1);
$set('created_by', Filament::auth()->user()?->name);
return;
}
elseif ($timeLapseCushioning > $timeLapse) {
$set('cPtTimeLapseError', 'Must be greater than or equal to time lapse cushioning!');
$set('time_lapse_cushioning', null);
$set('min_cushioning', null);
$set('max_cushioning', null);
return;
}
else
{
$set('cPtTimeLapseError', null);
$set('cPtTimeLapseCushError', null);
$set('min_cushioning', $timeLapse - $timeLapseCushioning);
$set('max_cushioning', $timeLapse + $timeLapseCushioning);
$set('created_by', Filament::auth()->user()?->name);
}
})
->extraAttributes(fn ($get) => [
'class' => $get('cPtTimeLapseError') ? 'border-red-500' : '',
])
->hint(fn ($get) => $get('cPtTimeLapseError') ? $get('cPtTimeLapseError') : null)
->hintColor('danger'),
Forms\Components\TextInput::make('time_lapse_cushioning')
->label('Time Lapse Cushioning (in minutes)')
->required()
->integer()
->minValue(1)
->default(1)
->reactive()
->afterStateUpdated(function ($state, callable $set, callable $get) {
$timeLapse = $get('time_lapse');
$timeLapseCushioning = $state;
if (!$timeLapse) {
$set('cPtTimeLapseCushError', 'Please enter a valid time lapse first.');
$set('time_lapse_cushioning', null);
$set('min_cushioning', null);
$set('max_cushioning', null);
return;
}
elseif(!$timeLapseCushioning)
{
// $set('cPtTimeLapseCushError', 'Please enter a valid time lapse cushioning!');
$set('time_lapse_cushioning', 1);
$set('cPtTimeLapseCushError', null);
$set('min_cushioning', $timeLapse - 1);
$set('max_cushioning', $timeLapse + 1);
$set('created_by', Filament::auth()->user()?->name);
return;
}
elseif ($timeLapseCushioning > $timeLapse) {
$set('cPtTimeLapseCushError', 'Must be less than or equal to time lapse!');
$set('time_lapse_cushioning', null);
$set('min_cushioning', null);
$set('max_cushioning', null);
return;
}
else
{
$set('cPtTimeLapseError', null);
$set('cPtTimeLapseCushError', null);
$set('min_cushioning', $timeLapse - $timeLapseCushioning);
$set('max_cushioning', $timeLapse + $timeLapseCushioning);
$set('created_by', Filament::auth()->user()?->name);
}
})
->extraAttributes(fn ($get) => [
'class' => $get('cPtTimeLapseCushError') ? 'border-red-500' : '',
])
->hint(fn ($get) => $get('cPtTimeLapseCushError') ? $get('cPtTimeLapseCushError') : null)
->hintColor('danger'),
Forms\Components\Hidden::make('min_cushioning')
->default(0)
->reactive()
->afterStateUpdated(function ($state, callable $set, callable $get) {
$set('created_by', Filament::auth()->user()?->name);
})
->required(),
Forms\Components\Hidden::make('max_cushioning')
->default(2)
->reactive()
->afterStateUpdated(function ($state, callable $set, callable $get) {
$set('created_by', Filament::auth()->user()?->name);
})
->required(),
Forms\Components\Hidden::make('created_by')
->default(fn () => Filament::auth()->user()?->name)
->required(),
Forms\Components\TextInput::make('id')
->hidden()
->reactive()
->afterStateUpdated(function ($state, callable $set, callable $get) {
$set('created_by', Filament::auth()->user()?->name);
})
->readOnly(),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('No.')
->label('No.')
->getStateUsing(function ($record, $livewire, $column, $rowLoop) {
$paginator = $livewire->getTableRecords();
$perPage = method_exists($paginator, 'perPage') ? $paginator->perPage() : 10;
$currentPage = method_exists($paginator, 'currentPage') ? $paginator->currentPage() : 1;
return ($currentPage - 1) * $perPage + $rowLoop->iteration;
}),
// Tables\Columns\TextColumn::make('id')
// ->label('ID')
// ->numeric()
// ->sortable(),
Tables\Columns\TextColumn::make('plant.name')
->label('Plant')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('checkPointNames1.name')
->label('Check Point 1')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('checkPointNames2.name')
->label('Check Point 2')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('sequence_number')
->label('Sequence Number')
->alignCenter()
->searchable()
->numeric()
->sortable(),
Tables\Columns\TextColumn::make('time_lapse')
->label('Time Lapse')
->alignCenter()
->searchable()
->numeric()
->sortable(),
Tables\Columns\TextColumn::make('time_lapse_cushioning')
->label('Time Lapse Cushioning (±)')
->alignCenter()
->searchable()
->numeric()
->sortable(),
Tables\Columns\TextColumn::make('created_at')
->label('Created At')
->dateTime()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('created_by')
->label('Created By')
->searchable()
->alignCenter(),
Tables\Columns\TextColumn::make('updated_at')
->label('Updated At')
->dateTime()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('deleted_at')
->label('Deleted At')
->dateTime()
->alignCenter()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
Tables\Filters\TrashedFilter::make(),
])
->actions([
Tables\Actions\ViewAction::make(),
Tables\Actions\EditAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
Tables\Actions\ForceDeleteBulkAction::make(),
Tables\Actions\RestoreBulkAction::make(),
]),
])
->headerActions([
ImportAction::make()
->importer(CheckPointTimeImporter::class)
->visible(function() {
return Filament::auth()->user()->can('view import check point time');
}),
ExportAction::make()
->exporter(CheckPointTimeExporter::class)
->visible(function() {
return Filament::auth()->user()->can('view export check point time');
}),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListCheckPointTimes::route('/'),
'create' => Pages\CreateCheckPointTime::route('/create'),
'view' => Pages\ViewCheckPointTime::route('/{record}'),
'edit' => Pages\EditCheckPointTime::route('/{record}/edit'),
];
}
public static function getEloquentQuery(): Builder
{
return parent::getEloquentQuery()
->withoutGlobalScopes([
SoftDeletingScope::class,
]);
}
}

View File

@@ -0,0 +1,17 @@
<?php
namespace App\Filament\Resources\CheckPointTimeResource\Pages;
use App\Filament\Resources\CheckPointTimeResource;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
class CreateCheckPointTime extends CreateRecord
{
protected static string $resource = CheckPointTimeResource::class;
protected function getRedirectUrl(): string
{
return $this->getResource()::getUrl('create');
}
}

View File

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

View File

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

View File

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

View File

@@ -2,11 +2,13 @@
namespace App\Filament\Resources;
use App\Filament\Exports\CompanyExporter;
use App\Filament\Imports\CompanyImporter;
use App\Filament\Resources\CompanyResource\Pages;
use App\Filament\Resources\CompanyResource\RelationManagers\PlantsRelationManager;
use App\Models\Company;
use Filament\Actions\Imports\Importer;
use Filament\Facades\Filament;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
@@ -16,6 +18,7 @@ use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Forms\Components\Section;
use Filament\Tables\Actions\ExportAction;
class CompanyResource extends Resource
{
@@ -67,22 +70,38 @@ class CompanyResource extends Resource
{
return $table
->columns([
Tables\Columns\TextColumn::make('id')
->label('ID')
->numeric()
->sortable(),
// Tables\Columns\TextColumn::make('id')
// ->label('ID')
// ->numeric()
// ->sortable(),
Tables\Columns\TextColumn::make('No.')
->label('No.')
->getStateUsing(function ($record, $livewire, $column, $rowLoop) {
$paginator = $livewire->getTableRecords();
$perPage = method_exists($paginator, 'perPage') ? $paginator->perPage() : 10;
$currentPage = method_exists($paginator, 'currentPage') ? $paginator->currentPage() : 1;
return ($currentPage - 1) * $perPage + $rowLoop->iteration;
}),
Tables\Columns\TextColumn::make('name')
->label('Company')
->alignCenter()
->sortable()
->searchable(),
Tables\Columns\TextColumn::make('created_at')
->label('Created At')
->dateTime()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('updated_at')
->label('Updated At')
->dateTime()
->alignCenter()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('deleted_at')
->label('Deleted At')
->dateTime()
->alignCenter()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
@@ -102,10 +121,17 @@ class CompanyResource extends Resource
])
->headerActions([
ImportAction::make()
->importer(CompanyImporter::class)
->importer(CompanyImporter::class)
->visible(function() {
return Filament::auth()->user()->can('view import company');
}),
ExportAction::make()
->exporter(CompanyExporter::class)
->visible(function() {
return Filament::auth()->user()->can('view export company');
}),
]);
}
public static function getRelations(): array
{
return [

View File

@@ -0,0 +1,217 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Exports\ConfigurationExporter;
use App\Filament\Imports\ConfigurationImporter;
use App\Filament\Resources\ConfigurationResource\Pages;
use App\Filament\Resources\ConfigurationResource\RelationManagers;
use App\Models\Configuration;
use App\Models\Line;
use Filament\Facades\Filament;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Forms\Get;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Tables\Actions\ImportAction;
use Filament\Tables\Actions\ExportAction;
class ConfigurationResource extends Resource
{
protected static ?string $model = Configuration::class;
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
protected static ?string $navigationGroup = 'Master Entries';
protected static ?int $navigationSort = 10;
public static function form(Form $form): Form
{
return $form
->schema([
Forms\Components\Select::make('plant_id')
->label('Plant')
->relationship('plant', 'name')
->required()
->reactive()
->default(function () {
return optional(Configuration::latest()->first())->plant_id;
})
->disabled(fn (Get $get) => !empty($get('id')))
->afterStateUpdated(function ($state, callable $set, callable $get) {
$plantId = $get('plant_id');
if (!$plantId) {
$set('cPlantError', 'Please select a plant first.');
return;
}
else
{
$set('cPlantError', null);
}
})
->extraAttributes(fn ($get) => [
'class' => $get('cPlantError') ? 'border-red-500' : '',
])
->hint(fn ($get) => $get('cPlantError') ? $get('cPlantError') : null)
->hintColor('danger'),
Forms\Components\Select::make('line_id')
->label('Line')
->relationship('line', 'name')
->required()
->reactive()
->options(function (callable $get) {
if (!$get('plant_id')) {
return [];
}
return Line::where('plant_id', $get('plant_id'))
->pluck('name', 'id')
->toArray();
})
->default(function () {
return optional(Configuration::latest()->first())->line_id;
})
->disabled(fn (Get $get) => !empty($get('id')))
->afterStateUpdated(function ($state, callable $set, callable $get) {
$lineId = $get('line_id');
if (!$lineId) {
$set('cLineError', 'Please select a line first.');
return;
}
else
{
$set('cLineError', null);
}
})
->extraAttributes(fn ($get) => [
'class' => $get('cLineError') ? 'border-red-500' : '',
])
->hint(fn ($get) => $get('cLineError') ? $get('cLineError') : null)
->hintColor('danger'),
Forms\Components\TextInput::make('c_type')
->label('Type')
->required(),
Forms\Components\TextInput::make('c_group')
->label('Group')
->required(),
Forms\Components\TextInput::make('c_name')
->label('Name')
->required(),
Forms\Components\TextInput::make('c_value')
->label('Value')
->required(),
Forms\Components\TextInput::make('id')
->hidden()
->readOnly(),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('No.')
->label('No.')
->getStateUsing(function ($record, $livewire, $column, $rowLoop) {
$paginator = $livewire->getTableRecords();
$perPage = method_exists($paginator, 'perPage') ? $paginator->perPage() : 10;
$currentPage = method_exists($paginator, 'currentPage') ? $paginator->currentPage() : 1;
return ($currentPage - 1) * $perPage + $rowLoop->iteration;
}),
Tables\Columns\TextColumn::make('plant.name')
->alignCenter()
->label('Plant')
->searchable(),
Tables\Columns\TextColumn::make('line.name')
->label('Line')
->alignCenter()
->searchable(),
Tables\Columns\TextColumn::make('c_type')
->label('Type')
->alignCenter()
->searchable(),
Tables\Columns\TextColumn::make('c_group')
->label('Group')
->alignCenter()
->searchable(),
Tables\Columns\TextColumn::make('c_name')
->label('Name')
->alignCenter()
->searchable(),
Tables\Columns\TextColumn::make('c_value')
->label('Value')
->alignCenter()
->searchable(),
Tables\Columns\TextColumn::make('created_at')
->label('Created At')
->dateTime()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('updated_at')
->dateTime()
->label('Updated At')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('deleted_at')
->dateTime()
->label('Deleted At')
->alignCenter()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
Tables\Filters\TrashedFilter::make(),
])
->actions([
Tables\Actions\ViewAction::make(),
Tables\Actions\EditAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
Tables\Actions\ForceDeleteBulkAction::make(),
Tables\Actions\RestoreBulkAction::make(),
]),
])
->headerActions([
ImportAction::make()
->importer(ConfigurationImporter::class)
->visible(function() {
return Filament::auth()->user()->can('view import configuration');
}),
ExportAction::make()
->exporter(ConfigurationExporter::class)
->visible(function() {
return Filament::auth()->user()->can('view export configuration');
}),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListConfigurations::route('/'),
'create' => Pages\CreateConfiguration::route('/create'),
'view' => Pages\ViewConfiguration::route('/{record}'),
'edit' => Pages\EditConfiguration::route('/{record}/edit'),
];
}
public static function getEloquentQuery(): Builder
{
return parent::getEloquentQuery()
->withoutGlobalScopes([
SoftDeletingScope::class,
]);
}
}

View File

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

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,200 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Exports\GuardNameExporter;
use App\Filament\Imports\GuardNameImporter;
use App\Filament\Resources\GuardNameResource\Pages;
use App\Filament\Resources\GuardNameResource\RelationManagers;
use App\Models\GuardName;
use Filament\Facades\Filament;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Forms\Get;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Actions\ExportAction;
use Filament\Tables\Actions\ImportAction;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Illuminate\Validation\Rule;
class GuardNameResource extends Resource
{
protected static ?string $model = GuardName::class;
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
protected static ?string $navigationGroup = 'Master Entries';
protected static ?int $navigationSort = 13;
public static function form(Form $form): Form
{
return $form
->schema([
Forms\Components\Select::make('plant_id')
->label('Plant')
->relationship('plant', 'name')
->required()
->reactive()
->default(function () {
return optional(GuardName::latest()->first())->plant_id;
})
->disabled(fn (Get $get) => !empty($get('id')))
->afterStateUpdated(function ($state, callable $set, callable $get) {
$plantId = $get('plant_id');
if (!$plantId) {
$set('GnError', 'Please select a plant first.');
return;
}
else
{
$set('GnError', null);
$set('created_by', Filament::auth()->user()?->name);
}
})
->extraAttributes(fn ($get) => [
'class' => $get('GnError') ? 'border-red-500' : '',
])
->hint(fn ($get) => $get('GnError') ? $get('GnError') : null)
->hintColor('danger'),
Forms\Components\TextInput::make('name')
->label('Name')
->required()
->reactive()
->afterStateUpdated(function ($state, callable $set, callable $get) {
$set('created_by', Filament::auth()->user()?->name);
})
->rule(function (callable $get) {
return Rule::unique('guard_names', 'name')
->where('plant_id', $get('plant_id'))
->ignore($get('id'));
}),
Forms\Components\TextInput::make('identification1')
->label('Identification-1')
->required()
->reactive()
->afterStateUpdated(function ($state, callable $set, callable $get) {
$set('created_by', Filament::auth()->user()?->name);
}),
Forms\Components\TextInput::make('identification2')
->label('Identification-2')
->reactive()
->afterStateUpdated(function ($state, callable $set, callable $get) {
$set('created_by', Filament::auth()->user()?->name);
}),
Forms\Components\Hidden::make('created_by')
->default(fn () => Filament::auth()->user()?->name)
->required(),
Forms\Components\TextInput::make('id')
->hidden()
->reactive()
->afterStateUpdated(function ($state, callable $set, callable $get) {
$set('created_by', Filament::auth()->user()?->name);
})
->readOnly(),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('No.')
->label('No.')
->getStateUsing(function ($record, $livewire, $column, $rowLoop) {
$paginator = $livewire->getTableRecords();
$perPage = method_exists($paginator, 'perPage') ? $paginator->perPage() : 10;
$currentPage = method_exists($paginator, 'currentPage') ? $paginator->currentPage() : 1;
return ($currentPage - 1) * $perPage + $rowLoop->iteration;
}),
// Tables\Columns\TextColumn::make('id')
// ->label('ID')
// ->numeric()
// ->sortable(),
Tables\Columns\TextColumn::make('plant.name')
->label('Plant')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('name')
->label('Guard')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('created_at')
->label('Created At')
->dateTime()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('created_by')
->label('Created By')
->searchable()
->alignCenter(),
Tables\Columns\TextColumn::make('updated_at')
->label('Updated At')
->dateTime()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('deleted_at')
->label('Deleted At')
->dateTime()
->alignCenter()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
Tables\Filters\TrashedFilter::make(),
])
->actions([
Tables\Actions\ViewAction::make(),
Tables\Actions\EditAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
Tables\Actions\ForceDeleteBulkAction::make(),
Tables\Actions\RestoreBulkAction::make(),
]),
])
->headerActions([
ImportAction::make()
->importer(GuardNameImporter::class)
->visible(function() {
return Filament::auth()->user()->can('view import guard name');
}),
ExportAction::make()
->exporter(GuardNameExporter::class)
->visible(function() {
return Filament::auth()->user()->can('view export guard name');
}),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListGuardNames::route('/'),
'create' => Pages\CreateGuardName::route('/create'),
'view' => Pages\ViewGuardName::route('/{record}'),
'edit' => Pages\EditGuardName::route('/{record}/edit'),
];
}
public static function getEloquentQuery(): Builder
{
return parent::getEloquentQuery()
->withoutGlobalScopes([
SoftDeletingScope::class,
]);
}
}

View File

@@ -0,0 +1,17 @@
<?php
namespace App\Filament\Resources\GuardNameResource\Pages;
use App\Filament\Resources\GuardNameResource;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
class CreateGuardName extends CreateRecord
{
protected static string $resource = GuardNameResource::class;
protected function getRedirectUrl(): string
{
return $this->getResource()::getUrl('create');
}
}

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,813 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Exports\GuardPatrolEntryExporter;
use App\Filament\Imports\GuardPatrolEntryImporter;
use App\Filament\Resources\GuardPatrolEntryResource\Pages;
use App\Filament\Resources\GuardPatrolEntryResource\RelationManagers;
use App\Models\CheckPointName;
use App\Models\Configuration;
use App\Models\GuardName;
use App\Models\GuardPatrolEntry;
use App\Models\Plant;
use Carbon\Carbon;
use Filament\Facades\Filament;
use Filament\Forms;
use Filament\Forms\Components\DateTimePicker;
use Filament\Forms\Components\FileUpload;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\Tabs\Tab;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Form;
use Filament\Forms\Get;
use Filament\Notifications\Notification;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Actions\ExportAction;
use Filament\Tables\Actions\ImportAction;
use Filament\Tables\Filters\Filter;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Illuminate\Validation\Rule;
use Maatwebsite\Excel\Facades\Excel;
use Storage;
use Str;
class GuardPatrolEntryResource extends Resource
{
protected static ?string $model = GuardPatrolEntry::class;
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
protected static ?string $navigationGroup = 'Guard';
public static function form(Form $form): Form
{
return $form
->schema([
Forms\Components\Select::make('plant_id')
->label('Plant')
->relationship('plant', 'name')
->required()
->reactive()
->default(function () {
return optional(GuardPatrolEntry::where('created_by', Filament::auth()->user()?->name)->latest()->first())->plant_id;
})
->disabled(fn (Get $get) => !empty($get('id')))
->afterStateUpdated(function ($state, callable $set, callable $get) {
$plantId = $get('plant_id');
if (!$plantId) {
// $set('gPePlantError', 'Please select a plant first.');
$set('gPePlantError', 'Please select a plant first.');
return;
}
else
{
$set('patrol_time', now()->format('Y-m-d H:i:s'));
$set('updated_by', Filament::auth()->user()?->name);
$set('gPePlantError', null);
}
})
->extraAttributes(fn ($get) => [
'class' => $get('gPePlantError') ? 'border-red-500' : '',
])
->hint(fn ($get) => $get('gPePlantError') ? $get('gPePlantError') : null)
->hintColor('danger'),
Forms\Components\Select::make('guard_name_id')
->label('Guard Name')
// ->relationship('guardNames', 'name')
->options(function (callable $get) {
$plantId = $get('plant_id');
if (!$plantId) {
return [];
}
return GuardName::where('plant_id', $plantId)
->pluck('name', 'id')
->toArray();
})
->required()
->reactive()
->default(function () {
return optional(GuardPatrolEntry::where('created_by', Filament::auth()->user()?->name)->latest()->first())->guard_name_id;
})
->disabled(fn (Get $get) => !empty($get('id')))
->afterStateUpdated(function ($state, callable $set, callable $get) {
$guardName = $get('guard_name_id');
if (!$guardName) {
$set('gPeGuardNameError', 'Please select a guard name first.');
return;
}
else
{
$set('patrol_time', now()->format('Y-m-d H:i:s'));
$set('updated_by', Filament::auth()->user()?->name);
$set('gPeGuardNameError', null);
}
})
->extraAttributes(fn ($get) => [
'class' => $get('gPeGuardNameError') ? 'border-red-500' : '',
])
->hint(fn ($get) => $get('gPeGuardNameError') ? $get('gPeGuardNameError') : null)
->hintColor('danger'),
Forms\Components\Hidden::make('check_point_name')//TextInput
->label('Check Point Name')
->reactive()
->afterStateUpdated(function ($state, callable $set, callable $get) {
$set('patrol_time', now()->format('Y-m-d H:i:s'));
$set('updated_by', Filament::auth()->user()?->name);
})
->extraAttributes([
'x-on:keydown.enter.prevent' => '$wire.processCheckPointName()',
]),
Forms\Components\Select::make('check_point_name_id')
->label('Check Point Name')
// ->relationship('checkPointNames', 'name')
->options(function (callable $get) {
$plantId = $get('plant_id');
if (!$plantId) {
return [];
}
return CheckPointName::where('plant_id', $plantId)
->pluck('name', 'id')
->toArray();
})
->required()
->reactive()
// ->default(function () {
// return optional(GuardPatrolEntry::where('created_by', Filament::auth()->user()?->name)->latest()->first())->check_point_name_id;
// })
->disabled(fn (Get $get) => !empty($get('id')))
->afterStateUpdated(function ($state, callable $set, callable $get) {
$checkPointName = $get('check_point_name_id');
if (!$checkPointName) {
$set('check_point_name_id', null);
$set('gPeCheckPointNameError', 'Please select a check point name first.');
return;
}
else
{
$set('patrol_time', now()->format('Y-m-d H:i:s'));
$set('updated_by', Filament::auth()->user()?->name);
$set('gPeCheckPointNameError', null);
}
})
->extraAttributes(fn ($get) => [
'class' => $get('gPeCheckPointNameError') ? 'border-red-500' : '',
])
->hint(fn ($get) => $get('gPeCheckPointNameError') ? $get('gPeCheckPointNameError') : null)
->hintColor('danger')
->rule(function (callable $get) {
return Rule::unique('guard_patrol_entries', 'check_point_name_id')
->where('guard_name_id', $get('guard_name_id'))
->where('patrol_time', now())
->where('plant_id', $get('plant_id'))
->ignore($get('id'));
}),
Forms\Components\TextInput::make('reader_code')
->label('Reader Code')
->hidden(fn (Get $get) => !$get('id'))
->reactive()
->afterStateUpdated(function ($state, callable $set, callable $get) {
if(!$get('id'))
{
$set('patrol_time', now()->format('Y-m-d H:i:s'));
}
$set('updated_by', Filament::auth()->user()?->name);
}),
Forms\Components\DateTimePicker::make('patrol_time')
->label('Patrol Time')
->reactive()
->default(fn () => now())
->readOnly(fn (Get $get) => !$get('id'))
->afterStateUpdated(function ($state, callable $set, callable $get) {
$set('updated_by', Filament::auth()->user()?->name);
})
->required()
->rule(function (callable $get) {
return Rule::unique('guard_patrol_entries', 'patrol_time')
->where('guard_name_id', $get('guard_name_id'))
->where('check_point_name_id', $get('check_point_name_id'))
->where('plant_id', $get('plant_id'))
->ignore($get('id'));
}),
Forms\Components\Hidden::make('created_by')
->default(fn () => Filament::auth()->user()?->name)
->required(),
Forms\Components\Hidden::make('updated_by')
->reactive()
->default(fn () => Filament::auth()->user()?->name)
->required(),
Forms\Components\TextInput::make('id')
->hidden()
->reactive()
->afterStateUpdated(function ($state, callable $set, callable $get) {
$set('updated_by', Filament::auth()->user()?->name);
})
->readOnly(),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('No.')
->label('No.')
->getStateUsing(function ($record, $livewire, $column, $rowLoop) {
$paginator = $livewire->getTableRecords();
$perPage = method_exists($paginator, 'perPage') ? $paginator->perPage() : 10;
$currentPage = method_exists($paginator, 'currentPage') ? $paginator->currentPage() : 1;
return ($currentPage - 1) * $perPage + $rowLoop->iteration;
}),
// Tables\Columns\TextColumn::make('id')
// ->label('ID')
// ->numeric()
// ->sortable(),
Tables\Columns\TextColumn::make('plant.name')
->label('Plant')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('guardNames.name') //guard_name_id
->label('Guard Name')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('checkPointNames.name') //check_point_name_id
->label('Check Point Name')
->alignCenter()
->sortable(),
// Tables\Columns\TextColumn::make('reader_code')
// ->label('Reader Code')
// ->alignCenter()
// ->sortable(),
Tables\Columns\TextColumn::make('patrol_time')
->label('Patrol Time')
->dateTime()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('created_at')
->label('Created At')
->dateTime()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('created_by')
->label('Created By')
->alignCenter(),
Tables\Columns\TextColumn::make('updated_at')
->label('Updated At')
->dateTime()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('updated_by')
->label('Updated By')
->alignCenter(),
Tables\Columns\TextColumn::make('deleted_at')
->label('Deleted At')
->dateTime()
->alignCenter()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
Tables\Filters\TrashedFilter::make(),
Filter::make('advanced_filters')
->label('Advanced Filters')
->form([
Select::make('Plant')
->label('Select Plant')
->nullable()
->options(function () {
return Plant::pluck('name', 'id');
})
->reactive(),
// ->afterStateUpdated(function ($state, callable $set, callable $get) {
// $set('sticker_master_id', null);
// $set('sap_msg_status', null);
// }),
Select::make('Guard Name')
->label('Select Guard Name')
->options(function (callable $get) {
$plantId = $get('Plant');
if (!$plantId) {
return [];
}
return GuardName::where('plant_id', $plantId)->pluck('name', 'id')->toArray();
})
->reactive(),
Select::make('Check Point Name')
->label('Select Check Point Name')
->options(function (callable $get) {
$plantId = $get('Plant');
if (!$plantId) {
return [];
}
return CheckPointName::where('plant_id', $plantId)->pluck('name', 'id')->toArray();
})
->reactive(),
Select::make('Created By')
->label('Created By')
->placeholder('Select Created By')
->options(function (callable $get) {
$plantId = $get('Plant');
if (!$plantId) {
return [];
}
return GuardPatrolEntry::where('plant_id', $plantId)->orderBy('patrol_time', 'asc')->get()->unique('created_by')->pluck('created_by', 'created_by')->toArray();//, 'id'
})
->reactive(),
DateTimePicker::make(name: 'From Patrol Time')
->label('From Patrol Time')
->beforeOrEqual('To Patrol Time')
->placeholder(placeholder: 'Select From Patrol Time')
->reactive()
->native(false),
DateTimePicker::make('To Patrol Time')
->label('To Patrol Time')
->afterOrEqual('From Patrol Time')
->placeholder(placeholder: 'Select To Patrol Time')
->reactive()
->native(false),
])
->query(function ($query, array $data) {
//Hide all records initially if no filters are applied
if (empty($data['Plant']) && empty($data['Guard Name']) && empty($data['Check Point Name']) && empty($data['Created By']) && empty($data['From Patrol Time']) && empty($data['To Patrol Time'])) {
return $query->whereRaw('1 = 0');
}
if (!empty($data['Plant'])) {
$query->where('plant_id', $data['Plant']);
}
if (!empty($data['Guard Name'])) {
$query->where('guard_name_id', $data['Guard Name']);
}
if (!empty($data['Check Point Name'])) {
$query->where('check_point_name_id', $data['Check Point Name']);
}
if (!empty($data['Created By'])) {
$query->where('created_by', $data['Created By']);
}
if (!empty($data['From Patrol Time'])) {
$query->where('patrol_time', '>=', $data['From Patrol Time']);
}
if (!empty($data['To Patrol Time'])) {
$query->where('patrol_time', '<=', $data['To Patrol Time']);
}
})
->indicateUsing(function (array $data) {
$indicators = [];
if (!empty($data['Plant'])) {
$indicators[] = 'Plant: ' . Plant::where('id', $data['Plant'])->value('name');
}
if (!empty($data['Guard Name'])) {
$indicators[] = 'Guard Name: ' . GuardName::where('plant_id', $data['Plant'])->where('id', $data['Guard Name'])->value('name');
}
if (!empty($data['Check Point Name'])) {
$indicators[] = 'Check Point Name: ' . CheckPointName::where('plant_id', $data['Plant'])->where('id', $data['Check Point Name'])->value('name');
}
if (!empty($data['Created By'])) {
$indicators[] = 'Created By: ' . $data['Created By'];
}
if (!empty($data['From Patrol Time'])) {
$indicators[] = 'From: ' . $data['From Patrol Time'];
}
if (!empty($data['To Patrol Time'])) {
$indicators[] = 'To: ' . $data['To Patrol Time'];
}
return $indicators;
})
])
->filtersFormMaxHeight('280px')
->actions([
Tables\Actions\ViewAction::make(),
Tables\Actions\EditAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
Tables\Actions\ForceDeleteBulkAction::make(),
Tables\Actions\RestoreBulkAction::make(),
]),
])
->headerActions([
Tables\Actions\Action::make('guard_patrol_entries')
->label('Import Guard Patrol Entries')
->form([
Select::make('plant_id')
->options(Plant::pluck('name', 'id')->toArray())
->label('Select Plant')
->reactive()
->required()
->default(function () {
return optional(GuardPatrolEntry::where('created_by', Filament::auth()->user()?->name)->latest()->first())->plant_id;
})
->afterStateUpdated(function ($state, callable $set, callable $get) {
$plantId = $get('plant_id');
$set('guard_patrol_entry', null);
if (!$plantId) {
$set('gPeSelectPlantError', 'Please select a plant first.');
return;
}
else
{
$set('gPeSelectPlantError', null);
}
})
->extraAttributes(fn ($get) => [
'class' => $get('gPeSelectPlantError') ? 'border-red-500' : '',
])
->hint(fn ($get) => $get('gPeSelectPlantError') ? $get('gPeSelectPlantError') : null)
->hintColor('danger'),
FileUpload::make('guard_patrol_entry')
->label('Import Guard Patrol Entries')
// ->required()
->preserveFilenames() // <- this keeps the original filename
->storeFiles(false)
->reactive()
->required()
->disk('local')
->visible(fn (Get $get) => !empty($get('plant_id')))
->directory('uploads/temp')
// Allow only .xlsx and .xls
->acceptedFileTypes(['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.ms-excel'])
// Optional: Custom error message if needed
->validationMessages([
'mimes' => 'Only .xlsx and .xls files are allowed.',
])
// Server-side validation for extra safety
->rules(['mimes:xlsx,xls']),
])
->action(function (array $data) {
$uploadedFile = $data['guard_patrol_entry'];
$plantId = $data['plant_id'];
$user = Filament::auth()->user()->name;
$disk = Storage::disk('local');
$originalName = $uploadedFile->getClientOriginalName(); // e.g. 3RA0018732.xlsx
$uploadedFileName = pathinfo($originalName, PATHINFO_FILENAME);
// $uploadedFileName = trim(str_replace('.xlsx', '', $originalName));
$folderPath = Configuration::where('c_name', 'GUARD_PATROL_ENTRY_FOLDER_PATH')->where('plant_id', $plantId)->value('c_value');
if(!$folderPath)
{
Notification::make()
->title('Upload Folder Path Not Found!')
->body('Please set the folder path in configuration for Guard Patrol Entry.')
->danger()
->send();
return;
}
$fullFolderPath = "uploads/$folderPath";
// Check if the folder exists, if not, create it
if (!Storage::disk('local')->exists($fullFolderPath))
{
Storage::disk('local')->makeDirectory($fullFolderPath);
}
$path = $uploadedFile->storeAs($fullFolderPath, $originalName, 'local');
$fullPath = Storage::disk('local')->path($path);
if ($fullPath && file_exists($fullPath))
{
$rows = Excel::toArray(null, $fullPath)[0];
if((count($rows) - 1) <= 0)
{
Notification::make()
->title('Invalid Guard Patrol Entry Found')
->body('Uploaded excel sheet is empty or<br>contains no valid data.')
->danger()
->send();
if ($disk->exists($path)) {
$disk->delete($path);
}
return;
}
$invalidRows=[];
$invalidGuardCheckPoints=[];
$unknownGuards=[];
$unknownCheckPoints=[];
$invalidPatrolTimes=[];
$validRowsFound = false;
foreach ($rows as $index => $row)
{
if ($index === 0) continue; // Skip header
$rowNumber = trim($row[0]);
$guardName = trim($row[1]);
$checkPointName = trim($row[2]);
$readerCode = trim($row[3]);
$patrolTime = trim($row[4]);
if (empty($rowNumber)) { continue; }
if (empty($guardName) || empty($checkPointName) || empty($readerCode) || empty($patrolTime)) {
$invalidRows[] = $rowNumber;
continue;
}
else
{
if(Str::length($guardName) < 3 || Str::length($checkPointName) < 3 || Str::length($readerCode) < 3 || Str::length($patrolTime) < 3)
{
$invalidGuardCheckPoints[] = $rowNumber;
continue;
}
else
{
$isValidRow = true;
$guardNames = GuardName::where('plant_id', $plantId)->where('name', $guardName)->first();
if (!$guardNames) {
$unknownGuards[] = $guardName;
$isValidRow = false;
}
$checkPointNames = CheckPointName::where('plant_id', $plantId)->where('name', $checkPointName)->first();
if (!$checkPointNames) {
$unknownCheckPoints[] = $checkPointName;
$isValidRow = false;
}
$formats = ['d-m-Y H:i:s', 'd-m-Y H:i']; //'07-05-2025 08:00' or '07-05-2025 08:00:00'
$patrolDateTime = null;
foreach ($formats as $format) {
try {
$patrolDateTime = Carbon::createFromFormat($format, $patrolTime);
break;
} catch (\Exception $e) {
$invalidPatrolTimes[] = $rowNumber;
$isValidRow = false;
}
}
if (!isset($patrolDateTime)) {
$invalidPatrolTimes[] = $rowNumber;
$isValidRow = false;
//$warnMsg[] = "Invalid 'Patrol DateTime' format. Expected DD-MM-YYYY HH:MM:SS";
}
if ($isValidRow && !$validRowsFound) {
$validRowsFound = true;
}
}
}
}
$uniqueInvalidRows = array_unique($invalidRows);
if (!empty($uniqueInvalidRows)) {
Notification::make()
->title('Invalid Guard Patrol Entry Found')
->body('The following rows contain empty values (Guard name or Check point name or Reader code or Patrol time):<br>' . implode(', ', $uniqueInvalidRows))
->danger()
->send();
if ($disk->exists($path)) {
$disk->delete($path);
}
return;
}
//should contain minimum 13 digit alpha numeric values
$uniqueInvalidGuardCheckPoints = array_unique($invalidGuardCheckPoints);
if (!empty($uniqueInvalidGuardCheckPoints)) {
Notification::make()
->title('Invalid Guard Patrol Entry Found')
->body('The following rows contain invalid values (Guard name or Check point name or Reader code or Patrol time):<br>' . implode(', ', $uniqueInvalidGuardCheckPoints))
->danger()
->send();
if ($disk->exists($path)) {
$disk->delete($path);
}
return;
}
$invalidDataFound = false;
$uniqueUnknownGuards = array_unique($unknownGuards);
if (!empty($uniqueUnknownGuards)) {
Notification::make()
->title('Unknown Guard Names Found')
->body("The following guard names aren't exist in master data:<br>" . implode(', ', $uniqueUnknownGuards))
->danger()
->send();
if ($disk->exists($path)) {
$disk->delete($path);
}
$invalidDataFound = true;
}
$uniqueUnknownCheckPoints = array_unique($unknownCheckPoints);
if (!empty($uniqueUnknownCheckPoints)) {
Notification::make()
->title('Unknown Check Point Names Found')
->body("The following check point names aren't exist in master data:<br>" . implode(', ', $uniqueUnknownCheckPoints))
->danger()
->send();
if ($disk->exists($path)) {
$disk->delete($path);
}
$invalidDataFound = true;
}
$uniqueInvalidPatrolTimes = array_unique($invalidPatrolTimes);
if (!empty($uniqueInvalidPatrolTimes)) {
Notification::make()
->title('Invalid Patrol Time Format Found')
->body("The following rows contains invalid patrol time format (Expected 'DD-MM-YYYY HH:MM:SS'):<br>" . implode(', ', $uniqueInvalidPatrolTimes))
->danger()
->send();
if ($disk->exists($path)) {
$disk->delete($path);
}
$invalidDataFound = true;
}
if ($invalidDataFound) {
return;
}
if (!$validRowsFound) {
Notification::make()
->title('Invalid Guard Patrol Entry Found')
->body('Uploaded excel sheet is empty or<br>contains no valid data.')
->danger()
->send();
if ($disk->exists($path)) {
$disk->delete($path);
}
return;
}
$validCnt = 0;
$dupCnt = 0;
$validRowsFound = false;
foreach ($rows as $index => $row)
{
if ($index === 0) continue; // Skip header
$rowNumber = trim($row[0]);
$guardName = trim($row[1]);
$checkPointName = trim($row[2]);
$readerCode = trim($row[3]);
$patrolTime = trim($row[4]);
if (empty($rowNumber)) { continue; }
if (empty($guardName) || empty($checkPointName) || empty($readerCode) || empty($patrolTime)) {
continue;
}
$isValidRow = true;
$formats = ['d-m-Y H:i:s', 'd-m-Y H:i']; //'07-05-2025 08:00' or '07-05-2025 08:00:00'
$patrolDateTime = null;
foreach ($formats as $format) {
try {
$patrolDateTime = Carbon::createFromFormat($format, $patrolTime);
break;
} catch (\Exception $e) {
$isValidRow = false;
}
}
if (!isset($patrolDateTime)) {
$isValidRow = false;
}
if ($isValidRow) {
$guardNames = GuardName::where('plant_id', $plantId)->where('name', $guardName)->first();
$checkPointNames = CheckPointName::where('plant_id', $plantId)->where('name', $checkPointName)->first();
$guardEntryFound = GuardPatrolEntry::where('plant_id', $plantId)->where('guard_name_id', $guardNames->id)->where('check_point_name_id', $checkPointNames->id)->where('patrol_time', $patrolDateTime->format('Y-m-d H:i:s'))->first();
if ($guardEntryFound) {
//$warnMsg[] = "Duplicate guard patrol entry found";
$dupCnt++;
continue;
}
else
{
$validCnt++;
GuardPatrolEntry::updateOrCreate([
'plant_id' => $plantId,
'guard_name_id' => $guardNames->id,
'check_point_name_id' => $checkPointNames->id,
'patrol_time' => $patrolDateTime->format('Y-m-d H:i:s')
],
[
'reader_code' => $readerCode,
'created_by' => $user,
'updated_by' => $user
]
);
$validRowsFound = true;
}
}
}
if (!$validRowsFound && $dupCnt > 0) {
Notification::make()
->title('Duplicate Guard Patrol Entry Found')
->body("Uploaded excel sheet contains '{$dupCnt}' duplicate entries!<br>Please check the uploaded file and try again.")
->danger()
->send();
if ($disk->exists($path))
{
$disk->delete($path);
}
}
else if ($validRowsFound && $validCnt > 0)
{
//session(['guard_patrol_entry_path' => $fullPath]);
Notification::make()
->title("Success: '{$validCnt}' guard patrol entries imported successfully.")
->success()
->send();
if ($disk->exists($path))
{
$disk->delete($path);
}
}
else
{
Notification::make()
->title('Failed: Something went wrong while uploading guard patrol entries!')
->danger()
->send();
if ($disk->exists($path)) {
$disk->delete($path);
}
}
}
})
->visible(function() {
return Filament::auth()->user()->can('view import guard patrol entries');
}),
ImportAction::make()
->label('Import Guard Patrol Entry')
// ->hidden()
->color('warning')
->importer(GuardPatrolEntryImporter::class)
->visible(function() {
return Filament::auth()->user()->can('view import guard patrol entry');
}),
ExportAction::make()
->label('Export Guard Patrol Entry')
->color('warning')
->exporter(GuardPatrolEntryExporter::class)
->visible(function() {
return Filament::auth()->user()->can('view export guard patrol entry');
}),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListGuardPatrolEntries::route('/'),
'create' => Pages\CreateGuardPatrolEntry::route('/create'),
'view' => Pages\ViewGuardPatrolEntry::route('/{record}'),
'edit' => Pages\EditGuardPatrolEntry::route('/{record}/edit'),
];
}
public static function getEloquentQuery(): Builder
{
return parent::getEloquentQuery()
->withoutGlobalScopes([
SoftDeletingScope::class,
]);
}
}

View File

@@ -0,0 +1,293 @@
<?php
namespace App\Filament\Resources\GuardPatrolEntryResource\Pages;
use App\Filament\Resources\GuardPatrolEntryResource;
use Filament\Actions;
use Filament\Facades\Filament;
use Filament\Notifications\Notification;
use Filament\Resources\Pages\CreateRecord;
class CreateGuardPatrolEntry extends CreateRecord
{
protected static string $resource = GuardPatrolEntryResource::class;
public $plantId;
public $pallet_number;
public $palletNo;
public $pendingPallet;
public $snoCount = 0;
public $pallet_number_locked = false;
public $serial_number;
//protected static string $view = 'filament.resources.pallet-validation-resource.pages.create-pallet-validation';
// protected $listeners = [
// 'updateSnoQuantity' => 'handleUpdateSnoQuantity',
// ];
// public ?array $data = null;
public function processCheckPointName()
{
// $plantId = $this->form->getState()['plant_id'];
// $plantId = trim($plantId) ?? null;
// $pendingPallet = $this->form->getState()['pending_pallet_list'];
// $palletNumber = trim($this->form->getState()['pallet_number'])?? null;
// $palletNumber = trim($palletNumber) ?? null;
// $serialNumber = trim($this->form->getState()['serial_number'])?? null;
// $serialNumber = trim($serialNumber) ?? null;
// $operatorName = Filament::auth()->user()?->name;
// $clickedAt = session('pallet_clicked_time');
// $clickedBy = session('pallet_created_by');
// if(!$palletNumber)
// {
// Notification::make()
// ->title('Pallet number cannot be empty')
// ->danger()
// ->send();
// $this->form->fill([
// 'serial_number' => null,
// 'plant_id' => $plantId,
// 'pallet_number' => $palletNumber,
// 'pending_pallet_list' => $pendingPallet,
// 'Sno_quantity' => 0,
// 'created_by' => $operatorName,
// 'scanned_by' => $operatorName,
// ]);
// return;
// }
// $count = PalletValidation::where('plant_id', $plantId)
// ->where('pallet_number', $palletNumber)
// ->count('pallet_number');
// if(!$serialNumber)
// {
// Notification::make()
// ->title('Serial number cannot be empty')
// ->danger()
// ->send();
// $this->dispatch('loadData', $palletNumber, $plantId);
// $this->form->fill([
// 'serial_number' => null,
// 'plant_id' => $plantId,
// 'pallet_number' => $palletNumber,
// 'pending_pallet_list' => $pendingPallet,
// 'Sno_quantity' => $count,
// 'created_by' => $operatorName,
// 'scanned_by' => $operatorName,
// ]);
// return;
// }
// if(strlen($serialNumber) < 13)
// {
// Notification::make()
// ->title('Serial number should contain minimum 13 digits.')
// ->danger()
// ->send();
// $this->dispatch('loadData', $palletNumber, $plantId);
// $this->form->fill([
// 'serial_number' => null,
// 'plant_id' => $plantId,
// 'pallet_number' => $palletNumber,
// 'pending_pallet_list' => $pendingPallet,
// 'Sno_quantity' => $count,
// 'created_by' => $operatorName,
// 'scanned_by' => $operatorName,
// ]);
// return;
// }
// if (!ctype_alnum($serialNumber))
// {
// Notification::make()
// ->title('Serial number must contain alpha-numeric values only.')
// ->danger()
// ->send();
// $this->dispatch('loadData', $palletNumber, $plantId);
// $this->form->fill([
// 'serial_number' => null,
// 'plant_id' => $plantId,
// 'pallet_number' => $palletNumber,
// 'pending_pallet_list' => $pendingPallet,
// 'Sno_quantity' => $count,
// 'created_by' => $operatorName,
// 'scanned_by' => $operatorName,
// ]);
// return;
// }
// $existInvoiceSno = LocatorInvoiceValidation::where('serial_number', $serialNumber)
// ->where('plant_id', $plantId)
// ->where('scanned_status', '=', 'Scanned')
// ->first();
// $invoiceNumber = $existInvoiceSno?->invoice_number;
// if($existInvoiceSno)
// {
// Notification::make()
// ->title("Scanned serial number '{$serialNumber}' already completed the scanning process and exist in invoice number : {$invoiceNumber}.<br>Scan the new serial number to add!")
// ->danger()
// ->send();
// $this->dispatch('loadData', $palletNumber, $plantId);
// $this->form->fill([
// 'serial_number' => null,
// 'plant_id' => $plantId,
// 'pallet_number' => $palletNumber,
// 'pending_pallet_list' => $pendingPallet,
// 'Sno_quantity' => $count,
// 'created_by' => $operatorName,
// 'scanned_by' => $operatorName,
// ]);
// return;
// }
// $existingRecord = PalletValidation::where('serial_number', $serialNumber)
// ->where('plant_id', $plantId)
// ->first();
// if ($existingRecord)
// {
// if ($existingRecord && $existingRecord->pallet_number == $palletNumber)
// {
// Notification::make()
// ->title("Scanned serial number '{$serialNumber}' is already exists in pallet number '{$palletNumber}'.<br>Scan the new serial number to proceed.")
// ->danger()
// ->send();
// }
// else if ($existingRecord && $existingRecord->pallet_number && $existingRecord->pallet_number != $palletNumber)
// {
// Notification::make()
// ->title("Scanned serial number '{$serialNumber}' already exists in pallet number '{$existingRecord->pallet_number}'.<br>Scan the new serial number to proceed.")
// ->danger()
// ->send();
// }
// else if ($existingRecord && $existingRecord->locator_number)
// {
// Notification::make()
// ->title("Scanned serial number '{$serialNumber}' is already exists in locator number '{$existingRecord->locator_number}'.<br>Scan the new serial number to proceed.")
// ->danger()
// ->send();
// }
// $this->dispatch('loadData', $palletNumber, $plantId);
// $this->form->fill([
// 'serial_number' => null,
// 'plant_id' => $plantId,
// 'pallet_number' => $palletNumber,
// 'pending_pallet_list' => $pendingPallet,
// 'Sno_quantity' => $count,
// 'created_by' => $operatorName,
// 'scanned_by' => $operatorName,
// ]);
// return;
// }
// try
// {
// $existingPallet = PalletValidation::where('plant_id', $plantId)
// ->where('pallet_number', $palletNumber)
// ->first();
// $createdAt = $existingPallet ? $existingPallet->created_at : $clickedAt ?? now();
// $createdBy = $existingPallet ? $existingPallet->created_by : $clickedBy ?? $operatorName;
// $record = PalletValidation::create([
// 'plant_id' => $plantId,
// 'pallet_number' => $palletNumber,
// 'serial_number' => $serialNumber,
// 'created_by' => $createdBy,
// 'scanned_by' => $operatorName,
// 'created_at' => $createdAt,
// 'scanned_at' => now(),
// 'updated_by' => $operatorName,
// ]);
// $count = PalletValidation::where('plant_id', $plantId)
// ->where('pallet_number', $palletNumber)
// ->count('pallet_number');
// if ($record)
// {
// Notification::make()
// ->title("Scanned serial number : '{$serialNumber}' successfully inserted into pallet table!<br>Scan the next new serial number to proceed...")
// ->success()
// ->send();
// $this->snoCount = PalletValidation::where('plant_id', $plantId)
// ->where('pallet_number', $palletNumber)
// ->count();
// $this->form->fill([
// 'plant_id' => $plantId,
// 'pallet_number' => $palletNumber,
// 'serial_number' => null,
// 'pending_pallet_list' => $pendingPallet,
// 'Sno_quantity' => $count,
// 'created_by' => $operatorName,
// 'scanned_by' => $operatorName,
// ]);
// $this->dispatch('loadData', $palletNumber, $plantId);
// }
// else
// {
// Notification::make()
// ->title('Pallet validation not inserted.')
// ->danger()
// ->send();
// $this->dispatch('loadData', $palletNumber, $plantId);
// $this->form->fill([
// 'plant_id' => $plantId,
// 'pallet_number' => $palletNumber,
// 'serial_number' => null,
// 'pending_pallet_list' => $pendingPallet,
// 'Sno_quantity' => $count,
// 'scanned_by' => $operatorName,
// ]);
// return;
// }
// }
// catch (\Exception $e)
// {
// Notification::make()
// ->title('Error: Pallet validation not inserted.')
// ->body("Something went wrong while inserting serial number : '{$serialNumber}' into pallet table!\nScan the new serial number to proceed...")
// ->danger()
// ->send();
// $this->dispatch('loadData', $palletNumber, $plantId);
// $this->form->fill([
// 'plant_id' => $plantId,
// 'pallet_number' => $palletNumber,
// 'serial_number' => null,
// 'pending_pallet_list' => $pendingPallet,
// 'Sno_quantity' => $count,
// 'created_by' => $operatorName,
// 'scanned_by' => $operatorName,
// ]);
// return;
// }
}
protected function getRedirectUrl(): string
{
return $this->getResource()::getUrl('create'); // Stay on Create Page after saving
}
}

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