You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

DocumentObserver.php 1.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. <?php
  2. namespace App\Observers;
  3. use App\Models\Accounting\Document;
  4. class DocumentObserver
  5. {
  6. /**
  7. * Handle the Document "created" event.
  8. */
  9. public function created(Document $document): void
  10. {
  11. //
  12. }
  13. /**
  14. * Handle the Document "deleted" event.
  15. */
  16. public function deleted(Document $document): void
  17. {
  18. //
  19. }
  20. /**
  21. * Handle the Document "restored" event.
  22. */
  23. public function restored(Document $document): void
  24. {
  25. //
  26. }
  27. public function updated(Document $document): void
  28. {
  29. $this->recalculateTotals($document);
  30. }
  31. public function saved(Document $document): void
  32. {
  33. $this->recalculateTotals($document);
  34. }
  35. protected function recalculateTotals(Document $document): void
  36. {
  37. // Sum up totals in cents
  38. $subtotalCents = $document->lineItems()->sum('total');
  39. $taxTotalCents = $document->lineItems()->sum('tax_total');
  40. $discountTotalCents = $document->lineItems()->sum('discount_total');
  41. $grandTotalCents = $subtotalCents + $taxTotalCents - $discountTotalCents;
  42. $subtotal = $subtotalCents / 100; // Convert to dollars
  43. $taxTotal = $taxTotalCents / 100;
  44. $discountTotal = $discountTotalCents / 100;
  45. $grandTotal = $grandTotalCents / 100;
  46. ray([
  47. 'subtotal' => $subtotal,
  48. 'tax_total' => $taxTotal,
  49. 'discount_total' => $discountTotal,
  50. 'grand_total' => $grandTotal,
  51. ]);
  52. $document->updateQuietly([
  53. 'subtotal' => $subtotal,
  54. 'tax_total' => $taxTotal,
  55. 'discount_total' => $discountTotal,
  56. 'total' => $grandTotal,
  57. ]);
  58. }
  59. /**
  60. * Handle the Document "force deleted" event.
  61. */
  62. public function forceDeleted(Document $document): void
  63. {
  64. //
  65. }
  66. }