From 307f197d2776d4d29e44232b38121a1f96404267 Mon Sep 17 00:00:00 2001 From: Nurmuhammet Allanov Date: Sun, 26 Nov 2023 21:15:42 +0500 Subject: [PATCH] wip on loanorders --- app/Models/Order/Loan/LoanOrder.php | 11 +++ app/Nova/Resource.php | 7 ++ .../Order/Loan/Concerns/LoanOrderEvents.php | 21 +++++ .../Order/Loan/Concerns/LoanOrderNovaRepo.php | 30 +++++-- app/Nova/Resources/Order/Loan/LoanOrder.php | 88 +++++++++++++++--- app/Repos/Order/OrderRepo.php | 89 +++++++++++++++++++ ..._11_23_162920_create_loan_orders_table.php | 9 +- database/seeders/DatabaseSeeder.php | 9 +- database/seeders/ProvinceTableSeeder.php | 64 +++++++++++++ 9 files changed, 300 insertions(+), 28 deletions(-) create mode 100644 app/Nova/Resources/Order/Loan/Concerns/LoanOrderEvents.php create mode 100644 app/Repos/Order/OrderRepo.php create mode 100644 database/seeders/ProvinceTableSeeder.php diff --git a/app/Models/Order/Loan/LoanOrder.php b/app/Models/Order/Loan/LoanOrder.php index 8da8fe4..1c4cfa8 100644 --- a/app/Models/Order/Loan/LoanOrder.php +++ b/app/Models/Order/Loan/LoanOrder.php @@ -57,6 +57,17 @@ class LoanOrder extends Model 'notes', ]; + /** + * The attributes that should be cast. + * + * @var array + */ + protected $casts = [ + 'born_at' => 'date', + 'passport_given_at' => 'date', + 'work_started_at' => 'date', + ]; + /** * Loan type */ diff --git a/app/Nova/Resource.php b/app/Nova/Resource.php index 206170f..b91872f 100644 --- a/app/Nova/Resource.php +++ b/app/Nova/Resource.php @@ -7,6 +7,13 @@ use Laravel\Nova\Resource as NovaResource; abstract class Resource extends NovaResource { + /** + * Indicates whether Nova should check for modifications between viewing and updating a resource. + * + * @var bool + */ + public static $trafficCop = false; + /** * Build an "index" query for the given resource. * diff --git a/app/Nova/Resources/Order/Loan/Concerns/LoanOrderEvents.php b/app/Nova/Resources/Order/Loan/Concerns/LoanOrderEvents.php new file mode 100644 index 0000000..bf2a312 --- /dev/null +++ b/app/Nova/Resources/Order/Loan/Concerns/LoanOrderEvents.php @@ -0,0 +1,21 @@ +{$attribute} = mb_strtoupper(sprintf( - '%s-%s', - Branch::find($request->branch_id)->unique_code, - $request->id - )) ?? uniqid(); - }; + return mb_strtoupper(sprintf( + '%s-%s', + Branch::find($request->branch_id)->unique_code ?? 'TB', + $model->id + )) ?? uniqid(); + } + + /** + * After model has been created + */ + public static function afterCreate(NovaRequest $request, Model $model): void + { + $model->update([ + 'unique_id' => static::fillUniqueId($request, $model), + 'filled_by' => auth()->id(), + 'user_id' => auth()->id(), + 'status' => OrderRepo::defaultStatus(), + ]); } } diff --git a/app/Nova/Resources/Order/Loan/LoanOrder.php b/app/Nova/Resources/Order/Loan/LoanOrder.php index 90736e8..f9060ed 100644 --- a/app/Nova/Resources/Order/Loan/LoanOrder.php +++ b/app/Nova/Resources/Order/Loan/LoanOrder.php @@ -5,6 +5,7 @@ namespace App\Nova\Resources\Order\Loan; use App\Models\Order\Loan\LoanOrder as LoanOrderModel; use App\Nova\Resource; use App\Nova\Resources\Branch\Concerns\BranchNovaRepo; +use App\Nova\Resources\Order\Loan\Concerns\LoanOrderEvents; use App\Nova\Resources\Order\Loan\Concerns\LoanOrderNovaRepo; use App\Repos\Order\Loan\BranchRepo; use App\Repos\Order\Loan\LoanTypeRepo; @@ -17,7 +18,9 @@ use Konsulting\NovaTarget\NovaTarget; use Laravel\Nova\Fields\Date; use Laravel\Nova\Fields\Email; use Laravel\Nova\Fields\File; +use Laravel\Nova\Fields\Hidden; use Laravel\Nova\Fields\ID; +use Laravel\Nova\Fields\Image; use Laravel\Nova\Fields\Number; use Laravel\Nova\Fields\Select; use Laravel\Nova\Fields\Slug; @@ -28,6 +31,8 @@ use Nurmuhammet\NovaInputmask\NovaInputmask; class LoanOrder extends Resource { + use LoanOrderEvents; + /** * The model the resource corresponds to. * @@ -48,9 +53,30 @@ class LoanOrder extends Resource * @var array */ public static $search = [ - 'unique_id', + 'unique_id', 'customer_name', 'customer_surname' ]; + /** + * Indicates whether the resource should automatically poll for new resources. + * + * @var bool + */ + // public static $polling = true; + + // /** + // * The interval at which Nova should poll for new resources. + // * + // * @var int + // */ + // public static $pollingInterval = 120; + + // /** + // * Indicates whether to show the polling toggle button inside Nova. + // * + // * @var bool + // */ + // public static $showPollingToggle = true; + /** * Get the displayable label of the resource. */ @@ -68,12 +94,37 @@ class LoanOrder extends Resource } /** - * Get the fields for create. + * Get the fields for index. */ - // public function fieldsForCreate(NovaRequest $request): array - // { + public function fieldsForIndex(NovaRequest $request): array + { + return [ + ID::make()->hide(), - // } + Text::make(__('Unique id'), 'unique_id')->sortable(), + + Select::make(__('Loan type'), 'loan_type') + ->displayUsingLabels() + ->options(LoanTypeRepo::values()) + ->sortable(), + + Select::make(__('Region'), 'region') + ->displayUsingLabels() + ->options(RegionRepo::values()) + ->sortable(), + + Select::make(__('Branch'), 'branch_id') + ->displayUsingLabels() + ->options(BranchRepo::values()) + ->sortable(), + + Text::make(__('Customer name'), 'customer_name'), + + Text::make(__('Customer surname'), 'customer_surname'), + + Text::make(__('Phone'), 'phone') + ]; + } /** * Get the fields displayed by the resource. @@ -81,7 +132,7 @@ class LoanOrder extends Resource public function fields(NovaRequest $request): array { return [ - ID::hidden()->sortable(), + ID::make()->sortable(), new Panel(__('Loan'), [ Select::make(__('Loan type'), 'loan_type') @@ -196,7 +247,7 @@ class LoanOrder extends Resource NovaInputmask::make(__('Phone Additional'), 'phone_additional') ->phonenumber('TM') ->size('w-1/4') - ->rules('required'), + ->rules('nullable'), NovaInputmask::make(__('Home phone'), 'phone_home') ->size('w-1/4') @@ -225,8 +276,8 @@ class LoanOrder extends Resource ->displayUsingLabels() ->searchable() ->dependsOn('region', BranchNovaRepo::dependsOnRegion('work_region')) - ->size('w-1/2') - ->rules('required'), + ->size('w-1/2'), + // ->rules('required'), Text::make(__('Position'), 'work_position') ->size('w-1/2') @@ -242,10 +293,21 @@ class LoanOrder extends Resource ]), new Panel(__('Passport'), [ - File::make(__('Passport (page 1)'), 'passport_one'), - File::make(__('Passport (page 2-3)'), 'passport_two'), - File::make(__('Passport (page 8-9)'), 'passport_three'), - File::make(__('Passport (page 32)'), 'passport_four'), + Image::make(__('Passport (page 1)'), 'passport_one') + ->size('w-1/2') + ->rules('required', 'max:2048'), + + Image::make(__('Passport (page 2-3)'), 'passport_two') + ->size('w-1/2') + ->rules('required', 'max:2048'), + + Image::make(__('Passport (page 8-9)'), 'passport_three') + ->size('w-1/2') + ->rules('required', 'max:2048'), + + Image::make(__('Passport (page 32)'), 'passport_four') + ->size('w-1/2') + ->rules('required', 'max:2048'), ]), // $table->foreignId('filled_by')->constrained('users')->restrictOnDelete(); diff --git a/app/Repos/Order/OrderRepo.php b/app/Repos/Order/OrderRepo.php new file mode 100644 index 0000000..8e8d042 --- /dev/null +++ b/app/Repos/Order/OrderRepo.php @@ -0,0 +1,89 @@ + __('Pending'), + self::REGISTER => __('Registered'), + self::PROCESSING => __('Processing'), + self::COMPLETED => __('Completed'), + self::CANCELLED => __('Cancelled'), + ]; + } + + /** + * Tailwind + */ + public static function statusClasses(): array + { + return [ + self::PENDING => 'warning', + self::REGISTER => 'info', + self::PROCESSING => 'primary', + self::COMPLETED => 'success', + self::CANCELLED => 'danger', + ]; + } + + /** + * HEX Colors + */ + public static function statusColors(): array + { + return [ + self::PENDING => '#F5573B', + self::REGISTER => '#F2CB22', + self::PROCESSING => '#098F56', + self::COMPLETED => '#8FC15D', + self::CANCELLED => '#d70206', + ]; + } + + /** + * Formatted status for given "status" + */ + public static function statusFormatted(string $status = 'pending'): string + { + return static::values()[$status] ?? __('None'); + } +} diff --git a/database/migrations/2023_11_23_162920_create_loan_orders_table.php b/database/migrations/2023_11_23_162920_create_loan_orders_table.php index 2dd21b1..089f756 100644 --- a/database/migrations/2023_11_23_162920_create_loan_orders_table.php +++ b/database/migrations/2023_11_23_162920_create_loan_orders_table.php @@ -1,5 +1,6 @@ text('passport_three'); $table->text('passport_four'); - $table->foreignId('filled_by')->constrained('users')->restrictOnDelete(); - $table->foreignId('user_id')->constrained('users')->restrictOnDelete(); + $table->foreignId('filled_by')->nullable()->constrained('users')->restrictOnDelete(); + $table->foreignId('user_id')->nullable()->constrained('users')->restrictOnDelete(); - $table->string('status')->index(); - $table->string('status_reason')->nullable(); + $table->string('status')->nullable()->default(OrderRepo::defaultStatus())->index(); + $table->string('status_reason')->nullable()->default(''); $table->string('notes')->nullable(); diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index cdacab5..28c62c2 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -12,8 +12,11 @@ class DatabaseSeeder extends Seeder */ public function run(): void { - $this->call([BranchTableSeeder::class]); - $this->call([UsersTableSeeder::class]); - $this->call([LoanTypeSeeder::class]); + $this->call([ + UsersTableSeeder::class, + ProvinceTableSeeder::class, + BranchTableSeeder::class, + LoanTypeSeeder::class, + ]); } } diff --git a/database/seeders/ProvinceTableSeeder.php b/database/seeders/ProvinceTableSeeder.php new file mode 100644 index 0000000..7366cb3 --- /dev/null +++ b/database/seeders/ProvinceTableSeeder.php @@ -0,0 +1,64 @@ + 'ag', + 'name' => 'Arçabil', + 'active' => true, + ], + [ + 'region' => 'ag', + 'name' => 'Bagtyýarlyk', + 'active' => true, + ], + [ + 'region' => 'ag', + 'name' => 'Berkararlyk', + 'active' => true, + ], + + [ + 'region' => 'ag', + 'name' => 'Çandybil', + 'active' => true, + ], + [ + 'region' => 'ag', + 'name' => 'Köpetdag', + 'active' => true, + ], + [ + 'region' => 'ah', + 'name' => 'Altyn-Asyr', + 'active' => true, + ], + [ + 'region' => 'ah', + 'name' => 'Ak-Bugdaý', + 'active' => true, + ], + [ + 'region' => 'mr', + 'name' => 'Mary', + 'active' => true, + ], + ]; + + foreach ($datas as $data) { + Province::create($data); + } + } +}