73 lines
1.8 KiB
PHP
Raw Normal View History

2025-01-24 21:37:05 -05:00
<?php
namespace App\Models;
use App\Enums\InvoiceStatus;
use App\Observers\PaymentObserver;
use Illuminate\Database\Eloquent\Attributes\ObservedBy;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\SoftDeletes;
2025-02-18 20:13:54 -05:00
use Illuminate\Support\Collection;
2025-01-24 21:37:05 -05:00
#[ObservedBy(PaymentObserver::class)]
class Payment extends Model
{
use SoftDeletes;
protected $fillable = [
'customer_id',
2025-02-18 20:13:54 -05:00
'check_number',
'date',
2025-01-24 21:37:05 -05:00
'amount',
'unapplied_amount',
'notes',
];
2025-02-18 20:13:54 -05:00
public function applyToInvoices(Collection $invoices): void
2025-01-24 21:37:05 -05:00
{
$remaining = $this->unapplied_amount ?? $this->amount;
2025-02-18 20:13:54 -05:00
$filteredInvoices = $invoices->whereIn('status', [
InvoiceStatus::UNPAID,
InvoiceStatus::PARTIALLY_PAID,
]);
2025-01-24 21:37:05 -05:00
2025-02-18 20:13:54 -05:00
foreach ($filteredInvoices as $invoice) {
2025-01-24 21:37:05 -05:00
$balance = $invoice->remainingBalance();
if ($remaining <= 0) {
break;
}
$applied = min($remaining, $balance);
$invoice->payments()->attach($this->id, ['applied_amount' => $applied]);
$remaining -= $applied;
if ($invoice->remainingBalance() == 0) {
$invoice->setStatus(InvoiceStatus::PAID);
} elseif ($applied > 0) {
$invoice->setStatus(InvoiceStatus::PARTIALLY_PAID);
2025-01-24 21:37:05 -05:00
}
}
$this->unapplied_amount = $remaining;
$this->saveQuietly();
}
public function customer(): BelongsTo
{
return $this->belongsTo(Customer::class);
}
public function invoices(): BelongsToMany
{
return $this->belongsToMany(Invoice::class)
->withPivot('applied_amount')
->withTimestamps();
}
}