123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- <?php
-
- namespace App\Observers;
-
- use App\Enums\Accounting\AdjustmentStatus;
- use App\Models\Accounting\Account;
- use App\Models\Accounting\Adjustment;
-
- class AdjustmentObserver
- {
- public function creating(Adjustment $adjustment): void
- {
- if (! $adjustment->account_id && ! $adjustment->isNonRecoverablePurchaseTax()) {
- $account = null;
-
- if ($adjustment->isSalesTax()) {
- $account = Account::factory()->forSalesTax($adjustment->name, $adjustment->description)->create();
- } elseif ($adjustment->isRecoverablePurchaseTax()) {
- $account = Account::factory()->forPurchaseTax($adjustment->name, $adjustment->description)->create();
- } elseif ($adjustment->isSalesDiscount()) {
- $account = Account::factory()->forSalesDiscount($adjustment->name, $adjustment->description)->create();
- } elseif ($adjustment->isPurchaseDiscount()) {
- $account = Account::factory()->forPurchaseDiscount($adjustment->name, $adjustment->description)->create();
- }
-
- if ($account) {
- $adjustment->account()->associate($account);
- }
- }
- }
-
- public function updating(Adjustment $adjustment): void
- {
- if ($adjustment->account) {
- $adjustment->account->update([
- 'name' => $adjustment->name,
- 'description' => $adjustment->description,
- ]);
- }
- }
-
- public function saved(Adjustment $adjustment): void
- {
- if ($adjustment->wasChanged('status') || $adjustment->wasRecentlyCreated) {
- if ($adjustment->isInactive()) {
- $adjustment->account?->update([
- 'archived' => true,
- ]);
- } else {
- $adjustment->account?->update([
- 'archived' => false,
- ]);
- }
- }
- }
-
- /**
- * Handle the Adjustment "saving" event.
- */
- public function saving(Adjustment $adjustment): void
- {
- // Handle dates changes affecting status
- // Only if the status isn't being explicitly changed and not in a manual state
- if ($adjustment->isDirty(['start_date', 'end_date']) &&
- ! $adjustment->isDirty('status') &&
- ! in_array($adjustment->status, [AdjustmentStatus::Archived, AdjustmentStatus::Paused])) {
-
- $adjustment->status = $adjustment->calculateNaturalStatus();
- }
-
- // Handle auto-resume for paused adjustments with a paused_until date
- if ($adjustment->shouldAutoResume() && ! $adjustment->isDirty('status')) {
- $adjustment->status = $adjustment->calculateNaturalStatus();
- $adjustment->paused_at = null;
- $adjustment->paused_until = null;
- $adjustment->status_reason = null;
- }
-
- // Ensure consistency between paused status and paused_at field
- if ($adjustment->status === AdjustmentStatus::Paused && ! $adjustment->paused_at) {
- $adjustment->paused_at = now();
- }
- }
- }
|