diff --git a/app/Filament/Pages/SupplierCustomerCodes.php b/app/Filament/Pages/SupplierCustomerCodes.php new file mode 100644 index 0000000..5244d5a --- /dev/null +++ b/app/Filament/Pages/SupplierCustomerCodes.php @@ -0,0 +1,172 @@ +user()) { + return false; + } + + return Feature::for($user)->active('SupplierCustomerCode'); + } + + public function mount(): void + { + abort_unless(static::canAccess(), 403); + + $this->form->fill(); + } + + public function form(Schema $form): Schema + { + return $form + ->schema([ + Grid::make(2) + ->schema([ + Select::make('supplier_id') + ->label('Beszállító') + ->options(Supplier::query()->orderBy('name')->pluck('name', 'id')) + ->required() + ->searchable() + ->live() + ->afterStateUpdated(fn (?string $state, Set $set) => $this->loadSupplierData($state, $set)), + TextInput::make('search') + ->label('Profitcenter keresése') + ->placeholder('Kezdjen el gépelni a szűküléshez...') + ->live(debounce: 300) + ->visible(fn (Get $get) => filled($get('supplier_id'))), + ]), + Toggle::make('hasCustomerCode') + ->label('Vevőkód funkció aktív ennél a beszállítónál') + ->visible(fn (Get $get) => filled($get('supplier_id'))), + Section::make('Profitcenterenkénti vevőkód') + ->visible(fn (Get $get) => filled($get('supplier_id'))) + ->columns(3) + ->schema(fn (Get $get) => $this->profitCenterCodeFields($get('search'))), + ]) + ->statePath('data'); + } + + /** + * @return array + */ + private function profitCenterCodeFields(?string $search = null): array + { + return ProfitCenter::query() + ->when(filled($search), fn ($query) => $query->where('name', 'like', '%'.$search.'%')) + ->orderBy('name') + ->get() + ->map(fn (ProfitCenter $profitCenter) => TextInput::make("codes.{$profitCenter->id}") + ->label($profitCenter->name) + ->inlineLabel() + ->maxLength(255)) + ->all(); + } + + private function loadSupplierData(?string $supplierId, Set $set): void + { + $codes = []; + + if ($supplierId) { + $supplier = Supplier::find($supplierId); + $set('hasCustomerCode', (bool) $supplier?->hasCustomerCode); + + $codes = ProfitCenterSupplierCode::query() + ->where('supplier_id', $supplierId) + ->pluck('customerCode', 'profit_center_id') + ->all(); + } else { + $set('hasCustomerCode', false); + } + + foreach (ProfitCenter::query()->pluck('id') as $profitCenterId) { + $set("codes.{$profitCenterId}", $codes[$profitCenterId] ?? null); + } + } + + protected function getFormActions(): array + { + return [ + Action::make('save') + ->label('Mentés') + ->submit('save') + ->color('primary'), + ]; + } + + public function save(): void + { + $state = $this->form->getState(); + $supplierId = $state['supplier_id']; + + Supplier::whereKey($supplierId)->update([ + 'hasCustomerCode' => (bool) ($state['hasCustomerCode'] ?? false), + ]); + + // A form aktuális szűrés (keresés) miatt csak a látható mezőket adná vissza a getState() - + // a $this->data-ban viszont minden profitcenter kódja benne marad, mert a loadSupplierData() + // mindegyiket explicit beállítja, függetlenül attól, hogy éppen renderelve van-e. + foreach ($this->data['codes'] ?? [] as $profitCenterId => $customerCode) { + $customerCode = is_string($customerCode) ? trim($customerCode) : $customerCode; + + if (blank($customerCode)) { + ProfitCenterSupplierCode::query() + ->where('supplier_id', $supplierId) + ->where('profit_center_id', $profitCenterId) + ->delete(); + + continue; + } + + ProfitCenterSupplierCode::updateOrCreate( + ['supplier_id' => $supplierId, 'profit_center_id' => $profitCenterId], + ['customerCode' => $customerCode], + ); + } + + Notification::make() + ->title('Mentve') + ->body('A beszállító vevőkód adatai elmentve.') + ->success() + ->send(); + } +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 3dc16a7..938db17 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -77,6 +77,7 @@ public function boot(): void \Livewire\Livewire::component('app.filament.pages.price-list-processor', \App\Filament\Pages\PriceListProcessor::class); \Livewire\Livewire::component('app.filament.auth.login', \App\Filament\Auth\Login::class); \Livewire\Livewire::component('app.filament.pages.calendar-test', \App\Filament\Pages\CalendarTest::class); + \Livewire\Livewire::component('app.filament.pages.supplier-customer-codes', \App\Filament\Pages\SupplierCustomerCodes::class); \Livewire\Livewire::component('app.filament.widgets.delivery-calendar-widget', \App\Filament\Widgets\DeliveryCalendarWidget::class); \Livewire\Livewire::component('app.filament.supplier-portal.resources.product-stocks.pages.list-product-stocks', \App\Filament\SupplierPortal\Resources\ProductStocks\Pages\ListProductStocks::class); diff --git a/resources/views/filament/components/speed-button-nav-bar.blade.php b/resources/views/filament/components/speed-button-nav-bar.blade.php index d2db389..601a218 100644 --- a/resources/views/filament/components/speed-button-nav-bar.blade.php +++ b/resources/views/filament/components/speed-button-nav-bar.blade.php @@ -1,4 +1,17 @@ @php + $deliveryChildren = [ + ['displayName' => 'Szállítási sablonok', 'link' => \App\Filament\Resources\DeliverySchedules\DeliveryScheduleResource::getUrl()], + ['displayName' => 'Beszállítói felülbírálások', 'link' => \App\Filament\Resources\DeliveryCalendarOverrides\DeliveryCalendarOverrideResource::getUrl()], + ['displayName' => 'Profitcenter ütemezés', 'link' => \App\Filament\Resources\ProfitCenterSupplierSchedules\ProfitCenterSupplierScheduleResource::getUrl()], + ['displayName' => 'Munkanaptárak', 'link' => \App\Filament\Resources\WorkCalendars\WorkCalendarResource::getUrl()], + ]; + + // A vevőkód-kezelő oldalt a Szállítás menü utolsó elemeként jelenítjük meg, + // a SupplierCustomerCode feature flagre bízva a láthatóságot (rollout-védelem). + if (\App\Filament\Pages\SupplierCustomerCodes::canAccess()) { + $deliveryChildren[] = ['displayName' => 'Beszállítói vevőkódok', 'link' => \App\Filament\Pages\SupplierCustomerCodes::getUrl()]; + } + $modules = [ ['name' => 'home', 'displayName' => 'Főoldal', 'icon' => 'home', 'link' => route('legacy.show', ['path' => 'dashboard']), 'roles' => ['root','admin','developer','profit-center']], ['name' => 'order', 'displayName' => 'Új megrendelés', 'icon' => 'bevetelezes', 'link' => route('legacy.show', ['path' => 'order']), 'roles' => ['root','profit-center']], @@ -13,12 +26,7 @@ ['name' => 'statistics', 'displayName' => 'Statisztikák', 'icon' => 'kimutatasok', 'link' => route('legacy.show', ['path' => 'admin/statistics']), 'roles' => ['root','developer','admin']], ['name' => 'export', 'displayName' => 'Export', 'icon' => 'export', 'link' => route('legacy.show', ['path' => 'admin/export']), 'roles' => ['root','developer','admin']], ['name' => 'priceListProcessor', 'displayName' => 'Árlista feldolgozó', 'icon' => 'price_list', 'link' => '/admin/pricelist-files', 'roles' => ['root','developer','admin']], - ['name' => 'delivery', 'displayName' => 'Szállítás', 'icon' => 'timetable3', 'roles' => ['root','admin','developer'], 'children' => [ - ['displayName' => 'Szállítási sablonok', 'link' => \App\Filament\Resources\DeliverySchedules\DeliveryScheduleResource::getUrl()], - ['displayName' => 'Beszállítói felülbírálások', 'link' => \App\Filament\Resources\DeliveryCalendarOverrides\DeliveryCalendarOverrideResource::getUrl()], - ['displayName' => 'Profitcenter ütemezés', 'link' => \App\Filament\Resources\ProfitCenterSupplierSchedules\ProfitCenterSupplierScheduleResource::getUrl()], - ['displayName' => 'Munkanaptárak', 'link' => \App\Filament\Resources\WorkCalendars\WorkCalendarResource::getUrl()], - ]], + ['name' => 'delivery', 'displayName' => 'Szállítás', 'icon' => 'timetable3', 'roles' => ['root','admin','developer'], 'children' => $deliveryChildren], ['name' => 'calendarTest', 'displayName' => 'Naptár Teszt', 'icon' => 'idopontok', 'link' => \App\Filament\Pages\CalendarTest::getUrl(), 'roles' => ['root','developer','admin']], ]; diff --git a/resources/views/filament/pages/supplier-customer-codes.blade.php b/resources/views/filament/pages/supplier-customer-codes.blade.php new file mode 100644 index 0000000..75e3503 --- /dev/null +++ b/resources/views/filament/pages/supplier-customer-codes.blade.php @@ -0,0 +1,20 @@ + +
+
+
Beszállítói vevőkódok
+

Válassza ki a beszállítót, majd adja meg a profitcenterenkénti vevőkódokat.

+
+ +
+
+ {{ $this->form }} + +
+ +
+
+
+
+