OwlCyberSecurity - MANAGER
Edit File: LogisticSendToTehranResource.php
<?php namespace App\Filament\Resources; use App\Filament\Resources\LogisticSendTOTehranResource\Pages; use App\Helpers\Calculator; use App\Helpers\LogisticGlobalSearch; use App\Models\Invoice; use App\Models\InvoiceDescription; use App\Models\InvoiceItem; use App\Models\InvoicesOthercosts; use App\Models\Logistic; use App\Models\Sheet; use App\Models\UserDiscount; use Carbon\Carbon; use Closure; use Filament\Forms\Components\DatePicker; use Filament\Forms\Components\Grid; use Filament\Forms\Components\Placeholder; use Filament\Forms\Components\Select; use Filament\Forms\Components\Textarea; use Filament\Forms\Components\TextInput; use Filament\Forms\Form; use Filament\Forms\Get; use Filament\Forms\Set; use Filament\Notifications\Notification; use Filament\Resources\Resource; use Filament\Tables\Actions\Action; use Filament\Tables\Table; use Filament\Tables\Actions\BulkAction; use Filament\Tables\Actions\EditAction; use Filament\Tables\Columns\TextColumn; use Filament\Tables\Filters\Filter; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Collection; use Illuminate\Support\Facades\DB; use Illuminate\Support\HtmlString; class LogisticSendToTehranResource extends Resource { use LogisticGlobalSearch; protected static ?string $model = Logistic::class; protected static ?string $navigationIcon = 'heroicon-o-rectangle-stack'; protected static ?string $modelLabel = 'درون تهران'; protected static ?string $pluralModelLabel = 'درون تهران'; protected static ?string $slug = 'logistic-in-tehran'; protected static ?string $navigationGroup = 'لاجیستیک'; protected static ?int $navigationSort = 6; public static function getEloquentQuery(): Builder { // return parent::getEloquentQuery() // ->whereNotNull('logistics.transporter') // ->where('logistics.transporter', '!=', '') // ->whereNull('logistics.arrivedintehran') // ->where(fn($query) => $query->wherenull('logistics.iscancel')->orwhere('logistics.iscancel', '=', 0)); return parent::getEloquentQuery() ->where('logistics.status_id', 6) ->where(fn($query) => $query->wherenull('logistics.iscancel')->orwhere('logistics.iscancel', '=', 0)); } public static function form(Form $form): Form { return $form->schema([ Grid::make(3)->schema([ TextInput::make('length')->label('طول')->numeric()->minValue(0)->required(), TextInput::make('height')->label('ارتفاع')->numeric()->minValue(0)->required(), TextInput::make('width')->label('عرض')->numeric()->minValue(0)->required()->lazy() ->afterStateUpdated(function (Set $set, $state, Get $get) { if (filled($get('length')) && filled($get('height')) && filled($get('width'))) { $set('contentWeight', ($get('height') * $get('width') * $get('length')) / 5); } }), ]), Grid::make(3)->schema([ TextInput::make('contentWeight')->numeric()->minValue(0)->label('وزن حجمی')->required(), TextInput::make('massweight')->numeric()->minValue(0)->label('وزن جرمی')->required(), TextInput::make('finalweight')->numeric()->label('وزن نهایی به گرم')->required(), ]), Grid::make()->schema([ DatePicker::make('arrivedintehran')->label('تاریخ رسیدن به تهران')->displayFormat('Y-m-d')->required(), Select::make('sheet_id')->label('انتخاب شیت')->options(Sheet::all()->sortByDesc('updated_at')->pluck('name', 'id'))->required()->searchable(), ]), Grid::make(1)->schema([ Textarea::make('invoiceDescriptionLevelSendToTehran')->label('توضیحات'), ]), Grid::make(1)->schema([ Placeholder::make('invoice_id')->content(function ($record) { $color = 'red'; $string = '<span class="bg-' . $color . '-100 text-' . $color . '-600">وزن و مشخصات وارد شده را بررسی کنید سپس دکمه ذخیره را انتخاب نمایید.</span>'; return new HtmlString($string); })->label(''), ]), ]); } public static function table(Table $table): Table { return $table ->columns([ TextColumn::make('invoice.code')->label('کد رهگیری')->copyable(), TextColumn::make('invoiceItem.name')->label('نام کالا')->toggleable(isToggledHiddenByDefault: true), TextColumn::make('price')->label('قیمت'), TextColumn::make('exchange.name')->label('ارز'), TextColumn::make('singleItemfullprice')->label('قیمت ریالی')->money('IRR'), TextColumn::make('orderId')->label('شماره سفارش'), TextColumn::make('buyingdate')->label('تاریخ خرید'), TextColumn::make('tracknumber')->label('ترک نامبر'), TextColumn::make('estimatedDateToTehran')->label('تاریخ تخمینی تهران')->badge() ->color(fn(string $state): string => Carbon::parse($state)->gte(now()) ? 'success' : 'warning'), ]) ->filters([ Filter::make('code')->form([ TextInput::make('code')->label('کد رهگیری'), ])->query(fn(Builder $query, array $data): Builder => $query->when( $data['code'], fn(Builder $query, $data): Builder => $query->whereHas( 'invoice', fn($q) => $q->where('invoices.code', 'like', '%' . $data . '%')), )), Filter::make('orderId')->form([ TextInput::make('orderId')->label('شماره سفارش'), ])->query(function (Builder $query, array $data): Builder { return $query->when( $data['orderId'], fn(Builder $query, $data): Builder => $query->where('orderId', 'like', '%' . $data . '%') ); }), Filter::make('name')->form([ TextInput::make('name')->label('نام کالا'), ])->query(fn(Builder $query, array $data): Builder => $query->when( $data['name'], fn(Builder $query, $data): Builder => $query->whereHas( 'invoiceItem', fn($q) => $q->where('invoice_items.name', 'like', '%' . $data . '%')), )), Filter::make('estimatedDateToTehran') ->toggle() ->label('تاخیر خورده ها') ->query(fn(Builder $query): Builder => $query->whereDate('estimatedDateToTehran', '<=', now())), ]) ->actions([ Action::make('final-factor')->label('مشاهده فاکتور')->color('primary')->icon('heroicon-o-currency-dollar') ->url(fn(Logistic $item) => config('app.url') . "/admin/invoice-search/view-factor/" . "{$item->invoice_id}") ->openUrlInNewTab() ->icon('heroicon-o-link') ->color('primary'), EditAction::make()->label('ثبت')->using(function (Logistic $record, array $data) { self::updateRecord($record, $data); return $record; }), Action::make('invoiceDescription')->label('توضیحات')->icon('heroicon-o-chat-bubble-bottom-center-text')->color('grey') ->mountUsing(function (Form $form, Logistic $record) { $form->fill([ 'invoiceDescriptionLevelBuyInvoice' => $record->invoiceDescriptionLevelBuyInvoice()->first()?->description, 'invoiceDescriptionLevelSetTrackNumber' => $record->invoiceDescriptionLevelSetTrackNumber()->first()?->description, 'invoiceDescriptionLevelSetOfficeNumber' => $record->invoiceDescriptionLevelSetOfficeNumber()->first()?->description, 'invoiceDescriptionLevelSetDubaiTrackNumber' => $record->invoiceDescriptionLevelSetDubaiTrackNumber()->first()?->description, 'invoiceDescriptionLevelIsInDubai' => $record->invoiceDescriptionLevelIsInDubai()->first()?->description, 'invoiceDescriptionLevelSendToTehran' => $record->invoiceDescriptionLevelSendToTehran()->first()?->description, 'invoiceDescriptionLevelIsInTehran' => $record->invoiceDescriptionLevelIsInTehran()->first()?->description, ]); }) ->form([ Textarea::make('invoiceDescriptionLevelBuyInvoice')->label('توضیحات مرحله خرید')->disabled(), Textarea::make('invoiceDescriptionLevelSetTrackNumber')->label('توضیحات ثبت ترک نامبر')->disabled(), Textarea::make('invoiceDescriptionLevelSetOfficeNumber')->label('توضیحات ثبت شماره دفتری')->disabled(), Textarea::make('invoiceDescriptionLevelSetDubaiTrackNumber')->label('توضیحات ثبت ترک دبی')->disabled(), Textarea::make('invoiceDescriptionLevelIsInDubai')->label('توضیحات درون دبی')->disabled(), Textarea::make('invoiceDescriptionLevelSendToTehran')->label('توضیحات ارسال به تهران')->disabled(), Textarea::make('invoiceDescriptionLevelIsInTehran')->label('توضیحات درون تهران')->disabled(), ]) ->modalCancelAction(false) ->modalSubmitAction(false) ->action(function (array $data) { }), Action::make('back')->label('برگشت به مرحله قبل')->icon('heroicon-o-arrow-uturn-left') ->form([ Placeholder::make('code')->label('آیا برای بازگشت سفارش با کد رهگیری زیر به مرحله قبل مطمعن هستین؟') ->content(fn(Logistic $record): string => $record->invoice->code) ]) ->action(function (Logistic $record, array $data) { $record->update([ 'status_id' => $record->status_id - 1, ]); }), ]) ->bulkActions([ BulkAction::make('edition')->label('ثبت گروهی') ->form([ Grid::make(3)->schema([ TextInput::make('length')->label('طول')->numeric()->minValue(0)->required(), TextInput::make('height')->label('ارتفاع')->numeric()->minValue(0)->required(), TextInput::make('width')->label('عرض')->numeric()->minValue(0)->required()->lazy() ->afterStateUpdated(function (Set $set, $state, Get $get) { if (filled($get('length')) && filled($get('height')) && filled($get('width'))) { $set('contentWeight', ($get('height') * $get('width') * $get('length')) / 5); } }), ]), Grid::make()->schema([ TextInput::make('contentWeight')->numeric()->minValue(0)->label('وزن حجمی')->required(), TextInput::make('massweight')->numeric()->minValue(0)->label('وزن جرمی')->required(), TextInput::make('finalweight')->numeric()->label('وزن نهایی به گرم')->required(), ]), Grid::make()->schema([ DatePicker::make('arrivedintehran')->label('تاریخ رسیدن به تهران')->displayFormat('Y-m-d')->required(), Select::make('sheet_id')->label('انتخاب شیت')->options(Sheet::all()->pluck('name', 'id'))->required(), ]), Grid::make(1)->schema([ Textarea::make('invoiceDescriptionLevelSendToTehran')->label('توضیحات'), ]), ]) ->action(function (Collection $records, array $data) { foreach ($records as $record) { self::updateRecord($record, $data); } return $records; }) ]) ->defaultSort('id', 'desc'); } public static function getPages(): array { return [ 'index' => Pages\ListLogisticSendToTehran::route('/'), ]; } private static function updateRecord($record, $data) { DB::beginTransaction(); try { InvoiceDescription::updateOrCreate([ 'logistics_id' => $record->id, 'level' => 'is-in-tehran', ], [ 'invoice_id' => $record->invoice_id, 'invoice_item_id' => $record->invoice_item_id, 'description' => $data['invoiceDescriptionLevelSendToTehran'], 'agent_id' => auth()->id(), ]); $record->update([ 'status_id' => 7, 'length' => $data['length'], 'height' => $data['height'], 'width' => $data['width'], 'contentWeight' => $data['contentWeight'], 'massweight' => $data['massweight'], 'finalweight' => $data['finalweight'], 'arrivedintehran' => $data['arrivedintehran'], 'sheet_id' => $data['sheet_id'], ]); Calculator::reCalculateFinalItemsBasedOnLogistic($record->invoice_id); $countAllItemIsInTehran = Logistic::where('invoice_id', $record->invoice_id)->where('iscancel', 0)->whereNull('finalweight')->count(); if ($countAllItemIsInTehran == 0) { $totalItemPrice = Logistic::where('invoice_id', $record->invoice_id)->where('iscancel', 0)->sum('Itemprice'); $totalBrokerWage = Logistic::where('invoice_id', $record->invoice_id)->where('iscancel', 0)->sum('brokerwageprice'); $finalTotalTransportPrice = Logistic::where('invoice_id', $record->invoice_id)->where('iscancel', 0)->sum('finalTransportprice'); $otherCostSum = InvoicesOthercosts::where('invoice_id', $record->invoice_id)->sum('OtherCostPrice'); $pay_tax=Invoice::find($record->invoice_id)->pay_tax; $taxAmount = 0.02; if ($pay_tax==1) $taxAmount = 0.1; elseif($pay_tax==2) $taxAmount = 0; $userdiscount=UserDiscount::where('invoice_id', $record->invoice_id)->first(); $discount=0; if($userdiscount and $userdiscount->affiliate->gift_card==0){ $discount=$userdiscount->discount_price; } $invoiceData = [ 'status' => 'تحویل دفتر ایران', 'finalTotaltransportprice' => $finalTotalTransportPrice, 'finalTotalitemprice' => $totalItemPrice + $totalBrokerWage, 'finalOthercosts' => $otherCostSum, 'finalTotalTax' => round(($finalTotalTransportPrice + $totalItemPrice + $totalBrokerWage + $otherCostSum-$discount) * $taxAmount, -1), ]; Invoice::where('id', $record->invoice_id)->update($invoiceData); //TODO: send sms } DB::commit(); } catch (\Exception $e) { DB::rollback(); Notification::make()->title('مشکلی پیش آمده لطفا دوباره تلاش کنید و یا با ادمین سیستم تماس بگیرید!')->danger()->send(); } return $record; } public static function canViewAny(): bool { return auth()->user()->can('logistic-in-tehran::view'); } }