From a566b7ac610d004d35aee1eaefbbdd202c5968f1 Mon Sep 17 00:00:00 2001 From: Nurmuhammet Allanov Date: Sat, 9 Nov 2024 18:49:54 +0500 Subject: [PATCH] User company addded --- F.MD | 3 + README.md | 1 + .../Resources/Company/UserCompanyResource.php | 36 +++++++--- .../Repositories/CacheRepository.php | 67 +++++++++++++++++++ .../Bank/Repositories/BankRepository.php | 42 +++++++++++- ..._04_184437_create_user_companies_table.php | 5 ++ .../UserCompany/Models/UserCompany.php | 24 +++++++ app/Modules/UserCompany/Types/CompanyType.php | 7 +- 8 files changed, 175 insertions(+), 10 deletions(-) create mode 100644 F.MD create mode 100644 app/Modules/AppHelpers/Repositories/CacheRepository.php diff --git a/F.MD b/F.MD new file mode 100644 index 0000000..ad922f6 --- /dev/null +++ b/F.MD @@ -0,0 +1,3 @@ +# Fuck your feelings, no one cares. Fuck you. Prove yourself mother fucker. + +Make user companies better. Move to "Company" navigation at the moment. diff --git a/README.md b/README.md index e69de29..24eb150 100644 --- a/README.md +++ b/README.md @@ -0,0 +1 @@ +# F diff --git a/app/Filament/Resources/Company/UserCompanyResource.php b/app/Filament/Resources/Company/UserCompanyResource.php index 272b0f7..50e2865 100644 --- a/app/Filament/Resources/Company/UserCompanyResource.php +++ b/app/Filament/Resources/Company/UserCompanyResource.php @@ -3,21 +3,27 @@ namespace App\Filament\Resources\Company; use App\Filament\Resources\Company\UserCompanyResource\Pages; +use App\Modules\Bank\Repositories\BankRepository; use App\Modules\UserCompany\Models\UserCompany; use App\Modules\UserCompany\Types\CompanyType; use Filament\Forms\Components\Select; use Filament\Forms\Components\TextInput; +use Filament\Forms\Components\Toggle; use Filament\Forms\Form; use Filament\Resources\Resource; use Filament\Tables; use Filament\Tables\Columns\TextColumn; +use Filament\Tables\Columns\ToggleColumn; +use Filament\Tables\Filters\Filter; use Filament\Tables\Table; class UserCompanyResource extends Resource { protected static ?string $model = UserCompany::class; - protected static ?string $navigationIcon = 'heroicon-o-briefcase'; + protected static ?string $navigationGroup = 'Company'; + + protected static ?string $navigationIcon = 'heroicon-o-building-office'; public static function form(Form $form): Form { @@ -30,6 +36,9 @@ class UserCompanyResource extends Resource ->default(CompanyType::default()) ->required(), + TextInput::make('name') + ->required(), + TextInput::make('ssb') ->label('Şahsy salgyt belgisi') ->unique(ignoreRecord: true) @@ -41,10 +50,15 @@ class UserCompanyResource extends Resource ->required(), Select::make('bank_id') - ->relationship(name: 'bank', titleAttribute: 'name') + ->label('Bank') + ->native(false) + ->options(BankRepository::make()->options()) ->searchable() - ->preload() ->required(), + + Toggle::make('default') + ->default(false) + ->label('Is default'), ]); } @@ -54,14 +68,20 @@ class UserCompanyResource extends Resource ->columns([ TextColumn::make('company_type') ->badge() - ->formatStateUsing(fn (string $state): string => CompanyType::options()[$state]) + ->formatStateUsing(fn (string $state): string => CompanyType::option($state)) ->color(fn (string $state): string => CompanyType::statusClass($state)), - // 'ssb' - // 'hb' - // 'bank_id' + + TextColumn::make('ssb') + ->label('Şahsy salgyt belgisi') + ->searchable(), + + TextColumn::make('hb') + ->label('HB'), + + ToggleColumn::make('default'), ]) ->filters([ - // + Filter::make('default'), ]) ->actions([ Tables\Actions\EditAction::make(), diff --git a/app/Modules/AppHelpers/Repositories/CacheRepository.php b/app/Modules/AppHelpers/Repositories/CacheRepository.php new file mode 100644 index 0000000..b8d4846 --- /dev/null +++ b/app/Modules/AppHelpers/Repositories/CacheRepository.php @@ -0,0 +1,67 @@ +name = $name; + $this->value = $value; + $this->time = $time; + } + + /** + * Cache Repo + * + * @param string $name key + * @param mixed $value value + * @param int|int $time time in seconds + */ + public static function make(string $name, mixed $value, int $time = 600): mixed + { + $repo = new self($name, $value, $time); + + return $repo->handle(); + } + + /** + * Handle cache + */ + public function handle(): mixed + { + return cache()->has($this->name) + ? cache($this->name) + : cache()->remember( + key: $this->name, + ttl: $this->time, + callback: fn () => is_callable($this->value) ? call_user_func($this->value) : $this->value + ); + } + + /** + * Forget the key from cache + */ + public static function forget(string $name): void + { + cache()->forget($name); + } +} diff --git a/app/Modules/Bank/Repositories/BankRepository.php b/app/Modules/Bank/Repositories/BankRepository.php index 8529617..1f54e5d 100644 --- a/app/Modules/Bank/Repositories/BankRepository.php +++ b/app/Modules/Bank/Repositories/BankRepository.php @@ -2,4 +2,44 @@ namespace App\Modules\Bank\Repositories; -class BankRepository {} +use App\Modules\AppHelpers\Repositories\CacheRepository; +use App\Modules\Bank\Models\Bank; +use App\Modules\Makeable; +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Support\Collection; + +class BankRepository +{ + use Makeable; + + /** @var Builder */ + protected Builder $query; + + /** + * Cache name + */ + protected static string $cacheName = 'BANK_REPOSITORY'; + + /** + * Bank repository + */ + public function __construct() + { + $this->query = Bank::query(); + } + + /** + * Return available options + * + * @return Collection|array + */ + public function options(): Collection|array + { + return CacheRepository::make( + name: static::$cacheName.'_options', + value: fn () => $this->query->get(['id', 'name', 'bab'])->mapWithKeys(fn ($item) => [ + $item->id => $item->name.' - '.$item->bab, + ]), + ); + } +} diff --git a/app/Modules/UserCompany/Database/Migrations/2024_11_04_184437_create_user_companies_table.php b/app/Modules/UserCompany/Database/Migrations/2024_11_04_184437_create_user_companies_table.php index 66e6f40..e70de74 100644 --- a/app/Modules/UserCompany/Database/Migrations/2024_11_04_184437_create_user_companies_table.php +++ b/app/Modules/UserCompany/Database/Migrations/2024_11_04_184437_create_user_companies_table.php @@ -20,6 +20,9 @@ return new class extends Migration ->nullable() ->comment('types: tel, hk, hj'); + $table->string('name') + ->index(); + $table->string('ssb') ->nullable() ->comment('Şahsy salgyt belgisi'); @@ -30,6 +33,8 @@ return new class extends Migration $table->foreignId('bank_id')->nullable()->constrained('banks')->nullOnDelete(); $table->foreignId('user_id')->nullable()->constrained('users')->nullOnDelete(); + $table->boolean('default')->default(false); + $table->timestamps(); }); } diff --git a/app/Modules/UserCompany/Models/UserCompany.php b/app/Modules/UserCompany/Models/UserCompany.php index 0977ad4..1ff6663 100644 --- a/app/Modules/UserCompany/Models/UserCompany.php +++ b/app/Modules/UserCompany/Models/UserCompany.php @@ -7,8 +7,32 @@ use App\Modules\Bank\Models\Bank; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; +/** + * @property int $id [primary,unique] + * @property \App\Modules\UserCompany\Types\CompanyType $company_type + * @property string $name + * @property string $ssb [unique] + * @property string $hb [unique] + * @property bool $default [default: false] + * @property int $user_id + * @property int $bank_id + * @property \Illuminate\Support\Carbon $created_at + * @property \Illuminate\Support\Carbon $updated_at + */ class UserCompany extends Model { + /** + * Get the attributes that should be cast. + * + * @return array + */ + protected function casts(): array + { + return [ + 'default' => 'boolean', + ]; + } + /** * User * diff --git a/app/Modules/UserCompany/Types/CompanyType.php b/app/Modules/UserCompany/Types/CompanyType.php index 7c5f7ac..b500abf 100644 --- a/app/Modules/UserCompany/Types/CompanyType.php +++ b/app/Modules/UserCompany/Types/CompanyType.php @@ -31,6 +31,11 @@ enum CompanyType: string ]; } + public static function option(?string $key = ''): string + { + return self::options()[$key] ?? '-'; + } + /** * Default option */ @@ -56,7 +61,7 @@ enum CompanyType: string /** * Get status */ - public static function statusClass(?string $key): string + public static function statusClass(?string $key = ''): string { return self::statusClasses()[$key] ?? 'danger'; }