您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

RecurringInvoiceObserver.php 1.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. <?php
  2. namespace App\Observers;
  3. use App\Enums\Accounting\RecurringInvoiceStatus;
  4. use App\Models\Accounting\DocumentLineItem;
  5. use App\Models\Accounting\RecurringInvoice;
  6. use Illuminate\Support\Facades\DB;
  7. class RecurringInvoiceObserver
  8. {
  9. public function saving(RecurringInvoice $recurringInvoice): void
  10. {
  11. if (($recurringInvoice->isDirty('start_date') && ! $recurringInvoice->last_date) || $this->otherScheduleDetailsChanged($recurringInvoice)) {
  12. $recurringInvoice->next_date = $recurringInvoice->calculateNextDate();
  13. }
  14. if ($recurringInvoice->end_type?->isAfter() && $recurringInvoice->occurrences_count >= $recurringInvoice->max_occurrences) {
  15. $recurringInvoice->status = RecurringInvoiceStatus::Ended;
  16. $recurringInvoice->ended_at = now();
  17. }
  18. }
  19. public function saved(RecurringInvoice $recurringInvoice): void
  20. {
  21. if ($recurringInvoice->wasChanged('status')) {
  22. $recurringInvoice->generateDueInvoices();
  23. }
  24. }
  25. protected function otherScheduleDetailsChanged(RecurringInvoice $recurringInvoice): bool
  26. {
  27. return $recurringInvoice->isDirty([
  28. 'frequency',
  29. 'interval_type',
  30. 'interval_value',
  31. 'month',
  32. 'day_of_month',
  33. 'day_of_week',
  34. 'end_type',
  35. 'max_occurrences',
  36. 'end_date',
  37. ]);
  38. }
  39. public function deleted(RecurringInvoice $recurringInvoice): void
  40. {
  41. DB::transaction(function () use ($recurringInvoice) {
  42. $recurringInvoice->lineItems()->each(function (DocumentLineItem $lineItem) {
  43. $lineItem->delete();
  44. });
  45. });
  46. }
  47. }