From 0e4da559d65575bf57556b150fa91d90c5a634c2 Mon Sep 17 00:00:00 2001 From: Jp Date: Mon, 9 Feb 2026 22:25:08 +0800 Subject: [PATCH] fix: cascade delete related transactions and ledgers for sales and expenses Ensure data integrity by cleaning up dependent records when deleting Sale or Expense models. This prevents orphaned transactions and ledgers in the database. --- app/Models/Expense.php | 14 ++++++++++++++ app/Models/Sale.php | 14 ++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/app/Models/Expense.php b/app/Models/Expense.php index b41f733..248a04b 100644 --- a/app/Models/Expense.php +++ b/app/Models/Expense.php @@ -25,6 +25,20 @@ class Expense extends Model 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); diff --git a/app/Models/Sale.php b/app/Models/Sale.php index 97707d8..bf59284 100644 --- a/app/Models/Sale.php +++ b/app/Models/Sale.php @@ -25,6 +25,20 @@ class Sale extends Model return $this->morphMany(Transaction::class, 'transactionable'); } + protected static function booted() + { + static::deleting(function ($sale) { + $sale->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);