- Add many-to-many relationships between Sale/Expense and Account models - Create pivot tables for account_sale and account_expense with migrations - Implement account syncing during sale/expense creation and editing - Add accounts_list attribute to display comma-separated account names - Introduce SaleService with DTO for sale creation logic - Simplify sales table columns to show branch, reference, date, and creator - Calculate and store aggregated financial fields from transactions - Make series field read-only instead of disabled in sale form
58 lines
1.5 KiB
PHP
58 lines
1.5 KiB
PHP
<?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\BelongsToMany;
|
|
use Illuminate\Database\Eloquent\Relations\MorphMany;
|
|
|
|
class Expense extends Model
|
|
{
|
|
use HasFactory;
|
|
|
|
protected $guarded = [];
|
|
|
|
protected $casts = [
|
|
'happened_on' => 'date:Y-m-d',
|
|
];
|
|
|
|
/**
|
|
* Get all the transactions for the Sale
|
|
*/
|
|
public function transactions(): MorphMany
|
|
{
|
|
return $this->morphMany(Transaction::class, 'transactionable');
|
|
}
|
|
|
|
protected static function booted()
|
|
{
|
|
static::deleting(function ($expense) {
|
|
$expense->transactions->each(function ($transaction) {
|
|
// Delete associated ledgers first to trigger any ledger deletion logic if exists
|
|
$transaction->ledgers->each(function ($ledger) {
|
|
$ledger->balances()->delete(); // Delete balances associated with ledger
|
|
$ledger->delete();
|
|
});
|
|
$transaction->delete();
|
|
});
|
|
});
|
|
}
|
|
|
|
public function branch(): BelongsTo
|
|
{
|
|
return $this->belongsTo(Branch::class);
|
|
}
|
|
|
|
public function accounts(): BelongsToMany
|
|
{
|
|
return $this->belongsToMany(Account::class, 'account_expense')->withTimestamps();
|
|
}
|
|
|
|
public function getAccountsListAttribute(): string
|
|
{
|
|
return $this->accounts->pluck('account')->implode(', ');
|
|
}
|
|
}
|