diff --git a/app/Filament/Resources/RfqTransporterBidResource.php b/app/Filament/Resources/RfqTransporterBidResource.php new file mode 100644 index 0000000..f53110f --- /dev/null +++ b/app/Filament/Resources/RfqTransporterBidResource.php @@ -0,0 +1,295 @@ +user(); + + return parent::getEloquentQuery() + ->withoutGlobalScopes([ + SoftDeletingScope::class, + ]) + ->when( + ! $user->hasAnyRole(['Super Admin', 'TransporterBidSupervisor']), + fn (Builder $query) => $query + ->where('transporter_name', $user->name) + ->whereNotNull('request_quotation_id') + ); + } + + public static function form(Form $form): Form + { + return $form + ->schema([ + Forms\Components\Select::make('request_quotation_id') + ->label('RFQ Number') + ->relationship('requestQuotation', 'rfq_number') + ->reactive() + // ->disabled(fn ($record) => !Filament::auth()->user()?->hasAnyRole(['Super Admin', 'TransporterBidSupervisor'])) + ->disabled(fn ($record) => + !Filament::auth()->user()?->hasAnyRole(['Super Admin', 'TransporterBidSupervisor']) + && $record + ) + ->afterStateUpdated(function ($state, callable $set) { + $rfq = \App\Models\RequestQuotation::find($state); + if ($rfq) { + $set('pickup_address', $rfq->pickup_address); + $set('delivery_address', $rfq->delivery_address); + $set('type_of_vehicle', $rfq->type_of_vehicle); + $set('weight', $rfq->weight); + $set('volumetrice_size_inch', $rfq->volumetrice_size_inch); + $set('no_of_vehicle', $rfq->no_of_vehicle); + $set('product_name', $rfq->product_name); + $set('pick_and_delivery', $rfq->pick_and_delivery); + $set('payment_term', $rfq->payment_term); + $set('paid_topay', $rfq->paid_topay); + $set('loading_by', $rfq->loading_by); + $set('unloading_by', $rfq->unloading_by); + $set('special_type', $rfq->special_type); + $set('rfq_date_time', $rfq->rfq_date_time); + $set('require_date_time', $rfq->require_date_time); + $set('rfq_rec_on_or_before', $rfq->rfq_rec_on_or_before); + } + }) + ->afterStateHydrated(function ($state, callable $set) { + $rfq = \App\Models\RequestQuotation::find($state); + if ($rfq) { + $set('pickup_address', $rfq->pickup_address); + $set('delivery_address', $rfq->delivery_address); + $set('type_of_vehicle', $rfq->type_of_vehicle); + $set('weight', $rfq->weight); + $set('volumetrice_size_inch', $rfq->volumetrice_size_inch); + $set('no_of_vehicle', $rfq->no_of_vehicle); + $set('product_name', $rfq->product_name); + $set('pick_and_delivery', $rfq->pick_and_delivery); + $set('payment_term', $rfq->payment_term); + $set('paid_topay', $rfq->paid_topay); + $set('loading_by', $rfq->loading_by); + $set('unloading_by', $rfq->unloading_by); + $set('special_type', $rfq->special_type); + $set('rfq_date_time', $rfq->rfq_date_time); + $set('require_date_time', $rfq->require_date_time); + $set('rfq_rec_on_or_before', $rfq->rfq_rec_on_or_before); + } + }) + ->required(), + Forms\Components\Section::make('RFQ Details') + ->visible(fn ($get) => $get('request_quotation_id') != null) + ->reactive() + ->schema([ + TextInput::make('pickup_address')->label('Pickup Address')->disabled(), + TextInput::make('delivery_address')->label('Delivery Address')->disabled(), + TextInput::make('type_of_vehicle')->label('Vehicle Type')->disabled(), + TextInput::make('weight')->label('Weight')->disabled(), + TextInput::make('volumetrice_size_inch')->label('Volumetric Size')->disabled(), + TextInput::make('no_of_vehicle')->label('No. of Vehicle')->disabled(), + TextInput::make('product_name')->label('Product Name')->disabled(), + TextInput::make('pick_and_delivery')->label('Pick & Delivery')->disabled(), + TextInput::make('payment_term')->label('Payment Term')->disabled(), + TextInput::make('paid_topay')->label('Paid / To Pay')->disabled(), + TextInput::make('loading_by')->label('Loading By')->disabled(), + TextInput::make('unloading_by')->label('Unloading By')->disabled(), + TextInput::make('special_type')->label('Special Type')->disabled(), + TextInput::make('rfq_date_time')->label('RFQ Created On')->disabled(), + TextInput::make('require_date_time')->label('Required Date')->disabled(), + TextInput::make('rfq_rec_on_or_before')->label('RFQ Received On/Before')->disabled(), + ]), + Forms\Components\TextInput::make('transporter_name') + ->label('Transporter Name') + ->readOnly() + ->default(Filament::auth()->user()?->name) + ->required() + ->rule(function (callable $get) { + return Rule::unique('rfq_transporter_bids', 'transporter_name') + ->where('request_quotation_id', $get('request_quotation_id')) + ->ignore($get('id')); + }), + Forms\Components\TextInput::make('total_freight_charge') + ->label('Total Freight Charge') + ->required() + // ->disabled(fn ($record) => $record && $record->created_by != Filament::auth()->user()?->name) + // ->hidden(fn ($record) => !Filament::auth()->user()?->hasAnyRole(['Super Admin', 'TransporterBidSupervisor']) && $record->transporter_name != Filament::auth()->user()?->name), + ->hidden(fn ($record) => + !Filament::auth()->user()?->hasAnyRole(['Super Admin', 'TransporterBidSupervisor']) + && ($record && $record->transporter_name != Filament::auth()->user()?->name) // Ensure $record is not null before checking transporter_name + ), + Forms\Components\TextInput::make('transit_day') + ->label('Transit Day') + ->required() + // ->disabled(fn ($record) => $record && $record->created_by != Filament::auth()->user()?->name), + // ->hidden(fn ($record) => !Filament::auth()->user()?->hasAnyRole(['Super Admin', 'TransporterBidSupervisor']) && $record->transporter_name != Filament::auth()->user()?->name), + ->hidden(fn ($record) => + !Filament::auth()->user()?->hasAnyRole(['Super Admin', 'TransporterBidSupervisor']) + && ($record && $record->transporter_name != Filament::auth()->user()?->name) // Ensure $record is not null before checking transporter_name + ), + Forms\Components\Hidden::make('created_by') + ->label('Created By') + ->default(Filament::auth()->user()?->name), + Forms\Components\Hidden::make('updated_by') + ->label('Updated By') + ->default(Filament::auth()->user()?->name), + ]); + } + + public static function table(Table $table): Table + { + return $table + ->columns([ + Tables\Columns\TextColumn::make('No.') + ->label('No.') + ->alignCenter() + ->getStateUsing(function ($record, $livewire, $column, $rowLoop) { + $paginator = $livewire->getTableRecords(); + $perPage = method_exists($paginator, 'perPage') ? $paginator->perPage() : 10; + $currentPage = method_exists($paginator, 'currentPage') ? $paginator->currentPage() : 1; + + return ($currentPage - 1) * $perPage + $rowLoop->iteration; + }), + Tables\Columns\TextColumn::make('requestQuotation.rfq_number') + ->label('RFQ Number') + ->alignCenter() + ->sortable(), + Tables\Columns\TextColumn::make('requestQuotation.pickup_address') + ->label('PickUp Address') + ->alignCenter() + ->sortable(), + Tables\Columns\TextColumn::make('requestQuotation.delivery_address') + ->label('Delivery Address') + ->alignCenter() + ->sortable(), + Tables\Columns\TextColumn::make('requestQuotation.type_of_vehicle') + ->label('Type Of Vehicle') + ->alignCenter() + ->sortable(), + Tables\Columns\TextColumn::make('requestQuotation.weight') + ->label('Weight') + ->alignCenter() + ->sortable(), + Tables\Columns\TextColumn::make('requestQuotation.volumetrice_size_inch') + ->label('Volumetrice Size Inch') + ->alignCenter() + ->sortable(), + Tables\Columns\TextColumn::make('requestQuotation.no_of_vehicle') + ->label('No Of Vehicle') + ->alignCenter() + ->sortable(), + Tables\Columns\TextColumn::make('requestQuotation.product_name') + ->label('Product Name') + ->alignCenter() + ->sortable(), + Tables\Columns\TextColumn::make('requestQuotation.pick_and_delivery') + ->label('Pick And Delivery') + ->alignCenter() + ->sortable(), + Tables\Columns\TextColumn::make('requestQuotation.payment_term') + ->label('Payment Term') + ->alignCenter() + ->sortable(), + Tables\Columns\TextColumn::make('requestQuotation.paid_topay') + ->label('Paid Today') + ->alignCenter() + ->sortable(), + Tables\Columns\TextColumn::make('requestQuotation.loading_by') + ->label('Loading By') + ->alignCenter() + ->sortable(), + Tables\Columns\TextColumn::make('requestQuotation.unloading_by') + ->label('Unloading By') + ->alignCenter() + ->sortable(), + Tables\Columns\TextColumn::make('requestQuotation.special_type') + ->label('Special Type') + ->alignCenter() + ->sortable(), + Tables\Columns\TextColumn::make('requestQuotation.rfq_date_time') + ->label('RFQ DateTime') + ->alignCenter() + ->sortable(), + Tables\Columns\TextColumn::make('requestQuotation.require_date_time') + ->label('RFQ Require DateTime') + ->alignCenter() + ->sortable(), + Tables\Columns\TextColumn::make('requestQuotation.rfq_rec_on_or_before') + ->label('RFQ Rec On Or Before') + ->alignCenter() + ->sortable(), + Tables\Columns\TextColumn::make('created_at') + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + Tables\Columns\TextColumn::make('updated_at') + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + Tables\Columns\TextColumn::make('deleted_at') + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + ]) + ->filters([ + Tables\Filters\TrashedFilter::make(), + ]) + ->actions([ + Tables\Actions\ViewAction::make(), + Tables\Actions\EditAction::make(), + ]) + ->bulkActions([ + Tables\Actions\BulkActionGroup::make([ + Tables\Actions\DeleteBulkAction::make(), + Tables\Actions\ForceDeleteBulkAction::make(), + Tables\Actions\RestoreBulkAction::make(), + ]), + ]); + } + + public static function getRelations(): array + { + return [ + // + ]; + } + + public static function getPages(): array + { + return [ + 'index' => Pages\ListRfqTransporterBids::route('/'), + 'create' => Pages\CreateRfqTransporterBid::route('/create'), + 'view' => Pages\ViewRfqTransporterBid::route('/{record}'), + 'edit' => Pages\EditRfqTransporterBid::route('/{record}/edit'), + ]; + } + + // public static function getEloquentQuery(): Builder + // { + // return parent::getEloquentQuery() + // ->withoutGlobalScopes([ + // SoftDeletingScope::class, + // ]); + // } +} diff --git a/app/Filament/Resources/RfqTransporterBidResource/Pages/CreateRfqTransporterBid.php b/app/Filament/Resources/RfqTransporterBidResource/Pages/CreateRfqTransporterBid.php new file mode 100644 index 0000000..590cd26 --- /dev/null +++ b/app/Filament/Resources/RfqTransporterBidResource/Pages/CreateRfqTransporterBid.php @@ -0,0 +1,12 @@ +record->wasChanged('total_freight_charge')) { + return; + } + + $rank = RfqTransporterBid::where('request_quotation_id', $this->record->request_quotation_id) + ->orderBy('total_freight_charge') + ->pluck('id') + ->search($this->record->id) + 1; + + $recipients = User::role(['Super Admin', 'Rfq Supervisor'])->get(); + $currentUser = Filament::auth()->user(); + + if ($currentUser && ! $recipients->contains('id', $currentUser->id)) { + $recipients->push($currentUser); + } + + Notification::make() + ->title('Rank Updated') + ->body("Your current rank is #{$rank}") + ->success() + ->sendToDatabase($recipients); + } + + protected function getHeaderActions(): array + { + return [ + Actions\ViewAction::make(), + Actions\DeleteAction::make(), + Actions\ForceDeleteAction::make(), + Actions\RestoreAction::make(), + ]; + } +} diff --git a/app/Filament/Resources/RfqTransporterBidResource/Pages/ListRfqTransporterBids.php b/app/Filament/Resources/RfqTransporterBidResource/Pages/ListRfqTransporterBids.php new file mode 100644 index 0000000..0a78374 --- /dev/null +++ b/app/Filament/Resources/RfqTransporterBidResource/Pages/ListRfqTransporterBids.php @@ -0,0 +1,19 @@ +