OwlCyberSecurity - MANAGER
Edit File: PreFactorManagementResource.php
<?php namespace App\Filament\Resources; use App\Filament\Resources\PreFactorManagementResource\Pages; use App\Helpers\InvoiceGlobalSearch; use App\Models\Credit; use App\Models\ExchangeInvoice; use App\Models\Invoice; use App\Models\Logistic; use App\Models\PaymentMethod; use App\Models\Transaction; use Carbon\Carbon; use Faker\Provider\ar_EG\Text; use Filament\Forms\Components\DatePicker; use Filament\Forms\Components\Placeholder; use Filament\Forms\Components\Section; use Filament\Forms\Components\Textarea; use Filament\Forms\Form; use Filament\Forms\Get; use Filament\Forms\Set; use Filament\Resources\Resource; use Filament\Support\RawJs; use Filament\Tables\Actions\Action; use Filament\Tables\Columns\TextColumn; use Filament\Tables\Table; use Filament\Tables\Filters\Filter; use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; use Filament\Forms\Components\TextInput; use Filament\Forms\Components\Select; use Filament\Forms\Components\Grid; use Filament\Notifications\Notification; use PhpParser\Node\Stmt\Label; use App\Models\UserDiscount; class PreFactorManagementResource extends Resource { use InvoiceGlobalSearch; protected static ?string $model = Invoice::class; protected static ?string $navigationIcon = 'heroicon-o-queue-list'; protected static ?string $modelLabel = 'پیش فاکتور'; protected static ?string $pluralModelLabel = 'پیش فاکتور ها'; protected static ?string $slug = 'pre-factors'; protected static ?int $navigationSort = 3; public static function getNavigationBadge(): ?string { return static::getModel()::where('invoices.orderlevel', 'فاکتور')->where('invoices.status', '!=', 'کنسل')->count(); } public static function getEloquentQuery(): Builder { return parent::getEloquentQuery()->where('invoices.orderlevel', 'فاکتور')->where('invoices.status', '!=', 'کنسل'); } public static function form(Form $form): Form { return $form->schema([ Grid::make(1)->schema([ TextInput::make('amount')->label('مبلغ')->numeric()->required()->minValue(1), Textarea::make('comment')->label('توضیحات')->required(), Select::make('payment_method_id')->label('نوع روش پرداخت')->options(PaymentMethod::whereNot('title_en', 'wallet')->whereNot('title_en', 'online')->get()->pluck('title_fa', 'id'))->searchable()->required() ]) ]); } public static function table(Table $table): Table { return $table ->columns([ TextColumn::make('user.name')->label('نام مشتری'), TextColumn::make('user.cell_number')->label('تلفن همراه'), TextColumn::make('code')->label('کد رهگیری'), TextColumn::make('created_at')->label('تاریخ'), // TextColumn::make('agent.name')->label('کارشناس'), ]) ->filters([ Filter::make('code')->form([ TextInput::make('code')->label('کد رهگیری'), ])->query(fn(Builder $query, array $data): Builder => $query->when( $data['code'], fn(Builder $query, $date): Builder => $query->where('code', $date), )), Filter::make('username')->form([ TextInput::make('name')->label('نام مشتری'), ])->query(fn(Builder $query, array $data): Builder => $query->when( $data['name'], fn(Builder $query, $data): Builder => $query->whereHas( 'user', fn($q) => $q->where('users.name', 'like', '%' . $data . '%')), )), Filter::make('cell_number')->form([ TextInput::make('cell_number')->label('تلفن همراه'), ])->query(fn(Builder $query, array $data): Builder => $query->when( $data['cell_number'], fn(Builder $query, $data): Builder => $query->whereHas( 'user', fn($q) => $q->where('users.cell_number', 'like', '%' . $data . '%')), )), Filter::make('created_at')->form([ DatePicker::make('created_from')->label('از تاریخ')->displayFormat('Y-m-d')->required(), DatePicker::make('created_until')->label('تا تاریخ')->displayFormat('Y-m-d')->required(), ])->query(fn(Builder $query, array $data): Builder => $query ->when( $data['created_from'], fn(Builder $query, $date): Builder => $query->whereDate('created_at', '>=', $date), ) ->when( $data['created_until'], fn(Builder $query, $date): Builder => $query->whereDate('created_at', '<=', $date), )), ]) ->actions([ Action::make('final-factor')->label('مشاهده فاکتور')->color('primary')->icon('heroicon-o-currency-dollar') ->url(fn(Invoice $invoice) => config('app.url') . "/admin/invoice-search/view-factor/" . "{$invoice->id}") ->openUrlInNewTab() ->icon('heroicon-o-link') ->color('primary'), Action::make('extension-payment')->label('تمدید زمان پرداخت')->icon('heroicon-o-clock') ->form([ Placeholder::make('submitdate')->label('این پیش فاکتور قبلا با تاریخ زیر ثبت شده برای تمدید پرداخت تا 24 ساعت آینده دکمه ثبت را انتخاب کنید') ->content(fn(Invoice $record): string => $record->submitdate) ]) ->action(function (Invoice $record, array $data) { Invoice::where('id', $record->id)->update([ 'submitdate' => Carbon::now(), ]); }), Action::make('cancel-invoice') ->label('لغو سفارش') ->requiresConfirmation() ->form([ Select::make('cancel_reason') ->label('علت کنسلی') ->required() ->options([ 'انصراف یا عدم پرداخت مشتری' => 'انصراف یا عدم پرداخت مشتری', 'نا موجود شدن کالا' => 'ناموجود شدن کالا', 'افزایش قیمت کالا' => 'افزایش قیمت کالا', 'اتمام مهلت پرداخت' => 'اتمام مهلت پرداخت', ]), ])->action(function (Invoice $record, array $data) { if (in_array($record->status, ['تحویل مشتری', 'تحویل دفتر ایران', 'ارسال به ایران', 'تحویل دفتر دوبی', 'ارسال به دوبی'])) { Notification::make() ->title('سفارش از مرحله ثبت ترک دبی رد شده و امکان کنسل کردن ندارد') ->danger() ->send(); return $record; } if ($record->sumPay() > 0) { Notification::make() ->title('این سفارش پرداختی دارد و قابل کنسل کردن نیست') ->danger() ->send(); return $record; } DB::beginTransaction(); try { $userDiscount = UserDiscount::where('invoice_id', $record->id) ->first(); if ($userDiscount) { UserDiscount::where('id', $userDiscount->id) ->delete(); } $record->update([ 'cancel_description' => $data['cancel_reason'] . ' در مرحله پیش فاکتور', 'status' => 'کنسل', ]); $record->logistics()->update([ 'iscancel' => true, 'canceldate' => now(), 'canceltype' => 'توسط ما', 'cancelreason' => $data['cancel_reason'], ]); Notification::make() ->title('سفارش با موفقیت کنسل شد') ->success() ->send(); DB::commit(); } catch (\Exception $e) { DB::rollback(); Notification::make() ->title('مشکلی پیش آمده لطفا دوباره تلاش کنید و یا با ادمین سیستم تماس بگیرید!') ->danger() ->send(); } return $record; }), ]) ->bulkActions([]) ->defaultSort('id', 'desc'); } public static function getPages(): array { return [ 'index' => Pages\ListPreFactorManagement::route('/'), ]; } public static function canViewAny(): bool { return auth()->user()->can('pre-factors::view'); } }