- Added maximum discount settings configurable by the administrator. - Implemented discount calculations in the quote confirmation process. - Introduced transport options with associated costs, including handling for exceeding maximum piece limits. - Updated frontend to display discounts and transport information in the quote summary. - Created new database migrations for storing discount and transport settings. - Developed a new Filament page for managing global discount settings. - Enhanced email templates to include discount and transport details. - Added tests to ensure proper functionality of discounts and transport calculations.
84 lines
2.3 KiB
PHP
84 lines
2.3 KiB
PHP
<?php
|
|
|
|
namespace App\Models;
|
|
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
|
use Laravel\Sanctum\HasApiTokens;
|
|
|
|
class Cliente extends Model
|
|
{
|
|
use HasApiTokens;
|
|
|
|
protected $table = 'clienti';
|
|
|
|
protected $fillable = [
|
|
'username', 'password',
|
|
'sconti_abilitati', 'sconto_max_1', 'sconto_max_2',
|
|
'nome', 'cognome', 'ragione_sociale', 'email', 'telefono',
|
|
'indirizzo', 'cap', 'citta', 'provincia', 'note',
|
|
];
|
|
|
|
protected $hidden = [
|
|
'password',
|
|
];
|
|
|
|
protected $casts = [
|
|
'password' => 'hashed',
|
|
'sconti_abilitati' => 'boolean',
|
|
'sconto_max_1' => 'decimal:2',
|
|
'sconto_max_2' => 'decimal:2',
|
|
];
|
|
|
|
/**
|
|
* Sconti massimi (%) che il cliente può applicare al preventivo: i suoi, se personalizzati,
|
|
* altrimenti la regola base. Zero per entrambi se l'amministratore li ha disabilitati.
|
|
*
|
|
* @return array{max_1:float,max_2:float}
|
|
*/
|
|
public function scontiMassimi(): array
|
|
{
|
|
if (! $this->sconti_abilitati) {
|
|
return ['max_1' => 0.0, 'max_2' => 0.0];
|
|
}
|
|
|
|
return [
|
|
'max_1' => (float) ($this->sconto_max_1 ?? Impostazione::scontiBase()['max_1']),
|
|
'max_2' => (float) ($this->sconto_max_2 ?? Impostazione::scontiBase()['max_2']),
|
|
];
|
|
}
|
|
|
|
public function preventivi(): HasMany
|
|
{
|
|
return $this->hasMany(Preventivo::class);
|
|
}
|
|
|
|
protected static function booted(): void
|
|
{
|
|
static::deleting(function (Cliente $cliente): void {
|
|
// Elimina di conseguenza i preventivi del cliente (con i relativi file)
|
|
// e revoca i token API usati per l'accesso al configuratore.
|
|
$cliente->preventivi()->get()->each->delete();
|
|
$cliente->tokens()->delete();
|
|
});
|
|
}
|
|
|
|
public function getNominativoAttribute(): string
|
|
{
|
|
if ($this->ragione_sociale) {
|
|
return $this->ragione_sociale;
|
|
}
|
|
|
|
$nome = trim("{$this->nome} {$this->cognome}");
|
|
|
|
return $nome !== '' ? $nome : $this->username;
|
|
}
|
|
|
|
public function getNomeCompletoAttribute(): string
|
|
{
|
|
$nome = trim("{$this->nome} {$this->cognome}");
|
|
|
|
return $nome !== '' ? $nome : $this->username;
|
|
}
|
|
}
|