first commit

This commit is contained in:
Simon Pocrnjič
2024-10-28 21:08:16 +01:00
commit 90a5858320
199 changed files with 21177 additions and 0 deletions
+35
View File
@@ -0,0 +1,35 @@
<?php
namespace App\Actions\Fortify;
use App\Models\User;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Laravel\Fortify\Contracts\CreatesNewUsers;
use Laravel\Jetstream\Jetstream;
class CreateNewUser implements CreatesNewUsers
{
use PasswordValidationRules;
/**
* Validate and create a newly registered user.
*
* @param array<string, string> $input
*/
public function create(array $input): User
{
Validator::make($input, [
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' => $this->passwordRules(),
'terms' => Jetstream::hasTermsAndPrivacyPolicyFeature() ? ['accepted', 'required'] : '',
])->validate();
return User::create([
'name' => $input['name'],
'email' => $input['email'],
'password' => Hash::make($input['password']),
]);
}
}
@@ -0,0 +1,18 @@
<?php
namespace App\Actions\Fortify;
use Illuminate\Validation\Rules\Password;
trait PasswordValidationRules
{
/**
* Get the validation rules used to validate passwords.
*
* @return array<int, \Illuminate\Contracts\Validation\Rule|array<mixed>|string>
*/
protected function passwordRules(): array
{
return ['required', 'string', Password::default(), 'confirmed'];
}
}
+29
View File
@@ -0,0 +1,29 @@
<?php
namespace App\Actions\Fortify;
use App\Models\User;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Laravel\Fortify\Contracts\ResetsUserPasswords;
class ResetUserPassword implements ResetsUserPasswords
{
use PasswordValidationRules;
/**
* Validate and reset the user's forgotten password.
*
* @param array<string, string> $input
*/
public function reset(User $user, array $input): void
{
Validator::make($input, [
'password' => $this->passwordRules(),
])->validate();
$user->forceFill([
'password' => Hash::make($input['password']),
])->save();
}
}
@@ -0,0 +1,32 @@
<?php
namespace App\Actions\Fortify;
use App\Models\User;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Laravel\Fortify\Contracts\UpdatesUserPasswords;
class UpdateUserPassword implements UpdatesUserPasswords
{
use PasswordValidationRules;
/**
* Validate and update the user's password.
*
* @param array<string, string> $input
*/
public function update(User $user, array $input): void
{
Validator::make($input, [
'current_password' => ['required', 'string', 'current_password:web'],
'password' => $this->passwordRules(),
], [
'current_password.current_password' => __('The provided password does not match your current password.'),
])->validateWithBag('updatePassword');
$user->forceFill([
'password' => Hash::make($input['password']),
])->save();
}
}
@@ -0,0 +1,56 @@
<?php
namespace App\Actions\Fortify;
use App\Models\User;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
use Laravel\Fortify\Contracts\UpdatesUserProfileInformation;
class UpdateUserProfileInformation implements UpdatesUserProfileInformation
{
/**
* Validate and update the given user's profile information.
*
* @param array<string, mixed> $input
*/
public function update(User $user, array $input): void
{
Validator::make($input, [
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'email', 'max:255', Rule::unique('users')->ignore($user->id)],
'photo' => ['nullable', 'mimes:jpg,jpeg,png', 'max:1024'],
])->validateWithBag('updateProfileInformation');
if (isset($input['photo'])) {
$user->updateProfilePhoto($input['photo']);
}
if ($input['email'] !== $user->email &&
$user instanceof MustVerifyEmail) {
$this->updateVerifiedUser($user, $input);
} else {
$user->forceFill([
'name' => $input['name'],
'email' => $input['email'],
])->save();
}
}
/**
* Update the given verified user's profile information.
*
* @param array<string, string> $input
*/
protected function updateVerifiedUser(User $user, array $input): void
{
$user->forceFill([
'name' => $input['name'],
'email' => $input['email'],
'email_verified_at' => null,
])->save();
$user->sendEmailVerificationNotification();
}
}
+19
View File
@@ -0,0 +1,19 @@
<?php
namespace App\Actions\Jetstream;
use App\Models\User;
use Laravel\Jetstream\Contracts\DeletesUsers;
class DeleteUser implements DeletesUsers
{
/**
* Delete the given user.
*/
public function delete(User $user): void
{
$user->deleteProfilePhoto();
$user->tokens->each->delete();
$user->delete();
}
}
+28
View File
@@ -0,0 +1,28 @@
<?php
namespace App\Charts;
use ArielMejiaDev\LarapexCharts\LarapexChart;
class ExampleChart
{
protected $chart;
public function __construct(LarapexChart $chart)
{
$this->chart = $chart;
}
public function build($options = null)
{
return $this->chart->areaChart()
->setTitle('Contracts during last six months.')
->setSubtitle('New and Completed.')
->addData('New', [4, 9, 5, 2, 1, 8])
->addData('Completed', [7, 2, 7, 2, 5, 4])
->setColors(['#1A56DB', '#ff6384'])
->setXAxis(['January', 'February', 'March', 'April', 'May', 'June'])
->setToolbar(true)
->toVue();
}
}
@@ -0,0 +1,13 @@
<?php
namespace App\Http\Controllers;
use App\Models\Account;
use Illuminate\Http\Request;
use Inertia\Inertia;
class AccountController extends Controller
{
//
}
+69
View File
@@ -0,0 +1,69 @@
<?php
namespace App\Http\Controllers;
use App\Models\Person\Person;
use Auth;
use Illuminate\Http\Request;
use Inertia\Inertia;
class ClientController extends Controller
{
public function index(Person $person){
return Inertia::render('Client/Index',[
'persons' => $person::with(['group','type'])
->selectRaw('person.*,(select count(id) from contracts where client_id=person.id) as contracts')
->whereHas('group', fn($que) => $que->where('deleted','=',0))
->whereHas('type', fn($que) => $que->where('deleted','=',0))
->where([
['person.active','=',1],
['person.group_id','=',1]
])->get(),
'create_url' => route('client.store'),
'person_types' => \App\Models\Person\PersonType::all(['id','name','description'])
->where('deleted','=',0)
]);
}
public function show($uuid) {
return Inertia::render('Client/Show', [
'client' => Person::with(['group','type','addresses','contracts'])->where('uuid', $uuid)->firstOrFail()
]);
}
public function store(Request $request)
{
$reqAddress = $request->input('address');
$userId = Auth::user()->id;
$address = [
'address' => $reqAddress['address'],
'country' => $reqAddress['country'],
'type_id' => $reqAddress['type_id'],
'person_id' => 0,
'user_id' => $userId
];
$pid = Person::create([
'nu' => rand(100000,200000),
'first_name' => $request->input('first_name'),
'last_name' => $request->input('last_name'),
'full_name' => $request->input('full_name'),
'gender' => null,
'birthday' => null,
'tax_number' => null,
'social_security_number' => null,
'description' => 'sdwwf',
'group_id' => 1,
'type_id' => 2,
'user_id' => $userId
])->id;
$address['person_id'] = $pid;
\App\Models\Person\PersonAddress::create($address);
return to_route('client');
}
}
@@ -0,0 +1,61 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ContractController extends Controller
{
public function store(Request $request)
{
$cuuid = $request->input('client_uuid');
$userId = \Auth::user()->id;
$pReqPer = $request->input('person');
$pReqCont = $request->input('contract');
$cid = \DB::table('person')->where('uuid', $cuuid)->firstOrFail('id')->id;
if(!empty($cid)){
$pid = \App\Models\Person\Person::create([
'nu' => rand(100000,200000),
'first_name' => $pReqPer['first_name'],
'last_name' => $pReqPer['last_name'],
'full_name' => $pReqPer['full_name'],
'gender' => null,
'birthday' => null,
'tax_number' => null,
'social_security_number' => null,
'description' => 'sdwwf',
'group_id' => 2,
'type_id' => 1,
'user_id' => $userId
])->id;
$address = [
'address' => $pReqPer['address']['address'],
'country' => $pReqPer['address']['country'],
'type_id' => $pReqPer['address']['type_id'],
'person_id' => $pid,
'user_id' => $userId
];
$contract = [
'reference' => $pReqCont['reference'],
'start_date' => date('Y-m-d', strtotime($pReqCont['start_date'])),
'client_id' => $cid,
'debtor_id' => $pid,
'type_id' => $pReqCont['type_id']
];
\App\Models\Person\PersonAddress::create($address);
\App\Models\Contract::create($contract);
}
return to_route('client.show', ['uuid' => $cuuid]);
}
}
+8
View File
@@ -0,0 +1,8 @@
<?php
namespace App\Http\Controllers;
abstract class Controller
{
//
}
+10
View File
@@ -0,0 +1,10 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class DebtController extends Controller
{
//
}
@@ -0,0 +1,10 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class PaymentController extends Controller
{
//
}
+22
View File
@@ -0,0 +1,22 @@
<?php
namespace App\Http\Controllers;
use App\Models\Person\Person;
use Illuminate\Http\Request;
class PersonController extends Controller
{
//
public function show(Person $person){
}
public function create(Request $request){
}
public function store(Request $request){
}
}
@@ -0,0 +1,10 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class SegmentController extends Controller
{
//
}
@@ -0,0 +1,42 @@
<?php
namespace App\Http\Middleware;
use Illuminate\Http\Request;
use Inertia\Middleware;
class HandleInertiaRequests extends Middleware
{
/**
* The root template that's loaded on the first page visit.
*
* @see https://inertiajs.com/server-side-setup#root-template
*
* @var string
*/
protected $rootView = 'app';
/**
* Determines the current asset version.
*
* @see https://inertiajs.com/asset-versioning
*/
public function version(Request $request): ?string
{
return parent::version($request);
}
/**
* Define the props that are shared by default.
*
* @see https://inertiajs.com/shared-data
*
* @return array<string, mixed>
*/
public function share(Request $request): array
{
return array_merge(parent::share($request), [
//
]);
}
}
+21
View File
@@ -0,0 +1,21 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\ResourceCollection;
class PersonCollection extends ResourceCollection
{
/**
* Transform the resource collection into an array.
*
* @return array<int|string, mixed>
*/
public function toArray(Request $request): array
{
return [
'data' => $this->collection
];
}
}
+35
View File
@@ -0,0 +1,35 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
class Account extends Model
{
/** @use HasFactory<\Database\Factories\Person/AccountFactory> */
use HasFactory;
public function debtor(): BelongsTo
{
return $this->belongsTo(\App\Models\Person\Person::class, 'debtor_id');
}
public function client(): BelongsTo
{
return $this->belongsTo(\App\Models\Person\Person::class, 'client_id');
}
public function type(): BelongsTo
{
return $this->belongsTo(\App\Models\AccountType::class);
}
public function debts(): HasMany
{
return $this->hasMany(\App\Models\Debt::class);
}
}
+11
View File
@@ -0,0 +1,11 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class AccountType extends Model
{
use HasFactory;
}
+46
View File
@@ -0,0 +1,46 @@
<?php
namespace App\Models;
use App\Traits\Uuid;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
class Contract extends Model
{
/** @use HasFactory<\Database\Factories\ContractFactory> */
use HasFactory;
use Uuid;
protected $fillable = [
'reference',
'start_date',
'end_date',
'client_id',
'debtor_id',
'type_id',
'description'
];
protected $hidden = [
'client_id',
'debtor_id',
'type_id'
];
public function type(): BelongsTo
{
return $this->belongsTo(\App\Models\ContractType::class, 'type_id');
}
public function debtor(): BelongsTo
{
return $this->belongsTo(\App\Models\Person\Person::class, 'debtor_id');
}
public function segments(): BelongsToMany {
return $this->belongsToMany(\App\Models\Segment::class);
}
}
+11
View File
@@ -0,0 +1,11 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class ContractType extends Model
{
use HasFactory;
}
+28
View File
@@ -0,0 +1,28 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
class Debt extends Model
{
use HasFactory;
public function account(): BelongsTo
{
return $this->belongsTo(\App\Models\Account::class);
}
public function type(): BelongsTo
{
return $this->belongsTo(\App\Models\DebtType::class);
}
public function payments(): HasMany
{
return $this->hasMany(\App\Models\Payment::class);
}
}
+11
View File
@@ -0,0 +1,11 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class DebtType extends Model
{
use HasFactory;
}
+17
View File
@@ -0,0 +1,17 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class Payment extends Model
{
use HasFactory;
public function type(): BelongsTo
{
return $this->belongsTo(\App\Models\PaymentType::class);
}
}
+11
View File
@@ -0,0 +1,11 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class PaymentType extends Model
{
use HasFactory;
}
+12
View File
@@ -0,0 +1,12 @@
<?php
namespace App\Models\Person;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class AddressType extends Model
{
/** @use HasFactory<\Database\Factories\Person/AddressTypeFactory> */
use HasFactory;
}
+83
View File
@@ -0,0 +1,83 @@
<?php
namespace App\Models\Person;
use App\Traits\Uuid;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Laravel\Sanctum\HasApiTokens;
class Person extends Model
{
use HasApiTokens;
/** @use HasFactory<\Database\Factories\Person/PersonFactory> */
use HasFactory;
use Uuid;
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $table = 'person';
protected $fillable = [
'nu',
'first_name',
'last_name',
'full_name',
'gender',
'birthday',
'tax_number',
'social_security_number',
'description',
'group_id',
'type_id',
'user_id'
];
protected $hidden = [
'id',
'deleted',
'user_id'
];
public function phones(): HasMany
{
return $this->hasMany(\App\Models\Person\PersonPhone::class)
->with(['type'])
->where('active','=',1);
}
public function addresses(): HasMany
{
return $this->hasMany(\App\Models\Person\PersonAddress::class)
->with(['type'])
->where('active','=',1);
}
public function group(): BelongsTo
{
return $this->belongsTo(\App\Models\Person\PersonGroup::class, 'group_id');
}
public function type(): BelongsTo
{
return $this->belongsTo(\App\Models\Person\PersonType::class, 'type_id');
}
public function contracts(): HasMany
{
return $this->hasMany(\App\Models\Contract::class, 'client_id')
->with('debtor', fn($que) =>
$que->with(['type', 'group'])
->whereHas('type', fn($tque) => $tque->where('deleted','=',0))
->whereHas('group', fn($tque) => $tque->where('deleted','=',0))
->where('active','=',1))
->with('type', fn($que) => $que->where('deleted','=',0))
->where('active', '=', 1);
}
}
+38
View File
@@ -0,0 +1,38 @@
<?php
namespace App\Models\Person;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class PersonAddress extends Model
{
/** @use HasFactory<\Database\Factories\Person/PersonAddressFactory> */
use HasFactory;
protected $fillable = [
'address',
'country',
'type_id',
'description',
'person_id',
'user_id'
];
protected $hidden = [
'user_id',
'person_id',
'deleted'
];
public function person(): BelongsTo
{
return $this->belongsTo(\App\Models\Person\Person::class);
}
public function type(): BelongsTo
{
return $this->belongsTo(\App\Models\Person\AddressType::class, 'type_id');
}
}
+19
View File
@@ -0,0 +1,19 @@
<?php
namespace App\Models\Person;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
class PersonGroup extends Model
{
/** @use HasFactory<\Database\Factories\Person/PersonGroupFactory> */
use HasFactory;
public function persons(): HasMany
{
return $this->hasMany(\App\Models\Person\Person::class);
}
}
+30
View File
@@ -0,0 +1,30 @@
<?php
namespace App\Models\Person;
use Blade;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class PersonPhone extends Model
{
/** @use HasFactory<\Database\Factories\Person/PersonPhoneFactory> */
use HasFactory;
protected $hidden = [
'user_id',
'person_id',
'deleted'
];
public function person(): BelongsTo
{
return $this->belongsTo(\App\Models\Person\Person::class);
}
public function type(): BelongsTo
{
return $this->belongsTo(\App\Models\Person\PhoneType::class, 'type_id');
}
}
+25
View File
@@ -0,0 +1,25 @@
<?php
namespace App\Models\Person;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
class PersonType extends Model
{
/** @use HasFactory<\Database\Factories\Person/PersonTypeFactory> */
use HasFactory;
protected $fillable = [
'name',
'description'
];
public function persons(): HasMany
{
return $this->hasMany(\App\Models\Person\Person::class);
}
}
+12
View File
@@ -0,0 +1,12 @@
<?php
namespace App\Models\Person;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class PhoneType extends Model
{
/** @use HasFactory<\Database\Factories\Person/PhoneTypeFactory> */
use HasFactory;
}
+17
View File
@@ -0,0 +1,17 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
class Segment extends Model
{
/** @use HasFactory<\Database\Factories\SegmentFactory> */
use HasFactory;
public function contracts(): BelongsToMany {
return $this->belongsToMany(\App\Models\Contract::class);
}
}
+67
View File
@@ -0,0 +1,67 @@
<?php
namespace App\Models;
// use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Fortify\TwoFactorAuthenticatable;
use Laravel\Jetstream\HasProfilePhoto;
use Laravel\Sanctum\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens;
/** @use HasFactory<\Database\Factories\UserFactory> */
use HasFactory;
use HasProfilePhoto;
use Notifiable;
use TwoFactorAuthenticatable;
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
'name',
'email',
'password',
];
/**
* The attributes that should be hidden for serialization.
*
* @var array<int, string>
*/
protected $hidden = [
'password',
'remember_token',
'two_factor_recovery_codes',
'two_factor_secret',
];
/**
* The accessors to append to the model's array form.
*
* @var array<int, string>
*/
protected $appends = [
'profile_photo_url',
];
/**
* Get the attributes that should be cast.
*
* @return array<string, string>
*/
protected function casts(): array
{
return [
'email_verified_at' => 'datetime',
'password' => 'hashed',
];
}
}
+24
View File
@@ -0,0 +1,24 @@
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*/
public function register(): void
{
//
}
/**
* Bootstrap any application services.
*/
public function boot(): void
{
//
}
}
+46
View File
@@ -0,0 +1,46 @@
<?php
namespace App\Providers;
use App\Actions\Fortify\CreateNewUser;
use App\Actions\Fortify\ResetUserPassword;
use App\Actions\Fortify\UpdateUserPassword;
use App\Actions\Fortify\UpdateUserProfileInformation;
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Str;
use Laravel\Fortify\Fortify;
class FortifyServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*/
public function register(): void
{
//
}
/**
* Bootstrap any application services.
*/
public function boot(): void
{
Fortify::createUsersUsing(CreateNewUser::class);
Fortify::updateUserProfileInformationUsing(UpdateUserProfileInformation::class);
Fortify::updateUserPasswordsUsing(UpdateUserPassword::class);
Fortify::resetUserPasswordsUsing(ResetUserPassword::class);
RateLimiter::for('login', function (Request $request) {
$throttleKey = Str::transliterate(Str::lower($request->input(Fortify::username())).'|'.$request->ip());
return Limit::perMinute(5)->by($throttleKey);
});
RateLimiter::for('two-factor', function (Request $request) {
return Limit::perMinute(5)->by($request->session()->get('login.id'));
});
}
}
@@ -0,0 +1,46 @@
<?php
namespace App\Providers;
use App\Actions\Jetstream\DeleteUser;
use Illuminate\Support\Facades\Vite;
use Illuminate\Support\ServiceProvider;
use Laravel\Jetstream\Jetstream;
class JetstreamServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*/
public function register(): void
{
//
}
/**
* Bootstrap any application services.
*/
public function boot(): void
{
$this->configurePermissions();
Jetstream::deleteUsersUsing(DeleteUser::class);
Vite::prefetch(concurrency: 3);
}
/**
* Configure the permissions that are available within the application.
*/
protected function configurePermissions(): void
{
Jetstream::defaultApiTokenPermissions(['read']);
Jetstream::permissions([
'create',
'read',
'update',
'delete',
]);
}
}
+14
View File
@@ -0,0 +1,14 @@
<?php
namespace App\Traits;
use Illuminate\Support\Str;
trait Uuid
{
protected static function boot(){
parent::boot();
static::creating(function ($model) {
$model->uuid = (string) Str::uuid();
});
}
}