ranjith-dev #476

Merged
jothi merged 2 commits from ranjith-dev into master 2026-03-11 14:07:21 +00:00
6 changed files with 379 additions and 381 deletions

View File

@@ -14,6 +14,7 @@ class StockDataMasterExporter extends Exporter
public static function getColumns(): array public static function getColumns(): array
{ {
static $rowNumber = 0; static $rowNumber = 0;
return [ return [
ExportColumn::make('no') ExportColumn::make('no')
->label('NO') ->label('NO')
@@ -29,7 +30,7 @@ class StockDataMasterExporter extends Exporter
->label('TYPE') ->label('TYPE')
->formatStateUsing(fn ($state) => match ($state) { ->formatStateUsing(fn ($state) => match ($state) {
'0' => 'FG', '0' => 'FG',
'1' => 'SFG', '1' => 'NON-FG',
default => '-', default => '-',
}), }),
ExportColumn::make('location') ExportColumn::make('location')
@@ -93,7 +94,7 @@ class StockDataMasterExporter extends Exporter
$scanned = $record->scanned_quantity ?? 0; $scanned = $record->scanned_quantity ?? 0;
return $scanned + $duplicate + $notInStock; return $scanned + $duplicate + $notInStock;
}), }),
ExportColumn::make('stock_difference') ExportColumn::make('stock_difference')
->label('STOCK DIFFERENCE COUNT') ->label('STOCK DIFFERENCE COUNT')
@@ -114,7 +115,7 @@ class StockDataMasterExporter extends Exporter
$difference = $physicalStock - $systemStock; $difference = $physicalStock - $systemStock;
return max($difference, 0); return max($difference, 0);
}), }),
ExportColumn::make('created_at') ExportColumn::make('created_at')
->label('CREATED AT'), ->label('CREATED AT'),
ExportColumn::make('updated_at') ExportColumn::make('updated_at')
@@ -131,10 +132,10 @@ class StockDataMasterExporter extends Exporter
public static function getCompletedNotificationBody(Export $export): string public static function getCompletedNotificationBody(Export $export): string
{ {
$body = 'Your stock data master export has completed and ' . number_format($export->successful_rows) . ' ' . str('row')->plural($export->successful_rows) . ' exported.'; $body = 'Your stock data master export has completed and '.number_format($export->successful_rows).' '.str('row')->plural($export->successful_rows).' exported.';
if ($failedRowsCount = $export->getFailedRowsCount()) { if ($failedRowsCount = $export->getFailedRowsCount()) {
$body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to export.'; $body .= ' '.number_format($failedRowsCount).' '.str('row')->plural($failedRowsCount).' failed to export.';
} }
return $body; return $body;

View File

@@ -6,12 +6,12 @@ use App\Models\Item;
use App\Models\Plant; use App\Models\Plant;
use App\Models\StickerMaster; use App\Models\StickerMaster;
use App\Models\StockDataMaster; use App\Models\StockDataMaster;
use Filament\Actions\Imports\Exceptions\RowImportFailedException;
use Filament\Actions\Imports\ImportColumn; use Filament\Actions\Imports\ImportColumn;
use Filament\Actions\Imports\Importer; use Filament\Actions\Imports\Importer;
use Filament\Actions\Imports\Models\Import; use Filament\Actions\Imports\Models\Import;
use Filament\Facades\Filament; use Filament\Facades\Filament;
use Str; use Str;
use Filament\Actions\Imports\Exceptions\RowImportFailedException;
class StockDataMasterImporter extends Importer class StockDataMasterImporter extends Importer
{ {
@@ -23,46 +23,46 @@ class StockDataMasterImporter extends Importer
ImportColumn::make('plant') ImportColumn::make('plant')
->requiredMapping() ->requiredMapping()
->exampleHeader('PLANT CODE') ->exampleHeader('PLANT CODE')
->example('1000') ->examples(['1000', '1000'])
->label('PLANT CODE') ->label('PLANT CODE')
->relationship(resolveUsing: 'code') ->relationship(resolveUsing: 'code')
->rules(['required']), ->rules(['required']),
ImportColumn::make('type') ImportColumn::make('type')
->requiredMapping() ->requiredMapping()
->exampleHeader('TYPE') ->exampleHeader('TYPE')
->example('FG/SFG') ->examples(['FG', 'NON-FG'])
->label('TYPE'), ->label('TYPE'),
ImportColumn::make('location') ImportColumn::make('location')
->requiredMapping() ->requiredMapping()
->exampleHeader('LOCATION') ->exampleHeader('LOCATION')
->example('2001') ->examples(['2001', '2002'])
->label('LOCATION') ->label('LOCATION')
->rules(['required']), ->rules(['required']),
ImportColumn::make('item_reference')// stickerMaster ImportColumn::make('item_reference')
->requiredMapping() ->requiredMapping()
->exampleHeader('ITEM CODE') ->exampleHeader('ITEM CODE')
->example('123456') ->examples(['123456', '246118'])
->label('ITEM CODE') ->label('ITEM CODE')
->rules(['required']), ->rules(['required']),
ImportColumn::make('serial_number') ImportColumn::make('serial_number')
->requiredMapping() ->requiredMapping()
->exampleHeader('SERIAL NUMBER') ->exampleHeader('SERIAL NUMBER')
->example('200235236622') ->examples(['200235236622', '200235236623'])
->label('SERIAL NUMBER'), ->label('SERIAL NUMBER'),
ImportColumn::make('batch') ImportColumn::make('batch')
->requiredMapping() ->requiredMapping()
->exampleHeader('BATCH') ->exampleHeader('BATCH')
->example('20102') ->examples(['20102', '20103'])
->label('BATCH'), ->label('BATCH'),
ImportColumn::make('quantity') ImportColumn::make('quantity')
->requiredMapping() ->requiredMapping()
->exampleHeader('QUANTITY') ->exampleHeader('QUANTITY')
->example('1') ->examples(['1', '1'])
->label('QUANTITY'), ->label('QUANTITY'),
ImportColumn::make('doc_no') ImportColumn::make('doc_no')
->requiredMapping() ->requiredMapping()
->exampleHeader('DOCUMENT NUMBER') ->exampleHeader('DOCUMENT NUMBER')
->example('156566') ->examples(['82128', '21222'])
->label('DOCUMENT NUMBER'), ->label('DOCUMENT NUMBER'),
]; ];
} }
@@ -86,26 +86,21 @@ class StockDataMasterImporter extends Importer
$operatorName = $user->name; $operatorName = $user->name;
if ($plantCod == null || $plantCod == '') { if ($plantCod == null || $plantCod == '') {
$warnMsg[] = "Plant code can't be empty!"; $warnMsg[] = "Plant code can't be empty!";
} } elseif ($typeValue == null || $typeValue == '') {
else if ($typeValue == null || $typeValue == '') {
$warnMsg[] = "Type can't be empty!"; $warnMsg[] = "Type can't be empty!";
} } elseif ($iCode == null || $iCode == '') {
else if ($iCode == null || $iCode == '') {
$warnMsg[] = "Item code can't be empty!"; $warnMsg[] = "Item code can't be empty!";
} } elseif ($location == null || $location == '') {
else if ($location == null || $location == '') {
$warnMsg[] = "Location can't be empty!"; $warnMsg[] = "Location can't be empty!";
} } elseif ($serialNumber == null || $serialNumber == '') {
else if ($serialNumber == null || $serialNumber == '') {
$warnMsg[] = "Serial number can't be empty!"; $warnMsg[] = "Serial number can't be empty!";
} }
// else if ($batch == null || $batch == '') { // else if ($batch == null || $batch == '') {
// $warnMsg[] = "Batch can't be empty!"; // $warnMsg[] = "Batch can't be empty!";
// } // }
else if ($quantity == null || $quantity == '') { elseif ($quantity == null || $quantity == '') {
$warnMsg[] = "Quantity can't be empty!"; $warnMsg[] = "Quantity can't be empty!";
} }
// else if ($docNo == null || $docNo == '') { // else if ($docNo == null || $docNo == '') {
@@ -152,33 +147,27 @@ class StockDataMasterImporter extends Importer
$typeValue = strtoupper($typeValue); $typeValue = strtoupper($typeValue);
if (! in_array($typeValue, ['FG', 'SFG'])) { if (! in_array($typeValue, ['FG', 'NON-FG'])) {
$warnMsg[] = 'Invalid type found! It should be either FG or SFG and fg/sfg.'; $warnMsg[] = 'Invalid type found! It should be either FG or NON-FG.';
} } elseif (Str::length($location) < 4) {
else if (Str::length($location) < 4) {
$warnMsg[] = 'Location should contain minimum 4 digits!'; $warnMsg[] = 'Location should contain minimum 4 digits!';
} } elseif (! ctype_digit((string) $location)) {
else if (! ctype_digit((string) $location)) {
$warnMsg[] = 'Location must be an integer!'; $warnMsg[] = 'Location must be an integer!';
} } elseif (Str::length($serialNumber) < 9) {
else if (Str::length($serialNumber) < 9) {
$warnMsg[] = 'Serial number should contain minimum 9 digits!'; $warnMsg[] = 'Serial number should contain minimum 9 digits!';
} } elseif (! ctype_alnum($serialNumber)) {
else if (!ctype_alnum($serialNumber)) {
$warnMsg[] = 'Serial number should contain alpha-numeric values!'; $warnMsg[] = 'Serial number should contain alpha-numeric values!';
} } elseif (! ctype_digit((string) $quantity) || (int) $quantity <= 0) {
else if (! ctype_digit((string) $quantity) || (int) $quantity <= 0) {
$warnMsg[] = 'Quantity must be an integer and greater than 0!'; $warnMsg[] = 'Quantity must be an integer and greater than 0!';
} }
if($batch){ if ($batch) {
if (Str::length($batch) < 5) { if (Str::length($batch) < 5) {
$warnMsg[] = 'Batch should contain minimum 5 digits!'; $warnMsg[] = 'Batch should contain minimum 5 digits!';
} }
} }
if($docNo){ if ($docNo) {
if (Str::length($docNo) < 5) { if (Str::length($docNo) < 5) {
$warnMsg[] = 'Document number contain minimum 5 digits!'; $warnMsg[] = 'Document number contain minimum 5 digits!';
} }
@@ -190,7 +179,7 @@ class StockDataMasterImporter extends Importer
$type = match ($typeValue) { $type = match ($typeValue) {
'FG' => '0', 'FG' => '0',
'SFG' => '1', 'NON-FG' => '1',
default => null, default => null,
}; };
@@ -199,7 +188,7 @@ class StockDataMasterImporter extends Importer
$record = StockDataMaster::where([ $record = StockDataMaster::where([
'plant_id' => $plantId, 'plant_id' => $plantId,
'sticker_master_id' => $stickId, 'sticker_master_id' => $stickId,
'serial_number' => $serialNumber 'serial_number' => $serialNumber,
])->first(); ])->first();
if ($record) { if ($record) {
@@ -234,10 +223,10 @@ class StockDataMasterImporter extends Importer
public static function getCompletedNotificationBody(Import $import): string public static function getCompletedNotificationBody(Import $import): string
{ {
$body = 'Your stock data master import has completed and ' . number_format($import->successful_rows) . ' ' . str('row')->plural($import->successful_rows) . ' imported.'; $body = 'Your stock data master import has completed and '.number_format($import->successful_rows).' '.str('row')->plural($import->successful_rows).' imported.';
if ($failedRowsCount = $import->getFailedRowsCount()) { if ($failedRowsCount = $import->getFailedRowsCount()) {
$body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to import.'; $body .= ' '.number_format($failedRowsCount).' '.str('row')->plural($failedRowsCount).' failed to import.';
} }
return $body; return $body;

File diff suppressed because it is too large Load Diff

View File

@@ -3,7 +3,6 @@
namespace App\Filament\Resources; namespace App\Filament\Resources;
use App\Filament\Resources\DuplicateStockResource\Pages; use App\Filament\Resources\DuplicateStockResource\Pages;
use App\Filament\Resources\DuplicateStockResource\RelationManagers;
use App\Models\DuplicateStock; use App\Models\DuplicateStock;
use Filament\Facades\Filament; use Filament\Facades\Filament;
use Filament\Forms; use Filament\Forms;
@@ -97,7 +96,7 @@ class DuplicateStockResource extends Resource
->searchable() ->searchable()
->formatStateUsing(fn ($state) => match ($state) { ->formatStateUsing(fn ($state) => match ($state) {
'0' => 'FG', '0' => 'FG',
'1' => 'SFG', '1' => 'NON-FG',
default => '-', default => '-',
}) })
->sortable(), ->sortable(),

View File

@@ -3,7 +3,6 @@
namespace App\Filament\Resources; namespace App\Filament\Resources;
use App\Filament\Resources\NotInStockResource\Pages; use App\Filament\Resources\NotInStockResource\Pages;
use App\Filament\Resources\NotInStockResource\RelationManagers;
use App\Models\NotInStock; use App\Models\NotInStock;
use App\Models\StickerMaster; use App\Models\StickerMaster;
use Filament\Facades\Filament; use Filament\Facades\Filament;
@@ -38,15 +37,15 @@ class NotInStockResource extends Resource
->required() ->required()
->searchable() ->searchable()
->options(function ($get) { ->options(function ($get) {
if (!$get('plant_id')) { if (! $get('plant_id')) {
return []; return [];
} }
return StickerMaster::with('item') return StickerMaster::with('item')
->where('plant_id', $get('plant_id')) ->where('plant_id', $get('plant_id'))
->get() ->get()
->pluck('item.code', 'id') ->pluck('item.code', 'id')
->toArray(); ->toArray();
}), }),
Forms\Components\TextInput::make('location') Forms\Components\TextInput::make('location')
->label('Location'), ->label('Location'),
@@ -64,7 +63,7 @@ class NotInStockResource extends Resource
->label('Type') ->label('Type')
->options([ ->options([
'0' => 'FG', '0' => 'FG',
'1' => 'SFG', '1' => 'NON-FG',
]), ]),
Forms\Components\TextInput::make('motor_scanned_status') Forms\Components\TextInput::make('motor_scanned_status')
->label('Motor Scanned Status'), ->label('Motor Scanned Status'),
@@ -122,7 +121,7 @@ class NotInStockResource extends Resource
->searchable() ->searchable()
->formatStateUsing(fn ($state) => match ($state) { ->formatStateUsing(fn ($state) => match ($state) {
'0' => 'FG', '0' => 'FG',
'1' => 'SFG', '1' => 'NON-FG',
default => '-', default => '-',
}) })
->sortable(), ->sortable(),

View File

@@ -5,28 +5,26 @@ namespace App\Filament\Resources;
use App\Filament\Exports\StockDataMasterExporter; use App\Filament\Exports\StockDataMasterExporter;
use App\Filament\Imports\StockDataMasterImporter; use App\Filament\Imports\StockDataMasterImporter;
use App\Filament\Resources\StockDataMasterResource\Pages; use App\Filament\Resources\StockDataMasterResource\Pages;
use App\Filament\Resources\StockDataMasterResource\RelationManagers;
use App\Models\Item; use App\Models\Item;
use App\Models\Plant; use App\Models\Plant;
use App\Models\SerialValidation;
use App\Models\StickerMaster; use App\Models\StickerMaster;
use App\Models\StockDataMaster; use App\Models\StockDataMaster;
use Filament\Facades\Filament; use Filament\Facades\Filament;
use Filament\Forms; use Filament\Forms;
use Filament\Forms\Components\DateTimePicker;
use Filament\Forms\Components\Radio;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Form; use Filament\Forms\Form;
use Filament\Notifications\Notification;
use Filament\Resources\Resource; use Filament\Resources\Resource;
use Filament\Tables; 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\ExportAction;
use Filament\Tables\Actions\ImportAction; use Filament\Tables\Actions\ImportAction;
use Filament\Tables\Filters\Filter; use Filament\Tables\Filters\Filter;
use Filament\Forms\Components\Select; use Filament\Tables\Table;
use Filament\Forms\Components\TextInput; use Illuminate\Database\Eloquent\Builder;
use Filament\Forms\Components\DateTimePicker; use Illuminate\Database\Eloquent\SoftDeletingScope;
use Filament\Forms\Components\Radio;
use Filament\Notifications\Notification;
class StockDataMasterResource extends Resource class StockDataMasterResource extends Resource
{ {
@@ -51,15 +49,15 @@ class StockDataMasterResource extends Resource
->required() ->required()
->searchable() ->searchable()
->options(function ($get) { ->options(function ($get) {
if (!$get('plant_id')) { if (! $get('plant_id')) {
return []; return [];
} }
return StickerMaster::with('item') return StickerMaster::with('item')
->where('plant_id', $get('plant_id')) ->where('plant_id', $get('plant_id'))
->get() ->get()
->pluck('item.code', 'id') ->pluck('item.code', 'id')
->toArray(); ->toArray();
}), }),
Forms\Components\TextInput::make('location') Forms\Components\TextInput::make('location')
->label('Location'), ->label('Location'),
@@ -77,7 +75,7 @@ class StockDataMasterResource extends Resource
->label('Type') ->label('Type')
->options([ ->options([
'0' => 'FG', '0' => 'FG',
'1' => 'SFG', '1' => 'NON-FG',
]), ]),
Forms\Components\TextInput::make('motor_scanned_status') Forms\Components\TextInput::make('motor_scanned_status')
->label('Motor Scanned Status'), ->label('Motor Scanned Status'),
@@ -135,7 +133,7 @@ class StockDataMasterResource extends Resource
->searchable() ->searchable()
->formatStateUsing(fn ($state) => match ($state) { ->formatStateUsing(fn ($state) => match ($state) {
'0' => 'FG', '0' => 'FG',
'1' => 'SFG', '1' => 'NON-FG',
default => '-', default => '-',
}) })
->sortable(), ->sortable(),
@@ -258,27 +256,27 @@ class StockDataMasterResource extends Resource
return $scanned + $duplicate + $notInStock; return $scanned + $duplicate + $notInStock;
}), }),
Tables\Columns\TextColumn::make('stock_difference') Tables\Columns\TextColumn::make('stock_difference')
->label('Stock Difference Count') ->label('Stock Difference Count')
->alignCenter() ->alignCenter()
->getStateUsing(function ($record) { ->getStateUsing(function ($record) {
$duplicate = \App\Models\DuplicateStock::where('stock_data_master_id', $record->id)->count(); $duplicate = \App\Models\DuplicateStock::where('stock_data_master_id', $record->id)->count();
$notInStock = \App\Models\NotInStock::where('serial_number', $record->serial_number) $notInStock = \App\Models\NotInStock::where('serial_number', $record->serial_number)
->where('plant_id', $record->plant_id) ->where('plant_id', $record->plant_id)
->count(); ->count();
$scanned = (int) $record->scanned_quantity; $scanned = (int) $record->scanned_quantity;
$physicalStock = $scanned + $duplicate + $notInStock; $physicalStock = $scanned + $duplicate + $notInStock;
$systemStock = (int) $record->quantity; $systemStock = (int) $record->quantity;
$difference = $physicalStock - $systemStock; $difference = $physicalStock - $systemStock;
return max($difference, 0); // prevents negative values return max($difference, 0); // prevents negative values
}), }),
Tables\Columns\TextColumn::make('created_at') Tables\Columns\TextColumn::make('created_at')
->label('Created At') ->label('Created At')
->alignCenter() ->alignCenter()
@@ -307,7 +305,7 @@ class StockDataMasterResource extends Resource
->label('Stock Type') ->label('Stock Type')
->options([ ->options([
'0' => 'FG', '0' => 'FG',
'1' => 'SFG', '1' => 'NON-FG',
]) ])
->inline() ->inline()
->default('0') ->default('0')
@@ -346,6 +344,7 @@ class StockDataMasterResource extends Resource
if (empty($pId)) { if (empty($pId)) {
return []; return [];
} }
return Item::whereHas('stickerMasters', function ($query) use ($pId) { return Item::whereHas('stickerMasters', function ($query) use ($pId) {
if ($pId) { if ($pId) {
$query->where('plant_id', $pId); $query->where('plant_id', $pId);
@@ -389,7 +388,7 @@ class StockDataMasterResource extends Resource
->native(false), ->native(false),
]) ])
->query(function ($query, array $data) { ->query(function ($query, array $data) {
if (!isset($data['type']) && (empty($data['Plant']) && empty($data['location']) && empty($data['serial_number']) && empty($data['created_from']) && empty($data['created_to']) && empty($data['updated_by']) && empty($data['scanned_status']) && empty($data['sticker_master_id']))) { if (! isset($data['type']) && (empty($data['Plant']) && empty($data['location']) && empty($data['serial_number']) && empty($data['created_from']) && empty($data['created_to']) && empty($data['updated_by']) && empty($data['scanned_status']) && empty($data['sticker_master_id']))) {
if (empty($data['type'])) { if (empty($data['type'])) {
Notification::make() Notification::make()
@@ -397,16 +396,17 @@ class StockDataMasterResource extends Resource
->danger() ->danger()
->send(); ->send();
} }
return $query->whereRaw('1 = 0'); return $query->whereRaw('1 = 0');
} }
if($data['type'] != ''){ if ($data['type'] != '') {
if ($data['type'] == '0') { if ($data['type'] == '0') {
$query->where('type', '0'); $query->where('type', '0');
if (!empty($data['scanned_status'])) { if (! empty($data['scanned_status'])) {
if ($data['scanned_status'] == 'Scanned') { if ($data['scanned_status'] == 'Scanned') {
$query->whereNotNull('scanned_status') $query->whereNotNull('scanned_status')
@@ -428,32 +428,31 @@ class StockDataMasterResource extends Resource
if ($data['scanned_status'] == 'Scanned') { if ($data['scanned_status'] == 'Scanned') {
$query->whereNotNull('scanned_status') $query->whereNotNull('scanned_status')
->where('scanned_status', '!=', ''); ->where('scanned_status', '!=', '');
} elseif ($data['scanned_status'] == 'Pending') { } elseif ($data['scanned_status'] == 'Pending') {
$query->where(function ($q) { $query->where(function ($q) {
$q->whereNull('scanned_status') $q->whereNull('scanned_status')
->orWhere('scanned_status', '!=', 'Scanned'); ->orWhere('scanned_status', '!=', 'Scanned');
}); });
} }
} }
} }
} } else {
else{
if ($data['scanned_status']) { if ($data['scanned_status']) {
if ($data['scanned_status'] == 'Scanned') { if ($data['scanned_status'] == 'Scanned') {
$query->whereNotNull('scanned_status') $query->whereNotNull('scanned_status')
->where('scanned_status', '!=', ''); ->where('scanned_status', '!=', '');
} elseif ($data['scanned_status'] == 'Pending') { } elseif ($data['scanned_status'] == 'Pending') {
$query->where(function ($q) { $query->where(function ($q) {
$q->whereNull('scanned_status') $q->whereNull('scanned_status')
->orWhere('scanned_status', '!=', 'Scanned'); ->orWhere('scanned_status', '!=', 'Scanned');
}); });
} }
} }