'Numerar', 'card' => 'Card', 'transfer' => 'Virament', 'mobile' => 'Mobile pay', ]; protected $fillable = [ 'company_id', 'client_id', 'work_order_id', 'user_id', 'paid_at', 'amount', 'method', 'reference', 'notes', ]; protected $casts = [ 'paid_at' => 'date', 'amount' => 'decimal:2', ]; public function client(): BelongsTo { return $this->belongsTo(Client::class); } public function workOrder(): BelongsTo { return $this->belongsTo(WorkOrder::class); } public function user(): BelongsTo { return $this->belongsTo(User::class); } /** * After save/delete, recompute the work order's pay_status. */ protected static function booted(): void { $sync = function (self $payment) { if (! $payment->work_order_id) { return; } $wo = WorkOrder::withoutGlobalScopes()->find($payment->work_order_id); if (! $wo) { return; } $paid = (float) static::withoutGlobalScopes() ->where('work_order_id', $wo->id) ->whereNull('deleted_at') ->sum('amount'); $total = (float) $wo->total; if ($paid <= 0) { $wo->pay_status = 'unpaid'; } elseif ($paid + 0.01 < $total) { $wo->pay_status = 'partial'; } else { $wo->pay_status = 'paid'; } $wo->save(); }; static::saved($sync); static::deleted($sync); } }