Compare commits
1 Commits
6169625b67
...
renovate/a
| Author | SHA1 | Date | |
|---|---|---|---|
| 909aa46a92 |
@@ -337,7 +337,7 @@ class Scheduler extends Command
|
||||
}
|
||||
break;
|
||||
case 'Daily':
|
||||
if (now()->format('H:i') == '08:00') {
|
||||
if (now()->format('H:i') == '11:10') {
|
||||
try {
|
||||
\Artisan::call('send-import-transit', [
|
||||
'schedule_type' => $rule->schedule_type,
|
||||
|
||||
@@ -7,8 +7,6 @@ use App\Models\AlertMailRule;
|
||||
use App\Models\ImportTransit;
|
||||
use App\Models\Plant;
|
||||
use Illuminate\Console\Command;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
use App\Exports\ImportTransitReportExport;
|
||||
|
||||
class SendImportTransit extends Command
|
||||
{
|
||||
@@ -53,14 +51,44 @@ class SendImportTransit extends Command
|
||||
return;
|
||||
}
|
||||
|
||||
$tableData = ImportTransit::where('status', '!=', 'Delivered')->orderByRaw("
|
||||
CASE
|
||||
WHEN cri_rfq_number ~ '[0-9]+'
|
||||
THEN CAST(regexp_replace(cri_rfq_number, '[^0-9]', '', 'g') AS INTEGER)
|
||||
ELSE NULL
|
||||
END NULLS LAST
|
||||
")->get();
|
||||
// $todayRecordExists = ImportTransit::whereDate('created_at', now()->toDateString())->first();
|
||||
|
||||
// if (!$todayRecordExists) {
|
||||
// $this->info('No records created today. Mail not sent.');
|
||||
// return;
|
||||
// }
|
||||
|
||||
$tableData = ImportTransit::select([
|
||||
'cri_rfq_number',
|
||||
'mail_received_date',
|
||||
'pricol_ref_number',
|
||||
'requester',
|
||||
'shipper',
|
||||
'shipper_location',
|
||||
'shipper_invoice',
|
||||
'shipper_invoice_date',
|
||||
'customs_agent_name',
|
||||
'eta_date',
|
||||
'status',
|
||||
'delivery_location',
|
||||
'etd_date',
|
||||
'mode',
|
||||
'inco_terms',
|
||||
'port_of_loading',
|
||||
'port_of_discharge',
|
||||
'delivery_city',
|
||||
'packages',
|
||||
'type_of_package',
|
||||
'gross_weight',
|
||||
'volume',
|
||||
'bill_number',
|
||||
'bill_received_date',
|
||||
'vessel_number',
|
||||
'remark',
|
||||
'is_transit_identified',
|
||||
])
|
||||
->where('status', '!=', 'Delivered')
|
||||
->get();
|
||||
|
||||
if ($tableData->isEmpty()) {
|
||||
$this->info('No pending Import Transit records found. Mail skipped.');
|
||||
@@ -73,19 +101,10 @@ class SendImportTransit extends Command
|
||||
|
||||
$mailSubject = 'Daily Import Transit Report';
|
||||
|
||||
$fileName = 'reports/pending_import_shipment_' . now()->format('Ymd_His') . '.xlsx';
|
||||
|
||||
Excel::store(
|
||||
new ImportTransitReportExport($tableData),
|
||||
$fileName,
|
||||
'local'
|
||||
);
|
||||
|
||||
$mail = new ImportTransitMail(
|
||||
$scheduleType,
|
||||
$tableData,
|
||||
$mailSubject,
|
||||
$fileName
|
||||
$mailSubject
|
||||
);
|
||||
|
||||
$toEmails = collect(explode(',', $rule->email))
|
||||
|
||||
@@ -1,97 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Exports;
|
||||
|
||||
use Maatwebsite\Excel\Concerns\FromCollection;
|
||||
use Maatwebsite\Excel\Concerns\WithHeadings;
|
||||
use Maatwebsite\Excel\Concerns\WithMapping;
|
||||
use Maatwebsite\Excel\Concerns\WithEvents;
|
||||
use PhpOffice\PhpSpreadsheet\Style\Fill;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Maatwebsite\Excel\Events\AfterSheet;
|
||||
|
||||
class ImportTransitReportExport implements FromCollection, WithHeadings, WithMapping, WithEvents
|
||||
{
|
||||
protected $data;
|
||||
|
||||
public function __construct($data)
|
||||
{
|
||||
$this->data = $data;
|
||||
}
|
||||
|
||||
public function headings(): array
|
||||
{
|
||||
return [
|
||||
'No',
|
||||
'CRI RFQ Number',
|
||||
'Requestor',
|
||||
'Shipper',
|
||||
'Shipper Location',
|
||||
'Shipper Invoice',
|
||||
'Shipper Invoice Date',
|
||||
'Custom Agent Name',
|
||||
'ETA',
|
||||
'Status',
|
||||
'Delivery Location',
|
||||
'ETD Date',
|
||||
'Remark',
|
||||
];
|
||||
}
|
||||
|
||||
public function collection()
|
||||
{
|
||||
return collect($this->data);
|
||||
}
|
||||
|
||||
public function map($row): array
|
||||
{
|
||||
static $srNo = 0;
|
||||
$srNo++;
|
||||
|
||||
return [
|
||||
$srNo,
|
||||
$row->cri_rfq_number,
|
||||
$row->requester,
|
||||
$row->shipper,
|
||||
$row->shipper_location,
|
||||
$row->shipper_invoice,
|
||||
$row->shipper_invoice_date,
|
||||
$row->customs_agent_name,
|
||||
$row->eta_date,
|
||||
$row->status,
|
||||
$row->delivery_location,
|
||||
$row->etd_date,
|
||||
$row->remark,
|
||||
];
|
||||
}
|
||||
|
||||
public function registerEvents(): array
|
||||
{
|
||||
|
||||
return [
|
||||
AfterSheet::class => function (AfterSheet $event) {
|
||||
|
||||
$rowNumber = 2; // Excel row starts after header
|
||||
|
||||
foreach ($this->data as $row) {
|
||||
|
||||
if ((int) $row->is_transit_identified == 1) {
|
||||
|
||||
$event->sheet
|
||||
->getStyle("A{$rowNumber}:M{$rowNumber}")
|
||||
->applyFromArray([
|
||||
'fill' => [
|
||||
'fillType' => Fill::FILL_SOLID,
|
||||
'startColor' => [
|
||||
'rgb' => 'FFFF00',
|
||||
],
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
$rowNumber++;
|
||||
}
|
||||
},
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -36,18 +36,12 @@ class ImportTransitExporter extends Exporter
|
||||
->label('SHIPPER INVOICE'),
|
||||
ExportColumn::make('shipper_invoice_date')
|
||||
->label('SHIPPER INVOICE DATE'),
|
||||
ExportColumn::make('inv_value')
|
||||
->label('Inv Value'),
|
||||
ExportColumn::make('freight_charge')
|
||||
->label('Freight Charge'),
|
||||
ExportColumn::make('customs_agent_name')
|
||||
->label('CUSTOMS AGENT NAME'),
|
||||
ExportColumn::make('eta_date')
|
||||
->label('ETA DATE'),
|
||||
ExportColumn::make('status')
|
||||
->label('STATUS'),
|
||||
ExportColumn::make('insurance_status')
|
||||
->label('Insurance Status'),
|
||||
ExportColumn::make('delivery_location')
|
||||
->label('DELIVERY LOCATION'),
|
||||
ExportColumn::make('etd_date')
|
||||
|
||||
@@ -75,7 +75,7 @@ class ImportTransitImporter extends Importer
|
||||
->label('Status'),
|
||||
ImportColumn::make('insurance_status')
|
||||
->exampleHeader('Insurance Status')
|
||||
->example('Yes')
|
||||
->example('Receipted')
|
||||
->label('Insurance Status'),
|
||||
ImportColumn::make('delivery_location')
|
||||
->exampleHeader('Delivery Location')
|
||||
@@ -176,7 +176,6 @@ class ImportTransitImporter extends Importer
|
||||
|
||||
return ImportTransit::updateOrCreate([
|
||||
'cri_rfq_number' => $criRfqNumber,
|
||||
'shipper_invoice' => $shipperInvoice,
|
||||
],
|
||||
[
|
||||
'mail_received_date' => $this->formatDate($mailRecDate),
|
||||
@@ -188,6 +187,7 @@ class ImportTransitImporter extends Importer
|
||||
'requester' => $requester,
|
||||
'shipper' => $shipper,
|
||||
'shipper_location' => $shipperLocation,
|
||||
'shipper_invoice' => $shipperInvoice,
|
||||
'inv_value' => $invValue,
|
||||
'freight_charge' => $freightCharge,
|
||||
'custom_agent_name' => $customsAgentname,
|
||||
|
||||
@@ -4,7 +4,6 @@ namespace App\Filament\Pages;
|
||||
|
||||
use App\Models\Plant;
|
||||
use App\Models\VisitorEntry;
|
||||
use Carbon\Carbon;
|
||||
use Filament\Facades\Filament;
|
||||
use Filament\Pages\Page;
|
||||
use Filament\Forms\Contracts\HasForms;
|
||||
@@ -38,172 +37,38 @@ class GateOutEntry extends Page implements HasForms
|
||||
->schema([
|
||||
Section::make('') // You can give your section a title or leave it blank
|
||||
->schema([
|
||||
Select::make('scan_out_gate_pass')
|
||||
->label('Scan Gate Pass')
|
||||
->required()
|
||||
->reactive()
|
||||
->options([
|
||||
'In' => 'In',
|
||||
'Out' => 'Out',
|
||||
]),
|
||||
TextInput::make('scan_out_gate_pass_in')
|
||||
->label('Scan In Gate Pass')
|
||||
->required()
|
||||
->reactive()
|
||||
->visible(fn ($get) => $get('scan_out_gate_pass') == 'In')
|
||||
->extraAttributes([
|
||||
'wire:keydown.enter' => 'processGatePassIn($event.target.value)',
|
||||
]),
|
||||
TextInput::make('scan_out_gate_pass_out')
|
||||
TextInput::make('scan_out_gate_pass')
|
||||
->label('Scan Out Gate Pass')
|
||||
->required()
|
||||
->reactive()
|
||||
->visible(fn ($get) => $get('scan_out_gate_pass') == 'Out')
|
||||
->extraAttributes([
|
||||
'wire:keydown.enter' => 'processGatePassOut($event.target.value)',
|
||||
'wire:keydown.enter' => 'processGatePass($event.target.value)',
|
||||
]),
|
||||
])
|
||||
->columns(5)
|
||||
]);
|
||||
}
|
||||
|
||||
public function processGatePassIn($gatePass)
|
||||
public function processGatePass($gatePass)
|
||||
{
|
||||
$entry = VisitorEntry::where('register_id', $gatePass)->latest()->first();
|
||||
$entry = VisitorEntry::where('register_id', $gatePass)->first();
|
||||
|
||||
if ($entry)
|
||||
{
|
||||
if($entry->in_time && !$entry->out_time && (empty($entry->valid_upto) || $entry->valid_upto == '' || $entry->valid_upto == null)){
|
||||
Notification::make()
|
||||
->title('Already Entered')
|
||||
->body('Gate pass In has already been processed for entry.')
|
||||
->warning()
|
||||
->send();
|
||||
$this->filters['scan_out_gate_pass_in'] = '';
|
||||
return;
|
||||
}
|
||||
elseif (
|
||||
!empty($entry->valid_upto) &&
|
||||
Carbon::parse($entry->valid_upto)->endOfDay()->gte(now())
|
||||
){
|
||||
if (empty($entry->out_time)) {
|
||||
Notification::make()
|
||||
->title('Gate In Not Allowed')
|
||||
->body("Previous gate-out has not been punched. Please complete gate-out first for ID ' . $gatePass . '.")
|
||||
->warning()
|
||||
->send();
|
||||
if ($entry) {
|
||||
$entry->out_time = now();
|
||||
$entry->save();
|
||||
|
||||
$this->filters['scan_out_gate_pass_in'] = '';
|
||||
return;
|
||||
}
|
||||
else{
|
||||
$newEntry = $entry->replicate();
|
||||
$newEntry->in_time = now();
|
||||
$newEntry->out_time = null;
|
||||
|
||||
$newEntry->save();
|
||||
|
||||
Notification::make()
|
||||
->title('Gate In')
|
||||
->body('Gate in has been successfully processed. Visitor marked as entered.')
|
||||
->success()
|
||||
->send();
|
||||
$this->filters['scan_out_gate_pass_in'] = '';
|
||||
}
|
||||
}
|
||||
else{
|
||||
Notification::make()
|
||||
->title('Visitor Pass Expired')
|
||||
->body('Your visitor pass validity has expired.')
|
||||
->danger()
|
||||
->send();
|
||||
$this->filters['scan_out_gate_pass_in'] = '';
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Notification::make()
|
||||
->title('Gate Pass Processed')
|
||||
->body('Gate pass has been successfully processed. Visitor marked as exited.')
|
||||
->success()
|
||||
->send();
|
||||
$this->filters['scan_out_gate_pass'] = '';
|
||||
} else {
|
||||
Notification::make()
|
||||
->title('Invalid Gate Pass')
|
||||
->body('Scanned gate in pass is not valid.')
|
||||
->body('The scanned gate pass is not valid. Please try again.')
|
||||
->danger()
|
||||
->send();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
public function processGatePassOut($gatePass)
|
||||
{
|
||||
$entry = VisitorEntry::where('register_id', $gatePass)->latest()->first();
|
||||
|
||||
if (!$entry) {
|
||||
Notification::make()
|
||||
->title('Invalid Gate Pass')
|
||||
->body('Scanned gate out pass is not valid.')
|
||||
->danger()
|
||||
->send();
|
||||
$this->filters['scan_out_gate_pass_out'] = '';
|
||||
return;
|
||||
}
|
||||
|
||||
if (empty($entry->valid_upto) || $entry->valid_upto == '' || $entry->valid_upto == null) {
|
||||
|
||||
if (!empty($entry->out_time)) {
|
||||
Notification::make()
|
||||
->title('Already Exited')
|
||||
->body('Gate pass has already been processed.')
|
||||
->warning()
|
||||
->send();
|
||||
$this->filters['scan_out_gate_pass_out'] = '';
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
$entry->out_time = now();
|
||||
$entry->save();
|
||||
|
||||
Notification::make()
|
||||
->title('Gate Pass Processed')
|
||||
->body('Visitor marked as exited.')
|
||||
->success()
|
||||
->send();
|
||||
|
||||
$this->filters['scan_out_gate_pass_out'] = '';
|
||||
return;
|
||||
}
|
||||
}
|
||||
elseif ((empty($entry->valid_upto) || $entry->valid_upto != '' || $entry->valid_upto != null))
|
||||
{
|
||||
if (Carbon::parse($entry->valid_upto)->endOfDay()->lt(now()))
|
||||
{
|
||||
Notification::make()
|
||||
->title('Visitor Pass Expired')
|
||||
->body('Your visitor pass validity has expired.')
|
||||
->danger()
|
||||
->send();
|
||||
$this->filters['scan_out_gate_pass_out'] = '';
|
||||
return;
|
||||
}
|
||||
if (!empty($entry->out_time)) {
|
||||
Notification::make()
|
||||
->title('Already Exited')
|
||||
->body('Gate pass has already been processed.')
|
||||
->warning()
|
||||
->send();
|
||||
$this->filters['scan_out_gate_pass_out'] = '';
|
||||
return;
|
||||
}
|
||||
else{
|
||||
$entry->out_time = now();
|
||||
$entry->save();
|
||||
|
||||
Notification::make()
|
||||
->title('Gate Out')
|
||||
->body('Visitor marked as exited.')
|
||||
->success()
|
||||
->send();
|
||||
$this->filters['scan_out_gate_pass_out'] = '';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -285,27 +285,27 @@ class AsrsItemValidationResource extends Resource
|
||||
|
||||
$status = $data['status'] ?? 'NotUpdated';
|
||||
// Hide all records initially if no filters are applied
|
||||
if (empty($data['Plant']) && empty($data['item_code']) && empty($data['uom']) && empty($data['status']) && empty($data['created_from']) && empty($data['created_to'])) {
|
||||
return $query->whereRaw('1 = 0');
|
||||
// $query->where('status', 'NotUpdated');
|
||||
}
|
||||
|
||||
// if (
|
||||
// empty($data['Plant']) &&
|
||||
// empty($data['item_code']) &&
|
||||
// empty($data['uom']) &&
|
||||
// empty($data['status']) &&
|
||||
// empty($data['created_from']) &&
|
||||
// empty($data['created_to'])
|
||||
// ) {
|
||||
// // $query->where('status', 'NotUpdated');
|
||||
// $query->where(function ($q) {
|
||||
// $q->where('status', 'NotUpdated')
|
||||
// ->orWhereNull('status')
|
||||
// ->orWhere('status', '');
|
||||
// });
|
||||
// if (empty($data['Plant']) && empty($data['item_code']) && empty($data['status']) && empty($data['created_from']) && empty($data['created_to'])) {
|
||||
// // return $query->whereRaw('1 = 0');
|
||||
// $query->where('status', 'NotUpdated');
|
||||
// }
|
||||
|
||||
if (
|
||||
empty($data['Plant']) &&
|
||||
empty($data['item_code']) &&
|
||||
empty($data['uom']) &&
|
||||
empty($data['status']) &&
|
||||
empty($data['created_from']) &&
|
||||
empty($data['created_to'])
|
||||
) {
|
||||
// $query->where('status', 'NotUpdated');
|
||||
$query->where(function ($q) {
|
||||
$q->where('status', 'NotUpdated')
|
||||
->orWhereNull('status')
|
||||
->orWhere('status', '');
|
||||
});
|
||||
}
|
||||
|
||||
if (! empty($data['Plant'])) {
|
||||
$query->where('plant_id', $data['Plant']);
|
||||
}
|
||||
@@ -387,12 +387,11 @@ class AsrsItemValidationResource extends Resource
|
||||
Tables\Actions\ViewAction::make(),
|
||||
Tables\Actions\EditAction::make(),
|
||||
// ->hidden(function ($record): bool {
|
||||
// if (auth()->user()?->hasRole('Super Admin')) {
|
||||
// if (auth()->user()?->hasRole('SuperAdmin')) {
|
||||
// return false;
|
||||
// }
|
||||
// else{
|
||||
// return trim(($record->status)) == 'Updated';
|
||||
// }
|
||||
|
||||
// return trim(strtolower($record->status)) == 'updated';
|
||||
// }),
|
||||
// ->visible(function ($record): bool {
|
||||
// return auth()->user()?->hasRole('SuperAdmin')
|
||||
|
||||
@@ -77,48 +77,42 @@ class GuardPatrolEntryResource extends Resource
|
||||
])
|
||||
->hint(fn ($get) => $get('gPePlantError') ? $get('gPePlantError') : null)
|
||||
->hintColor('danger'),
|
||||
// Forms\Components\Select::make('guard_name_id')
|
||||
// ->label('Guard Name')
|
||||
// // ->relationship('guardNames', 'name')
|
||||
// ->options(function (callable $get) {
|
||||
// $plantId = $get('plant_id');
|
||||
// if (! $plantId) {
|
||||
// return [];
|
||||
// }
|
||||
|
||||
// return GuardName::where('plant_id', $plantId)
|
||||
// ->pluck('name', 'id')
|
||||
// ->toArray();
|
||||
// })
|
||||
// ->required()
|
||||
// ->reactive()
|
||||
// ->default(function () {
|
||||
// return optional(GuardPatrolEntry::where('created_by', Filament::auth()->user()?->name)->latest()->first())->guard_name_id;
|
||||
// })
|
||||
// ->disabled(fn (Get $get) => ! empty($get('id')))
|
||||
// ->afterStateUpdated(function ($state, callable $set, callable $get) {
|
||||
// $guardName = $get('guard_name_id');
|
||||
// if (! $guardName) {
|
||||
// $set('gPeGuardNameError', 'Please select a guard name first.');
|
||||
|
||||
// return;
|
||||
// } else {
|
||||
// $set('patrol_time', now()->format('Y-m-d H:i:s'));
|
||||
// $set('updated_by', Filament::auth()->user()?->name);
|
||||
// $set('gPeGuardNameError', null);
|
||||
// }
|
||||
// })
|
||||
// ->extraAttributes(fn ($get) => [
|
||||
// 'class' => $get('gPeGuardNameError') ? 'border-red-500' : '',
|
||||
// ])
|
||||
// ->hint(fn ($get) => $get('gPeGuardNameError') ? $get('gPeGuardNameError') : null)
|
||||
// ->hintColor('danger'),
|
||||
Forms\Components\TextInput::make('guard_name')
|
||||
Forms\Components\Select::make('guard_name_id')
|
||||
->label('Guard Name')
|
||||
->default(fn () => Filament::auth()->user()?->name)
|
||||
->readOnly()
|
||||
->dehydrated(),
|
||||
// ->relationship('guardNames', 'name')
|
||||
->options(function (callable $get) {
|
||||
$plantId = $get('plant_id');
|
||||
if (! $plantId) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return GuardName::where('plant_id', $plantId)
|
||||
->pluck('name', 'id')
|
||||
->toArray();
|
||||
})
|
||||
->required()
|
||||
->reactive()
|
||||
->default(function () {
|
||||
return optional(GuardPatrolEntry::where('created_by', Filament::auth()->user()?->name)->latest()->first())->guard_name_id;
|
||||
})
|
||||
->disabled(fn (Get $get) => ! empty($get('id')))
|
||||
->afterStateUpdated(function ($state, callable $set, callable $get) {
|
||||
$guardName = $get('guard_name_id');
|
||||
if (! $guardName) {
|
||||
$set('gPeGuardNameError', 'Please select a guard name first.');
|
||||
|
||||
return;
|
||||
} else {
|
||||
$set('patrol_time', now()->format('Y-m-d H:i:s'));
|
||||
$set('updated_by', Filament::auth()->user()?->name);
|
||||
$set('gPeGuardNameError', null);
|
||||
}
|
||||
})
|
||||
->extraAttributes(fn ($get) => [
|
||||
'class' => $get('gPeGuardNameError') ? 'border-red-500' : '',
|
||||
])
|
||||
->hint(fn ($get) => $get('gPeGuardNameError') ? $get('gPeGuardNameError') : null)
|
||||
->hintColor('danger'),
|
||||
Forms\Components\Hidden::make('check_point_name')// TextInput
|
||||
->label('Check Point Name')
|
||||
->reactive()
|
||||
@@ -129,88 +123,50 @@ class GuardPatrolEntryResource extends Resource
|
||||
->extraAttributes([
|
||||
'x-on:keydown.enter.prevent' => '$wire.processCheckPointName()',
|
||||
]),
|
||||
// Forms\Components\Select::make('check_point_name_id')
|
||||
// ->label('Check Point Name')
|
||||
// // ->relationship('checkPointNames', 'name')
|
||||
// ->options(function (callable $get) {
|
||||
// $plantId = $get('plant_id');
|
||||
// if (! $plantId) {
|
||||
// return [];
|
||||
// }
|
||||
|
||||
// return CheckPointName::where('plant_id', $plantId)
|
||||
// ->pluck('name', 'id')
|
||||
// ->toArray();
|
||||
// })
|
||||
// ->required()
|
||||
// ->reactive()
|
||||
// // ->default(function () {
|
||||
// // return optional(GuardPatrolEntry::where('created_by', Filament::auth()->user()?->name)->latest()->first())->check_point_name_id;
|
||||
// // })
|
||||
// ->disabled(fn (Get $get) => ! empty($get('id')))
|
||||
// ->afterStateUpdated(function ($state, callable $set, callable $get) {
|
||||
// $checkPointName = $get('check_point_name_id');
|
||||
// if (! $checkPointName) {
|
||||
// $set('check_point_name_id', null);
|
||||
// $set('gPeCheckPointNameError', 'Please select a check point name first.');
|
||||
|
||||
// return;
|
||||
// } else {
|
||||
// $set('patrol_time', now()->format('Y-m-d H:i:s'));
|
||||
// $set('updated_by', Filament::auth()->user()?->name);
|
||||
// $set('gPeCheckPointNameError', null);
|
||||
// }
|
||||
// })
|
||||
// ->extraAttributes(fn ($get) => [
|
||||
// 'class' => $get('gPeCheckPointNameError') ? 'border-red-500' : '',
|
||||
// ])
|
||||
// ->hint(fn ($get) => $get('gPeCheckPointNameError') ? $get('gPeCheckPointNameError') : null)
|
||||
// ->hintColor('danger')
|
||||
// ->rule(function (callable $get) {
|
||||
// return Rule::unique('guard_patrol_entries', 'check_point_name_id')
|
||||
// ->where('guard_name_id', $get('guard_name_id'))
|
||||
// ->where('patrol_time', now())
|
||||
// ->where('plant_id', $get('plant_id'))
|
||||
// ->ignore($get('id'));
|
||||
// }),
|
||||
|
||||
Forms\Components\Hidden::make('check_point_name_id')
|
||||
->dehydrated(true),
|
||||
Forms\Components\TextInput::make('check_point_name')
|
||||
Forms\Components\Select::make('check_point_name_id')
|
||||
->label('Check Point Name')
|
||||
// ->relationship('checkPointNames', 'name')
|
||||
->options(function (callable $get) {
|
||||
$plantId = $get('plant_id');
|
||||
if (! $plantId) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return CheckPointName::where('plant_id', $plantId)
|
||||
->pluck('name', 'id')
|
||||
->toArray();
|
||||
})
|
||||
->required()
|
||||
->reactive()
|
||||
// ->default(function () {
|
||||
// return optional(GuardPatrolEntry::where('created_by', Filament::auth()->user()?->name)->latest()->first())->check_point_name_id;
|
||||
// })
|
||||
->disabled(fn (Get $get) => ! empty($get('id')))
|
||||
->afterStateUpdated(function ($state, callable $set, callable $get) {
|
||||
|
||||
if (blank($state)) {
|
||||
$checkPointName = $get('check_point_name_id');
|
||||
if (! $checkPointName) {
|
||||
$set('check_point_name_id', null);
|
||||
$set('gPeCheckPointNameError', 'Please enter a check point name.');
|
||||
$set('gPeCheckPointNameError', 'Please select a check point name first.');
|
||||
|
||||
return;
|
||||
} else {
|
||||
$set('patrol_time', now()->format('Y-m-d H:i:s'));
|
||||
$set('updated_by', Filament::auth()->user()?->name);
|
||||
$set('gPeCheckPointNameError', null);
|
||||
}
|
||||
|
||||
$checkPoint = CheckPointName::where('plant_id', $get('plant_id'))
|
||||
->whereRaw('LOWER(name) = ?', [strtolower(trim($state))])
|
||||
->first();
|
||||
|
||||
if (! $checkPoint) {
|
||||
$set('check_point_name_id', null);
|
||||
$set('gPeCheckPointNameError', 'Invalid check point name.');
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$set('check_point_name_id', $checkPoint->id);
|
||||
$set('patrol_time', now()->format('Y-m-d H:i:s'));
|
||||
$set('updated_by', Filament::auth()->user()?->name);
|
||||
$set('gPeCheckPointNameError', null);
|
||||
})
|
||||
->extraAttributes(fn ($get) => [
|
||||
'class' => $get('gPeCheckPointNameError') ? 'border-red-500' : '',
|
||||
])
|
||||
->hint(fn ($get) => $get('gPeCheckPointNameError'))
|
||||
->hintColor('danger'),
|
||||
->hint(fn ($get) => $get('gPeCheckPointNameError') ? $get('gPeCheckPointNameError') : null)
|
||||
->hintColor('danger')
|
||||
->rule(function (callable $get) {
|
||||
return Rule::unique('guard_patrol_entries', 'check_point_name_id')
|
||||
->where('guard_name_id', $get('guard_name_id'))
|
||||
->where('patrol_time', now())
|
||||
->where('plant_id', $get('plant_id'))
|
||||
->ignore($get('id'));
|
||||
}),
|
||||
Forms\Components\TextInput::make('reader_code')
|
||||
->label('Reader Code')
|
||||
->hidden(fn (Get $get) => ! $get('id'))
|
||||
|
||||
@@ -3,10 +3,6 @@
|
||||
namespace App\Filament\Resources\GuardPatrolEntryResource\Pages;
|
||||
|
||||
use App\Filament\Resources\GuardPatrolEntryResource;
|
||||
use App\Models\CheckPointName;
|
||||
use App\Models\CheckPointTime;
|
||||
use App\Models\GuardName;
|
||||
use App\Models\GuardPatrolEntry;
|
||||
use Filament\Actions;
|
||||
use Filament\Facades\Filament;
|
||||
use Filament\Notifications\Notification;
|
||||
@@ -33,100 +29,6 @@ class CreateGuardPatrolEntry extends CreateRecord
|
||||
|
||||
// public ?array $data = null;
|
||||
|
||||
protected function mutateFormDataBeforeCreate(array $data): array
|
||||
{
|
||||
$guardId = GuardName::where(
|
||||
'name',
|
||||
Filament::auth()->user()?->name
|
||||
)->value('id');
|
||||
|
||||
if (! $guardId) {
|
||||
|
||||
Notification::make()
|
||||
->title('Guard Name Not Matched')
|
||||
->body('Logged-in user name was not found in Guard Name Master.')
|
||||
->danger()
|
||||
->send();
|
||||
$this->halt();
|
||||
}
|
||||
|
||||
$data['guard_name_id'] = $guardId;
|
||||
|
||||
$checkPoint = CheckPointName::where('plant_id', $data['plant_id'])
|
||||
->where('name', trim($data['check_point_name']))
|
||||
->value('id');
|
||||
|
||||
if (! $checkPoint) {
|
||||
Notification::make()
|
||||
->title('Invalid Check Point')
|
||||
->body('The entered check point name does not exist.')
|
||||
->danger()
|
||||
->send();
|
||||
$this->halt();
|
||||
}
|
||||
|
||||
// $lastScan = GuardPatrolEntry::where('plant_id', $data['plant_id'])
|
||||
// ->where('guard_name_id', $guardId)
|
||||
// ->latest('id')
|
||||
// ->first();
|
||||
|
||||
// if ($lastScan) {
|
||||
|
||||
// $previousPoint = $lastScan->check_point_name_id;
|
||||
|
||||
// $route = CheckPointTime::where('plant_id', $data['plant_id'])
|
||||
// ->where('check_point1_id', $previousPoint)
|
||||
// ->where('check_point2_id', $checkPoint->id)
|
||||
// ->first();
|
||||
|
||||
|
||||
// if (! $route) {
|
||||
|
||||
// Notification::make()
|
||||
// ->title('Wrong Check Point Order')
|
||||
// ->body('This checkpoint is not the next allowed point.')
|
||||
// ->danger()
|
||||
// ->send();
|
||||
|
||||
// $this->halt();
|
||||
// }
|
||||
|
||||
|
||||
// } else {
|
||||
|
||||
|
||||
// // First scan must start from sequence 1
|
||||
|
||||
// $firstRoute = CheckPointTime::where('plant_id', $data['plant_id'])
|
||||
// ->where('check_point2_id', $checkPoint->id)
|
||||
// ->where('sequence_number', 1)
|
||||
// ->first();
|
||||
|
||||
|
||||
// if (! $firstRoute) {
|
||||
|
||||
// Notification::make()
|
||||
// ->title('Invalid Starting Point')
|
||||
// ->body('Patrol must start from the first checkpoint.')
|
||||
// ->danger()
|
||||
// ->send();
|
||||
|
||||
// $this->halt();
|
||||
// }
|
||||
|
||||
// }
|
||||
|
||||
|
||||
|
||||
$data['check_point_name_id'] = $checkPoint;
|
||||
|
||||
|
||||
unset($data['check_point_name']);
|
||||
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
|
||||
public function processCheckPointName()
|
||||
{
|
||||
|
||||
@@ -24,10 +24,6 @@ use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
use Filament\Tables\Actions\ImportAction;
|
||||
use Filament\Forms\Components\DateTimePicker;
|
||||
use Filament\Forms\Components\Select;
|
||||
use Filament\Tables\Filters\Filter;
|
||||
use Filament\Forms\Components\TextInput;
|
||||
// use PhpOffice\PhpSpreadsheet\IOFactory;
|
||||
|
||||
class ImportTransitResource extends Resource
|
||||
@@ -44,16 +40,16 @@ class ImportTransitResource extends Resource
|
||||
->schema([
|
||||
Forms\Components\TextInput::make('cri_rfq_number')
|
||||
->label('CRI/RFQ Number')
|
||||
->required()
|
||||
->disabled(fn ($operation) => $operation == 'edit'),
|
||||
->disabled(fn ($operation) => $operation == 'edit')
|
||||
->unique(ignoreRecord: true),
|
||||
Forms\Components\DatePicker::make('mail_received_date')
|
||||
->label('Mail Received Date')
|
||||
->required(),
|
||||
// Forms\Components\TextInput::make('pricol_ref_number')
|
||||
// ->label('Ref Number')
|
||||
// ->afterStateUpdated(function (callable $set) {
|
||||
// $set('updated_by', Filament::auth()->user()?->name);
|
||||
// }),
|
||||
Forms\Components\TextInput::make('pricol_ref_number')
|
||||
->label('Pricol Ref Number')
|
||||
->afterStateUpdated(function (callable $set) {
|
||||
$set('updated_by', Filament::auth()->user()?->name);
|
||||
}),
|
||||
Forms\Components\TextInput::make('requester')
|
||||
->label('Requester')
|
||||
->afterStateUpdated(function (callable $set) {
|
||||
@@ -79,7 +75,7 @@ class ImportTransitResource extends Resource
|
||||
->afterStateUpdated(function (callable $set) {
|
||||
$set('updated_by', Filament::auth()->user()?->name);
|
||||
}),
|
||||
Forms\Components\TextInput::make('inv_value')
|
||||
Forms\Components\DatePicker::make('inv_value')
|
||||
->label('Inv Value')
|
||||
->afterStateUpdated(function (callable $set) {
|
||||
$set('updated_by', Filament::auth()->user()?->name);
|
||||
@@ -224,158 +220,128 @@ class ImportTransitResource extends Resource
|
||||
}),
|
||||
Tables\Columns\TextColumn::make('cri_rfq_number')
|
||||
->label('CRI/RFQ Number')
|
||||
->searchable()
|
||||
->alignCenter()
|
||||
->sortable(),
|
||||
Tables\Columns\TextColumn::make('mail_received_date')
|
||||
->label('Mail Received Date')
|
||||
->searchable()
|
||||
->date()
|
||||
->alignCenter()
|
||||
->sortable(),
|
||||
Tables\Columns\TextColumn::make('pricol_ref_number')
|
||||
->label('Ref Number')
|
||||
->searchable()
|
||||
->label('Pricol Ref Number')
|
||||
->alignCenter()
|
||||
->sortable(),
|
||||
Tables\Columns\TextColumn::make('requester')
|
||||
->label('Requester')
|
||||
->searchable()
|
||||
->alignCenter()
|
||||
->sortable(),
|
||||
Tables\Columns\TextColumn::make('shipper')
|
||||
->label('Shipper')
|
||||
->searchable()
|
||||
->alignCenter()
|
||||
->sortable(),
|
||||
Tables\Columns\TextColumn::make('shipper_location')
|
||||
->label('Shipper Location')
|
||||
->searchable()
|
||||
->alignCenter()
|
||||
->sortable(),
|
||||
Tables\Columns\TextColumn::make('shipper_invoice')
|
||||
->label('Shipper Invoice')
|
||||
->searchable()
|
||||
->alignCenter()
|
||||
->sortable(),
|
||||
Tables\Columns\TextColumn::make('shipper_invoice_date')
|
||||
->label('Shipper Invoice Date')
|
||||
->searchable()
|
||||
->date()
|
||||
->formatStateUsing(fn ($state) => $state?->format('Y-m-d'))
|
||||
->alignCenter()
|
||||
->sortable(),
|
||||
Tables\Columns\TextColumn::make('inv_value')
|
||||
->label('Inv Value')
|
||||
->searchable()
|
||||
->alignCenter()
|
||||
->sortable(),
|
||||
Tables\Columns\TextColumn::make('freight_charge')
|
||||
->label('Freight Charge')
|
||||
->searchable()
|
||||
->alignCenter()
|
||||
->sortable(),
|
||||
Tables\Columns\TextColumn::make('customs_agent_name')
|
||||
->label('Customs Agent Name')
|
||||
->searchable()
|
||||
->alignCenter()
|
||||
->sortable(),
|
||||
Tables\Columns\TextColumn::make('eta_date')
|
||||
->label('ETA Date')
|
||||
->searchable()
|
||||
->date()
|
||||
->alignCenter()
|
||||
->sortable(),
|
||||
Tables\Columns\TextColumn::make('status')
|
||||
->label('Status')
|
||||
->searchable()
|
||||
->alignCenter()
|
||||
->sortable(),
|
||||
Tables\Columns\TextColumn::make('insurance_status')
|
||||
->label('Insurance Status')
|
||||
->searchable()
|
||||
->alignCenter()
|
||||
->sortable(),
|
||||
Tables\Columns\TextColumn::make('delivery_location')
|
||||
->label('Delivery Location')
|
||||
->searchable()
|
||||
->alignCenter()
|
||||
->sortable(),
|
||||
Tables\Columns\TextColumn::make('etd_date')
|
||||
->label('ETD Date')
|
||||
->searchable()
|
||||
->date()
|
||||
->alignCenter()
|
||||
->sortable(),
|
||||
Tables\Columns\TextColumn::make('mode')
|
||||
->label('Mode')
|
||||
->searchable()
|
||||
->alignCenter()
|
||||
->sortable(),
|
||||
Tables\Columns\TextColumn::make('inco_terms')
|
||||
->label('Inco Terms')
|
||||
->searchable()
|
||||
->alignCenter()
|
||||
->sortable(),
|
||||
Tables\Columns\TextColumn::make('port_of_loading')
|
||||
->label('Port of Loading')
|
||||
->searchable()
|
||||
->alignCenter()
|
||||
->sortable(),
|
||||
Tables\Columns\TextColumn::make('port_of_discharge')
|
||||
->label('Port of Discharge')
|
||||
->searchable()
|
||||
->alignCenter()
|
||||
->sortable(),
|
||||
Tables\Columns\TextColumn::make('delivery_city')
|
||||
->label('Delivery City')
|
||||
->searchable()
|
||||
->alignCenter()
|
||||
->sortable(),
|
||||
Tables\Columns\TextColumn::make('packages')
|
||||
->label('Packages')
|
||||
->searchable()
|
||||
->alignCenter()
|
||||
->sortable(),
|
||||
Tables\Columns\TextColumn::make('type_of_package')
|
||||
->label('Type of Package')
|
||||
->searchable()
|
||||
->alignCenter()
|
||||
->sortable(),
|
||||
Tables\Columns\TextColumn::make('gross_weight')
|
||||
->label('Gross Weight')
|
||||
->searchable()
|
||||
->alignCenter()
|
||||
->sortable(),
|
||||
Tables\Columns\TextColumn::make('volume')
|
||||
->label('Volume')
|
||||
->searchable()
|
||||
->alignCenter()
|
||||
->sortable(),
|
||||
Tables\Columns\TextColumn::make('bill_number')
|
||||
->label('Bill Number')
|
||||
->searchable()
|
||||
->alignCenter()
|
||||
->sortable(),
|
||||
Tables\Columns\TextColumn::make('bill_received_date')
|
||||
->label('Bill Received Date')
|
||||
->searchable()
|
||||
->alignCenter()
|
||||
->date()
|
||||
->sortable(),
|
||||
Tables\Columns\TextColumn::make('vessel_number')
|
||||
->label('Vessel Number')
|
||||
->searchable()
|
||||
->alignCenter()
|
||||
->sortable(),
|
||||
Tables\Columns\TextColumn::make('remark')
|
||||
->label('Remark')
|
||||
->searchable()
|
||||
->alignCenter()
|
||||
->sortable(),
|
||||
Tables\Columns\TextColumn::make('is_transit_identified')
|
||||
->label('Is Transit Identified')
|
||||
->searchable()
|
||||
->alignCenter()
|
||||
->sortable(),
|
||||
Tables\Columns\TextColumn::make('created_at')
|
||||
@@ -406,100 +372,7 @@ class ImportTransitResource extends Resource
|
||||
])
|
||||
->filters([
|
||||
Tables\Filters\TrashedFilter::make(),
|
||||
Filter::make('advanced_filters')
|
||||
->label('Advanced Filters')
|
||||
->form([
|
||||
TextInput::make('cri_rfq_number')
|
||||
->label('CRI RFQ Number')
|
||||
->reactive()
|
||||
->placeholder('Enter Rfq Number')
|
||||
->afterStateUpdated(function ($state, callable $set, callable $get): void {
|
||||
$set('created_from', null);
|
||||
$set('created_to', null);
|
||||
}),
|
||||
TextInput::make('status')
|
||||
->label('Status')
|
||||
->reactive()
|
||||
->placeholder('Enter Status')
|
||||
->afterStateUpdated(function ($state, callable $set, callable $get): void {
|
||||
$set('created_from', null);
|
||||
$set('created_to', null);
|
||||
}),
|
||||
Select::make('is_transit_identified')
|
||||
->label('Is Transit Identified')
|
||||
->reactive()
|
||||
->options([
|
||||
0 => 0,
|
||||
1 => 1,
|
||||
])
|
||||
->afterStateUpdated(function ($state, callable $set, callable $get): void {
|
||||
$set('created_from', null);
|
||||
$set('created_to', null);
|
||||
}),
|
||||
DateTimePicker::make(name: 'created_from')
|
||||
->label('Created From')
|
||||
->placeholder(placeholder: 'Select From DateTime')
|
||||
->reactive()
|
||||
->native(false),
|
||||
DateTimePicker::make('created_to')
|
||||
->label('Created To')
|
||||
->placeholder(placeholder: 'Select To DateTime')
|
||||
->reactive()
|
||||
->native(false),
|
||||
])
|
||||
->query(function ($query, array $data) {
|
||||
// Hide all records initially if no filters are applied
|
||||
if (empty($data['cri_rfq_number']) && empty($data['status']) && ! isset($data['is_transit_identified']) && empty($data['created_from']) && empty($data['created_to'])) {
|
||||
return $query;
|
||||
}
|
||||
|
||||
if (! empty($data['cri_rfq_number'])) {
|
||||
$query->where('cri_rfq_number', 'like', '%'.$data['cri_rfq_number'].'%');
|
||||
}
|
||||
|
||||
if (! empty($data['status'])) {
|
||||
$query->where('status', 'like', '%'.$data['status'].'%');
|
||||
}
|
||||
|
||||
if (isset($data['is_transit_identified'])) {
|
||||
$query->where('is_transit_identified', $data['is_transit_identified']);
|
||||
}
|
||||
|
||||
if (! empty($data['created_from'])) {
|
||||
$query->where('created_at', '>=', $data['created_from']);
|
||||
}
|
||||
|
||||
if (! empty($data['created_to'])) {
|
||||
$query->where('created_at', '<=', $data['created_to']);
|
||||
}
|
||||
})
|
||||
->indicateUsing(function (array $data) {
|
||||
$indicators = [];
|
||||
|
||||
if (! empty($data['cri_rfq_number'])) {
|
||||
$indicators[] = 'CRI Rfq Number: '.$data['cri_rfq_number'];
|
||||
}
|
||||
|
||||
if (! empty($data['status'])) {
|
||||
$indicators[] = 'Status: '.$data['status'];
|
||||
}
|
||||
|
||||
if (isset($data['is_transit_identified'])) {
|
||||
$indicators[] = 'Is Transit Identified: '.$data['is_transit_identified'];
|
||||
}
|
||||
|
||||
if (! empty($data['created_from'])) {
|
||||
$indicators[] = 'From: '.$data['created_from'];
|
||||
}
|
||||
|
||||
if (! empty($data['created_to'])) {
|
||||
$indicators[] = 'To: '.$data['created_to'];
|
||||
}
|
||||
|
||||
return $indicators;
|
||||
}),
|
||||
])
|
||||
->filtersFormMaxHeight('280px')
|
||||
->actions([
|
||||
Tables\Actions\ViewAction::make(),
|
||||
Tables\Actions\EditAction::make(),
|
||||
|
||||
@@ -6,7 +6,6 @@ use App\Filament\Exports\LineExporter;
|
||||
use App\Filament\Imports\LineImporter;
|
||||
use App\Filament\Resources\LineResource\Pages;
|
||||
use App\Models\Block;
|
||||
use App\Models\Item;
|
||||
use App\Models\Line;
|
||||
use App\Models\Plant;
|
||||
use App\Models\WorkGroupMaster;
|
||||
@@ -25,11 +24,6 @@ use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Database\Eloquent\SoftDeletingScope;
|
||||
use Illuminate\Validation\Rule;
|
||||
use Illuminate\Validation\Rules\Unique;
|
||||
use Filament\Forms\Components\DateTimePicker;
|
||||
use Filament\Forms\Components\FileUpload;
|
||||
use Filament\Forms\Components\Select;
|
||||
use Filament\Forms\Components\TextInput;
|
||||
use Filament\Tables\Filters\Filter;
|
||||
|
||||
class LineResource extends Resource
|
||||
{
|
||||
@@ -1190,207 +1184,7 @@ class LineResource extends Resource
|
||||
])
|
||||
->filters([
|
||||
Tables\Filters\TrashedFilter::make(),
|
||||
Filter::make('advanced_filters')
|
||||
->label('Advanced Filters')
|
||||
->form([
|
||||
Select::make('Plant')
|
||||
->label('Search by Plant Name')
|
||||
->nullable()
|
||||
->options(function (callable $get) {
|
||||
$userHas = Filament::auth()->user()->plant_id;
|
||||
|
||||
// return ($userHas && strlen($userHas) > 0) ? Plant::where('id', $userHas)->pluck('name', 'id')->toArray() : Plant::orderBy('code')->pluck('name', 'id')->toArray();
|
||||
if ($userHas && strlen($userHas) > 0) {
|
||||
return Plant::where('id', $userHas)->pluck('name', 'id')->toArray();
|
||||
} else {
|
||||
return Plant::whereHas('items', function ($query) {
|
||||
$query->whereNotNull('id');
|
||||
})->orderBy('code')->pluck('name', 'id')->toArray();
|
||||
}
|
||||
})
|
||||
->searchable()
|
||||
->reactive()
|
||||
->afterStateUpdated(function ($state, callable $set, callable $get): void {
|
||||
$set('code', null);
|
||||
$set('operator_id', null);
|
||||
}),
|
||||
Select::make('name')
|
||||
->label('Search by Line Name')
|
||||
->nullable()
|
||||
->options(function (callable $get) {
|
||||
$plantId = $get('Plant');
|
||||
|
||||
return $plantId ? Line::where('plant_id', $plantId)->pluck('name', 'id') : [];
|
||||
})
|
||||
->searchable()
|
||||
->reactive(),
|
||||
Select::make('type')
|
||||
->label('Search by Line Type')
|
||||
->nullable()
|
||||
->options(function (callable $get) {
|
||||
$plantId = $get('Plant');
|
||||
|
||||
return $plantId ? Line::where('plant_id', $plantId)->distinct()->pluck('type', 'type')->toArray(): [];
|
||||
|
||||
})
|
||||
->searchable()
|
||||
->reactive(),
|
||||
Select::make('work_group_id')
|
||||
->label('Search by WorkGroupCenter')
|
||||
->nullable()
|
||||
->options(function (callable $get) {
|
||||
$plantId = $get('Plant');
|
||||
|
||||
$workGroupIds = Line::where('plant_id', $plantId)
|
||||
->get([
|
||||
'work_group1_id',
|
||||
'work_group2_id',
|
||||
'work_group3_id',
|
||||
'work_group4_id',
|
||||
'work_group5_id',
|
||||
'work_group6_id',
|
||||
'work_group7_id',
|
||||
'work_group8_id',
|
||||
'work_group9_id',
|
||||
'work_group10_id',
|
||||
])
|
||||
->flatMap(function ($line) {
|
||||
return [
|
||||
$line->work_group1_id,
|
||||
$line->work_group2_id,
|
||||
$line->work_group3_id,
|
||||
$line->work_group4_id,
|
||||
$line->work_group5_id,
|
||||
$line->work_group6_id,
|
||||
$line->work_group7_id,
|
||||
$line->work_group8_id,
|
||||
$line->work_group9_id,
|
||||
$line->work_group10_id,
|
||||
];
|
||||
})
|
||||
->filter()
|
||||
->unique()
|
||||
->values()
|
||||
->toArray();
|
||||
|
||||
return WorkGroupMaster::whereIn('id', $workGroupIds)
|
||||
->pluck('name', 'id')
|
||||
->toArray();
|
||||
|
||||
})
|
||||
->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),
|
||||
])
|
||||
->query(function ($query, array $data) {
|
||||
// Hide all records initially if no filters are applied
|
||||
if (empty($data['Plant']) && empty($data['name']) && empty($data['type']) && empty($data['work_group_id']) && empty($data['created_from']) && empty($data['created_to']) && empty($data['updated_from']) && empty($data['updated_to'])) {
|
||||
// return $query->whereRaw('1 = 0');
|
||||
}
|
||||
|
||||
if (! empty($data['Plant'])) { // $plant = $data['Plant'] ?? null
|
||||
$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['name'])) {
|
||||
$query->where('id', $data['name']);
|
||||
}
|
||||
|
||||
if (! empty($data['type'])) {
|
||||
$query->where('type', $data['type']);
|
||||
}
|
||||
|
||||
// if (! empty($data['work_group_id'])) {
|
||||
// $query->where('name', $data['work_group_id']);
|
||||
// }
|
||||
|
||||
if (! empty($data['work_group_id'])) {
|
||||
|
||||
$query->where(function ($q) use ($data) {
|
||||
|
||||
$q->where('work_group1_id', $data['work_group_id'])
|
||||
->orWhere('work_group2_id', $data['work_group_id'])
|
||||
->orWhere('work_group3_id', $data['work_group_id'])
|
||||
->orWhere('work_group4_id', $data['work_group_id'])
|
||||
->orWhere('work_group5_id', $data['work_group_id'])
|
||||
->orWhere('work_group6_id', $data['work_group_id'])
|
||||
->orWhere('work_group7_id', $data['work_group_id'])
|
||||
->orWhere('work_group8_id', $data['work_group_id'])
|
||||
->orWhere('work_group9_id', $data['work_group_id'])
|
||||
->orWhere('work_group10_id', $data['work_group_id']);
|
||||
});
|
||||
}
|
||||
|
||||
if (! empty($data['created_from'])) {
|
||||
$query->where('created_at', '>=', $data['created_from']);
|
||||
}
|
||||
|
||||
if (! empty($data['created_to'])) {
|
||||
$query->where('created_at', '<=', $data['created_to']);
|
||||
}
|
||||
|
||||
})
|
||||
->indicateUsing(function (array $data) {
|
||||
$indicators = [];
|
||||
|
||||
if (! empty($data['Plant'])) {
|
||||
$indicators[] = 'Plant: '.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['name'])) {
|
||||
$indicators[] = 'Line Name: '.Line::where('id', $data['name'])->value('name');
|
||||
}
|
||||
|
||||
if (! empty($data['type'])) {
|
||||
$indicators[] = 'Line Type: '.Line::where('type', $data['type'])->value('type');
|
||||
}
|
||||
|
||||
if (! empty($data['work_group_id'])) {
|
||||
$indicators[] = 'Work Group: ' .
|
||||
WorkGroupMaster::where('id', $data['work_group_id'])->value('name');
|
||||
}
|
||||
|
||||
if (! empty($data['created_from'])) {
|
||||
$indicators[] = 'From: '.$data['created_from'];
|
||||
}
|
||||
|
||||
if (! empty($data['created_to'])) {
|
||||
$indicators[] = 'To: '.$data['created_to'];
|
||||
}
|
||||
|
||||
if (! empty($data['updated_from'])) {
|
||||
$indicators[] = 'From: '.$data['updated_from'];
|
||||
}
|
||||
|
||||
if (! empty($data['updated_to'])) {
|
||||
$indicators[] = 'To: '.$data['updated_to'];
|
||||
}
|
||||
|
||||
return $indicators;
|
||||
}),
|
||||
])
|
||||
->filtersFormMaxHeight('280px')
|
||||
->actions([
|
||||
Tables\Actions\ViewAction::make(),
|
||||
Tables\Actions\EditAction::make(),
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,269 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Filament\Resources\PanelBoxValidationResource\Pages;
|
||||
|
||||
use App\Filament\Resources\PanelBoxValidationResource;
|
||||
use App\Models\ProductCharacteristicsMaster;
|
||||
use Filament\Actions;
|
||||
use Filament\Resources\Pages\CreateRecord;
|
||||
use Illuminate\Validation\ValidationException;
|
||||
|
||||
class CreatePanelBoxValidation extends CreateRecord {
|
||||
|
||||
protected static string $resource = PanelBoxValidationResource::class;
|
||||
|
||||
|
||||
public $showChecklist = false;
|
||||
public $checklist;
|
||||
|
||||
public $skipChecklistValidation = false;
|
||||
|
||||
public bool $shouldSkipChecklist = false;
|
||||
|
||||
public $existingRecords = [];
|
||||
|
||||
protected $listeners = [
|
||||
'checklistUpdated' => 'setChecklist',
|
||||
'checklist-cancelled' => 'handleChecklistCancel',
|
||||
'checklist-saved' => 'checkListSaved',
|
||||
];
|
||||
|
||||
public function setChecklist($checklist)
|
||||
{
|
||||
$this->data['checklist'] = $checklist;
|
||||
}
|
||||
|
||||
public function doCreate()
|
||||
{
|
||||
$this->create();
|
||||
}
|
||||
|
||||
public function mount(): void
|
||||
{
|
||||
parent::mount();
|
||||
|
||||
session()->forget([
|
||||
'last_selected_plant_id',
|
||||
'last_selected_line',
|
||||
'last_selected_production',
|
||||
]);
|
||||
}
|
||||
|
||||
public function handleChecklistCancel()
|
||||
{
|
||||
$this->skipChecklistValidation = true;
|
||||
$this->showChecklist = false;
|
||||
}
|
||||
|
||||
protected function mutateFormDataBeforeCreate(array $data): array
|
||||
{
|
||||
// if ($this->shouldSkipChecklist) {
|
||||
// return $data;
|
||||
// }
|
||||
|
||||
if ($this->checkIfHasCharacteristics($data)) {
|
||||
$this->showChecklist = true;
|
||||
$this->halt();
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
protected function checkIfHasCharacteristics(array $data)
|
||||
{
|
||||
$plantId = $data['plant_id'] ?? null;
|
||||
$itemCode = $data['item_id'] ?? null;
|
||||
$lineId = $data['line_id'] ?? null;
|
||||
|
||||
if (!$plantId || !$itemCode || !$lineId) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$item = \App\Models\Item::where('code', $itemCode)
|
||||
->where('plant_id', $plantId)
|
||||
->first();
|
||||
|
||||
$categoryName = trim($item->category) ?? null;
|
||||
|
||||
if (!$item) {
|
||||
$this->existingRecords = collect();
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->existingRecords = ProductCharacteristicsMaster::where('plant_id', $plantId)
|
||||
->where('category', $categoryName)
|
||||
->where('line_id', $lineId)
|
||||
->get();
|
||||
|
||||
return $this->existingRecords->isNotEmpty();
|
||||
}
|
||||
|
||||
public function checkListSaved()
|
||||
{
|
||||
$this->showChecklist = false;
|
||||
|
||||
$plantId = $this->data['plant_id'] ?? null;
|
||||
$lineId = $this->data['line_id'] ?? null;
|
||||
$productionOrder = $this->data['production_order'] ?? null;
|
||||
|
||||
return redirect()->to(
|
||||
static::getResource()::getUrl('create', [
|
||||
'plant_id' => $this->data['plant_id'] ?? null,
|
||||
'line_id' => $this->data['line_id'] ?? null,
|
||||
'production_order' => $this->data['production_order'] ?? null,
|
||||
])
|
||||
);
|
||||
}
|
||||
|
||||
protected function beforeCreate(): void
|
||||
{
|
||||
$errors = [];
|
||||
|
||||
if (!empty($this->data['validationError'])) {
|
||||
$errors['validationError'] = ['Fix the errors before submitting.'];
|
||||
}
|
||||
|
||||
if (!empty($this->data['serialPanelError'])) {
|
||||
$errors['serialPanelError'] = ['Fix the errors before submitting.'];
|
||||
}
|
||||
|
||||
if (!empty($this->data['packSlipPanelError'])) {
|
||||
$errors['packSlipPanelError'] = ['Fix the errors before submitting.'];
|
||||
}
|
||||
|
||||
if (!empty($this->data['namePlatePanelError'])) {
|
||||
$errors['namePlatePanelError'] = ['Fix the errors before submitting.'];
|
||||
}
|
||||
|
||||
//..name plate
|
||||
|
||||
if (!empty($this->data['tubeStickerPanelError'])) {
|
||||
$errors['tubeStickerPanelError'] = ['Fix the errors before submitting.'];
|
||||
}
|
||||
|
||||
if (!empty($this->data['warrantyCardPanelError'])) {
|
||||
$errors['warrantyCardPanelError'] = ['Fix the errors before submitting.'];
|
||||
}
|
||||
|
||||
//..part validations
|
||||
|
||||
if (!empty($this->data['part_validation1_error'])) {
|
||||
$errors['part_validation1_error'] = ['Fix the errors before submitting.'];
|
||||
}
|
||||
|
||||
if (!empty($this->data['part_validation2_error'])) {
|
||||
$errors['part_validation2_error'] = ['Fix the errors before submitting.'];
|
||||
}
|
||||
|
||||
if (!empty($this->data['part_validation3_error'])) {
|
||||
$errors['part_validation3_error'] = ['Fix the errors before submitting.'];
|
||||
}
|
||||
|
||||
if (!empty($this->data['part_validation4_error'])) {
|
||||
$errors['part_validation4_error'] = ['Fix the errors before submitting.'];
|
||||
}
|
||||
|
||||
if (!empty($this->data['part_validation5_error'])) {
|
||||
$errors['part_validation5_error'] = ['Fix the errors before submitting.'];
|
||||
}
|
||||
|
||||
if (!empty($errors)) {
|
||||
throw ValidationException::withMessages($errors);
|
||||
}
|
||||
|
||||
$this->checkExisting();
|
||||
|
||||
$checklist = $this->data['data']['checklist'] ?? [];
|
||||
|
||||
if (count($this->existingRecords) > 0){
|
||||
|
||||
$this->showChecklist = true;
|
||||
$this->halt();
|
||||
}
|
||||
else{
|
||||
$this->showChecklist = false;
|
||||
}
|
||||
}
|
||||
|
||||
public function checkExisting()
|
||||
{
|
||||
$plant_id = $this->data['plant_id'] ?? null;
|
||||
$item_code = $this->data['item_id'] ?? null;
|
||||
$line_id = $this->data['line_id'] ?? null;
|
||||
|
||||
|
||||
$item = \App\Models\Item::where('code', $item_code)->where('plant_id', $plant_id)->first();
|
||||
|
||||
if (!$item) {
|
||||
$this->existingRecords = collect();
|
||||
return;
|
||||
}
|
||||
|
||||
// $item_id = $item->id;
|
||||
$categoryName = trim($item->category) ?? null;
|
||||
|
||||
$this->existingRecords = ProductCharacteristicsMaster::where('plant_id', $plant_id)
|
||||
->where('category', $categoryName)
|
||||
->where('line_id', $line_id)
|
||||
->get();
|
||||
}
|
||||
|
||||
protected function afterCreate(): void
|
||||
{
|
||||
// Get the value from the hidden field 'plant'
|
||||
$plant = $this->form->getState()['plant'] ?? null;
|
||||
$line = $this->form->getState()['line'] ?? null;
|
||||
$production = $this->form->getState()['production'] ?? null;
|
||||
|
||||
// $this->skipChecklistValidation = false;
|
||||
// $this->showChecklist = false;
|
||||
// $this->checklist = [];
|
||||
|
||||
// $this->form->fill();
|
||||
|
||||
// reset checklist
|
||||
$this->checklist = [];
|
||||
|
||||
$this->skipChecklistValidation = false;
|
||||
$this->showChecklist = false;
|
||||
|
||||
$this->form->fill([]);
|
||||
|
||||
$this->data = [];
|
||||
|
||||
$this->resetValidation();
|
||||
$this->resetErrorBag();
|
||||
|
||||
$this->form->fill([
|
||||
'plant_id' => null,
|
||||
'line_id' => null,
|
||||
'production_order' => null,
|
||||
]);
|
||||
|
||||
|
||||
// $this->dispatch('focus-item-id');
|
||||
session()->flash('focus_item_id_after_redirect', true);
|
||||
logger('Focus flag set in session');
|
||||
|
||||
if ($plant) {
|
||||
session(['last_selected_plant_id' => $plant]);
|
||||
}
|
||||
if ($line) {
|
||||
session(['last_selected_line' => $line]);
|
||||
}
|
||||
if ($production) {
|
||||
session(['last_selected_production' => $production]);
|
||||
}
|
||||
}
|
||||
|
||||
protected function getRedirectUrl(): string
|
||||
{
|
||||
//return $this->getResource()::getUrl('create'); // Stay on Create Page after savin
|
||||
|
||||
return $this->getResource()::getUrl('create', [
|
||||
'plant_id' => $this->data['plant_id'] ?? null,
|
||||
'line_id' => $this->data['line_id'] ?? null,
|
||||
'production_order' => $this->data['production_order'] ?? null,
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Filament\Resources\PanelBoxValidationResource\Pages;
|
||||
|
||||
use App\Filament\Resources\PanelBoxValidationResource;
|
||||
use Filament\Actions;
|
||||
use Filament\Resources\Pages\EditRecord;
|
||||
|
||||
class EditPanelBoxValidation extends EditRecord
|
||||
{
|
||||
protected static string $resource = PanelBoxValidationResource::class;
|
||||
|
||||
protected function getHeaderActions(): array
|
||||
{
|
||||
return [
|
||||
Actions\ViewAction::make(),
|
||||
Actions\DeleteAction::make(),
|
||||
Actions\ForceDeleteAction::make(),
|
||||
Actions\RestoreAction::make(),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Filament\Resources\PanelBoxValidationResource\Pages;
|
||||
|
||||
use App\Filament\Resources\PanelBoxValidationResource;
|
||||
use Filament\Actions;
|
||||
use Filament\Resources\Pages\ListRecords;
|
||||
|
||||
class ListPanelBoxValidations extends ListRecords
|
||||
{
|
||||
protected static string $resource = PanelBoxValidationResource::class;
|
||||
|
||||
protected function getHeaderActions(): array
|
||||
{
|
||||
return [
|
||||
Actions\CreateAction::make(),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Filament\Resources\PanelBoxValidationResource\Pages;
|
||||
|
||||
use App\Filament\Resources\PanelBoxValidationResource;
|
||||
use Filament\Actions;
|
||||
use Filament\Resources\Pages\ViewRecord;
|
||||
|
||||
class ViewPanelBoxValidation extends ViewRecord
|
||||
{
|
||||
protected static string $resource = PanelBoxValidationResource::class;
|
||||
|
||||
protected function getHeaderActions(): array
|
||||
{
|
||||
return [
|
||||
Actions\EditAction::make(),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -253,9 +253,9 @@ class ProductionCharacteristicResource extends Resource
|
||||
->label('Spec. Value')
|
||||
// ->searchable()
|
||||
->formatStateUsing(function ($record) {
|
||||
$specVal = ProductCharacteristicsMaster::where('plant_id', $record->plant_id)->where('item_id', $record->item_id)->where('line_id', $record->line_id)->where('machine_id', $record->machine_id)->where('name', $record->characteristic_name)->first();
|
||||
// return $record?->plant_id.'-'.$record?->item_id.'-'.$record->line_id.'-'.$record?->machine_id;
|
||||
$specVal = ProductCharacteristicsMaster::where('plant_id', $record->plant_id)->where('item_id', $record->item_id)->where('line_id', $record->line_id)->where('machine_id', $record->machine_id)->first();
|
||||
|
||||
// return $record?->plant_id.'-'.$record?->item_id.'-'.$record->line_id.'-'.$record?->machine_id;
|
||||
return $specVal?->lower.' - '.$specVal?->upper;
|
||||
})
|
||||
->alignCenter()
|
||||
@@ -276,7 +276,7 @@ class ProductionCharacteristicResource extends Resource
|
||||
'Not Ok' => 'danger',
|
||||
'NotOk' => 'danger',
|
||||
'ConditionallyAccepted' => 'success',
|
||||
default => 'black',
|
||||
default => 'gray',
|
||||
})
|
||||
->alignCenter()
|
||||
->sortable(),
|
||||
|
||||
@@ -3507,17 +3507,6 @@ class QualityValidationResource extends Resource
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (strpos($state, '|') !== false) {
|
||||
$state = explode('|', $state)[0];
|
||||
if ($state != $expectedValue){
|
||||
$set('part_validation1_error', 'Invalid input for part validation 1.');
|
||||
}
|
||||
else{
|
||||
$set('part_validation1', $state);
|
||||
$set('part_validation1_error', null);
|
||||
}
|
||||
}
|
||||
if ($state == $expectedValue) {
|
||||
$set('part_validation1_error', null);
|
||||
} else {
|
||||
@@ -3529,80 +3518,14 @@ class QualityValidationResource extends Resource
|
||||
|
||||
$mPlantName = $mailData['plant_name'];
|
||||
$emails = $mailData['emails'];
|
||||
$ccEmails = $mailData['cc_emails'] ?? [];
|
||||
$mUserName = Filament::auth()->user()->name;
|
||||
|
||||
// if (! empty($emails)) {
|
||||
// if (is_array($emails)) {
|
||||
// $emailList = collect($emails)
|
||||
// ->flatMap(fn ($email) => explode(',', $email))
|
||||
// ->map(fn ($email) => trim($email))
|
||||
// ->filter()
|
||||
// ->toArray();
|
||||
// } else {
|
||||
// $emailList = array_map('trim', explode(',', $emails));
|
||||
// }
|
||||
|
||||
// $ccList = [];
|
||||
|
||||
// if (!empty($cc_emails)) {
|
||||
// if (is_array($cc_emails)) {
|
||||
// $ccList = collect($cc_emails)
|
||||
// ->flatMap(fn ($email) => explode(',', $email))
|
||||
// ->map(fn ($email) => trim($email))
|
||||
// ->filter()
|
||||
// ->toArray();
|
||||
// } else {
|
||||
// $ccList = collect(explode(',', $cc_emails))
|
||||
// ->map(fn ($email) => trim($email))
|
||||
// ->filter()
|
||||
// ->toArray();
|
||||
// }
|
||||
// }
|
||||
|
||||
// Mail::to($emailList)
|
||||
// ->cc($ccList)
|
||||
// ->send(
|
||||
// new InvalidQualityMail(
|
||||
// $state,
|
||||
// $mPorder,
|
||||
// $mPlantName,
|
||||
// $mLinePart,
|
||||
// $mUserName,
|
||||
// $mExpectedValue,
|
||||
// 'InvalidPartNumber'
|
||||
// )
|
||||
// );
|
||||
// }
|
||||
if (!empty($emails)) {
|
||||
|
||||
$emailList = collect(is_array($emails) ? $emails : explode(',', $emails))
|
||||
->flatMap(fn ($email) => explode(',', $email))
|
||||
->map(fn ($email) => trim($email))
|
||||
->filter()
|
||||
->toArray();
|
||||
|
||||
$ccList = collect(is_array($ccEmails) ? $ccEmails : explode(',', $ccEmails))
|
||||
->flatMap(fn ($email) => explode(',', $email))
|
||||
->map(fn ($email) => trim($email))
|
||||
->filter()
|
||||
->toArray();
|
||||
|
||||
Mail::to($emailList)
|
||||
->cc($ccList)
|
||||
->send(
|
||||
new InvalidQualityMail(
|
||||
$state,
|
||||
$mPorder,
|
||||
$mPlantName,
|
||||
$mLinePart,
|
||||
$mUserName,
|
||||
$mExpectedValue,
|
||||
'InvalidPartNumber'
|
||||
)
|
||||
);
|
||||
}
|
||||
else {
|
||||
if (! empty($emails)) {
|
||||
// Mail::to($emails)->send(new InvalidSerialMail($serNo, $invoiceNumber, $mPlantName, $mInvoiceType));
|
||||
Mail::to($emails)->send(
|
||||
new InvalidQualityMail($state, $mPorder, $mPlantName, $mLinePart, $mUserName, $mExpectedValue, 'InvalidPartNumber')
|
||||
);
|
||||
} else {
|
||||
\Log::warning("No recipients found for plant {$mPlantName}, module Serial, rule invalid_serial.");
|
||||
}
|
||||
$set('part_validation1', null);
|
||||
@@ -4044,7 +3967,6 @@ class QualityValidationResource extends Resource
|
||||
->where('module', 'QualityValidation')
|
||||
->where('rule_name', 'QualityMail')
|
||||
->where(fn ($q) => $q->whereNull('schedule_type')->orWhere('schedule_type', ''))
|
||||
// ->get()
|
||||
->pluck('email')
|
||||
->toArray();
|
||||
|
||||
@@ -4062,16 +3984,13 @@ class QualityValidationResource extends Resource
|
||||
->where('module', 'QualityValidation')
|
||||
->where('rule_name', 'QualityMail')
|
||||
->where(fn ($q) => $q->whereNull('schedule_type')->orWhere('schedule_type', ''))
|
||||
->get(['email', 'cc_emails']);
|
||||
// ->pluck('email')
|
||||
// ->toArray();
|
||||
->pluck('email')
|
||||
->toArray();
|
||||
|
||||
return [
|
||||
'plant_id' => $plantId,
|
||||
'plant_name' => $mPlantName,
|
||||
'emails' => $emails->pluck('email')->filter()->toArray(),
|
||||
'cc_emails' => $emails->pluck('cc_emails')->filter()->toArray(),
|
||||
// 'emails' => $emails,
|
||||
'emails' => $emails,
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -813,7 +813,7 @@ class TestingPanelReadingResource extends Resource
|
||||
if ($plantId) {
|
||||
return MotorTestingMaster::whereHas('testingPanelReadings', function ($query) {
|
||||
$query->whereNotNull('id');
|
||||
})->whereNotNull('subassembly_code')->orderBy('subassembly_code')->pluck('subassembly_code', 'id');
|
||||
})->orderBy('subassembly_code')->pluck('subassembly_code', 'id');
|
||||
} else {
|
||||
return [];
|
||||
// return Item::whereHas('motorTestingMasters')
|
||||
|
||||
@@ -187,15 +187,6 @@ class VisitorEntryResource extends Resource
|
||||
->numeric()
|
||||
->default(1)
|
||||
->required(),
|
||||
Forms\Components\Select::make('mode_of_travel')
|
||||
->label('Mode of Travel')
|
||||
->options([
|
||||
'Rental' => 'Rental',
|
||||
'Car' => 'Car',
|
||||
'Bike' => 'Bike',
|
||||
])
|
||||
->reactive()
|
||||
->placeholder('Select Mode of Travel'),
|
||||
Forms\Components\DateTimePicker::make('in_time')
|
||||
->label('In Time')
|
||||
->required()
|
||||
@@ -223,7 +214,6 @@ class VisitorEntryResource extends Resource
|
||||
public static function table(Table $table): Table
|
||||
{
|
||||
return $table
|
||||
// ->modifyQueryUsing(fn (Builder $query) => $query->whereDate('created_at', today()))
|
||||
->columns([
|
||||
Tables\Columns\TextColumn::make('No.')
|
||||
->label('NO')
|
||||
@@ -254,26 +244,16 @@ class VisitorEntryResource extends Resource
|
||||
->alignCenter()
|
||||
->searchable()
|
||||
->sortable(),
|
||||
Tables\Columns\TextColumn::make('mobile_number')
|
||||
->label('Visitor Mobile Number')
|
||||
->alignCenter()
|
||||
->searchable()
|
||||
->searchable()
|
||||
->sortable(),
|
||||
Tables\Columns\TextColumn::make('name')
|
||||
->label('Visitor Name')
|
||||
->sortable()
|
||||
->alignCenter()
|
||||
->searchable(),
|
||||
Tables\Columns\TextColumn::make('company')
|
||||
->label('Visitor Company')
|
||||
->sortable()
|
||||
->alignCenter()
|
||||
->searchable(),
|
||||
Tables\Columns\TextColumn::make('employeeMaster.plant.name')
|
||||
->label('Visited Plant')
|
||||
Tables\Columns\TextColumn::make('mobile_number')
|
||||
->label('Visitor Mobile Number')
|
||||
->alignCenter()
|
||||
->searchable()
|
||||
->searchable()
|
||||
->sortable(),
|
||||
Tables\Columns\TextColumn::make('employeeMaster.name')
|
||||
->label('Recipient Name')
|
||||
@@ -295,16 +275,6 @@ class VisitorEntryResource extends Resource
|
||||
->searchable()
|
||||
->alignCenter()
|
||||
->sortable(),
|
||||
Tables\Columns\TextColumn::make('purpose_of_visit')
|
||||
->label('Purpose of Visit')
|
||||
->searchable()
|
||||
->alignCenter()
|
||||
->sortable(),
|
||||
Tables\Columns\TextColumn::make('mode_of_travel')
|
||||
->label('Mode of Travel')
|
||||
->searchable()
|
||||
->alignCenter()
|
||||
->sortable(),
|
||||
Tables\Columns\TextColumn::make('in_time')
|
||||
->label('In Time')
|
||||
->searchable()
|
||||
@@ -435,25 +405,9 @@ class VisitorEntryResource extends Resource
|
||||
])
|
||||
->query(function ($query, array $data) {
|
||||
// Hide all records initially if no filters are applied
|
||||
// if (empty($data['register_id']) && empty($data['type']) && empty($data['name']) && empty($data['company']) && empty($data['employee_master_id']) && empty($data['created_from']) && empty($data['created_to'])) {
|
||||
// $query->where(function ($q) {
|
||||
// });
|
||||
// }
|
||||
|
||||
$hasAnyFilter = !empty($data['register_id'])
|
||||
|| !empty($data['type'])
|
||||
|| !empty($data['name'])
|
||||
|| !empty($data['company'])
|
||||
|| !empty($data['employee_master_id'])
|
||||
|| !empty($data['employee_department'])
|
||||
|| !empty($data['created_from'])
|
||||
|| !empty($data['created_to']);
|
||||
|
||||
if (!$hasAnyFilter) {
|
||||
// $query->whereDate('created_at', today());
|
||||
$query->whereDate('visitor_entries.created_at', today())
|
||||
->whereNull('out_time');
|
||||
return;
|
||||
if (empty($data['register_id']) && empty($data['type']) && empty($data['name']) && empty($data['company']) && empty($data['employee_master_id']) && empty($data['created_from']) && empty($data['created_to'])) {
|
||||
$query->where(function ($q) {
|
||||
});
|
||||
}
|
||||
|
||||
if (! empty($data['register_id'])) {
|
||||
@@ -469,15 +423,8 @@ class VisitorEntryResource extends Resource
|
||||
}
|
||||
}
|
||||
|
||||
// if (! empty($data['name'])) {
|
||||
// $query->where('name', 'like', '%'.$data['name'].'%');
|
||||
// }
|
||||
|
||||
if (! empty($data['name'])) {
|
||||
$query->whereRaw(
|
||||
'LOWER(name) LIKE ?',
|
||||
['%' . strtolower($data['name']) . '%']
|
||||
);
|
||||
$query->where('name', 'like', '%'.$data['name'].'%');
|
||||
}
|
||||
|
||||
if (! empty($data['company'])) {
|
||||
@@ -674,5 +621,4 @@ class VisitorEntryResource extends Resource
|
||||
SoftDeletingScope::class,
|
||||
]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -21,42 +21,36 @@ class CreateVisitorEntry extends CreateRecord
|
||||
|
||||
public function processMobile($mobile)
|
||||
{
|
||||
$registerId = $this->data['register_id'] ?? null;
|
||||
|
||||
$visitor = VisitorEntry::where('mobile_number', $mobile)->latest()->first();
|
||||
|
||||
if ($visitor) {
|
||||
|
||||
$employee = EmployeeMaster::where('id', $visitor->employee_master_id)->first();
|
||||
|
||||
$this->form->fill([
|
||||
'register_id' => $registerId ?? '',
|
||||
'mobile_number' => $visitor->mobile_number,
|
||||
'name' => $visitor->name ?? '',
|
||||
'company' => $visitor->company ?? '',
|
||||
'type' => $visitor->type ?? '',
|
||||
'department' => $employee?->department ?? '',
|
||||
'employee_master_id' => $visitor->employee_master_id,
|
||||
'code' => $employee?->code ?? '',
|
||||
'purpose_of_visit' => '',
|
||||
'in_time' => now(),
|
||||
'out_time' => null,
|
||||
'valid_upto' => null,
|
||||
'register_id' => $visitor->register_id ?? '',
|
||||
'mobile_number' => $mobile ?? '',
|
||||
'name' => $visitor->name ?? '',
|
||||
'company' => $visitor->company ?? '',
|
||||
'type' => $visitor->type ?? '',
|
||||
'department' => $employee->department ?? '',
|
||||
'employee_master_id' => $visitor->employee_master_id->name ?? '',
|
||||
'code' => $employee->code ?? '',
|
||||
]);
|
||||
}
|
||||
else {
|
||||
|
||||
$registerId = $this->form->getState()['register_id'] ?? '';
|
||||
|
||||
$this->form->fill([
|
||||
'register_id' => $registerId ?? '',
|
||||
'mobile_number' => $mobile,
|
||||
'name' => '',
|
||||
'company' => '',
|
||||
'type' => '',
|
||||
'department' => '',
|
||||
'employee_master_id' => null,
|
||||
'code' => '',
|
||||
'purpose_of_visit' => '',
|
||||
'in_time' => now(),
|
||||
'out_time' => null,
|
||||
'valid_upto' => null,
|
||||
'register_id' => $registerId ?? '',
|
||||
'mobile_number' => $mobile ?? '',
|
||||
'name' => $visitor->name ?? '',
|
||||
'company' => $visitor->company ?? '',
|
||||
'type' => $visitor->type ?? '',
|
||||
'department' => $employee->department ?? '',
|
||||
'employee_master_id' => $visitor->employee_master_id->name ?? '',
|
||||
'code' => $employee->code ?? '',
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -520,7 +520,7 @@ class CharacteristicsController extends Controller
|
||||
|
||||
if (Str::contains($modelHeading, 'PRESSURE BOOSTER SYSTEM', ignoreCase: true)) {
|
||||
$typesToCreate = ['MOTOR', 'PUMP', 'NAME_PLATE'];
|
||||
} elseif (Str::contains($modelHeading, 'PUMP SET', ignoreCase: true) || Str::contains($modelHeading, 'PUMPSET', ignoreCase: true) || Str::contains($modelHeading, 'PUMPS', ignoreCase: true)) {
|
||||
} elseif (Str::contains($modelHeading, 'PUMPS', ignoreCase: true) || Str::contains($modelHeading, 'PUMPSET', ignoreCase: true)) {
|
||||
$typesToCreate = ['MOTOR', 'PUMP'];
|
||||
} elseif (Str::contains($modelHeading, 'PUMP', ignoreCase: true) && ! Str::contains($modelHeading, 'PUMP SET', ignoreCase: true) && ! Str::contains($modelHeading, 'PUMPSET', ignoreCase: true) && ! Str::contains($modelHeading, 'PUMPS', ignoreCase: true)) {
|
||||
$typesToCreate = ['PUMP'];
|
||||
@@ -673,7 +673,7 @@ class CharacteristicsController extends Controller
|
||||
// 'status_description' => "Serial number '{$serialNumber}' doesn't have pumpset model to proceed!",
|
||||
// ], 404);
|
||||
}
|
||||
} elseif (! Str::contains($curHead, 'PUMP SET', ignoreCase: true) && ! Str::contains($curHead, 'PUMPSET', ignoreCase: true) && ! Str::contains($curHead, 'PUMPS', ignoreCase: true)) {
|
||||
} elseif (! Str::contains($curHead, 'PUMPS', ignoreCase: true) && ! Str::contains($curHead, 'PUMPSET', ignoreCase: true)) {
|
||||
return response()->json([
|
||||
'status_code' => 'ERROR',
|
||||
'status_description' => "Serial number '{$serialNumber}' doesn't have valid model type to proceed!",
|
||||
@@ -1562,7 +1562,7 @@ class CharacteristicsController extends Controller
|
||||
|
||||
if (Str::contains($modelHeading, 'PRESSURE BOOSTER SYSTEM', ignoreCase: true)) {
|
||||
$typesToCreate = ['MOTOR', 'PUMP', 'NAME_PLATE'];
|
||||
} elseif (Str::contains($modelHeading, 'PUMP SET', ignoreCase: true) || Str::contains($modelHeading, 'PUMPSET', ignoreCase: true) || Str::contains($modelHeading, 'PUMPS', ignoreCase: true)) {
|
||||
} elseif (Str::contains($modelHeading, 'PUMPS', ignoreCase: true) || Str::contains($modelHeading, 'PUMPSET', ignoreCase: true)) {
|
||||
$typesToCreate = ['MOTOR', 'PUMP'];
|
||||
} elseif (Str::contains($modelHeading, 'PUMP', ignoreCase: true) && ! Str::contains($modelHeading, 'PUMP SET', ignoreCase: true) && ! Str::contains($modelHeading, 'PUMPSET', ignoreCase: true) && ! Str::contains($modelHeading, 'PUMPS', ignoreCase: true)) {
|
||||
$typesToCreate = ['PUMP'];
|
||||
@@ -1941,7 +1941,7 @@ class CharacteristicsController extends Controller
|
||||
|
||||
if (Str::contains($modelHeading, 'PRESSURE BOOSTER SYSTEM', ignoreCase: true)) {
|
||||
$typesToCreate = ['MOTOR', 'PUMP', 'NAME_PLATE'];
|
||||
} elseif (Str::contains($modelHeading, 'PUMP SET', ignoreCase: true) || Str::contains($modelHeading, 'PUMPSET', ignoreCase: true) || Str::contains($modelHeading, 'PUMPS', ignoreCase: true)) {
|
||||
} elseif (Str::contains($modelHeading, 'PUMPS', ignoreCase: true) || Str::contains($modelHeading, 'PUMPSET', ignoreCase: true)) {
|
||||
$typesToCreate = ['MOTOR', 'PUMP'];
|
||||
} elseif (Str::contains($modelHeading, 'PUMP', ignoreCase: true) && ! Str::contains($modelHeading, 'PUMP SET', ignoreCase: true) && ! Str::contains($modelHeading, 'PUMPSET', ignoreCase: true) && ! Str::contains($modelHeading, 'PUMPS', ignoreCase: true)) {
|
||||
$typesToCreate = ['PUMP'];
|
||||
@@ -2399,7 +2399,7 @@ class CharacteristicsController extends Controller
|
||||
// 'status_description' => "Serial number '{$serialNumber}' doesn't have pumpset model to proceed!",
|
||||
// ], 404);
|
||||
}
|
||||
} elseif (! Str::contains($curHead, 'PUMP SET', ignoreCase: true) && ! Str::contains($curHead, 'PUMPSET', ignoreCase: true) && ! Str::contains($curHead, 'PUMPS', ignoreCase: true)) {
|
||||
} elseif (! Str::contains($curHead, 'PUMPS', ignoreCase: true) && ! Str::contains($curHead, 'PUMPSET', ignoreCase: true)) {
|
||||
return response()->json([
|
||||
'status_code' => 'ERROR',
|
||||
'status_description' => "Serial number '{$serialNumber}' doesn't have valid model type to proceed!",
|
||||
@@ -3666,7 +3666,7 @@ class CharacteristicsController extends Controller
|
||||
|
||||
if (Str::contains($modelHeading, 'PRESSURE BOOSTER SYSTEM', ignoreCase: true)) {
|
||||
$typesToCreate = ['MOTOR', 'PUMP', 'NAME_PLATE'];
|
||||
} elseif (Str::contains($modelHeading, 'PUMP SET', ignoreCase: true) || Str::contains($modelHeading, 'PUMPSET', ignoreCase: true) || Str::contains($modelHeading, 'PUMPS', ignoreCase: true)) {
|
||||
} elseif (Str::contains($modelHeading, 'PUMPS', ignoreCase: true) || Str::contains($modelHeading, 'PUMPSET', ignoreCase: true)) {
|
||||
$typesToCreate = ['MOTOR', 'PUMP'];
|
||||
} elseif (Str::contains($modelHeading, 'PUMP', ignoreCase: true) && ! Str::contains($modelHeading, 'PUMP SET', ignoreCase: true) && ! Str::contains($modelHeading, 'PUMPSET', ignoreCase: true) && ! Str::contains($modelHeading, 'PUMPS', ignoreCase: true)) {
|
||||
$typesToCreate = ['PUMP'];
|
||||
@@ -4701,7 +4701,7 @@ class CharacteristicsController extends Controller
|
||||
|
||||
if (Str::contains($modelHeading, 'PRESSURE BOOSTER SYSTEM', ignoreCase: true)) {
|
||||
$typesToCreate = ['MOTOR', 'PUMP', 'NAME_PLATE'];
|
||||
} elseif (Str::contains($modelHeading, 'PUMP SET', ignoreCase: true) || Str::contains($modelHeading, 'PUMPSET', ignoreCase: true) || Str::contains($modelHeading, 'PUMPS', ignoreCase: true)) {
|
||||
} elseif (Str::contains($modelHeading, 'PUMPS', ignoreCase: true) || Str::contains($modelHeading, 'PUMPSET', ignoreCase: true)) {
|
||||
$typesToCreate = ['MOTOR', 'PUMP'];
|
||||
} elseif (Str::contains($modelHeading, 'PUMP', ignoreCase: true) && ! Str::contains($modelHeading, 'PUMP SET', ignoreCase: true) && ! Str::contains($modelHeading, 'PUMPSET', ignoreCase: true) && ! Str::contains($modelHeading, 'PUMPS', ignoreCase: true)) {
|
||||
$typesToCreate = ['PUMP'];
|
||||
|
||||
@@ -1,266 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Livewire;
|
||||
|
||||
use App\Models\AlertMailRule;
|
||||
use App\Models\Item;
|
||||
use App\Models\Line;
|
||||
use App\Models\PanelBoxValidation;
|
||||
use App\Models\Plant;
|
||||
use App\Models\ProductCharacteristicsMaster;
|
||||
use App\Models\ProductionCharacteristic;
|
||||
use Filament\Facades\Filament;
|
||||
use Livewire\Component;
|
||||
use Filament\Notifications\Notification;
|
||||
use Illuminate\Support\Facades\Mail;
|
||||
use App\Mail\InvalidQualityMail;
|
||||
|
||||
class PanelCheckList extends Component
|
||||
{
|
||||
|
||||
public $records = [];
|
||||
|
||||
public $existingRecords = [];
|
||||
|
||||
// public bool $shouldSkipChecklist = false;
|
||||
|
||||
public array $checklist = [];
|
||||
|
||||
public $showChecklist = false;
|
||||
|
||||
// public $skipChecklistValidation = false;
|
||||
|
||||
// protected $listeners = ['focus-item-id' => 'handleFocus', 'trigger-create' => 'doCreate',];
|
||||
|
||||
public $data =
|
||||
[
|
||||
'item_id' => '',
|
||||
'plant_id' => '',
|
||||
];
|
||||
|
||||
public $data1 = [
|
||||
'checklist' => [],
|
||||
];
|
||||
|
||||
// public function doCreate()
|
||||
// {
|
||||
// $this->create();
|
||||
|
||||
// $this->shouldSkipChecklist = false;
|
||||
// }
|
||||
|
||||
public function mount($records = [])
|
||||
{
|
||||
// $this->records = collect($records);
|
||||
$this->records = $records;
|
||||
|
||||
// foreach ($records as $record) {
|
||||
// $this->checklist[$record['id']] = 'ok';
|
||||
// }
|
||||
}
|
||||
|
||||
public function cancel()
|
||||
{
|
||||
$this->dispatch('checklist-cancelled');
|
||||
}
|
||||
|
||||
public function saveChecklist()
|
||||
{
|
||||
if (empty($this->checklist) || count($this->checklist) != count($this->records)) {
|
||||
Notification::make()
|
||||
->title('Incomplete Checklist')
|
||||
->body('Please complete all checklist fields before submitting.')
|
||||
->danger()
|
||||
->send();
|
||||
return;
|
||||
}
|
||||
|
||||
$item = Item::where('code', $this->data['item_id'])->first();
|
||||
|
||||
if (! $item) {
|
||||
Notification::make()
|
||||
->title('Invalid Item Code')
|
||||
->body('Item not found for given code.')
|
||||
->danger()
|
||||
->send();
|
||||
return;
|
||||
}
|
||||
|
||||
$itemAgaPlant = Item::where('code', $this->data['item_id'])->where('plant_id', $this->data['plant_id'])->first();
|
||||
|
||||
$plant = Plant::find($this->data['plant_id']);
|
||||
|
||||
if (! $itemAgaPlant) {
|
||||
Notification::make()
|
||||
->title('Invalid Item Code')
|
||||
->body("Item code '$this->data['item_id']' not found for given plant code '{$plant?->code}'.")
|
||||
->danger()
|
||||
->send();
|
||||
return;
|
||||
}
|
||||
|
||||
$itemId = $itemAgaPlant->id;
|
||||
|
||||
$exists = PanelBoxValidation::where('plant_id', $this->data['plant_id'] ?? null)
|
||||
->where('serial_number', $this->data['serial_number'] ?? null)
|
||||
->first();
|
||||
|
||||
$plan = Plant::find($this->data['plant_id']);
|
||||
|
||||
if ($exists) {
|
||||
Notification::make()
|
||||
->title('Duplicate Serial Number')
|
||||
->body("serial number {$this->data['serial_number']} already exists for the selected plant $plan->code.")
|
||||
->danger()
|
||||
->send();
|
||||
return;
|
||||
}
|
||||
|
||||
$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,
|
||||
'created_by' => $this->data['created_by'] ?? null,
|
||||
]);
|
||||
|
||||
if (! $qualityValidation || ! $qualityValidation->exists) {
|
||||
Notification::make()
|
||||
->title('Failed to save Panel Box Validation')
|
||||
->body('Something went wrong while inserting data.')
|
||||
->danger()
|
||||
->send();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
foreach ($this->checklist as $characteristicId => $value) {
|
||||
|
||||
// $status = 'Ok';
|
||||
|
||||
$characteristic = ProductCharacteristicsMaster::find($characteristicId);
|
||||
|
||||
if (($characteristic?->inspection_type ?? null) === 'Value') {
|
||||
if (
|
||||
$characteristic &&
|
||||
is_numeric($value) &&
|
||||
$value >= $characteristic->lower &&
|
||||
$value <= $characteristic->upper
|
||||
) {
|
||||
$status = 'Ok';
|
||||
} else {
|
||||
$status = 'NotOk';
|
||||
}
|
||||
}
|
||||
else {
|
||||
$status = $value;
|
||||
}
|
||||
|
||||
ProductionCharacteristic::create([
|
||||
'plant_id' => $this->data['plant_id'] ?? null,
|
||||
'item_id' => $itemId ?? null,
|
||||
'line_id' => $this->data['line_id'] ?? null,
|
||||
'machine_id' => $characteristic?->machine_id ?? null,
|
||||
'production_order' => $this->data['production_order'] ?? null,
|
||||
'serial_number' => $this->data['serial_number'] ?? null,
|
||||
'characteristic_name' => $characteristic?->name ?? null,
|
||||
'observed_value' => $value ?? null,
|
||||
'status' => $status,
|
||||
'inspection_status' => $finalInspectionStatus ?? null,
|
||||
'created_by' => $this->data['operator_id'] ?? null,
|
||||
]);
|
||||
}
|
||||
|
||||
$this->showChecklist = false;
|
||||
|
||||
$this->dispatch('checklist-saved');
|
||||
}
|
||||
|
||||
public function canSaveChecklist(): bool
|
||||
{
|
||||
if (empty($this->checklist) || count($this->checklist) != count($this->records)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
foreach ($this->checklist as $characteristicId => $value) {
|
||||
|
||||
if ($value == null || $value == '') {
|
||||
return false;
|
||||
}
|
||||
|
||||
$characteristic = ProductCharacteristicsMaster::find($characteristicId);
|
||||
|
||||
if (! $characteristic || ! is_numeric($value) || $value <= $characteristic->lower || $value >= $characteristic->upper){
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public function getCharacteristicStatus($characteristicId): ?string
|
||||
{
|
||||
$value = $this->checklist[$characteristicId] ?? null;
|
||||
|
||||
if ($value == null || $value == '') {
|
||||
return null;
|
||||
}
|
||||
|
||||
$characteristic = ProductCharacteristicsMaster::find($characteristicId);
|
||||
|
||||
if (! $characteristic || ! is_numeric($value)) {
|
||||
return 'Not Ok';
|
||||
}
|
||||
|
||||
return ($value > $characteristic->lower && $value < $characteristic->upper) ? 'Ok' : 'Not Ok';
|
||||
|
||||
}
|
||||
|
||||
// public static function getMailData($plantId)
|
||||
// {
|
||||
// $globalEmails = AlertMailRule::where('plant', 0)
|
||||
// ->where('module', 'QualityValidation')
|
||||
// ->where('rule_name', 'QualityMail')
|
||||
// ->where(fn ($q) => $q->whereNull('schedule_type')->orWhere('schedule_type', ''))
|
||||
// ->pluck('email')
|
||||
// ->toArray();
|
||||
|
||||
// if (! empty($globalEmails)) {
|
||||
// return [
|
||||
// 'plant_id' => 0,
|
||||
// 'plant_name' => 'All Plants',
|
||||
// 'emails' => $globalEmails,
|
||||
// ];
|
||||
// }
|
||||
|
||||
// $mPlantName = Plant::where('id', $plantId)->value('name');
|
||||
|
||||
// $emails = AlertMailRule::where('plant', $plantId)
|
||||
// ->where('module', 'QualityValidation')
|
||||
// ->where('rule_name', 'QualityMail')
|
||||
// ->where(fn ($q) => $q->whereNull('schedule_type')->orWhere('schedule_type', ''))
|
||||
// ->pluck('email')
|
||||
// ->toArray();
|
||||
|
||||
// return [
|
||||
// 'plant_id' => $plantId,
|
||||
// 'plant_name' => $mPlantName,
|
||||
// 'emails' => $emails,
|
||||
// ];
|
||||
// }
|
||||
|
||||
public function render()
|
||||
{
|
||||
return view('livewire.panel-check-list');
|
||||
}
|
||||
}
|
||||
@@ -25,15 +25,15 @@ class ProductionCheckList extends Component
|
||||
|
||||
public $existingRecords = [];
|
||||
|
||||
// public bool $shouldSkipChecklist = false;
|
||||
public bool $shouldSkipChecklist = false;
|
||||
|
||||
public array $checklist = [];
|
||||
|
||||
public $showChecklist = false;
|
||||
|
||||
// public $skipChecklistValidation = false;
|
||||
public $skipChecklistValidation = false;
|
||||
|
||||
// protected $listeners = ['focus-item-id' => 'handleFocus', 'trigger-create' => 'doCreate',];
|
||||
protected $listeners = ['focus-item-id' => 'handleFocus', 'trigger-create' => 'doCreate',];
|
||||
|
||||
public $data =
|
||||
[
|
||||
@@ -45,21 +45,23 @@ class ProductionCheckList extends Component
|
||||
'checklist' => [],
|
||||
];
|
||||
|
||||
// public function doCreate()
|
||||
// {
|
||||
// $this->create();
|
||||
#[On('focus-item-id')]
|
||||
public function handleFocus()
|
||||
{
|
||||
$this->dispatch('focus-input');
|
||||
}
|
||||
|
||||
public function doCreate()
|
||||
{
|
||||
$this->create();
|
||||
|
||||
$this->shouldSkipChecklist = false;
|
||||
}
|
||||
|
||||
// $this->shouldSkipChecklist = false;
|
||||
// }
|
||||
|
||||
public function mount($records = [])
|
||||
{
|
||||
// $this->records = collect($records);
|
||||
$this->records = $records;
|
||||
|
||||
foreach ($records as $record) {
|
||||
$this->checklist[$record['id']] = 'ok';
|
||||
}
|
||||
$this->records = collect($records);
|
||||
}
|
||||
|
||||
public function cancel()
|
||||
@@ -253,10 +255,11 @@ class ProductionCheckList extends Component
|
||||
];
|
||||
}
|
||||
|
||||
// public function updatedDataChecklist()
|
||||
// {
|
||||
// $this->dispatch('checklistUpdated', $this->data['checklist']);
|
||||
// }
|
||||
public function updatedDataChecklist()
|
||||
{
|
||||
$this->dispatch('checklistUpdated', $this->data['checklist']);
|
||||
}
|
||||
|
||||
|
||||
public function render()
|
||||
{
|
||||
|
||||
@@ -9,7 +9,6 @@ use Illuminate\Mail\Mailable;
|
||||
use Illuminate\Mail\Mailables\Content;
|
||||
use Illuminate\Mail\Mailables\Envelope;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
use Illuminate\Mail\Mailables\Attachment;
|
||||
|
||||
class ImportTransitMail extends Mailable
|
||||
{
|
||||
@@ -21,17 +20,14 @@ class ImportTransitMail extends Mailable
|
||||
|
||||
public $mailSubject;
|
||||
|
||||
public $excelPath;
|
||||
|
||||
/**
|
||||
* Create a new message instance.
|
||||
*/
|
||||
public function __construct($scheduleType, $tableData, $mailSubject, $excelPath)
|
||||
public function __construct($scheduleType, $tableData, $mailSubject)
|
||||
{
|
||||
$this->scheduleType = $scheduleType;
|
||||
$this->tableData = $tableData ?? [];
|
||||
$this->mailSubject = $mailSubject ?? 'Import Transit';
|
||||
$this->excelPath = $excelPath;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -40,7 +36,7 @@ class ImportTransitMail extends Mailable
|
||||
public function envelope(): Envelope
|
||||
{
|
||||
return new Envelope(
|
||||
subject: 'Import Shipment InTransit Mail',
|
||||
subject: 'Import Transit Mail',
|
||||
);
|
||||
}
|
||||
|
||||
@@ -49,9 +45,7 @@ class ImportTransitMail extends Mailable
|
||||
*/
|
||||
public function content(): Content
|
||||
{
|
||||
$now = now();
|
||||
$reportDate = $now->format('d/m/Y');
|
||||
$greeting = '<b>Dear Sir/Madam</b>,<br>Kindly find attached the Pending Import Shipment Status Report as on ' . $reportDate . ' for your reference.<br>We request you to review the shipments highlighted in <span style="background-color: yellow; font-weight: bold;">yellow</span> and arrange for their clearance at the earliest to avoid further delays and additional charges.<br>Please note that for shipments pending under <b>Telex Release</b> and <b>Duty Payment</b>, CFS charges will be commenced post ETA. We therefore urge you to expedite the necessary actions at your end.<br>FCL shipment will take 5-6 Days for clearance & LCL shipment will take 7-8 Days for clearance after arrival of the shipment @ destination Port.</br>';
|
||||
$greeting = '<b>Dear Sir</b>';
|
||||
|
||||
//$greeting1 = 'Dear C.R.I Branch Team, <br><br> Please follow and ensure the same';
|
||||
|
||||
@@ -94,14 +88,6 @@ class ImportTransitMail extends Mailable
|
||||
*/
|
||||
public function attachments(): array
|
||||
{
|
||||
return [
|
||||
Attachment::fromStorageDisk(
|
||||
'local',
|
||||
$this->excelPath
|
||||
)->as('Import_Transit_Report.xlsx')
|
||||
->withMime(
|
||||
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
|
||||
),
|
||||
];
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,46 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
|
||||
class PanelBoxValidation extends Model
|
||||
{
|
||||
use SoftDeletes;
|
||||
|
||||
protected $fillable = [
|
||||
'plant_id',
|
||||
'line_id',
|
||||
'sticker_master_id',
|
||||
'production_order',
|
||||
'serial_number',
|
||||
'serial_number_panel',
|
||||
'pack_slip_panel',
|
||||
'name_plate_panel',
|
||||
'tube_sticker_panel',
|
||||
'warranty_card_panel',
|
||||
'part_validation1',
|
||||
'part_validation2',
|
||||
'part_validation3',
|
||||
'part_validation4',
|
||||
'part_validation5',
|
||||
'created_by',
|
||||
'updated_by'
|
||||
];
|
||||
public function plant(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(Plant::class);
|
||||
}
|
||||
|
||||
public function line(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(Line::class);
|
||||
}
|
||||
|
||||
public function stickerMaster(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(StickerMaster::class);
|
||||
}
|
||||
}
|
||||
@@ -23,7 +23,6 @@ class VisitorEntry extends Model
|
||||
'employee_master_id',
|
||||
'number_of_person',
|
||||
'valid_upto',
|
||||
'mode_of_travel',
|
||||
];
|
||||
|
||||
public function employeeMaster(): BelongsTo
|
||||
|
||||
@@ -1,106 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Policies;
|
||||
|
||||
use Illuminate\Auth\Access\Response;
|
||||
use App\Models\PanelBoxValidation;
|
||||
use App\Models\User;
|
||||
|
||||
class PanelBoxValidationPolicy
|
||||
{
|
||||
/**
|
||||
* Determine whether the user can view any models.
|
||||
*/
|
||||
public function viewAny(User $user): bool
|
||||
{
|
||||
return $user->checkPermissionTo('view-any PanelBoxValidation');
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether the user can view the model.
|
||||
*/
|
||||
public function view(User $user, PanelBoxValidation $panelboxvalidation): bool
|
||||
{
|
||||
return $user->checkPermissionTo('view PanelBoxValidation');
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether the user can create models.
|
||||
*/
|
||||
public function create(User $user): bool
|
||||
{
|
||||
return $user->checkPermissionTo('create PanelBoxValidation');
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether the user can update the model.
|
||||
*/
|
||||
public function update(User $user, PanelBoxValidation $panelboxvalidation): bool
|
||||
{
|
||||
return $user->checkPermissionTo('update PanelBoxValidation');
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether the user can delete the model.
|
||||
*/
|
||||
public function delete(User $user, PanelBoxValidation $panelboxvalidation): bool
|
||||
{
|
||||
return $user->checkPermissionTo('delete PanelBoxValidation');
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether the user can delete any models.
|
||||
*/
|
||||
public function deleteAny(User $user): bool
|
||||
{
|
||||
return $user->checkPermissionTo('delete-any PanelBoxValidation');
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether the user can restore the model.
|
||||
*/
|
||||
public function restore(User $user, PanelBoxValidation $panelboxvalidation): bool
|
||||
{
|
||||
return $user->checkPermissionTo('restore PanelBoxValidation');
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether the user can restore any models.
|
||||
*/
|
||||
public function restoreAny(User $user): bool
|
||||
{
|
||||
return $user->checkPermissionTo('restore-any PanelBoxValidation');
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether the user can replicate the model.
|
||||
*/
|
||||
public function replicate(User $user, PanelBoxValidation $panelboxvalidation): bool
|
||||
{
|
||||
return $user->checkPermissionTo('replicate PanelBoxValidation');
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether the user can reorder the models.
|
||||
*/
|
||||
public function reorder(User $user): bool
|
||||
{
|
||||
return $user->checkPermissionTo('reorder PanelBoxValidation');
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether the user can permanently delete the model.
|
||||
*/
|
||||
public function forceDelete(User $user, PanelBoxValidation $panelboxvalidation): bool
|
||||
{
|
||||
return $user->checkPermissionTo('force-delete PanelBoxValidation');
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether the user can permanently delete any models.
|
||||
*/
|
||||
public function forceDeleteAny(User $user): bool
|
||||
{
|
||||
return $user->checkPermissionTo('force-delete-any PanelBoxValidation');
|
||||
}
|
||||
}
|
||||
@@ -7,7 +7,7 @@
|
||||
"license": "MIT",
|
||||
"require": {
|
||||
"php": "^8.2",
|
||||
"alperenersoy/filament-export": "^3.0",
|
||||
"alperenersoy/filament-export": "^4.0",
|
||||
"althinect/filament-spatie-roles-permissions": "^2.3",
|
||||
"diogogpinto/filament-auth-ui-enhancer": "^1.0",
|
||||
"erag/laravel-pwa": "^1.9",
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
$sql1 = <<<'SQL'
|
||||
ALTER TABLE visitor_entries
|
||||
ADD COLUMN mode_of_travel TEXT DEFAULT NULL
|
||||
SQL;
|
||||
|
||||
DB::statement($sql1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
// Schema::table('visitor_entries', function (Blueprint $table) {
|
||||
// //
|
||||
// });
|
||||
}
|
||||
};
|
||||
@@ -1,56 +0,0 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
$sql = <<<'SQL'
|
||||
CREATE TABLE panel_box_validations (
|
||||
id BIGINT GENERATED always AS IDENTITY PRIMARY KEY,
|
||||
|
||||
plant_id BIGINT NOT NULL,
|
||||
line_id BIGINT NOT NULL,
|
||||
sticker_master_id BIGINT NOT NULL,
|
||||
production_order TEXT DEFAULT NULL,
|
||||
serial_number TEXT DEFAULT NULL,
|
||||
serial_number_panel TEXT DEFAULT NULL,
|
||||
pack_slip_panel TEXT DEFAULT NULL,
|
||||
name_plate_panel TEXT DEFAULT NULL,
|
||||
tube_sticker_panel TEXT DEFAULT NULL,
|
||||
warranty_card_panel TEXT DEFAULT NULL,
|
||||
part_validation1 TEXT DEFAULT NULL,
|
||||
part_validation2 TEXT DEFAULT NULL,
|
||||
part_validation3 TEXT DEFAULT NULL,
|
||||
part_validation4 TEXT DEFAULT NULL,
|
||||
part_validation5 TEXT DEFAULT NULL,
|
||||
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMP,
|
||||
created_by TEXT DEFAULT NULL,
|
||||
updated_by TEXT DEFAULT NULL,
|
||||
deleted_at TIMESTAMP,
|
||||
|
||||
UNIQUE (plant_id, serial_number),
|
||||
FOREIGN KEY (plant_id) REFERENCES plants (id),
|
||||
FOREIGN KEY (line_id) REFERENCES lines (id),
|
||||
FOREIGN KEY (sticker_master_id) REFERENCES sticker_masters (id)
|
||||
);
|
||||
SQL;
|
||||
|
||||
DB::statement($sql);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('panel_box_validations');
|
||||
}
|
||||
};
|
||||
@@ -1,6 +0,0 @@
|
||||
<div>
|
||||
@livewire('panel-check-list', [
|
||||
'records' => $existingRecords,
|
||||
'data' => $data
|
||||
])
|
||||
</div>
|
||||
@@ -1,141 +0,0 @@
|
||||
<div class="fixed inset-0 flex items-center justify-center z-50">
|
||||
|
||||
{{-- <div class="bg-white max-h-[80vh] overflow-hidden p-6 rounded-lg shadow-lg pointer-events-auto"
|
||||
style="width:30vw !important; max-width:none !important;"> --}}
|
||||
|
||||
<div
|
||||
class="bg-white rounded-lg shadow-lg pointer-events-auto
|
||||
w-full max-w-2xl max-h-[90vh] flex flex-col">
|
||||
|
||||
{{-- @if($records && $records->count()) --}}
|
||||
@if(!empty($records) && count($records))
|
||||
<div style="max-height:250px; overflow-y:auto; border:1px solid #ccc;">
|
||||
|
||||
{{-- <table class="min-w-full border"> --}}
|
||||
<table class="w-full table-fixed border text-sm">
|
||||
<thead>
|
||||
<tr class="bg-gray-100">
|
||||
<th class="border px-2 py-1 w-2/3">Characteristics</th>
|
||||
<th class="border px-2 py-1 w-1/3">Value</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach($records as $record)
|
||||
<tr>
|
||||
<td class="border p-2">
|
||||
{{ $record['name'] }}
|
||||
</td>
|
||||
|
||||
{{-- <td class="border p-2">
|
||||
<input
|
||||
type="text"
|
||||
wire:model.defer="checklist.{{ $record['id'] }}"
|
||||
wire:model.live="checklist.{{ $record['id'] }}"
|
||||
class="w-full border rounded px-2 py-1"
|
||||
placeholder="Enter value"
|
||||
>
|
||||
</td> --}}
|
||||
|
||||
{{-- <td class="border p-2">
|
||||
@php
|
||||
$status = $this->getCharacteristicStatus($record['id']);
|
||||
@endphp
|
||||
|
||||
<input
|
||||
type="text"
|
||||
wire:model.live="checklist.{{ $record['id'] }}"
|
||||
class="w-full rounded px-2 py-1 border-2 transition-all duration-200"
|
||||
style="
|
||||
@if($status === 'Ok')
|
||||
border-color: #22c55e;
|
||||
box-shadow: 0 0 8px rgba(34, 197, 94, 0.8);
|
||||
@elseif($status === 'Not Ok')
|
||||
border-color: #ef4444;
|
||||
box-shadow: 0 0 8px rgba(239, 68, 68, 0.8);
|
||||
@else
|
||||
border-color: #d1d5db;
|
||||
@endif
|
||||
"
|
||||
placeholder="Enter value"
|
||||
>
|
||||
</td> --}}
|
||||
|
||||
<td class="border p-2">
|
||||
@php
|
||||
$status = $this->getCharacteristicStatus($record['id']);
|
||||
@endphp
|
||||
|
||||
@if(($record['inspection_type'] ?? null) === 'Visual')
|
||||
|
||||
<div class="flex gap-4">
|
||||
<label class="flex items-center gap-1">
|
||||
<input
|
||||
type="radio"
|
||||
wire:model.live="checklist.{{ $record['id'] }}"
|
||||
value="Ok"
|
||||
>
|
||||
Ok
|
||||
</label>
|
||||
|
||||
<label class="flex items-center gap-1">
|
||||
<input
|
||||
type="radio"
|
||||
wire:model.live="checklist.{{ $record['id'] }}"
|
||||
value="NotOk"
|
||||
>
|
||||
Not Ok
|
||||
</label>
|
||||
</div>
|
||||
|
||||
@else
|
||||
|
||||
<input
|
||||
type="text"
|
||||
wire:model.live="checklist.{{ $record['id'] }}"
|
||||
class="w-full rounded px-2 py-1 border-2 transition-all duration-200"
|
||||
style="
|
||||
@if($status === 'Ok')
|
||||
border-color: #22c55e;
|
||||
box-shadow: 0 0 8px rgba(34, 197, 94, 0.8);
|
||||
@elseif($status === 'Not Ok')
|
||||
border-color: #ef4444;
|
||||
box-shadow: 0 0 8px rgba(239, 68, 68, 0.8);
|
||||
@else
|
||||
border-color: #d1d5db;
|
||||
@endif
|
||||
"
|
||||
placeholder="Enter value"
|
||||
>
|
||||
|
||||
@endif
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
@else
|
||||
<p>No records found.</p>
|
||||
@endif
|
||||
<div class="border-t mt-6 pt-4 flex justify-end gap-3">
|
||||
|
||||
<button
|
||||
type="button"
|
||||
wire:click="cancel"
|
||||
style="background-color:#dc2626; color:white;"
|
||||
class="px-6 py-2 rounded-lg shadow-md"
|
||||
>
|
||||
Cancel
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
wire:click="saveChecklist"
|
||||
style="background-color:#16a34a; color:white;"
|
||||
{{-- @disabled(!$this->canSaveChecklist()) --}}
|
||||
class="px-6 py-2 rounded-lg shadow-md disabled:opacity-50 disabled:cursor-not-allowed"
|
||||
>
|
||||
Save
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,11 +1,7 @@
|
||||
<div class="fixed inset-0 flex items-center justify-center z-50">
|
||||
|
||||
{{-- <div class="bg-white max-h-[80vh] overflow-hidden p-6 rounded-lg shadow-lg pointer-events-auto"
|
||||
style="width:30vw !important; max-width:none !important;"> --}}
|
||||
|
||||
<div
|
||||
class="bg-white rounded-lg shadow-lg pointer-events-auto
|
||||
w-full max-w-2xl max-h-[90vh] flex flex-col">
|
||||
<div class="bg-white max-h-[80vh] overflow-hidden p-6 rounded-lg shadow-lg pointer-events-auto"
|
||||
style="width:30vw !important; max-width:none !important;">
|
||||
|
||||
{{-- @if($records && $records->count()) --}}
|
||||
@if(!empty($records) && count($records))
|
||||
|
||||
@@ -29,10 +29,6 @@
|
||||
<td>Item Code</td>
|
||||
<td style="text-align: center;">{{ $request->item->code ?? $request->code }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Description</td>
|
||||
<td style="text-align: center;">{{ $request->item->description ?? $request->description }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Job Number</td>
|
||||
<td style="text-align: center;">{{ $request->aufnr }}</td>
|
||||
|
||||
@@ -19,13 +19,13 @@
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
width: 100%;
|
||||
font-size: 10px;
|
||||
font-size: 14px;
|
||||
white-space: nowrap !important;
|
||||
}
|
||||
th, td {
|
||||
border: 1px solid #020813da;
|
||||
padding: 8px 10px;
|
||||
text-align: left;
|
||||
text-align: center;
|
||||
white-space: nowrap !important;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
@@ -41,13 +41,6 @@
|
||||
background-color: #f3f4f6;
|
||||
}
|
||||
|
||||
.status-column {
|
||||
text-align: left !important;
|
||||
white-space: normal !important;
|
||||
min-width: 250px;
|
||||
width: 250px;
|
||||
vertical-align: top;
|
||||
}
|
||||
.footer {
|
||||
text-align: center;
|
||||
font-size: 13px;
|
||||
@@ -71,6 +64,7 @@
|
||||
<tr>
|
||||
<th>No</th>
|
||||
<th>CRI RFQ Number</th>
|
||||
<th>Ref Number</th>
|
||||
<th>Requestor</th>
|
||||
<th>Shipper</th>
|
||||
<th>Shipper Location</th>
|
||||
@@ -89,27 +83,35 @@
|
||||
<tr style="{{ $row['is_transit_identified'] == 1 ? 'background-color:#FFFF00;' . 'font-weight: bold;' : '' }}">
|
||||
<td>{{ $loop->iteration }}</td>
|
||||
<td>{{ $row['cri_rfq_number'] }}</td>
|
||||
{{-- <td>{{ $row['mail_received_date'] }}</td> --}}
|
||||
{{-- <td>{{ \Carbon\Carbon::parse($row['mail_received_date'])->format('Y-m-d') }}</td> --}}
|
||||
<td>{{ $row['pricol_ref_number'] }}</td>
|
||||
<td>{{ $row['requester'] }}</td>
|
||||
<td>{{ $row['shipper'] }}</td>
|
||||
<td>{{ $row['shipper_location'] }}</td>
|
||||
<td>{{ $row['shipper_invoice'] }}</td>
|
||||
{{-- <td>{{ \Carbon\Carbon::parse($row['shipper_invoice_date'])->format('Y-m-d') }}</td> --}}
|
||||
<td>
|
||||
{{ !empty($row['shipper_invoice_date']) ? \Carbon\Carbon::parse($row['shipper_invoice_date'])->format('Y-m-d') : '' }}
|
||||
</td>
|
||||
{{-- <td>{{ $row['shipper_invoice_date'] }}</td> --}}
|
||||
<td>{{ \Carbon\Carbon::parse($row['shipper_invoice_date'])->format('Y-m-d') }}</td>
|
||||
<td>{{ $row['customs_agent_name'] }}</td>
|
||||
{{-- <td>{{ \Carbon\Carbon::parse($row['eta_date'])->format('Y-m-d') }}</td> --}}
|
||||
<td>
|
||||
{{ !empty($row['eta_date']) ? \Carbon\Carbon::parse($row['eta_date'])->format('Y-m-d') : '' }}
|
||||
</td>
|
||||
<td class="status-column">
|
||||
{{ $row['status'] }}
|
||||
</td>
|
||||
{{-- <td>{{ $row['eta_date'] }}</td> --}}
|
||||
<td>{{ \Carbon\Carbon::parse($row['eta_date'])->format('Y-m-d') }}</td>
|
||||
<td>{{ $row['status'] }}</td>
|
||||
<td>{{ $row['delivery_location'] }}</td>
|
||||
{{-- <td>{{ \Carbon\Carbon::parse($row['etd_date'])->format('Y-m-d') }}</td> --}}
|
||||
<td>
|
||||
{{ !empty($row['etd_date']) ? \Carbon\Carbon::parse($row['etd_date'])->format('Y-m-d') : '' }}
|
||||
</td>
|
||||
{{-- <td>{{ $row['etd_date'] }}</td> --}}
|
||||
<td>{{ \Carbon\Carbon::parse($row['etd_date'])->format('Y-m-d') }}</td>
|
||||
{{-- <td>{{ $row['mode'] }}</td>
|
||||
<td>{{ $row['inco_terms'] }}</td>
|
||||
<td>{{ $row['port_of_loading'] }}</td>
|
||||
<td>{{ $row['port_of_discharge'] }}</td>
|
||||
<td>{{ $row['delivery_city'] }}</td>
|
||||
<td>{{ $row['packages'] }}</td>
|
||||
<td>{{ $row['type_of_package'] }}</td>
|
||||
<td>{{ $row['gross_weight'] }}</td>
|
||||
<td>{{ $row['volume'] }}</td>
|
||||
<td>{{ $row['bill_number'] }}</td> --}}
|
||||
{{-- <td>{{ $row['bill_received_date'] }}</td> --}}
|
||||
{{-- <td>{{ \Carbon\Carbon::parse($row['bill_received_date'])->format('Y-m-d') }}</td>
|
||||
<td>{{ $row['vessel_number'] }}</td> --}}
|
||||
<td>{{ $row['remark'] }}</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<style>
|
||||
@page {
|
||||
margin: 0;
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<style>
|
||||
@page {
|
||||
margin: 0;
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<style>
|
||||
@page {
|
||||
margin: 0;
|
||||
|
||||
@@ -41,26 +41,32 @@
|
||||
.badge-header {
|
||||
background: #1a1a2e;
|
||||
color: #fff;
|
||||
padding: 1.5mm 2mm;
|
||||
text-align: center;
|
||||
padding: 2mm 2mm 1.5mm;
|
||||
font-size: 8pt;
|
||||
font-weight: bold;
|
||||
letter-spacing: 1px;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.badge-header .type { font-size: 9pt; letter-spacing: 2px; }
|
||||
.badge-header .badge-id { font-size: 7pt; opacity: 0.85; }
|
||||
.badge-header .type {
|
||||
font-size: 9pt;
|
||||
letter-spacing: 2px;
|
||||
}
|
||||
|
||||
.badge-header .badge-id {
|
||||
font-size: 7pt;
|
||||
opacity: 0.85;
|
||||
}
|
||||
|
||||
/* ── Body ── */
|
||||
.badge-body {
|
||||
display: flex;
|
||||
flex: 1;
|
||||
padding: 1.5mm 2mm;
|
||||
padding: 2mm;
|
||||
gap: 2mm;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* ── Fields (left) ── */
|
||||
@@ -68,104 +74,82 @@
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
overflow: hidden;
|
||||
gap: 1.2mm;
|
||||
}
|
||||
|
||||
.field-row {
|
||||
display: grid;
|
||||
grid-template-columns: 16mm 3mm 1fr;
|
||||
line-height: 1.25;
|
||||
margin-bottom: 0.6mm;
|
||||
align-items: start;
|
||||
line-height: 1.3;
|
||||
margin-bottom: 0.7mm;
|
||||
}
|
||||
|
||||
.field-label {
|
||||
color: #000;
|
||||
color: #000; /* was #555 — now pure black */
|
||||
font-size: 6.5pt;
|
||||
font-weight: 700;
|
||||
white-space: nowrap;
|
||||
font-weight: 700; /* was normal — now bold */
|
||||
}
|
||||
|
||||
.field-colon {
|
||||
color: #000;
|
||||
color: #000; /* was #555 — now pure black */
|
||||
font-size: 6.5pt;
|
||||
font-weight: 700;
|
||||
font-weight: 700; /* added bold */
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.field-value {
|
||||
font-weight: 700;
|
||||
font-weight: 700; /* was 600 — now fully bold */
|
||||
font-size: 6.5pt;
|
||||
color: #000;
|
||||
/* Prevent wrapping — truncate with ellipsis if too long */
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
color: #000; /* was #111 — now pure black */
|
||||
}
|
||||
|
||||
/* ── Photo column (right) ── */
|
||||
/* ── Photo (right) ── */
|
||||
.badge-photo {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 1mm;
|
||||
width: 18mm;
|
||||
flex-shrink: 0;
|
||||
gap: 0.5mm;
|
||||
}
|
||||
|
||||
.badge-photo img {
|
||||
width: 16mm;
|
||||
height: 16mm;
|
||||
height: 18mm;
|
||||
object-fit: cover;
|
||||
border: 1px solid #000;
|
||||
border: 1px solid #ccc;
|
||||
}
|
||||
|
||||
.badge-photo .no-photo {
|
||||
width: 16mm;
|
||||
height: 16mm;
|
||||
border: 1.5px dashed #000;
|
||||
height: 18mm;
|
||||
border: 1.5px dashed #000; /* was #aaa — darker border */
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 6pt;
|
||||
color: #000;
|
||||
font-size: 6pt; /* slightly larger */
|
||||
color: #000; /* was #aaa */
|
||||
font-weight: 700;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.host-sign {
|
||||
font-size: 6pt;
|
||||
color: #000;
|
||||
font-weight: 700;
|
||||
font-size: 6pt; /* was 5.5pt — slightly larger */
|
||||
color: #000; /* was #555 — now pure black */
|
||||
font-weight: 700; /* added bold */
|
||||
text-align: center;
|
||||
border-top: 1px solid #000;
|
||||
border-top: 1px solid #000; /* was 0.5px #aaa — darker line */
|
||||
padding-top: 0.5mm;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
/* ── QR code ── */
|
||||
.visitor-qr {
|
||||
margin-top: 1mm;
|
||||
width: 18mm;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.visitor-qr svg {
|
||||
width: 16mm !important;
|
||||
height: 16mm !important;
|
||||
display: block;
|
||||
}
|
||||
|
||||
/* ── Footer ── */
|
||||
.badge-footer {
|
||||
border-top: 1px solid #000;
|
||||
padding: 0.8mm 2mm;
|
||||
border-top: 1px solid #000; /* was 0.5px #ddd — darker line */
|
||||
padding: 1mm 2mm;
|
||||
text-align: right;
|
||||
font-size: 6pt;
|
||||
color: #000;
|
||||
font-weight: 700;
|
||||
flex-shrink: 0;
|
||||
font-size: 6pt; /* was 5.5pt — slightly larger */
|
||||
color: #000; /* was #888 — now pure black */
|
||||
font-weight: 700; /* added bold */
|
||||
}
|
||||
|
||||
@media print {
|
||||
@@ -174,9 +158,9 @@
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<body onload="window.print()">
|
||||
|
||||
{{-- ── Print / Close buttons (screen only) ── --}}
|
||||
{{-- ── Print button (visible on screen only, hidden when printing) ── --}}
|
||||
<div class="no-print" style="padding: 8px; text-align:center; background:#f3f4f6;">
|
||||
<button onclick="window.print()" style="padding:6px 18px; background:#1a1a2e; color:#fff; border:none; border-radius:6px; cursor:pointer; font-size:13px;">
|
||||
🖨️ Print Badge
|
||||
@@ -191,7 +175,7 @@
|
||||
{{-- Header --}}
|
||||
<div class="badge-header">
|
||||
<span class="type">{{ strtoupper($visitor->type ?? 'VISITOR') }}</span>
|
||||
<span class="badge-id">#{{ $visitor->register_id ?? str_pad($visitor->id, 5, '0', STR_PAD_LEFT) }}</span>
|
||||
<span class="badge-id">#{{ str_pad($visitor->register_id, 5, '0', STR_PAD_LEFT) }}</span>
|
||||
</div>
|
||||
|
||||
{{-- Body --}}
|
||||
@@ -199,62 +183,61 @@
|
||||
|
||||
{{-- Left: fields --}}
|
||||
<div class="badge-fields">
|
||||
<div class="field-row">
|
||||
<span class="field-label">Name</span>
|
||||
<span class="field-colon">:</span>
|
||||
<span class="field-value">{{ strtoupper($visitor->name) }}</span>
|
||||
<div class="field-row">
|
||||
<span class="field-label">Name</span>
|
||||
<span class="field-colon">:</span>
|
||||
<span class="field-value">{{ strtoupper($visitor->name) }}</span>
|
||||
</div>
|
||||
<div class="field-row">
|
||||
<span class="field-label">Company</span>
|
||||
<span class="field-colon">:</span>
|
||||
<span class="field-value">{{ $visitor->company }}</span>
|
||||
</div>
|
||||
<div class="field-row">
|
||||
<span class="field-label">To Meet</span>
|
||||
<span class="field-colon">:</span>
|
||||
<span class="field-value">{{ strtoupper($visitor->employeeMaster?->name ?? '—') }}</span>
|
||||
</div>
|
||||
<div class="field-row">
|
||||
<span class="field-label">Dept</span>
|
||||
<span class="field-colon">:</span>
|
||||
<span class="field-value">{{ strtoupper($visitor->employeeMaster?->department ?? $visitor->department ?? '—') }}</span>
|
||||
</div>
|
||||
<div class="field-row">
|
||||
<span class="field-label">Valid Upto</span>
|
||||
<span class="field-colon">:</span>
|
||||
<span class="field-value">{{ $visitor->valid_upto ? \Carbon\Carbon::parse($visitor->valid_upto)->format('d/m/Y H:i:s') : '—' }}</span>
|
||||
</div>
|
||||
<div class="field-row">
|
||||
<span class="field-label">Date & Time</span>
|
||||
<span class="field-colon">:</span>
|
||||
<span class="field-value">{{ $visitor->in_time ? \Carbon\Carbon::parse($visitor->in_time)->format('d/m/Y H:i:s') : '—' }}</span>
|
||||
</div>
|
||||
<div class="field-row">
|
||||
<span class="field-label">No of Visitors</span>
|
||||
<span class="field-colon">:</span>
|
||||
<span class="field-value">{{ $visitor->number_of_person ?? 1 }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="field-row">
|
||||
<span class="field-label">Company</span>
|
||||
<span class="field-colon">:</span>
|
||||
<span class="field-value">{{ $visitor->company }}</span>
|
||||
</div>
|
||||
<div class="field-row">
|
||||
<span class="field-label">To Meet</span>
|
||||
<span class="field-colon">:</span>
|
||||
<span class="field-value">{{ strtoupper($visitor->employeeMaster?->name ?? '—') }}</span>
|
||||
</div>
|
||||
<div class="field-row">
|
||||
<span class="field-label">Dept</span>
|
||||
<span class="field-colon">:</span>
|
||||
<span class="field-value">{{ strtoupper($visitor->employeeMaster?->department ?? $visitor->department ?? '—') }}</span>
|
||||
</div>
|
||||
<div class="field-row">
|
||||
<span class="field-label">Valid Upto</span>
|
||||
<span class="field-colon">:</span>
|
||||
<span class="field-value">{{ $visitor->valid_upto ? \Carbon\Carbon::parse($visitor->valid_upto)->format('d/m/Y H:i:s') : '—' }}</span>
|
||||
</div>
|
||||
<div class="field-row">
|
||||
<span class="field-label">Date & Time</span>
|
||||
<span class="field-colon">:</span>
|
||||
<span class="field-value">{{ $visitor->in_time ? \Carbon\Carbon::parse($visitor->in_time)->format('d/m/Y H:i:s') : '—' }}</span>
|
||||
</div>
|
||||
<div class="field-row">
|
||||
<span class="field-label">No of Visitors</span>
|
||||
<span class="field-colon">:</span>
|
||||
<span class="field-value">{{ $visitor->number_of_person ?? 1 }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- Right: photo + host sign + QR --}}
|
||||
{{-- Right: photo + host sign --}}
|
||||
<div class="badge-photo">
|
||||
@if($photoUrl)
|
||||
<img src="{{ $photoUrl }}" alt="Visitor Photo" />
|
||||
@else
|
||||
<div class="no-photo">No Photo</div>
|
||||
@endif
|
||||
|
||||
<div class="host-sign">Host Sign</div>
|
||||
|
||||
{{-- QR Code — high res, with quiet zone and high error correction --}}
|
||||
@if(!empty($visitor->register_id))
|
||||
<div class="visitor-qr">
|
||||
{!! QrCode::size(300)
|
||||
->margin(2)
|
||||
->errorCorrection('H')
|
||||
<div class="visitor-qr" style="margin-top:2mm;">
|
||||
{{-- {!! QrCode::size(25)
|
||||
->margin(0)
|
||||
->generate($visitor->register_id) !!} --}}
|
||||
@if(!empty($visitor->register_id))
|
||||
{!! QrCode::size(35)
|
||||
->margin(0)
|
||||
->generate((string) $visitor->register_id) !!}
|
||||
</div>
|
||||
@endif
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -264,11 +247,5 @@
|
||||
|
||||
</div>
|
||||
|
||||
<script>
|
||||
window.addEventListener('load', function () {
|
||||
setTimeout(function () { window.print(); }, 300);
|
||||
});
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user