59 Commits

Author SHA1 Message Date
07dc9f6335 Merge pull request 'ranjith-dev' (#972) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 17s
Reviewed-on: #972
2026-09-01 07:15:18 +00:00
dhanabalan
778d2ef383 Added is completed and save pallet button in spare packing page
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 14s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 19s
Laravel Pint / pint (pull_request) Successful in 11m19s
Laravel Larastan / larastan (pull_request) Failing after 13m1s
2026-09-01 12:44:58 +05:30
dhanabalan
f228cb44a2 Added create spare packing blade file
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 15s
2026-09-01 12:43:57 +05:30
dhanabalan
f9b95a136a Added spare pack data livewire pages
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 20s
2026-09-01 12:43:03 +05:30
dhanabalan
fd5a67899e Added spare packing importer and exporter
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
2026-09-01 12:42:07 +05:30
dhanabalan
eb25216153 Added spare packing resource pages
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
2026-09-01 12:41:26 +05:30
dhanabalan
0d8db9d336 Added spare packing model file
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 26s
2026-09-01 12:40:27 +05:30
dhanabalan
3082903de5 Added spare packing migration file
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 22s
2026-09-01 12:39:51 +05:30
73ea3ace06 Merge pull request 'ranjith-dev' (#971) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
Reviewed-on: #971
2026-09-01 06:57:06 +00:00
dhanabalan
56d61e54db Added sale order master policy file
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 2m6s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 2m19s
Laravel Pint / pint (pull_request) Successful in 10m21s
Laravel Larastan / larastan (pull_request) Failing after 12m27s
2026-09-01 12:26:35 +05:30
dhanabalan
a4dcbcd771 Added sale order master importer and exporter
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
2026-09-01 12:26:02 +05:30
dhanabalan
369fbb5245 Added sale order master resource pages
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 43s
2026-09-01 12:25:09 +05:30
dhanabalan
e9c23d0ca6 Added sale order master model file
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
2026-09-01 12:23:54 +05:30
dhanabalan
41413c3c2f Added sale order master migration file
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
2026-09-01 12:23:20 +05:30
fb03427267 Merge pull request 'Added scanned quantity column in panel gr master exporter' (#970) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 16s
Reviewed-on: #970
2026-08-29 10:37:39 +00:00
dhanabalan
d3aa93ecad Added scanned quantity column in panel gr master exporter
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 23s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 38s
Laravel Pint / pint (pull_request) Successful in 10m41s
Laravel Larastan / larastan (pull_request) Failing after 14m20s
2026-08-29 16:07:17 +05:30
72a20533ee Merge pull request 'ranjith-dev' (#969) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #969
2026-08-29 10:30:02 +00:00
dhanabalan
5fb025ecd9 Added sticker master relation in panel gr master model file
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 13s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 20s
Laravel Pint / pint (pull_request) Successful in 7m42s
Laravel Larastan / larastan (pull_request) Failing after 10m21s
2026-08-29 15:59:36 +05:30
dhanabalan
707a3b949c changed logic for showing scanned quantity in panel gr master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
2026-08-29 15:58:58 +05:30
de41d5ca00 Merge pull request 'Added logic for invalid quantity updation in panel gr master' (#968) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
Reviewed-on: #968
2026-08-29 10:10:09 +00:00
dhanabalan
0219554eb7 Added logic for invalid quantity updation in panel gr master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 13s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 20s
Laravel Pint / pint (pull_request) Successful in 12m12s
Laravel Larastan / larastan (pull_request) Failing after 15m27s
2026-08-29 15:39:51 +05:30
2d5d977760 Merge pull request 'Updated getPumpResult response parameter discharge from flow_reading and default value as '1' to delete rows count and modified admin user names' (#967) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
Reviewed-on: #967
2026-08-29 07:10:46 +00:00
dhanabalan
fa8d5690db Updated getPumpResult response parameter discharge from flow_reading and default value as '1' to delete rows count and modified admin user names
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 29s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 33s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 13s
Laravel Larastan / larastan (pull_request) Failing after 8m21s
Laravel Pint / pint (pull_request) Successful in 8m14s
2026-08-29 12:37:51 +05:30
66fe79c582 Merge pull request 'ranjith-dev' (#966) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 28s
Reviewed-on: #966
2026-08-29 07:00:07 +00:00
dhanabalan
9dcec45920 Added scanned quantity in filament table of panel gr master page
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 12s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 19s
Laravel Pint / pint (pull_request) Successful in 9m49s
Laravel Larastan / larastan (pull_request) Failing after 11m24s
2026-08-29 12:29:53 +05:30
dhanabalan
fe05be6538 Added panel box validations method in panel gr master model file
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
2026-08-29 12:29:13 +05:30
034bbe3707 Merge pull request 'added notification for characteritics not found in panel box validation' (#965) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 21s
Reviewed-on: #965
2026-08-29 05:56:43 +00:00
dhanabalan
b30c19eda0 added notification for characteritics not found in panel box validation
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 13s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 19s
Laravel Pint / pint (pull_request) Successful in 9m27s
Laravel Larastan / larastan (pull_request) Failing after 10m55s
2026-08-29 11:26:27 +05:30
3d68bbdad7 Merge pull request 'Added catch for rework scenario in panel box validation' (#964) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Reviewed-on: #964
2026-08-29 05:45:06 +00:00
dhanabalan
541793613c Added catch for rework scenario in panel box validation
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 14s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 20s
Laravel Pint / pint (pull_request) Successful in 8m3s
Laravel Larastan / larastan (pull_request) Failing after 10m1s
2026-08-29 11:13:34 +05:30
9e07231ba4 Merge pull request 'ranjith-dev' (#963) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
Reviewed-on: #963
2026-08-29 04:45:05 +00:00
dhanabalan
d2b104eaf3 Added rework logic in panel check list
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 12s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 20s
Laravel Pint / pint (pull_request) Successful in 7m35s
Laravel Larastan / larastan (pull_request) Failing after 11m25s
2026-08-29 10:14:52 +05:30
dhanabalan
6905981e55 Added halt logic in create panel box validation
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
2026-08-29 10:13:52 +05:30
dhanabalan
b933849854 Added rework logic in panel box validation page
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
2026-08-29 10:12:02 +05:30
549142c27b Merge pull request 'added code and plant in production order' (#962) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #962
2026-08-28 10:38:42 +00:00
dhanabalan
cb8740d048 added code and plant in production order
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 19s
Laravel Larastan / larastan (pull_request) Failing after 7m20s
Laravel Pint / pint (pull_request) Successful in 7m54s
2026-08-28 16:08:28 +05:30
de2e7a76e6 Merge pull request 'Updated discharge label on PumpTestingResultExporter' (#961) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
Reviewed-on: #961
2026-08-28 09:01:19 +00:00
dhanabalan
5c826e8c3d Updated discharge label on PumpTestingResultExporter
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 12s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 17s
Laravel Larastan / larastan (pull_request) Failing after 7m13s
Laravel Pint / pint (pull_request) Successful in 8m21s
2026-08-28 14:30:50 +05:30
fa10a64188 Merge pull request 'ranjith-dev' (#960) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Reviewed-on: #960
2026-08-28 08:49:39 +00:00
dhanabalan
02a435e93d Updated pump testing result post api function success and failure response description
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 13s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 21s
Laravel Pint / pint (pull_request) Successful in 5m36s
Laravel Larastan / larastan (pull_request) Failing after 9m10s
2026-08-28 14:18:54 +05:30
dhanabalan
ce0bfa72ca Updated unique query table name and exportAction label
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
2026-08-28 14:15:07 +05:30
dhanabalan
bc60690872 Added pump testing entry / result post api function with validations and Updated pump testing master / entry / result get api function validations,
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
2026-08-28 13:01:24 +05:30
dhanabalan
f4d416bea2 Added pump testing result resource and exporter files and Updated pump testing entry report filter functionality
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
2026-08-28 12:54:53 +05:30
dhanabalan
5279b016d1 Added pump testing result model files for hasMany relations
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
2026-08-28 12:48:51 +05:30
dhanabalan
2fb143c1f2 Added pump testing result policies and model file
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
2026-08-28 12:42:59 +05:30
dhanabalan
eac712aaac Added pump testing result migration file
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
2026-08-28 12:39:19 +05:30
8689893088 Merge pull request 'Added remove stopped related fields on get api getClassChar function for manual laser' (#959) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Reviewed-on: #959
2026-08-28 05:48:03 +00:00
dhanabalan
44b2a19270 Added remove stopped related fields on get api getClassChar function for manual laser
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 13s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 18s
Laravel Pint / pint (pull_request) Successful in 5m49s
Laravel Larastan / larastan (pull_request) Failing after 9m1s
2026-08-28 11:17:17 +05:30
4ea2cafb40 Merge pull request 'ranjith-dev' (#958) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 21s
Reviewed-on: #958
2026-08-28 05:09:31 +00:00
dhanabalan
bb5e088b02 removed panel box checklst rework logic
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 13s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 21s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 12s
Laravel Pint / pint (pull_request) Successful in 7m40s
Laravel Larastan / larastan (pull_request) Failing after 9m39s
2026-08-28 10:39:19 +05:30
dhanabalan
393ea6a4bd removed rework logic in panel box
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
2026-08-28 10:38:33 +05:30
5da6cb5132 Merge pull request 'ranjith-dev' (#957) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #957
2026-08-28 05:03:57 +00:00
dhanabalan
0c189f695c Added rework logic in panel box check list
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 12s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 13s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 20s
Laravel Larastan / larastan (pull_request) Failing after 8m50s
Laravel Pint / pint (pull_request) Successful in 9m19s
2026-08-28 10:33:40 +05:30
dhanabalan
95d70fbdca Added rework logic in panel box validation
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 14s
2026-08-28 10:32:49 +05:30
2efe50f422 Merge pull request 'ranjith-dev' (#956) from ranjith-dev into master
All checks were successful
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 32s
Reviewed-on: #956
2026-08-27 11:04:37 +00:00
dhanabalan
88e6b83487 removed rework logic in panel check list
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 10s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 20s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Laravel Larastan / larastan (pull_request) Failing after 9m22s
Laravel Pint / pint (pull_request) Successful in 9m32s
2026-08-27 16:34:09 +05:30
dhanabalan
8061953062 removed rework logic in panel box validation
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
2026-08-27 16:33:39 +05:30
94b5bd8904 Merge pull request 'Removed unwanted warning message on material invoice number scanning' (#955) from ranjith-dev into master
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Has been cancelled
Reviewed-on: #955
2026-08-27 10:50:43 +00:00
dhanabalan
3270a744e9 Removed unwanted warning message on material invoice number scanning
Some checks failed
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (push) Successful in 11s
Gemini PR Review / Gemini PR Review (pull_request) Failing after 17s
Scan for leaked secrets using Kingfisher / kingfisher-secrets-scan (pull_request) Successful in 11s
Laravel Larastan / larastan (pull_request) Failing after 8m3s
Laravel Pint / pint (pull_request) Successful in 8m2s
2026-08-27 16:20:17 +05:30
47 changed files with 4581 additions and 261 deletions

View File

@@ -2,6 +2,7 @@
namespace App\Filament\Exports;
use App\Models\PanelBoxValidation;
use App\Models\PanelGrMaster;
use Filament\Actions\Exports\ExportColumn;
use Filament\Actions\Exports\Exporter;
@@ -35,6 +36,17 @@ class PanelGrMasterExporter extends Exporter
->label('INSPECTION LOT NUMBER'),
ExportColumn::make('quantity')
->label('QUANTITY'),
ExportColumn::make('scanned_quantity')
->label('SCANNED QUANTITY')
->getStateUsing(function ($record) {
return PanelBoxValidation::where('plant_id', $record->plant_id)
->where('production_order', $record->document_number)
->where('inspection_lot_number', $record->inspection_lot_number)
->whereHas('stickerMaster', function ($query) use ($record) {
$query->where('item_id', $record->item_id);
})
->count();
}),
ExportColumn::make('created_at')
->label('CREATED AT'),
ExportColumn::make('updated_at')

View File

@@ -22,9 +22,9 @@ class ProductionOrderExporter extends Exporter
// Increment and return the row number
return ++$rowNumber;
}),
ExportColumn::make('plant_id')
ExportColumn::make('plant.code')
->label('PLANT CODE'),
ExportColumn::make('item_id')
ExportColumn::make('item.code')
->label('ITEM CODE'),
ExportColumn::make('quantity')
->label('QUANTITY'),

View File

@@ -0,0 +1,93 @@
<?php
namespace App\Filament\Exports;
use App\Models\PumpTestingResult;
use Filament\Actions\Exports\ExportColumn;
use Filament\Actions\Exports\Exporter;
use Filament\Actions\Exports\Models\Export;
class PumpTestingResultExporter extends Exporter
{
protected static ?string $model = PumpTestingResult::class;
public static function getColumns(): array
{
static $rowNumber = 0;
return [
ExportColumn::make('no')
->label('NO')
->state(function ($record) use (&$rowNumber) {
// Increment and return the row number
return ++$rowNumber;
}),
ExportColumn::make('plant.code')
->label('PLANT CODE'),
ExportColumn::make('tested_date')
->label('TESTED DATE'),
ExportColumn::make('tested_type')
->label('TESTED TYPE'),
ExportColumn::make('pumpTestingMaster.item.code')
->label('PUMP CODE'),
ExportColumn::make('pumpTestingMaster.item.category')
->label('PUMP CATEGORY')
->enabledByDefault(false),
ExportColumn::make('pumpTestingMaster.item.description')
->label('PUMP TYPE'),
ExportColumn::make('pumpTestingMaster.item.uom')
->label('UNIT OF MEASURE')
->enabledByDefault(false),
ExportColumn::make('pump_serial_number')
->label('PUMP SERIAL NUMBER'),
ExportColumn::make('correction_head')
->label('CORRECTION HEAD'),
ExportColumn::make('sl_no')
->label('SL. NO.'),
ExportColumn::make('voltage')
->label('VOLTAGE'),
ExportColumn::make('current')
->label('CURRENT'),
ExportColumn::make('watt')
->label('WATT'),
ExportColumn::make('frequency')
->label('FREQUENCY'),
ExportColumn::make('speed')
->label('SPEED'),
ExportColumn::make('discharge')
->label('DISCHARGE'),
ExportColumn::make('head')
->label('HEAD'),
ExportColumn::make('pump_output')
->label('PUMP OUTPUT'),
ExportColumn::make('power_p2')
->label('PUMP P2'),
ExportColumn::make('overall_efficiency')
->label('OVERALL EFFICIENCY'),
ExportColumn::make('pump_efficiency')
->label('PUMP EFFICIENCY'),
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 pump testing result 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,58 @@
<?php
namespace App\Filament\Exports;
use App\Models\SaleOrderMaster;
use Filament\Actions\Exports\ExportColumn;
use Filament\Actions\Exports\Exporter;
use Filament\Actions\Exports\Models\Export;
class SaleOrderMasterExporter extends Exporter
{
protected static ?string $model = SaleOrderMaster::class;
public static function getColumns(): array
{
static $rowNumber = 0;
return [
ExportColumn::make('no')
->label('NO')
->state(function ($record) use (&$rowNumber) {
// Increment and return the row number
return ++$rowNumber;
}),
ExportColumn::make('plant.code')
->label('PLANT CODE'),
ExportColumn::make('item.code')
->label('ITEM CODE'),
ExportColumn::make('sale_order_number')
->label('SALE ORDER NUMBER'),
ExportColumn::make('supplier_name')
->label('SUPPLIER NAME'),
ExportColumn::make('quantity')
->label('QUANTITY'),
ExportColumn::make('created_at')
->label('CREATED AT'),
ExportColumn::make('updated_at')
->label('UPDATED AT'),
ExportColumn::make('created_by')
->label('CREATED BY'),
ExportColumn::make('updated_by')
->label('UPDATED BY'),
ExportColumn::make('deleted_at')
->label('DELETED AT')
->enabledByDefault(false),
];
}
public static function getCompletedNotificationBody(Export $export): string
{
$body = 'Your sale order 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,68 @@
<?php
namespace App\Filament\Exports;
use App\Models\SparePacking;
use Filament\Actions\Exports\ExportColumn;
use Filament\Actions\Exports\Exporter;
use Filament\Actions\Exports\Models\Export;
class SparePackingExporter extends Exporter
{
protected static ?string $model = SparePacking::class;
public static function getColumns(): array
{
static $rowNumber = 0;
return [
ExportColumn::make('no')
->label('NO')
->state(function ($record) use (&$rowNumber) {
// Increment and return the row number
return ++$rowNumber;
}),
ExportColumn::make('plant.code')
->label('PLANT CODE'),
ExportColumn::make('item.code')
->label('ITEM CODE'),
ExportColumn::make('saleOrder.sale_order_number')
->label('SALE ORDER NUMBER'),
ExportColumn::make('saleOrder.supplier_name')
->label('SUPPLIER NAME'),
ExportColumn::make('spare_packing_number')
->label('SPARE PACKING NUMBER'),
ExportColumn::make('document_number')
->label('DOCUMENT NUMBER'),
ExportColumn::make('quantity')
->label('QUANTITY'),
ExportColumn::make('spare_packing_status')
->label('SPARE PACKING STATUS'),
ExportColumn::make('created_at')
->label('CREATED AT'),
ExportColumn::make('updated_at')
->label('UPDATED AT'),
ExportColumn::make('scanned_at')
->label('SCANNED AT'),
ExportColumn::make('created_by')
->label('CREATED BY'),
ExportColumn::make('updated_by')
->label('UPDATED BY'),
ExportColumn::make('scanned_by')
->label('SCANNED BY'),
ExportColumn::make('deleted_at')
->label('DELETED AT')
->enabledByDefault(false),
];
}
public static function getCompletedNotificationBody(Export $export): string
{
$body = 'Your spare packing 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,153 @@
<?php
namespace App\Filament\Imports;
use App\Models\Item;
use App\Models\Plant;
use App\Models\SaleOrderMaster;
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 SaleOrderMasterImporter extends Importer
{
protected static ?string $model = SaleOrderMaster::class;
protected array $importedSaleOrders = [];
public static function getColumns(): array
{
return [
ImportColumn::make('plant')
->requiredMapping()
->exampleHeader('Plant Code')
->example('1000')
->label('Plant Code')
->relationship(resolveUsing: 'code')
->rules(['required']),
ImportColumn::make('item')
->requiredMapping()
->exampleHeader('Item Code')
->example('630214')
->label('Item Code')
->relationship(resolveUsing: 'code')
->rules(['required']),
ImportColumn::make('sale_order_number')
->requiredMapping()
->exampleHeader('Sale Order Number')
->example('1JA0029512')
->label('Sale Order Number')
->rules(['required']),
ImportColumn::make('supplier_name')
->exampleHeader('Supplier Name')
->example('ABC Supplier')
->label('Supplier Name'),
ImportColumn::make('quantity')
->exampleHeader('Quantity')
->example('100')
->label('Quantity'),
];
}
public function resolveRecord(): ?SaleOrderMaster
{
$warnMsg = [];
$plantCod = $this->data['plant'];
$plant = null;
$item = null;
$saleOrder = trim($this->data['sale_order_number']);
$supplierName = trim($this->data['supplier_name']);
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 {
$item = Item::where('code', $this->data['item'])->where('plant_id', $plant->id)->first();
}
if (! $item) {
$warnMsg[] = 'Item not found';
}
}
if (Str::length($this->data['sale_order_number']) < 9) {
$warnMsg[] = 'Invalid Sale Order number found';
}
if (empty($this->data['sale_order_number'])) {
$warnMsg[] = 'Sale Order Number cannot be empty.';
}
if (empty($this->data['supplier_name'])) {
$warnMsg[] = 'Supplier Name cannot be empty.';
}
if (empty($this->data['quantity'])) {
$warnMsg[] = 'Quantity cannot be empty.';
}
if (! is_numeric($this->data['quantity'])) {
$warnMsg[] = 'Quantity must be a number.';
}
if (isset($this->importedSaleOrders[$saleOrder])) {
if (strtolower(trim($this->importedSaleOrders[$saleOrder])) != strtolower($supplierName)){
$warnMsg[] = "Sale Order '{$saleOrder}' has multiple supplier names in the import file.";
}
}
else {
$this->importedSaleOrders[$saleOrder] = $supplierName;
}
$existingPo = SaleOrderMaster::where('plant_id', $plant->id)->where('sale_order_number', $this->data['sale_order_number'])->first();
if ($existingPo && trim(strtolower($existingPo->supplier_name)) != trim(strtolower($this->data['supplier_name'])))
{
$warnMsg[] = "Sale Order '{$this->data['sale_order_number']}' is already mapped to supplier '{$existingPo->supplier_name}'.";
}
$existingPoItem = SaleOrderMaster::where('plant_id', $plant->id)->where('item_id', $item->id)->where('sale_order_number', $this->data['sale_order_number'])->where('supplier_name', $this->data['supplier_name'])->first();
if ($existingPoItem)
{
$warnMsg[] = "Sale Order '{$this->data['sale_order_number']}' is already exist with item code '{$this->data['item']}' and supplier name '{$this->data['supplier_name']}'.";
}
$user = Filament::auth()->user();
$operatorName = $user->name;
if (! empty($warnMsg)) {
throw new RowImportFailedException(implode(', ', $warnMsg));
}
SaleOrderMaster::updateOrCreate([
'plant_id' => $plant->id,
'item_id' => $item->id,
'sale_order_number' => $this->data['sale_order_number'],
'supplier_name' => $this->data['supplier_name'],
'quantity' => $this->data['quantity'] ?? null,
'created_by' => $operatorName,
'updated_by' => $operatorName,
]);
return null;
}
public static function getCompletedNotificationBody(Import $import): string
{
$body = 'Your sale order 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,63 @@
<?php
namespace App\Filament\Imports;
use App\Models\SparePacking;
use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import;
class SparePackingImporter extends Importer
{
protected static ?string $model = SparePacking::class;
public static function getColumns(): array
{
return [
ImportColumn::make('plant')
->requiredMapping()
->relationship()
->rules(['required']),
ImportColumn::make('item')
->requiredMapping()
->relationship()
->rules(['required']),
ImportColumn::make('sale_order_master_id')
->requiredMapping()
->numeric()
->rules(['required', 'integer']),
ImportColumn::make('spare_packing_number'),
ImportColumn::make('document_number'),
ImportColumn::make('batch_number'),
ImportColumn::make('quantity'),
ImportColumn::make('spare_packing_status'),
ImportColumn::make('scanned_at')
->requiredMapping()
->rules(['required', 'datetime']),
ImportColumn::make('created_by'),
ImportColumn::make('updated_by'),
ImportColumn::make('scanned_by'),
];
}
public function resolveRecord(): ?SparePacking
{
// return SparePacking::firstOrNew([
// // Update existing records, matching them by `$this->data['column_name']`
// 'email' => $this->data['email'],
// ]);
return new SparePacking();
}
public static function getCompletedNotificationBody(Import $import): string
{
$body = 'Your spare packing 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

@@ -218,11 +218,6 @@ class CreateInvoiceValidation extends CreateRecord
if ($totMQuan > 0) {
$checkMat = InvoiceValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->latest('updated_at')->first(); // ->where('quantity', '!=', '')
if (($checkMat?->stickerMaster->material_type ?? 0) == 3) {
Notification::make()
->title("Material Type : {$checkMat?->stickerMaster->material_type}")
->info()
->seconds(1)
->send();
$totMatQuan = InvoiceValidation::where('invoice_number', $invoiceNumber)->whereNull('serial_number')->where('plant_id', $plantId)->latest('updated_at')->first()?->invoice_quantity ?? 0;
$scanMatQuan = number_format($totMatQuan - (InvoiceValidation::where('invoice_number', $invoiceNumber)->whereNull('serial_number')->where('plant_id', $plantId)->latest('updated_at')->first()?->quantity ?? 0), 3, '.', ''); // ('updated_at', 'desc')
} else {
@@ -847,11 +842,6 @@ class CreateInvoiceValidation extends CreateRecord
$checkMat = InvoiceValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->latest('updated_at')->first(); // ->where('quantity', '!=', '')
if (($checkMat?->stickerMaster->material_type ?? 0) == 3) {
Notification::make()
->title("Material Type : {$checkMat?->stickerMaster->material_type}")
->info()
->seconds(1)
->send();
$totMatQuan = InvoiceValidation::where('invoice_number', $invoiceNumber)->whereNull('serial_number')->where('plant_id', $plantId)->latest('updated_at')->first()?->invoice_quantity ?? 0;
$scanMatQuan = number_format($totMatQuan - (InvoiceValidation::where('invoice_number', $invoiceNumber)->whereNull('serial_number')->where('plant_id', $plantId)->latest('updated_at')->first()?->quantity ?? 0), 3, '.', ''); // ('updated_at', 'desc')
} else {
@@ -894,11 +884,6 @@ class CreateInvoiceValidation extends CreateRecord
$checkMat = InvoiceValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->latest('updated_at')->first(); // ->where('quantity', '!=', '')
if (($checkMat?->stickerMaster->material_type ?? 0) == 3) {
Notification::make()
->title("Material Type : {$checkMat?->stickerMaster->material_type}")
->info()
->seconds(1)
->send();
$totMatQuan = InvoiceValidation::where('invoice_number', $invoiceNumber)->whereNull('serial_number')->where('plant_id', $plantId)->latest('updated_at')->first()?->invoice_quantity ?? 0;
$scanMatQuan = number_format($totMatQuan - (InvoiceValidation::where('invoice_number', $invoiceNumber)->whereNull('serial_number')->where('plant_id', $plantId)->latest('updated_at')->first()?->quantity ?? 0), 3, '.', ''); // ('updated_at', 'desc')
} else {
@@ -1966,11 +1951,6 @@ class CreateInvoiceValidation extends CreateRecord
$checkMat = InvoiceValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->latest('updated_at')->first(); // ->where('quantity', '!=', '')
if (($checkMat?->stickerMaster->material_type ?? 0) == 3) {
Notification::make()
->title("Material Type : {$checkMat?->stickerMaster->material_type}")
->info()
->seconds(1)
->send();
$totMatQuan = InvoiceValidation::where('invoice_number', $invoiceNumber)->whereNull('serial_number')->where('plant_id', $plantId)->latest('updated_at')->first()?->invoice_quantity ?? 0;
$scanMatQuan = number_format($totMatQuan - (InvoiceValidation::where('invoice_number', $invoiceNumber)->whereNull('serial_number')->where('plant_id', $plantId)->latest('updated_at')->first()?->quantity ?? 0), 3, '.', ''); // ('updated_at', 'desc')
} else {
@@ -2014,11 +1994,6 @@ class CreateInvoiceValidation extends CreateRecord
$checkMat = InvoiceValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->latest('updated_at')->first(); // ->where('quantity', '!=', '')
if (($checkMat?->stickerMaster->material_type ?? 0) == 3) {
Notification::make()
->title("Material Type : {$checkMat?->stickerMaster->material_type}")
->info()
->seconds(1)
->send();
$totMatQuan = InvoiceValidation::where('invoice_number', $invoiceNumber)->whereNull('serial_number')->where('plant_id', $plantId)->latest('updated_at')->first()?->invoice_quantity ?? 0;
$scanMatQuan = number_format($totMatQuan - (InvoiceValidation::where('invoice_number', $invoiceNumber)->whereNull('serial_number')->where('plant_id', $plantId)->latest('updated_at')->first()?->quantity ?? 0), 3, '.', ''); // ('updated_at', 'desc')
} else {
@@ -2525,11 +2500,6 @@ class CreateInvoiceValidation extends CreateRecord
if ($totMQuan > 0) {
$checkMat = InvoiceValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->latest('updated_at')->first(); // ->where('quantity', '!=', '')
if (($checkMat?->stickerMaster->material_type ?? 0) == 3) {
Notification::make()
->title("Material Type : {$checkMat?->stickerMaster->material_type}")
->info()
->seconds(1)
->send();
$totMatQuan = InvoiceValidation::where('invoice_number', $invoiceNumber)->whereNull('serial_number')->where('plant_id', $plantId)->latest('updated_at')->first()?->invoice_quantity ?? 0;
$scanMatQuan = number_format($totMatQuan - (InvoiceValidation::where('invoice_number', $invoiceNumber)->whereNull('serial_number')->where('plant_id', $plantId)->latest('updated_at')->first()?->quantity ?? 0), 3, '.', ''); // ('updated_at', 'desc')
} else {
@@ -3210,11 +3180,6 @@ class CreateInvoiceValidation extends CreateRecord
$checkMat = InvoiceValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->latest('updated_at')->first(); // ->where('quantity', '!=', '')
if (($checkMat?->stickerMaster->material_type ?? 0) == 3) {
Notification::make()
->title("Material Type : {$checkMat?->stickerMaster->material_type}")
->info()
->seconds(1)
->send();
$totMatQuan = InvoiceValidation::where('invoice_number', $invoiceNumber)->whereNull('serial_number')->where('plant_id', $plantId)->latest('updated_at')->first()?->invoice_quantity ?? 0;
$scanMatQuan = number_format($totMatQuan - (InvoiceValidation::where('invoice_number', $invoiceNumber)->whereNull('serial_number')->where('plant_id', $plantId)->latest('updated_at')->first()?->quantity ?? 0), 3, '.', ''); // ('updated_at', 'desc')
} else {
@@ -3595,11 +3560,6 @@ class CreateInvoiceValidation extends CreateRecord
$checkMat = InvoiceValidation::where('invoice_number', $invoiceNumber)->where('plant_id', $plantId)->latest('updated_at')->first(); // ->where('quantity', '!=', '')
if (($checkMat?->stickerMaster->material_type ?? 0) == 3) {
Notification::make()
->title("Material Type : {$checkMat?->stickerMaster->material_type}")
->info()
->seconds(1)
->send();
$totMatQuan = InvoiceValidation::where('invoice_number', $invoiceNumber)->whereNull('serial_number')->where('plant_id', $plantId)->latest('updated_at')->first()?->invoice_quantity ?? 0;
$scanMatQuan = number_format($totMatQuan - (InvoiceValidation::where('invoice_number', $invoiceNumber)->whereNull('serial_number')->where('plant_id', $plantId)->latest('updated_at')->first()?->quantity ?? 0), 3, '.', ''); // ('updated_at', 'desc')
} else {

View File

@@ -9,6 +9,7 @@ use App\Models\ProductionCharacteristic;
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;
@@ -31,6 +32,7 @@ use App\Filament\Exports\PanelBoxValidationExporter;
use App\Filament\Imports\PanelBoxValidationImporter;
use Filament\Forms\Components\Actions;
use Filament\Forms\Components\Actions\Action;
use Illuminate\Support\Js;
class PanelBoxValidationResource extends Resource
{
@@ -64,6 +66,7 @@ class PanelBoxValidationResource extends Resource
$set('item_id', null);
$set('line_id', null);
$set('production_order', null);
$set('inspection_lot_number', null);
$set('part_validation_type_options', []);
$set('part_validation_type', null);
@@ -117,6 +120,7 @@ class PanelBoxValidationResource extends Resource
->afterStateUpdated(function (callable $set, callable $get, $state) {
$set('item_id', null);
$set('production_order', null);
$set('inspection_lot_number', null);
$set('line', $state);
@@ -943,6 +947,7 @@ class PanelBoxValidationResource extends Resource
'id' => 'item_id',
'onkeydown' => "
if (event.key === 'Enter') {
const serialFields = [
'serial_number_motor_qr', 'serial_number_pump_qr', 'pack_slip_motor_qr',
'name_plate_motor_qr', 'tube_sticker_motor_qr', 'warranty_card_qr'
@@ -962,6 +967,7 @@ class PanelBoxValidationResource extends Resource
if (anyVisible) {
event.preventDefault();
event.stopPropagation();
event.stopImmediatePropagation();
return false;
}
}
@@ -969,8 +975,11 @@ class PanelBoxValidationResource extends Resource
])
->hint(fn ($get) => $get('validationError') ? $get('validationError') : null)
->hintColor('danger'),
Forms\Components\Hidden::make('serial_exists')
->default(false),
Forms\Components\Hidden::make('serial_exists')
// ->default(false)
->live()
->dehydrated()
->id('serial_exists'),
Forms\Components\Actions::make([
Action::make('rework')
@@ -996,9 +1005,9 @@ class PanelBoxValidationResource extends Resource
if ($alreadyExists) {
Notification::make()
->title('Invalid Rework')
->title('Duplicate Found')
->body(
'This document number and inspection lot number have already been used for this serial number. Please provide a new document number and inspection lot number for rework..'
'This document number and inspection lot number have already been used for this serial number. Please provide a new document number and inspection lot number for rework...'
)
->danger()
->send();

View File

@@ -74,11 +74,14 @@ class CreatePanelBoxValidation extends CreateRecord {
// return $data;
// }
if ($this->checkIfHasCharacteristics($data)) {
if(($data['serial_exists']) == true){
$this->halt();
}
if ($this->checkIfHasCharacteristics($data) && ($data['serial_exists']) == false) {
$this->showChecklist = true;
$this->halt();
}
else{
if(!$this->checkIfHasCharacteristics($data) && ($data['serial_exists']) == false){
\Filament\Notifications\Notification::make()
->title('Characteristics not found for the scanned item.')
->danger()

View File

@@ -9,6 +9,7 @@ use App\Filament\Resources\PanelGrMasterResource\RelationManagers;
use App\Models\Item;
use App\Models\PalletValidation;
use App\Models\PanelGrMaster;
use App\Models\PanelBoxValidation;
use App\Models\Plant;
use Filament\Facades\Filament;
use Filament\Forms;
@@ -26,6 +27,8 @@ use Filament\Forms\Components\Section;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Closure;
use Filament\Notifications\Notification;
use Illuminate\Support\Facades\Log;
class PanelGrMasterResource extends Resource
{
@@ -99,6 +102,9 @@ class PanelGrMasterResource extends Resource
if ((float) $state == 0) {
$set('quantity', null);
}
$set('updated_by', Filament::auth()->user()?->name);
$set('updated_at', now());
}),
Forms\Components\Hidden::make('created_by')
->label('Created By')
@@ -157,6 +163,20 @@ class PanelGrMasterResource extends Resource
->searchable()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('scanned_quantity')
->label('Scanned Quantity')
->searchable()
->alignCenter()
->sortable()
->getStateUsing(function ($record) {
return PanelBoxValidation::where('plant_id', $record->plant_id)
->where('production_order', $record->document_number)
->where('inspection_lot_number', $record->inspection_lot_number)
->whereHas('stickerMaster', function ($query) use ($record) {
$query->where('item_id', $record->item_id);
})
->count();
}),
Tables\Columns\TextColumn::make('created_at')
->dateTime()
->alignCenter()

View File

@@ -3,13 +3,49 @@
namespace App\Filament\Resources\PanelGrMasterResource\Pages;
use App\Filament\Resources\PanelGrMasterResource;
use App\Models\PanelBoxValidation;
use App\Models\StickerMaster;
use Filament\Actions;
use Filament\Facades\Filament;
use Filament\Notifications\Notification;
use Filament\Resources\Pages\EditRecord;
class EditPanelGrMaster extends EditRecord
{
protected static string $resource = PanelGrMasterResource::class;
protected function mutateFormDataBeforeSave(array $data): array
{
$record = $this->record;
$sticker = StickerMaster::where('plant_id', $record->plant_id)->where('item_id', $record->item_id)->first();
if($sticker)
{
$scannedQuantity = PanelBoxValidation::where('plant_id', $record->plant_id)
->where('production_order', $record->document_number)
->where('inspection_lot_number', $record->inspection_lot_number)
->where('sticker_master_id', $sticker->id)
->count();
}
if ((int) $data['quantity'] < $scannedQuantity) {
Notification::make()
->title('Invalid Quantity')
->body("Already scanned quantity is {$scannedQuantity}.<br>Panel GR Master quantity cannot be less than {$scannedQuantity}.")
->danger()
->send();
$this->halt();
}
$data['updated_by'] = Filament::auth()->user()?->name;
$data['updated_at'] = now();
return $data;
}
protected function getHeaderActions(): array
{
return [

View File

@@ -464,7 +464,7 @@ class PumpTestingEntryResource extends Resource
})
->afterStateUpdated(function ($state, callable $set, callable $get) {
$set('Item', null);
$set('isi_type', null);
$set('tested_type', null);
$set('created_by', null);
$set('updated_by', null);
}),
@@ -479,7 +479,7 @@ class PumpTestingEntryResource extends Resource
->reactive()
->native(false),
Select::make('tested_type')
->label('Tested Type')
->label('Search by Tested Type')
->nullable()
->options(function (callable $get) {
$plantId = $get('Plant');
@@ -592,13 +592,13 @@ class PumpTestingEntryResource extends Resource
}
if (! empty($data['Item']) && ! empty($data['Plant'])) {
$itemIds = Item::where('id', $data['Item'])
$pumpMasterIds = PumpTestingMaster::where('item_id', $data['Item'])
->where('plant_id', $data['Plant'])
->pluck('id')
->toArray();
if (! empty($itemIds)) {
$query->whereIn('item_id', $itemIds);
if (! empty($pumpMasterIds)) {
$query->whereIn('pump_testing_master_id', $pumpMasterIds);
}
}
@@ -611,7 +611,14 @@ class PumpTestingEntryResource extends Resource
})->pluck('id')->toArray();
if (! empty($descIds)) {
$query->whereIn('item_id', $descIds);
$pumpMasterIds = PumpTestingMaster::whereIn('item_id', $descIds)
->where('plant_id', $data['Plant'])
->pluck('id')
->toArray();
if (! empty($pumpMasterIds)) {
$query->whereIn('pump_testing_master_id', $pumpMasterIds);
}
}
}

View File

@@ -0,0 +1,808 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Exports\PumpTestingResultExporter;
use App\Filament\Resources\PumpTestingResultResource\Pages;
use App\Models\Configuration;
use App\Models\Item;
use App\Models\Plant;
use App\Models\PumpTestingMaster;
use App\Models\PumpTestingResult;
use Filament\Facades\Filament;
use Filament\Forms;
use Filament\Forms\Components\DatePicker;
use Filament\Forms\Components\DateTimePicker;
use Filament\Forms\Components\Section;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Form;
use Filament\Forms\Get;
use Filament\Forms\Set;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Actions\ExportAction;
use Filament\Tables\Filters\Filter;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Illuminate\Validation\Rule;
class PumpTestingResultResource extends Resource
{
protected static ?string $model = PumpTestingResult::class;
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
protected static ?string $navigationGroup = 'Pump Testing Panel';
protected static ?int $navigationSort = 3;
public static function form(Form $form): Form
{
return $form
->schema([
Section::make('')
->schema([
Forms\Components\Select::make('plant_id')
->label('Plant Name')
->relationship('plant', 'name')
->options(function (callable $get) {
$userHas = Filament::auth()->user()->plant_id;
return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::orderBy('code')->pluck('name', 'id')->toArray();
})
->columnSpan(1) // (['default' => 1, 'sm' => 2])
->required()
->searchable()
->reactive()
->default(function () {
$userHas = Filament::auth()->user()->plant_id;
return ($userHas && strlen($userHas) > 0) ? $userHas : optional(PumpTestingResult::latest()->first())->plant_id ?? null;
})
->disabled(fn (Get $get) => ! empty($get('id')))
->afterStateUpdated(function ($state, callable $set, callable $get) {
$plantId = $get('plant_id');
$set('pump_testing_master_id', null);
$set('pump_master_id', null);
// $set('pump_type', null);
if (! $plantId) {
$set('pTeError', 'Please select a plant first.');
return;
} else {
$set('pTeError', null);
}
$set('updated_by', Filament::auth()->user()?->name);
})
->extraAttributes(fn ($get) => [
'class' => $get('pTeError') ? 'border-red-500' : '',
])
->hint(fn ($get) => $get('pTeError') ? $get('pTeError') : null)
->hintColor('danger'),
Forms\Components\Select::make('tested_type')
->label('Tested Type')
->selectablePlaceholder(false)
->options(function (callable $get) {
$plantId = $get('plant_id');
if ($plantId) {
return Configuration::where('plant_id', $plantId)
->where('c_name', 'PUMP_DISPLAY_TEST_TYPE')
->whereNot('c_value', 'Routine Test')
->orderBy('created_at')
->pluck('c_value', 'c_value')
->toArray();
} else {
return Configuration::where('c_name', 'PUMP_DISPLAY_TEST_TYPE')
->whereNot('c_value', 'Routine Test')
->orderBy('created_at')
->pluck('c_value', 'c_value')
->toArray();
}
})
->afterStateUpdated(function ($state, callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
})
->columnSpan(1)
->required()
->default('Pump Performance Test')
->reactive(),
Forms\Components\DatePicker::make('tested_date')
->label('Tested Date')
->afterStateUpdated(function ($state, callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
})
->columnSpan(1)
->default(now())
->required()
->reactive(),
Forms\Components\TextInput::make('correction_head')
->label('Correction Head')
->placeholder('Scan the correction head')
->afterStateUpdated(function ($state, callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
})
->columnSpan(1)
->required()
->reactive(),
Forms\Components\Hidden::make('pump_testing_master_id')
// ->relationship('pumpTestingMasters', 'id')
->required(),
Forms\Components\Select::make('pump_master_id')
->label('Pump Code')
// ->relationship('pumpTestingMasters', 'id')
->options(function (callable $get) {
$plantId = $get('plant_id');
if (! $plantId) {
return [];
}
return Item::where('plant_id', $plantId)->whereHas('pumpTestingMasters')->orderBy('code')->pluck('code', 'code');
})
->columnSpan(1)
->required()
->searchable()
->reactive()
->afterStateUpdated(function (callable $set, callable $get, ?string $state) {
$plantId = $get('plant_id'); // Get selected plant
$set('pump_testing_master_id', null);
// $set('pump_type', null);
if (! $plantId) {
$set('pump_master_id', null);
} elseif ($state) {
// $pumpMaster = PumpTestingMaster::where('plant_id', $plantId)->where('item_id', $state)->first();
$pumpMaster = PumpTestingMaster::where('plant_id', $plantId)->whereHas('item', function ($query) use ($state) {
$query->where('code', $state);
})->first();
if (! $pumpMaster) {
$set('pump_master_id', null);
} else {
$set('pump_testing_master_id', $pumpMaster->id);
// $set('pump_type', $pumpMaster->item->description ?? null);
}
}
$set('updated_by', Filament::auth()->user()?->name);
})
->afterStateHydrated(function ($component, $state, Get $get, Set $set) {
if ($get('id')) {
$itemId = PumpTestingMaster::where('id', $get('pump_testing_master_id'))->first()?->item_id;
if ($itemId) {
$item = Item::where('id', $itemId)->first()?->code;
if ($item) {
$set('pump_master_id', $item);
} else {
$set('pump_master_id', null);
}
} else {
$set('pump_master_id', null);
}
}
}),
// Forms\Components\TextInput::make('pump_type')
// ->label('Pump Type]')
// ->placeholder('Choose the pump code first')
// ->readOnly()
// ->afterStateUpdated(function ($state, callable $set) {
// $set('updated_by', Filament::auth()->user()?->name);
// })
// ->columnSpan(1)
// ->required()
// ->reactive(),
Forms\Components\TextInput::make('pump_serial_number')
->label('Pump Serial Number')
->placeholder('Scan the pump serial number')
->rule(function (callable $get) {
return Rule::unique('pump_testing_results', 'pump_serial_number')
->where('plant_id', $get('plant_id'))
->where('pump_testing_master_id', $get('pump_testing_master_id'))
->where('tested_type', $get('tested_type'))
->where('sl_no', $get('sl_no'))
->ignore($get('id'));
})
->afterStateUpdated(function ($state, callable $set) {
if (strpos($state, '|') != false) {
$parts = explode('|', $state);
$set('pump_serial_number', $parts[1]);
}
$set('updated_by', Filament::auth()->user()?->name);
})
->columnSpan(1)
->required()
->reactive(),
Forms\Components\TextInput::make('sl_no')
->label('Sl. No.')
->placeholder('Scan the sl. no.')
->afterStateUpdated(function ($state, callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
})
->columnSpan(1)
->required()
->reactive(),
Forms\Components\TextInput::make('voltage')
->label('Voltage')
->placeholder('Scan the voltage')
->afterStateUpdated(function ($state, callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
})
->columnSpan(1)
->required()
->reactive(),
Forms\Components\TextInput::make('current')
->label('Current')
->placeholder('Scan the current')
->afterStateUpdated(function ($state, callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
})
->columnSpan(1)
->required()
->reactive(),
Forms\Components\TextInput::make('watt')
->label('Watt')
->placeholder('Scan the watt')
->afterStateUpdated(function ($state, callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
})
->columnSpan(1)
->required()
->reactive(),
Forms\Components\TextInput::make('frequency')
->label('Frequency')
->placeholder('Scan the frequency')
->afterStateUpdated(function ($state, callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
})
->columnSpan(1)
->required()
->reactive(),
Forms\Components\TextInput::make('speed')
->label('Speed')
->placeholder('Scan the speed')
->afterStateUpdated(function ($state, callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
})
->columnSpan(1)
->required()
->reactive(),
Forms\Components\TextInput::make('discharge')
->label('Discharge')
->placeholder('Scan the discharge')
->afterStateUpdated(function ($state, callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
})
->columnSpan(1)
->required()
->reactive(),
Forms\Components\TextInput::make('head')
->label('Head')
->placeholder('Scan the head')
->afterStateUpdated(function ($state, callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
})
->columnSpan(1)
->required()
->reactive(),
Forms\Components\TextInput::make('pump_output')
->label('Pump Output')
->placeholder('Scan the pump output')
->afterStateUpdated(function ($state, callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
})
->columnSpan(1)
->required()
->reactive(),
Forms\Components\TextInput::make('power_p2')
->label('Power P2')
->placeholder('Scan the power p2')
->afterStateUpdated(function ($state, callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
})
->columnSpan(1)
->required()
->reactive(),
Forms\Components\TextInput::make('overall_efficiency')
->label('Overall Efficiency')
->placeholder('Scan the overall efficiency')
->afterStateUpdated(function ($state, callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
})
->columnSpan(1)
->required()
->reactive(),
Forms\Components\TextInput::make('pump_efficiency')
->label('Pump Efficiency')
->placeholder('Scan the pump efficiency')
->afterStateUpdated(function ($state, callable $set) {
$set('updated_by', Filament::auth()->user()?->name);
})
->columnSpan(1)
->required()
->reactive(),
Forms\Components\Hidden::make('created_by')
->default(fn () => Filament::auth()->user()?->name)
->columnSpan(1)
->required(),
Forms\Components\Hidden::make('updated_by')
->default(fn () => Filament::auth()->user()?->name)
->columnSpan(1)
->required(),
Forms\Components\TextInput::make('id')
->hidden()
->columnSpan(1)
->readOnly(),
])
->columns(['default' => 1, 'sm' => 2]),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
// 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('plant.name')
->label('Plant Name')
->searchable()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('tested_date')
->label('Tested Date')
->date() // 'F d, Y'
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('tested_type')
->label('Tested Type')
->searchable()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('pumpTestingMasters.item.code')
->label('Pump Code')
->searchable()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('pumpTestingMasters.item.category')
->label('Pump Category')
->default('-')
->searchable()
->alignCenter()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('pumpTestingMasters.item.description')
->label('Pump Type')
->searchable()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('pumpTestingMasters.item.uom')
->label('Unit Of Measure')
->default('-')
->searchable()
->alignCenter()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('pump_serial_number')
->label('Pump Serial Number')
->searchable()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('correction_head')
->label('Correction Head')
->searchable()
->alignCenter(),
Tables\Columns\TextColumn::make('sl_no')
->label('Sl. No.')
->searchable()
->alignCenter(),
Tables\Columns\TextColumn::make('voltage')
->label('Voltage')
->searchable()
->alignCenter(),
Tables\Columns\TextColumn::make('current')
->label('Current')
->searchable()
->alignCenter(),
Tables\Columns\TextColumn::make('watt')
->label('Watt')
->searchable()
->alignCenter(),
Tables\Columns\TextColumn::make('frequency')
->label('Frequency')
->searchable()
->alignCenter(),
Tables\Columns\TextColumn::make('speed')
->label('Speed')
->searchable()
->alignCenter(),
Tables\Columns\TextColumn::make('discharge')
->label('Discharge')
->searchable()
->alignCenter(),
Tables\Columns\TextColumn::make('head')
->label('Head')
->searchable()
->alignCenter(),
Tables\Columns\TextColumn::make('pump_output')
->label('Pump Output')
->searchable()
->alignCenter(),
Tables\Columns\TextColumn::make('power_p2')
->label('Power P2')
->searchable()
->alignCenter(),
Tables\Columns\TextColumn::make('overall_efficiency')
->label('Overall Efficiency')
->searchable()
->alignCenter(),
Tables\Columns\TextColumn::make('pump_efficiency')
->label('Pump Efficiency')
->searchable()
->alignCenter(),
Tables\Columns\TextColumn::make('created_by')
->label('Created By')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('created_at')
->label('Created At')
->dateTime()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('updated_by')
->label('Updated By')
->alignCenter()
->sortable(),
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(),
Filter::make('advanced_filters')
->label('Advanced Filters')
->form([
Select::make('Plant')
->label('Search by Plant Name')
->nullable()
->searchable()
// ->options(function () {
// return Plant::pluck('name', 'id');
// })
->reactive()
->options(function (callable $get) {
$userHas = Filament::auth()->user()->plant_id;
if ($userHas && strlen($userHas) > 0) {
return Plant::where('id', $userHas)->pluck('name', 'id')->toArray();
} else {
return Plant::whereHas('pumpTestingResults', function ($query) {
$query->whereNotNull('id');
})->orderBy('code')->pluck('name', 'id');
}
// return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::orderBy('code')->pluck('name', 'id')->toArray();
})
->afterStateUpdated(function ($state, callable $set, callable $get) {
$set('Item', null);
$set('tested_type', null);
$set('created_by', null);
$set('updated_by', null);
}),
DatePicker::make('tested_from')
->label('Tested From')
->placeholder('Select From Date')
->reactive()
->native(false),
DatePicker::make('tested_to')
->label('Tested To')
->placeholder('Select To Date')
->reactive()
->native(false),
Select::make('tested_type')
->label('Search by Tested Type')
->nullable()
->options(function (callable $get) {
$plantId = $get('Plant');
if (! $plantId) {
return PumpTestingResult::whereNotNull('tested_type')->select('tested_type')->distinct()->pluck('tested_type', 'tested_type');
} else {
return PumpTestingResult::where('plant_id', $plantId)->whereNotNull('tested_type')->select('tested_type')->distinct()->pluck('tested_type', 'tested_type');
}
})
->searchable()
->reactive(),
Select::make('Item')
->label('Search by Pump Code')
->nullable()
->options(function (callable $get) {
$pId = $get('Plant');
if (! $pId) {
return [];
} else {
return Item::whereHas('pumpTestingMasters', function ($query) use ($pId) {
if ($pId) {
$query->where('plant_id', $pId);
}
$query->whereHas('pumpTestingResults');
})->pluck('code', 'id');
}
})
->searchable()
->reactive(),
TextInput::make('description')
->label('Pump Type')
->placeholder('Enter the Pump Type'),
TextInput::make('pump_serial_number')
->label('Pump Serial Number')
->placeholder('Enter the Pump Serial Number'),
Select::make('created_by')
->label('Search by Created By')
->nullable()
->options(function (callable $get) {
$plantId = $get('Plant');
if (! $plantId) {
return PumpTestingResult::whereNotNull('created_by')->select('created_by')->distinct()->pluck('created_by', 'created_by');
} else {
return PumpTestingResult::where('plant_id', $plantId)->whereNotNull('created_by')->select('created_by')->distinct()->pluck('created_by', 'created_by');
}
})
->searchable()
->reactive(),
DateTimePicker::make(name: 'created_from')
->label('Created From')
->placeholder(placeholder: 'Select From DateTime')
->reactive()
->native(false),
DateTimePicker::make('created_to')
->label('Created To')
->placeholder(placeholder: 'Select To DateTime')
->reactive()
->native(false),
Select::make('updated_by')
->label('Search by Updated By')
->nullable()
->options(function (callable $get) {
$plantId = $get('Plant');
if (! $plantId) {
return PumpTestingResult::whereNotNull('updated_by')->select('updated_by')->distinct()->pluck('updated_by', 'updated_by');
} else {
return PumpTestingResult::where('plant_id', $plantId)->whereNotNull('updated_by')->select('updated_by')->distinct()->pluck('updated_by', 'updated_by');
}
})
->searchable()
->reactive(),
DateTimePicker::make(name: 'updated_from')
->label('Updated From')
->placeholder(placeholder: 'Select From DateTime')
->reactive()
->native(false),
DateTimePicker::make('updated_to')
->label('Updated To')
->placeholder(placeholder: 'Select To DateTime')
->reactive()
->native(false),
])
->query(function ($query, array $data) {
// Hide all records initially if no filters are applied
if (empty($data['Plant']) && empty($data['tested_from']) && empty($data['tested_to']) && empty($data['tested_type']) && empty($data['Item']) && empty($data['description']) && empty($data['pump_serial_number']) && empty($data['created_by']) && empty($data['created_from']) && empty($data['created_to']) && empty($data['updated_by']) && empty($data['updated_from']) && empty($data['updated_to'])) {
return $query->whereRaw('1 = 0');
}
if (! empty($data['Plant'])) {
$query->where('plant_id', $data['Plant']);
} else {
$userHas = Filament::auth()->user()->plant_id;
if ($userHas && strlen($userHas) > 0) {
return $query->whereRaw('1 = 0');
}
}
if (! empty($data['tested_from'])) {
$query->where('tested_date', '>=', $data['tested_from']);
}
if (! empty($data['tested_to'])) {
$query->where('tested_date', '<=', $data['tested_to']);
}
if (! empty($data['tested_type'])) {
$query->where('tested_type', $data['tested_type']);
}
if (! empty($data['Item']) && ! empty($data['Plant'])) {
$pumpMasterIds = PumpTestingMaster::where('item_id', $data['Item'])
->where('plant_id', $data['Plant'])
->pluck('id')
->toArray();
if (! empty($pumpMasterIds)) {
$query->whereIn('pump_testing_master_id', $pumpMasterIds);
}
}
if (! empty($data['description'])) {
$pId = $data['Plant'] ?? null;
$descIds = Item::where('description', 'like', '%'.$data['description'].'%')->whereHas('pumpTestingMasters', function ($query) use ($pId) {
if ($pId) {
$query->where('plant_id', $pId);
}
})->pluck('id')->toArray();
if (! empty($descIds)) {
$pumpMasterIds = PumpTestingMaster::whereIn('item_id', $descIds)
->where('plant_id', $data['Plant'])
->pluck('id')
->toArray();
if (! empty($pumpMasterIds)) {
$query->whereIn('pump_testing_master_id', $pumpMasterIds);
}
}
}
if (! empty($data['pump_serial_number'])) {
$query->where('pump_serial_number', 'like', '%'.$data['pump_serial_number'].'%');
}
if (! empty($data['created_by'])) {
$query->where('created_by', $data['created_by']);
}
if (! empty($data['created_from'])) {
$query->where('created_at', '>=', $data['created_from']);
}
if (! empty($data['created_to'])) {
$query->where('created_at', '<=', $data['created_to']);
}
if (! empty($data['updated_by'])) {
$query->where('updated_by', $data['updated_by']);
}
if (! empty($data['updated_from'])) {
$query->where('updated_at', '>=', $data['updated_from']);
}
if (! empty($data['updated_to'])) {
$query->where('updated_at', '<=', $data['updated_to']);
}
})
->indicateUsing(function (array $data) {
$indicators = [];
if (! empty($data['Plant'])) {
$indicators[] = 'Plant Name: '.Plant::where('id', $data['Plant'])->value('name');
} else {
$userHas = Filament::auth()->user()->plant_id;
if ($userHas && strlen($userHas) > 0) {
return 'Plant: Choose plant to filter records.';
}
}
if (! empty($data['tested_from'])) {
$indicators[] = 'Tested From: '.$data['tested_from'];
}
if (! empty($data['tested_to'])) {
$indicators[] = 'Tested To: '.$data['tested_to'];
}
if (! empty($data['tested_type'])) {
$indicators[] = 'Tested Type: '.$data['tested_type'];
}
if (! empty($data['Item']) && ! empty($data['Plant'])) {
$itemCode = Item::find($data['Item'])->code ?? 'Unknown';
$indicators[] = 'Pump Code: '.$itemCode;
}
if (! empty($data['description'])) {
$indicators[] = 'Pump Type: '.$data['description'];
}
if (! empty($data['pump_serial_number'])) {
$indicators[] = 'Pump Serial Number: '.$data['pump_serial_number'];
}
if (! empty($data['created_by'])) {
$indicators[] = 'Created By: '.$data['created_by'];
}
if (! empty($data['created_from'])) {
$indicators[] = 'Created From: '.$data['created_from'];
}
if (! empty($data['created_to'])) {
$indicators[] = 'Created To: '.$data['created_to'];
}
if (! empty($data['updated_by'])) {
$indicators[] = 'Updated By: '.$data['updated_by'];
}
if (! empty($data['updated_from'])) {
$indicators[] = 'Updated From: '.$data['updated_from'];
}
if (! empty($data['updated_to'])) {
$indicators[] = 'Updated To: '.$data['updated_to'];
}
return $indicators;
}),
])
->filtersFormMaxHeight('280px')
->actions([
Tables\Actions\ViewAction::make(),
Tables\Actions\EditAction::make(),
])
->headerActions([
ExportAction::make()
->label('Export Pump Testing Results')
->color('warning')
->exporter(PumpTestingResultExporter::class)
->visible(function () {
return Filament::auth()->user()->can('view export pump testing results');
}),
])
->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\ListPumpTestingResults::route('/'),
'create' => Pages\CreatePumpTestingResult::route('/create'),
'view' => Pages\ViewPumpTestingResult::route('/{record}'),
'edit' => Pages\EditPumpTestingResult::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\PumpTestingResultResource\Pages;
use App\Filament\Resources\PumpTestingResultResource;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
class CreatePumpTestingResult extends CreateRecord
{
protected static string $resource = PumpTestingResultResource::class;
}

View File

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

View File

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

View File

@@ -0,0 +1,193 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Exports\SaleOrderMasterExporter;
use App\Filament\Imports\SaleOrderMasterImporter;
use App\Filament\Resources\SaleOrderMasterResource\Pages;
use App\Filament\Resources\SaleOrderMasterResource\RelationManagers;
use App\Models\Item;
use App\Models\Plant;
use App\Models\SaleOrderMaster;
use Filament\Facades\Filament;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Tables\Actions\ExportAction;
use Filament\Tables\Actions\ImportAction;
class SaleOrderMasterResource extends Resource
{
protected static ?string $model = SaleOrderMaster::class;
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
protected static ?string $navigationGroup = 'Spare Packing';
public static function form(Form $form): Form
{
return $form
->schema([
Forms\Components\Select::make('plant_id')
->label('Plant')
->reactive()
->relationship('plant', 'name')
->options(function (callable $get) {
$userHas = Filament::auth()->user()->plant_id;
return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::orderBy('code')->pluck('name', 'id')->toArray();
})
->required(),
Forms\Components\Select::make('item_id')
->label('Item Code')
->reactive()
->searchable()
->options(function (callable $get) {
$plantId = $get('plant_id');
if (empty($plantId)) {
return [];
}
return Item::where('plant_id', $plantId)->pluck('code', 'id');
})
->required(),
Forms\Components\TextInput::make('sale_order_number')
->label('Sale Order Number'),
Forms\Components\TextInput::make('supplier_name')
->label('Supplier Name'),
Forms\Components\TextInput::make('quantity')
->label('Quantity'),
Forms\Components\Hidden::make('created_by')
->label('Created By')
->default(Filament::auth()->user()?->name),
Forms\Components\Hidden::make('updated_by')
->default(Filament::auth()->user()?->name),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('No.')
->label('No.')
->getStateUsing(function ($record, $livewire, $column, $rowLoop) {
$paginator = $livewire->getTableRecords();
$perPage = method_exists($paginator, 'perPage') ? $paginator->perPage() : 10;
$currentPage = method_exists($paginator, 'currentPage') ? $paginator->currentPage() : 1;
return ($currentPage - 1) * $perPage + $rowLoop->iteration;
}),
Tables\Columns\TextColumn::make('plant.name')
->label('Plant')
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('item.code')
->label('Item Code')
->searchable()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('sale_order_number')
->label('Sale Order Number')
->searchable()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('supplier_name')
->label('Supplier Name')
->searchable()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('quantity')
->label('Quantity')
->searchable()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('created_at')
->label('Created At')
->dateTime()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('created_by')
->label('Created By')
->searchable()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('updated_at')
->label('Updated At')
->dateTime()
->alignCenter()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('updated_by')
->label('Updated By')
->searchable()
->alignCenter()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('deleted_at')
->label('Deleted At')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
Tables\Filters\TrashedFilter::make(),
])
->actions([
Tables\Actions\ViewAction::make(),
Tables\Actions\EditAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
Tables\Actions\ForceDeleteBulkAction::make(),
Tables\Actions\RestoreBulkAction::make(),
]),
])
->headerActions([
ImportAction::make()
->label('Import Sale Order')
->color('warning')
->importer(SaleOrderMasterImporter::class)
->visible(function () {
return Filament::auth()->user()->can('view import sale order master');
}),
ExportAction::make()
->label('Export Sale Order')
->color('warning')
->exporter(SaleOrderMasterExporter::class)
->visible(function () {
return Filament::auth()->user()->can('view export sale order master');
}),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListSaleOrderMasters::route('/'),
'create' => Pages\CreateSaleOrderMaster::route('/create'),
'view' => Pages\ViewSaleOrderMaster::route('/{record}'),
'edit' => Pages\EditSaleOrderMaster::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\SaleOrderMasterResource\Pages;
use App\Filament\Resources\SaleOrderMasterResource;
use Filament\Actions;
use Filament\Resources\Pages\CreateRecord;
class CreateSaleOrderMaster extends CreateRecord
{
protected static string $resource = SaleOrderMasterResource::class;
}

View File

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

View File

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

View File

@@ -0,0 +1,340 @@
<?php
namespace App\Filament\Resources;
use App\Filament\Resources\SparePackingResource\Pages;
use App\Filament\Resources\SparePackingResource\RelationManagers;
use App\Models\Plant;
use App\Models\SaleOrderMaster;
use App\Models\SparePacking;
use Filament\Facades\Filament;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Forms\Components\Section;
use Filament\Tables\Actions\ExportAction;
use Filament\Tables\Actions\ImportAction;
use App\Filament\Exports\SparePackingExporter;
use App\Filament\Imports\SparePackingImporter;
class SparePackingResource extends Resource
{
protected static ?string $model = SparePacking::class;
protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack';
protected static ?string $navigationGroup = 'Spare Packing';
public static function form(Form $form): Form
{
return $form
->schema([
Section::make('')
->schema([
Forms\Components\Select::make('plant_id')
->label('Plant')
->reactive()
->relationship('plant', 'name')
->options(function (callable $get) {
$userHas = Filament::auth()->user()->plant_id;
return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::orderBy('code')->pluck('name', 'id')->toArray();
})
->required(),
Forms\Components\Select::make('sale_order_master_id')
->label('Sale Order Number')
->reactive()
->searchable()
->options(function (callable $get) {
$plantId = $get('plant_id');
if (empty($plantId)) {
return [];
}
return SaleOrderMaster::where('plant_id', $plantId)->distinct()->pluck('sale_order_number', 'sale_order_number');
})
->required()
->afterStateUpdated(function ($state, callable $set) {
$set('spare_packing_number', null);
}),
Forms\Components\TextInput::make('spare_packing_number')
->label('Scan Spare Packing No')
->reactive()
->required()
->readonly()
->extraAttributes([
'x-data' => '{ value: "" }',
'x-model' => 'value',
'x-on:keydown.enter.prevent' => '$wire.processPalletNo()',
])
->suffixAction(fn ($get, $set) => Forms\Components\Actions\Action::make('addWirePackNo')
->label('')
->button()
->icon('heroicon-o-plus')
->color('primary')
->extraAttributes([
'class' => 'p-1 w-7 h-7',
])
->action(function ($get, $set, $livewire) {
$plantId = $get('plant_id');
session(['pallet_clicked_time' => now()->toDateTimeString()]);
session(['pallet_created_by' => Filament::auth()->user()->name]);
$year = now()->format('y');
$month = now()->format('m');
$prefix = "SP-{$year}{$month}";
$lastPallet = SparePacking::where('spare_packing_number', 'like', "{$prefix}%")
->orderByDesc('spare_packing_number')
->first();
if ($lastPallet) {
$lastNumber = (int) substr(
$lastPallet->spare_packing_number,
strlen($prefix)
);
$newNumber = $lastNumber + 1;
$newNumber = $newNumber < 1000
? str_pad($newNumber, 3, '0', STR_PAD_LEFT)
: (string) $newNumber;
} else {
$newNumber = '001';
}
$newPalletNumber = "{$prefix}{$newNumber}";
$set('spare_packing_number', $newPalletNumber);
$set('plant_id', $plantId);
// $livewire->redirectToQrPdf($newPalletNumber);
})
),
Forms\Components\TextInput::make('document_number')
->label('Document No')
->reactive()
->readOnly(fn (callable $get) => ! $get('spare_packing_number'))
->extraAttributes([
'x-on:keydown.enter.prevent' => '$wire.processDocNo()',
]),
Forms\Components\TextInput::make('removeDoc_number')
->label('Remove Document No')
->reactive()
->minLength(9)
->readOnly(fn (callable $get) => ! $get('spare_packing_number') || $get('document_number'))
->extraAttributes([
'x-data' => '{ value: "" }',
'x-model' => 'value',
'x-on:keydown.enter.prevent' => '$wire.processRemoveDocNo()',
]),
Forms\Components\TextInput::make('Sno_quantity')
->label('SNo. Quantity')
->readOnly()
->default('0'),
Forms\Components\Select::make('pending_pallet_list')
->label('Pending Pallet List')
->reactive()
->afterStateUpdated(function ($state, callable $set) {
$set('spare_packing_number', $state);
$set('pallet_number_locked', false);
})
->options(function ($get) {
$plantId = $get('plant_id');
$saleOrder = $get('sale_order_master_id');
if (!$plantId || !$saleOrder) {
return [];
}
$saleOrderIds = SaleOrderMaster::where('plant_id', $plantId)
->where('sale_order_number', $saleOrder)
->pluck('id');
return SparePacking::query()
->where('plant_id', $plantId)
->whereIn('sale_order_master_id', $saleOrderIds)
->where(function ($query) {
$query->whereNull('spare_packing_status')
->orWhere('spare_packing_status', '');
})
->whereNotNull('spare_packing_number')
->orderBy('spare_packing_number', 'asc')
->pluck('spare_packing_number')
->unique()
->mapWithKeys(fn ($number) => [$number => $number])
->toArray();
}),
Forms\Components\View::make('forms.components.save-spare-packing-button'),
Forms\Components\Hidden::make('created_by')
->label('Created By'),
Forms\Components\Hidden::make('updated_by')
->label('Updated By'),
])
->columns(6),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('No.')
->label('No.')
->alignCenter()
->getStateUsing(function ($record, $livewire, $column, $rowLoop) {
$paginator = $livewire->getTableRecords();
$perPage = method_exists($paginator, 'perPage') ? $paginator->perPage() : 10;
$currentPage = method_exists($paginator, 'currentPage') ? $paginator->currentPage() : 1;
return ($currentPage - 1) * $perPage + $rowLoop->iteration;
}),
Tables\Columns\TextColumn::make('plant.name')
->label('Plant')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('item.code')
->label('Item')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('item.description')
->label('Description')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('saleOrder.sale_order_number')
->label('Sale Order No')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('saleOrder.supplier_name')
->label('Supplier Name')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('spare_packing_number')
->label('Spare Packing Number')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('document_number')
->label('Document Number')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('quantity')
->label('Quantity')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('spare_packing_status')
->label('Spare Packing Status')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('created_at')
->label('Created At')
->dateTime()
->alignCenter()
->sortable(),
Tables\Columns\TextColumn::make('created_by')
->label('Created By')
->alignCenter()
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('updated_at')
->label('Updated At')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('updated_by')
->label('Updated By')
->alignCenter()
->searchable()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('scanned_at')
->label('Scanned At')
->dateTime()
->sortable()
->alignCenter()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('scanned_by')
->label('Scanned By')
->alignCenter()
->searchable()
->sortable()
->alignCenter()
->toggleable(isToggledHiddenByDefault: true),
Tables\Columns\TextColumn::make('deleted_at')
->label('Deleted At')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
Tables\Filters\TrashedFilter::make(),
])
->actions([
Tables\Actions\ViewAction::make(),
Tables\Actions\EditAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
Tables\Actions\ForceDeleteBulkAction::make(),
Tables\Actions\RestoreBulkAction::make(),
]),
])
->headerActions([
ImportAction::make()
->label('Import Spare Packing')
->color('warning')
->importer(SparePackingImporter::class)
->visible(function () {
return Filament::auth()->user()->can('view import spare packing');
}),
ExportAction::make()
->label('Export Spare Packing')
->color('warning')
->exporter(SparePackingExporter::class)
->visible(function () {
return Filament::auth()->user()->can('view export spare packing');
}),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListSparePackings::route('/'),
'create' => Pages\CreateSparePacking::route('/create'),
'view' => Pages\ViewSparePacking::route('/{record}'),
'edit' => Pages\EditSparePacking::route('/{record}/edit'),
];
}
public static function getEloquentQuery(): Builder
{
return parent::getEloquentQuery()
->withoutGlobalScopes([
SoftDeletingScope::class,
]);
}
}

View File

@@ -0,0 +1,845 @@
<?php
namespace App\Filament\Resources\SparePackingResource\Pages;
use App\Filament\Resources\SparePackingResource;
use App\Models\Item;
use App\Models\Plant;
use App\Models\SaleOrderMaster;
use Filament\Actions;
use Filament\Facades\Filament;
use Filament\Notifications\Notification;
use Filament\Resources\Pages\CreateRecord;
use App\Models\SparePacking;
class CreateSparePacking extends CreateRecord
{
public $docNo;
public $saleOrder;
public $plantId;
public $count = 0;
public $snoCount = 0;
public $pendingPallet;
public array $importedSaleOrderList = [];
protected static string $resource = SparePackingResource::class;
protected static string $view = 'filament.resources.spare-packing-resource.create-spare-packing';
protected $listeners = [
'updateSnoQuantity' => 'handleUpdateSnoQuantity',
];
public function handleUpdateSnoQuantity($newValue)
{
$this->form->fill([
'Sno_quantity' => $newValue,
]);
}
public function processDocNo(){
$plantId = $this->form->getState()['plant_id'];
$plantId = trim($plantId) ?? null;
$docNo = trim($this->form->getState()['document_number'])?? null;
$saleOrder = trim($this->form->getState()['sale_order_master_id'])?? null;
$sparePackNo = trim($this->form->getState()['spare_packing_number'])?? null;
$sparePackNo = trim($sparePackNo) ?? null;
$user = Filament::auth()->user();
$operatorName = $user->name;
if (empty($docNo) || $docNo == '')
{
Notification::make()
->title("Document Number can't be empty")
->danger()
->duration(5000)
->send();
$this->form->fill([
'document_number' => null,
'plant_id' => $plantId,
'sale_order_master_id' => $saleOrder,
'spare_packing_number' => $sparePackNo,
'Sno_quantity' => 0,
'created_by' => $operatorName,
'scanned_by' => $operatorName,
]);
return;
}
// $pattern = '/^([^|]+)\|([^|]+)\|([^|]+)\|(\d+(\.\d+)?)(kg)?$/i';
// $pattern = '/^([^|]+)\|([^|]+)\|([^|]+)\|(\d+(\.\d+)?)$/i';
$pattern = '/^([^|]+)\|([^|]+)\|(\d+(\.\d+)?)$/i';
if (!preg_match($pattern, $docNo, $matches))
{
Notification::make()
->title("Scan Valid Qr code ")
->body("Expected Format : (MaterialCode|Document Number|Quantity)")
->danger()
->duration(5000)
->send();
$this->form->fill([
'document_number' => null,
'plant_id' => $plantId,
'sale_order_master_id' => $saleOrder,
'spare_packing_number' => $sparePackNo,
'Sno_quantity' => 0,
'created_by' => $operatorName,
'scanned_by' => $operatorName,
]);
return;
}
$materialCode = $matches[1];
$docNo = $matches[2];
$weight = $matches[3];
$icode = Item::where('code', $materialCode)->first();
if(!$icode)
{
Notification::make()
->title("Unknown Item Code")
->body("Item Code not found '$materialCode'")
->danger()
->duration(5000)
->send();
$this->form->fill([
'document_number' => null,
'plant_id' => $plantId,
'sale_order_master_id' => $saleOrder,
'spare_packing_number' => $sparePackNo,
'Sno_quantity' => 0,
'created_by' => $operatorName,
'scanned_by' => $operatorName,
]);
return;
}
$icodeAgaPlant = Item::where('code', $materialCode)->where('plant_id', $plantId)->first();
$plantCode = Plant::where('id', $plantId)->first();
$plantcode = $plantCode->code;
$itemId = $icodeAgaPlant->id;
if(!$icodeAgaPlant)
{
Notification::make()
->title("Unknown Item Code")
->body("Item Code not found '$materialCode' against Plant Code '$plantcode'")
->danger()
->duration(5000)
->send();
$this->form->fill([
'document_number' => null,
'plant_id' => $plantId,
'sale_order_master_id' => $saleOrder,
'spare_packing_number' => $sparePackNo,
'Sno_quantity' => 0,
'created_by' => $operatorName,
'scanned_by' => $operatorName,
]);
return;
}
$icodeAgaCPoPlant = SaleOrderMaster::where('item_id', $itemId)->where('plant_id', $plantId)->first();
if(!$icodeAgaCPoPlant)
{
Notification::make()
->title("Unknown Item Code in Customer PO")
->body("Item Code '$materialCode' not found in any active Customer PO against Plant Code '$plantcode'")
->danger()
->duration(5000)
->send();
$this->form->fill([
'document_number' => null,
'plant_id' => $plantId,
'sale_order_master_id' => $saleOrder,
'spare_packing_number' => $sparePackNo,
'Sno_quantity' => 0,
'created_by' => $operatorName,
'scanned_by' => $operatorName,
]);
return;
}
$processOrderAgaPlant = SparePacking::where('document_number', $docNo)->where('plant_id', $plantId)->first();
if($processOrderAgaPlant)
{
Notification::make()
->title("Duplicate Document Number")
->body("Duplicate document number found '$docNo' against Plant Code '$plantcode'")
->danger()
->duration(5000)
->send();
$this->form->fill([
'document_number' => null,
'plant_id' => $plantId,
'sale_order_master_id' => $saleOrder,
'spare_packing_number' => $sparePackNo,
'Sno_quantity' => 0,
'created_by' => $operatorName,
'scanned_by' => $operatorName,
]);
return;
}
$saleOrderRecord = SaleOrderMaster::where('sale_order_number', $saleOrder)
->where('plant_id', $plantId)
->where('item_id', $itemId)
->first();
if(!$saleOrderRecord)
{
Notification::make()
->title("Sale Order Not Found")
->body("Sale Order '$saleOrder' for Item '$materialCode' not found against Plant '$plantcode'")
->danger()
->duration(5000)
->send();
$this->form->fill([
'document_number' => null,
'plant_id' => $plantId,
'sale_order_master_id' => $saleOrder,
'spare_packing_number' => $sparePackNo,
'Sno_quantity' => 0,
'created_by' => $operatorName,
'scanned_by' => $operatorName,
]);
return;
}
$alreadyScannedQty = SparePacking::where('sale_order_master_id', $saleOrderRecord->id)
->where('plant_id', $plantId)
->where('item_id', $itemId)
->selectRaw('SUM(CAST(quantity AS NUMERIC)) as total_weight')
->value('total_weight');
$totalQty = round((float)$alreadyScannedQty + (float)$weight, 3);
if($totalQty > round((float)$saleOrderRecord->quantity, 3))
{
Notification::make()
->title("Scanned Quantity Exceeds Sale Order Quantity")
->body("Scanned quantity '$weight' and already scanned quantity '$alreadyScannedQty' exceeds allowed quantity '{$saleOrderRecord->quantity}' for Sale Order '$saleOrderRecord->sale_order_number' and Item '$materialCode'")
->danger()
->duration(5000)
->send();
$this->form->fill([
'document_number' => null,
'plant_id' => $plantId,
'sale_order_master_id' => $saleOrder,
'item_id' => $itemId,
'spare_packing_number' => $sparePackNo,
'Sno_quantity' => 0,
'created_by' => $operatorName,
'scanned_by' => $operatorName,
]);
return;
}
try
{
$existingPallet = SparePacking::where('plant_id', $plantId)
->where('spare_packing_number', $sparePackNo)
->first();
$count = SparePacking::where('plant_id', $plantId)
->where('spare_packing_number', $sparePackNo)
->count('spare_packing_number');
$createdAt = $existingPallet ? $existingPallet->created_at : $clickedAt ?? now();
$createdBy = $existingPallet ? $existingPallet->created_by : $clickedBy ?? $operatorName;
$record = SparePacking::create([
'plant_id' => $plantId,
'item_id' => $itemId,
'spare_packing_number' => $sparePackNo,
'document_number' => $docNo,
'sale_order_master_id' => $saleOrderRecord->id,
'quantity' => $weight,
'created_by' => $createdBy,
'scanned_by' => $operatorName,
'created_at' => $createdAt,
'scanned_at' => now(),
'updated_by' => $operatorName,
]);
if ($record)
{
$this->snoCount = SparePacking::where('plant_id', $plantId)
->where('spare_packing_number', $sparePackNo)
->count();
$this->dispatch('loadData', $sparePackNo, $plantId);
$this->form->fill([
'plant_id' => $plantId,
'sale_order_master_id' => $saleOrder,
'item_id' => $itemId,
'spare_packing_number' => $sparePackNo,
'document_number' => null,
// 'pending_pallet_list' => $pendingPallet,
'Sno_quantity' => $this->snoCount,
'created_by' => $operatorName,
'scanned_by' => $operatorName,
]);
}
else
{
Notification::make()
->title("Failed to insert scanned serial number '$docNo' into wire master table!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', $sparePackNo, $plantId);
$this->form->fill([
'plant_id' => $plantId,
'sale_order_master_id' => $saleOrder,
'item_id' => $itemId,
'spare_packing_number' => $sparePackNo,
'document_number' => null,
// 'pending_pallet_list' => $pendingPallet,
'Sno_quantity' => $count,
'scanned_by' => $operatorName,
]);
return;
}
}
catch (\Exception $e)
{
Notification::make()
->title('Error: Serial not inserted.')
->body("Something went wrong while inserting document number '{$docNo}' into pallet table!\nScan the new document number to proceed...")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', $sparePackNo, $plantId);
$this->form->fill([
'plant_id' => $plantId,
'sale_order_master_id' => $saleOrder,
'spare_packing_number' => $sparePackNo,
'document_number' => null,
// 'pending_pallet_list' => $pendingPallet,
'Sno_quantity' => $count,
'created_by' => $operatorName,
'scanned_by' => $operatorName,
]);
return;
}
$this->dispatch('loadData', $sparePackNo, $plantId);
}
public function markAsComplete()
{
$plantId = $this->form->getState()['plant_id'];
$plantId = trim($plantId) ?? null;
$pendingPallet = $this->form->getState()['pending_pallet_list'];
$palletNumber = trim($this->form->getState()['spare_packing_number'])?? null;
$palletNumber = trim($palletNumber) ?? null;
$processOrder = trim($this->form->getState()['document_number'])?? null;
$processOrder = trim($processOrder) ?? null;
$user = Filament::auth()->user();
$operatorName = $user->name;
$isCompleted = $this->data['is_completed'] ?? false;
// $this->pendingPallet = $this->form->getState()['pending_pallet_list'];
if (! ($this->data['is_completed'] ?? false)) {
Notification::make()
->title('Completion required')
->body('Please check the "Is Completed" checkbox to finish master packing.')
->warning()
->duration(3000)
->send();
return;
}
$palletExist = SparePacking::where('spare_packing_number', $palletNumber)
->where('plant_id', $plantId)
->first();
if (!$palletExist)
{
Notification::make()
->title("Pallet number '$palletNumber' does not have process orders to save!<br>Add the valid process order into pallet number to proceed...")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', $palletNumber, $plantId);
$this->form->fill([
'document_number' => null,
'plant_id' => $plantId,
'spare_packing_number' => $palletNumber,
'pending_pallet_list' => $pendingPallet,
'Sno_quantity' => 0,
'created_by' => $operatorName,
'scanned_by' => $operatorName,
]);
return;
}
$allCompleted = SparePacking::where('plant_id', $plantId)
->where('spare_packing_number', $palletNumber)
->where('spare_packing_status', '=','Completed')
->first();
if ($allCompleted)
{
Notification::make()
->title("Spare Packing pallet number '$palletNumber' already completed the master packing!<br>Generate the new Spare Packing Pallet number or choose from pending pallet list!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', '', $plantId);
$this->form->fill([
'document_number' => null,
'plant_id' => $plantId,
'spare_packing_number' => null,
'pending_pallet_list' => null,//$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 (!$isCompleted)
{
$updated = SparePacking::where('spare_packing_number', $palletNumber)
->where('plant_id', $plantId)
->update([
'updated_at' => now(),
'updated_by' => $operatorName,
]);
if ($updated > 0)
{
Notification::make()
->title("Pallet number '$palletNumber' records saved successfully!")
->success()
->duration(800)
->send();
$this->dispatch('loadData', '', $plantId);
$this->form->fill([
'document_number' => null,
'plant_id' => $plantId,
'spare_packing_number' => null,//$palletNumber
'pending_pallet_list' => null,//$pendingPallet
'Sno_quantity' => 0,//$count,
'created_by' => $operatorName,
'scanned_by' => $operatorName,
]);
return;
}
}
else
{
$updated = SparePacking::where('spare_packing_number', $palletNumber)
->where('plant_id', $plantId)
->update([
'spare_packing_status' => 'Completed',
'updated_at' => now(),
'updated_by' => $operatorName,
]);
if ($updated > 0)
{
Notification::make()
->title("Pallet number '$palletNumber' completed the master packing successfully!")
->success()
->duration(800)
->send();
$this->dispatch('loadData', '', $plantId);
$this->form->fill([
'document_number' => null,
'plant_id' => $plantId,
'spare_packing_number' => null,//$palletNumber
'pending_pallet_list' => null,//$pendingPallet
'Sno_quantity' => 0,//$count
'created_by' => $operatorName,
'scanned_by' => $operatorName,
]);
return;
}
}
}
public function processPalletNo()
{
$plantId = $this->form->getState()['plant_id'];
$plantId = trim($plantId) ?? null;
$pendingPallet = $this->form->getState()['pending_pallet_list'];
$palletNumber = trim($this->form->getState()['spare_packing_number']) ?? null;
$saleOrder = trim($this->form->getState()['sale_order_master_id'])?? null;
$palletNumber = trim($palletNumber) ?? null;
$docNo = trim($this->form->getState()['document_number']) ?? null;
$docNo = trim($docNo) ?? null;
$user = Filament::auth()->user();
$operatorName = $user->name;
//$this->dispatch('loadData', $palletNumber, $plantId);
$this->form->fill([
'serial_number' => null,
'plant_id' => $plantId,
'sale_order_master_id' => $saleOrder,
'pallet_number' => $palletNumber,
'pending_pallet_list' => $pendingPallet,
'Sno_quantity' => 0,
'created_by' => $operatorName,
'scanned_by' => $operatorName,
]);
if (!$palletNumber)
{
Notification::make()
->title('Pallet number is required.')
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', '', $plantId);
$this->form->fill([
'document_number' => null,
'plant_id' => $plantId,
'sale_order_master_id' => $saleOrder,
'spare_packing_number' => $palletNumber,
'pending_pallet_list' => $pendingPallet,
'Sno_quantity' => 0,
'created_by' => $operatorName,
'scanned_by' => $operatorName,
]);
return;
}
if (strlen($palletNumber) < 10)
{
Notification::make()
->title("Pallet number '$palletNumber' must be at least 10 digits.")
->danger()
->duration(5000)
->send();
$this->dispatch('loadLocator' ,'',$plantId);
$this->form->fill([
'serial_number' => null,
'plant_id' => $plantId,
'sale_order_master_id' => $saleOrder,
'spare_packing_number' => $palletNumber,
'pending_pallet_list' => $pendingPallet,
'Sno_quantity' => 0,
'created_by' => $operatorName,
'scanned_by' => $operatorName,
]);
return;
}
$count = SparePacking::where('plant_id', $plantId)
->where('spare_packing_number', $palletNumber)
->count('spare_packing_number');
$palletNotCompleted = SparePacking::where('plant_id', $plantId)
->where('spare_packing_number', $palletNumber)
->where('spare_packing_status', '=','')
->orWhere('spare_packing_status', '=',null)
->first();
if (!$palletNotCompleted)
{
Notification::make()
->title("Pallet number not found $palletNumber!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', $palletNumber, $plantId);
$this->form->fill([
'document_number' => null,
'plant_id' => $plantId,
'sale_order_master_id' => $saleOrder,
'spare_packing_number' => $palletNumber,
'pending_pallet_list' => $pendingPallet,
'Sno_quantity' => $count,
'created_by' => $operatorName,
'scanned_by' => $operatorName,
]);
return;
}
$this->form->fill([
'document_number' => null,
'plant_id' => $plantId,
'sale_order_master_id' => $saleOrder,
'spare_packing_number' => $palletNumber,
'pending_pallet_list' => $pendingPallet,
'Sno_quantity' => $count,
'created_by' => $operatorName,
'scanned_by' => $operatorName,
]);
$this->dispatch('loadData', $palletNumber, $plantId);
}
public function processRemoveDocNo()
{
$plantId = $this->form->getState()['plant_id'];
$plantId = trim($plantId) ?? null;
$pendingPallet = $this->form->getState()['pending_pallet_list'];
$palletNumber = trim($this->form->getState()['spare_packing_number']) ?? null;
$customerPo = trim($this->form->getState()['sale_order_master_id'])?? null;
$palletNumber = trim($palletNumber) ?? null;
$docNo = trim($this->form->getState()['removeDoc_number']) ?? null;
$docNo = trim($docNo) ?? null;
$user = Filament::auth()->user();
$operatorName = $user->name;
if (!$palletNumber)
{
Notification::make()
->title('Spare Pallet number is required to remove.')
->danger()
->duration(5000)
->send();
return;
}
$pattern = '/^([^|]+)\|([^|]+)\|(\d+(\.\d+)?)$/i';
if (!preg_match($pattern, $docNo, $matches))
{
Notification::make()
->title("Scan Valid Qr code ")
->body("Expected Format : (MaterialCode|Document Number|Quantity)")
->danger()
->duration(5000)
->send();
$this->form->fill([
'document_number' => null,
'plant_id' => $plantId,
'sale_order_master_id' => $customerPo,
'spare_packing_number' => $palletNumber,
'Sno_quantity' => 0,
'created_by' => $operatorName,
'scanned_by' => $operatorName,
]);
return;
}
$materialCode = $matches[1];
$docNo = $matches[2];
$weight = $matches[3];
$count = SparePacking::where('plant_id', $plantId)
->where('spare_packing_number', $palletNumber)
->count('spare_packing_number');
if (!$docNo)
{
Notification::make()
->title('Document number is required to remove.')
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', $palletNumber, $plantId);
$this->form->fill([
'document_number' => null,
'plant_id' => $plantId,
'sale_order_master_id' => $customerPo,
'spare_packing_number' => $palletNumber,
'pending_pallet_list' => $pendingPallet,
'Sno_quantity' => $count,
'created_by' => $operatorName,
'scanned_by' => $operatorName,
]);
return;
}
$processOrderexist = SparePacking::where('plant_id', $plantId)
->where('document_number', $docNo)
->first();
if (!$processOrderexist)
{
Notification::make()
->title('Document number not exists in pallet table.')
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', $palletNumber, $plantId);
$this->form->fill([
'document_number' => null,
'plant_id' => $plantId,
'sale_order_master_id' => $customerPo,
'spare_packing_number' => $palletNumber,
'pending_pallet_list' => $pendingPallet,
'Sno_quantity' => $count,
'created_by' => $operatorName,
'scanned_by' => $operatorName,
]);
return;
}
$palletExist = SparePacking::where('plant_id', $plantId)
->where('document_number', $docNo)
->where('spare_packing_number', '!=', '')
->where('spare_packing_number', '!=', null)
->first();
if ($palletExist && $palletExist->spare_packing_number != $palletNumber)
{
Notification::make()
->title("Scanned document number exist in pallet number '$palletExist->spare_packing_number'.<br>Scan the valid exist document number to remove!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', $palletNumber, $plantId);
$this->form->fill([
'document_number' => null,
'plant_id' => $plantId,
'sale_order_master_id' => $customerPo,
'spare_packing_number' => $palletNumber,
'pending_pallet_list' => $pendingPallet,
'Sno_quantity' => $count,
'created_by' => $operatorName,
'scanned_by' => $operatorName,
]);
return;
}
$deleted = SparePacking::where('plant_id', $plantId)
->where('spare_packing_number', $palletNumber)
->where('document_number', $docNo)
->forceDelete();
if ($deleted)
{
Notification::make()
->title("Scanned document number '$docNo' successfully removed from pallet table!<br>Scan the next exist document number to remove...")
->success()
->duration(600)
->send();
$this->snoCount = SparePacking::where('plant_id', $plantId)
->where('spare_packing_number', $palletNumber)
->count();
$this->form->fill([
'plant_id' => $plantId,
'sale_order_master_id' => $customerPo,
'spare_packing_number' => $palletNumber,
'removeDoc_number' => null,
'pending_pallet_list' => $this->pendingPallet,
'Sno_quantity' => $this->snoCount,
'created_by' => $operatorName,
'scanned_by' => $operatorName,
]);
$this->dispatch('loadData', $palletNumber, $plantId);
}
else
{
Notification::make()
->title("Failed to remove scanned document number '$docNo' from master pallet!")
->danger()
->duration(5000)
->send();
$this->dispatch('loadData', $palletNumber, $plantId);
$this->form->fill([
'document_number' => null,
'plant_id' => $plantId,
'sale_order_master_id' => $customerPo,
'spare_packing_number' => $palletNumber,
'pending_pallet_list' => $pendingPallet,
'Sno_quantity' => $count,
'created_by' => $operatorName,
'scanned_by' => $operatorName,
]);
}
//$this->dispatch('removeSno', $serialNumber, $palletNumber, $plantId);
}
public function getFormActions(): array
{
return [];
}
}

View File

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

View File

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

View File

@@ -3241,7 +3241,7 @@ class CharacteristicsController extends Controller
$characteristicsData = ClassCharacteristic::where('gernr', $serialNumber)->where('item_id', $itemId)->where('machine_id', $machineId)->where('plant_id', $plantId)->get();
$remFields = ['id', 'plant_id', 'machine_id', 'item_id', 'gernr', 'zmm_codeclass', 'zmm_colour', 'zmm_grade', 'zmm_grwt_cable', 'zmm_grwt_pf', 'zmm_isivalve', 'zmm_isi_wc', 'zmm_length', 'zmm_license_cml_no', 'zmm_mfgmonyr', 'zmm_motoridentification', 'zmm_newt_cable', 'zmm_newt_pf', 'zmm_packtype', 'zmm_panel', 'zmm_pumpidentification', 'zmm_psettype', 'zmm_size', 'zmm_type', 'zmm_usp', 'created_at', 'updated_at', 'created_by', 'updated_by', 'deleted_at'];
$remFields = ['id', 'plant_id', 'machine_id', 'item_id', 'gernr', 'zmm_codeclass', 'zmm_colour', 'zmm_grade', 'zmm_grwt_cable', 'zmm_grwt_pf', 'zmm_isivalve', 'zmm_isi_wc', 'zmm_length', 'zmm_license_cml_no', 'zmm_mfgmonyr', 'zmm_motoridentification', 'zmm_newt_cable', 'zmm_newt_pf', 'zmm_packtype', 'zmm_panel', 'zmm_pumpidentification', 'zmm_psettype', 'zmm_size', 'zmm_type', 'zmm_usp', 'created_at', 'updated_at', 'created_by', 'updated_by', 'deleted_at', 'is_stopped', 'stopped_datetime', 'stopped_by'];
$filteredData = $characteristicsData->map(function ($char) use ($remFields) {
$charArray = $char->toArray();

File diff suppressed because it is too large Load Diff

View File

@@ -180,30 +180,40 @@ public $records = [];
$latestReworkRecord = PanelBoxValidation::where('plant_id', $this->data['plant_id'] ?? null)->where('serial_number', $this->data['serial_number'] ?? null)->latest()->first();
if($latestReworkRecord){
$qualityValidation = PanelBoxValidation::create([
'plant_id' => $this->data['plant_id'] ?? null,
'line_id' => $this->data['line_id'] ?? null,
'sticker_master_id' => $this->data['sticker_master_id'] ?? null,
'production_order' => $this->data['production_order'] ?? null,
'serial_number' => $this->data['serial_number'] ?? null,
'serial_number_panel' => $this->data['serial_number_panel'] ?? null,
'pack_slip_panel' => $this->data['pack_slip_panel'] ?? null,
'name_plate_panel' => $this->data['name_plate_panel'] ?? null,
'tube_sticker_panel' => $this->data['tube_sticker_panel'] ?? null,
'warranty_card_panel' => $this->data['warranty_card_panel'] ?? null,
'part_validation1' => $this->data['part_validation1'] ?? null,
'part_validation2' => $this->data['part_validation2'] ?? null,
'part_validation3' => $this->data['part_validation3'] ?? null,
'part_validation4' => $this->data['part_validation4'] ?? null,
'part_validation5' => $this->data['part_validation5'] ?? null,
'panel_box_supplier' => $this->data['panel_box_supplier'] ?? null,
'panel_box_serial_number' => $this->data['panel_box_serial_number'] ?? null,
'panel_box_code' => $this->data['panel_box_code'] ?? null,
'inspection_lot_number' => $this->data['inspection_lot_number'] ?? null,
'rework_count' => $latestReworkRecord ? ((int) $latestReworkRecord->rework_count + 1) : 0,
'created_by' => $this->data['created_by'] ?? null,
'updated_by' => $this->data['updated_by'] ?? null,
]);
try{
$qualityValidation = PanelBoxValidation::create([
'plant_id' => $this->data['plant_id'] ?? null,
'line_id' => $this->data['line_id'] ?? null,
'sticker_master_id' => $this->data['sticker_master_id'] ?? null,
'production_order' => $this->data['production_order'] ?? null,
'serial_number' => $this->data['serial_number'] ?? null,
'serial_number_panel' => $this->data['serial_number_panel'] ?? null,
'pack_slip_panel' => $this->data['pack_slip_panel'] ?? null,
'name_plate_panel' => $this->data['name_plate_panel'] ?? null,
'tube_sticker_panel' => $this->data['tube_sticker_panel'] ?? null,
'warranty_card_panel' => $this->data['warranty_card_panel'] ?? null,
'part_validation1' => $this->data['part_validation1'] ?? null,
'part_validation2' => $this->data['part_validation2'] ?? null,
'part_validation3' => $this->data['part_validation3'] ?? null,
'part_validation4' => $this->data['part_validation4'] ?? null,
'part_validation5' => $this->data['part_validation5'] ?? null,
'panel_box_supplier' => $this->data['panel_box_supplier'] ?? null,
'panel_box_serial_number' => $this->data['panel_box_serial_number'] ?? null,
'panel_box_code' => $this->data['panel_box_code'] ?? null,
'inspection_lot_number' => $this->data['inspection_lot_number'] ?? null,
'rework_count' => $latestReworkRecord ? ((int) $latestReworkRecord->rework_count + 1) : 0,
'created_by' => $this->data['created_by'] ?? null,
'updated_by' => $this->data['updated_by'] ?? null,
]);
}
catch (\Illuminate\Database\QueryException $e) {
Notification::make()
->title('Duplicate Record')
->body("Duplicate serial number found against doc number '{$this->data['production_order'] }' and inspection lot number '{$this->data['inspection_lot_number']}'.")
->danger()
->send();
return;
}
}
else{
$qualityValidation = PanelBoxValidation::create([
@@ -231,7 +241,6 @@ public $records = [];
]);
}
// $qualityValidation = PanelBoxValidation::create([
// 'plant_id' => $this->data['plant_id'] ?? null,
// 'line_id' => $this->data['line_id'] ?? null,
@@ -257,14 +266,12 @@ public $records = [];
// ]);
if (! $qualityValidation || ! $qualityValidation->exists) {
Notification::make()
->title('Failed to save Panel Box Validation')
->body('Something went wrong while inserting data.')
->danger()
->send();
return;
}

View File

@@ -0,0 +1,55 @@
<?php
namespace App\Livewire;
use App\Models\SparePacking;
use Livewire\Component;
class SparePackData extends Component
{
public $plantId;
public $sparePackNo;
public $snoCount = 0;
public $records = [];
protected $listeners = [
'loadData' => 'loadSparePackingData',
];
public function loadSparePackingData($sparePackNo, $plantId)
{
$this->plantId = $plantId;
$this->sparePackNo = $sparePackNo;
$this->records = [];
$this->records = SparePacking::query()
->where('plant_id', $this->plantId)
->where('spare_packing_number', $this->sparePackNo)
->orderBy('scanned_at')
->get()
->map(function ($record) {
return [
'created_at' => $record->created_at,
'created_by' => $record->created_by ?? '',
'spare_packing_number' => $record->spare_packing_number,
'item_code' => $record->item?->code ?? '',
'item_description' => $record->item?->description ?? '',
'document_number' => $record->document_number,
'quantity' => $record->quantity,
'scanned_at' => $record->scanned_at,
'scanned_by' => $record->scanned_by ?? '',
];
})
->toArray();
}
public function render()
{
return view('livewire.spare-pack-data');
}
}

View File

@@ -31,4 +31,9 @@ class PanelGrMaster extends Model
{
return $this->belongsTo(Item::class);
}
public function stickerMaster()
{
return $this->belongsTo(StickerMaster::class, 'sticker_master_id');
}
}

View File

@@ -94,6 +94,11 @@ class Plant extends Model
return $this->hasMany(PumpTestingEntry::class, 'plant_id', 'id');
}
public function pumpTestingResults()
{
return $this->hasMany(PumpTestingResult::class, 'plant_id', 'id');
}
public function guardNames()
{
return $this->hasMany(GuardName::class, 'plant_id', 'id');

View File

@@ -59,4 +59,9 @@ class PumpTestingMaster extends Model
{
return $this->hasMany(PumpTestingEntry::class, 'pump_testing_master_id', 'id');
}
public function pumpTestingResults()
{
return $this->hasMany(PumpTestingResult::class, 'pump_testing_master_id', 'id');
}
}

View File

@@ -0,0 +1,47 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class PumpTestingResult extends Model
{
use SoftDeletes;
protected $fillable = [
'plant_id',
'pump_testing_master_id',
'tested_date',
'tested_type',
'pump_serial_number',
'correction_head',
'sl_no',
'voltage',
'current',
'watt',
'frequency',
'speed',
'discharge',
'head',
'pump_output',
'power_p2',
'overall_efficiency',
'pump_efficiency',
'created_at',
'created_by',
'updated_at',
'updated_by',
];
public function plant(): BelongsTo
{
return $this->belongsTo(Plant::class);
}
public function pumpTestingMasters(): BelongsTo
{
return $this->belongsTo(PumpTestingMaster::class, 'pump_testing_master_id', 'id');
}
}

View File

@@ -0,0 +1,32 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class SaleOrderMaster extends Model
{
use SoftDeletes;
protected $fillable = [
'plant_id',
'item_id',
'sale_order_number',
'supplier_name',
'quantity',
'created_by',
'updated_by'
];
public function plant(): BelongsTo
{
return $this->belongsTo(Plant::class);
}
public function item(): BelongsTo
{
return $this->belongsTo(Item::class);
}
}

View File

@@ -0,0 +1,44 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;
class SparePacking extends Model
{
use SoftDeletes;
protected $fillable = [
'plant_id',
'item_id',
'sale_order_master_id',
'spare_packing_number',
'document_number',
'batch_number',
'quantity',
'spare_packing_status',
'created_at',
'created_by',
'updated_at',
'updated_by',
'scanned_at',
'scanned_by',
];
public function plant(): BelongsTo
{
return $this->belongsTo(Plant::class);
}
public function item(): BelongsTo
{
return $this->belongsTo(Item::class, 'item_id');
}
public function saleOrder(): BelongsTo
{
return $this->belongsTo(SaleOrderMaster::class, 'sale_order_master_id');
}
}

View File

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

View File

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

View File

@@ -0,0 +1,61 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
$sql = <<<'SQL'
CREATE TABLE pump_testing_results (
id BIGINT GENERATED always AS IDENTITY PRIMARY KEY,
plant_id BIGINT NOT NULL,
pump_testing_master_id BIGINT NOT NULL,
tested_date DATE NOT NULL DEFAULT CURRENT_DATE,
tested_type TEXT DEFAULT NULL,
pump_serial_number TEXT DEFAULT NULL,
correction_head TEXT DEFAULT NULL,
sl_no TEXT DEFAULT NULL,
voltage TEXT DEFAULT NULL,
current TEXT DEFAULT NULL,
watt TEXT DEFAULT NULL,
frequency TEXT DEFAULT NULL,
speed TEXT DEFAULT NULL,
discharge TEXT DEFAULT NULL,
head TEXT DEFAULT NULL,
pump_output TEXT DEFAULT NULL,
power_p2 TEXT DEFAULT NULL,
overall_efficiency TEXT DEFAULT NULL,
pump_efficiency TEXT DEFAULT NULL,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW(),
deleted_at TIMESTAMP,
created_by TEXT NOT NULL,
updated_by TEXT NOT NULL,
UNIQUE (plant_id, pump_testing_master_id, tested_type, pump_serial_number, sl_no),
FOREIGN KEY (pump_testing_master_id) REFERENCES pump_testing_masters (id),
FOREIGN KEY (plant_id) REFERENCES plants (id)
);
SQL;
DB::statement($sql);
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('pump_testing_results');
}
};

View File

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

View File

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

View File

@@ -0,0 +1,32 @@
<x-filament::page>
<div class="filament-form space-y-6">
{{ $this->form }}
</div>
<div class="bg-white shadow rounded-xl p-4">
<livewire:spare-pack-data />
</div>
<div class="filament-actions mt-6">
<x-filament::actions>
@foreach ($this->getFormActions() as $action)
{{ $action }}
@endforeach
</x-filament::actions>
</div>
@push('scripts')
<script>
window.addEventListener('open-pdf', event => {
const url = event.detail.url;
const win = window.open(url, '_blank');
if (!win || win.closed || typeof win.closed == 'undefined') {
alert('Popup blocked. Please allow popups for this site.');
}
});
</script>
@endpush
</x-filament::page>

View File

@@ -0,0 +1,19 @@
<div class="flex flex-col items-start space-y-1">
<div class="flex items-center">
<input
type="checkbox"
id="is_completed"
wire:model.defer="data.is_completed"
class="focus:outline-none focus:ring-0 focus:border-transparent border-gray-300"
>
<label for="is_completed" style="margin-left:2mm;" class="whitespace-nowrap mb-0">
Is Completed!
</label>
</div>
<button
type="button"
wire:click="markAsComplete"
class="px-2 py-1 border border-primary-500 text-primary-600 rounded hover:bg-primary-50 hover:border-primary-700 transition text-sm"
>
Save Pallet
</button>

View File

@@ -0,0 +1,47 @@
<div class="p-4">
<h2 class="text-lg font-bold mb-4 text-gray-700 uppercase tracking-wider">
SPARE PACKING DATA TABLE:
</h2>
<div class="overflow-x-auto rounded-lg shadow">
<table class="w-full divide-y divide-gray-200 text-sm text-center">
<thead class="bg-gray-100 text-s font-semibold uppercase text-gray-700">
<tr>
<th class="border px-4 py-2">No</th>
<th class="border px-4 py-2">Created Datetime</th>
<th class="border px-4 py-2 whitespace-nowrap">Created By</th>
<th class="border px-4 py-2 whitespace-nowrap">S PACKING No</th>
<th class="border px-4 py-2 whitespace-nowrap">Item Code</th>
<th class="border px-4 py-2">Description</th>
<th class="border px-4 py-2">Doc No</th>
<th class="border px-4 py-2">Quantity</th>
<th class="border px-4 py-2">Scanned Datetime</th>
<th class="border px-4 py-2 whitespace-nowrap">Scanned By</th>
</tr>
</thead>
<tbody class="divide-y divide-gray-100">
@forelse ($records as $index => $record)
<tr class="hover:bg-gray-50">
<td class="border px-4 py-2">{{ $index + 1 }}</td>
<td class="border px-4 py-2 whitespace-nowrap">{{ $record['created_at'] ?? '-' }}</td>
<td class="border px-4 py-2 whitespace-nowrap">{{ $record['created_by'] ?? '-' }}</td>
<td class="border px-4 py-2 whitespace-nowrap">{{ $record['spare_packing_number'] ?? '-' }}</td>
<td class="border px-4 py-2">{{ $record['item_code'] ?? '-' }}</td>
<td class="border px-4 py-2 whitespace-nowrap">{{ $record['item_description'] ?? '-' }}</td>
<td class="border px-4 py-2 whitespace-nowrap">{{ $record['document_number'] ?? '-' }}</td>
<td class="border px-4 py-2">{{ $record['quantity'] ?? '-' }}</td>
<td class="border px-4 py-2 whitespace-nowrap">{{ $record['scanned_at'] ?? '-' }}</td>
<td class="border px-4 py-2">{{ $record['scanned_by'] ?? '-' }}</td>
</tr>
@empty
<tr>
<td colspan="10" class="px-4 py-4 text-center text-gray-500">
No spare packing records found.
</td>
</tr>
@endforelse
</tbody>
</table>
</div>
</div>

View File

@@ -158,8 +158,12 @@ Route::get('testing/pump-master/get', [TestingPanelController::class, 'get_pump_
Route::get('testing/pump-entry/get', [TestingPanelController::class, 'get_pump_entry']);
Route::post('testing/pump-entry/store-data', [TestingPanelController::class, 'storePumpEntry']);
Route::get('testing/pump-result/get', [TestingPanelController::class, 'get_pump_result']);
Route::post('testing/pump-result/store-data', [TestingPanelController::class, 'storePumpResult']);
// Testing panel Controller
Route::get('testing/user/get-data', [UserController::class, 'get_user_data']);