Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

RecurringInvoice.php 4.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. <?php
  2. namespace App\Models\Accounting;
  3. use App\Casts\MoneyCast;
  4. use App\Casts\RateCast;
  5. use App\Collections\Accounting\DocumentCollection;
  6. use App\Concerns\Blamable;
  7. use App\Concerns\CompanyOwned;
  8. use App\Enums\Accounting\AdjustmentComputation;
  9. use App\Enums\Accounting\DayOfMonth;
  10. use App\Enums\Accounting\DayOfWeek;
  11. use App\Enums\Accounting\DocumentDiscountMethod;
  12. use App\Enums\Accounting\EndType;
  13. use App\Enums\Accounting\Frequency;
  14. use App\Enums\Accounting\IntervalType;
  15. use App\Enums\Accounting\Month;
  16. use App\Enums\Accounting\RecurringInvoiceStatus;
  17. use App\Enums\Setting\PaymentTerms;
  18. use App\Models\Common\Client;
  19. use App\Models\Setting\Currency;
  20. use Illuminate\Database\Eloquent\Attributes\CollectedBy;
  21. use Illuminate\Database\Eloquent\Factories\HasFactory;
  22. use Illuminate\Database\Eloquent\Model;
  23. use Illuminate\Database\Eloquent\Relations\BelongsTo;
  24. use Illuminate\Database\Eloquent\Relations\HasMany;
  25. use Illuminate\Database\Eloquent\Relations\MorphMany;
  26. #[CollectedBy(DocumentCollection::class)]
  27. class RecurringInvoice extends Model
  28. {
  29. use Blamable;
  30. use CompanyOwned;
  31. use HasFactory;
  32. protected $table = 'recurring_invoices';
  33. protected $fillable = [
  34. 'company_id',
  35. 'client_id',
  36. 'logo',
  37. 'header',
  38. 'subheader',
  39. 'order_number',
  40. 'payment_terms',
  41. 'approved_at',
  42. 'ended_at',
  43. 'frequency',
  44. 'interval_type',
  45. 'interval_value',
  46. 'month',
  47. 'day_of_month',
  48. 'day_of_week',
  49. 'start_date',
  50. 'end_type',
  51. 'max_occurrences',
  52. 'end_date',
  53. 'occurrences_count',
  54. 'timezone',
  55. 'next_date',
  56. 'last_date',
  57. 'auto_send',
  58. 'send_time',
  59. 'status',
  60. 'currency_code',
  61. 'discount_method',
  62. 'discount_computation',
  63. 'discount_rate',
  64. 'subtotal',
  65. 'tax_total',
  66. 'discount_total',
  67. 'total',
  68. 'terms',
  69. 'footer',
  70. 'created_by',
  71. 'updated_by',
  72. ];
  73. protected $casts = [
  74. 'approved_at' => 'datetime',
  75. 'ended_at' => 'datetime',
  76. 'start_date' => 'date',
  77. 'end_date' => 'date',
  78. 'next_date' => 'date',
  79. 'last_date' => 'date',
  80. 'auto_send' => 'boolean',
  81. 'send_time' => 'datetime:H:i',
  82. 'payment_terms' => PaymentTerms::class,
  83. 'frequency' => Frequency::class,
  84. 'interval_type' => IntervalType::class,
  85. 'month' => Month::class,
  86. 'day_of_month' => DayOfMonth::class,
  87. 'day_of_week' => DayOfWeek::class,
  88. 'end_type' => EndType::class,
  89. 'status' => RecurringInvoiceStatus::class,
  90. 'discount_method' => DocumentDiscountMethod::class,
  91. 'discount_computation' => AdjustmentComputation::class,
  92. 'discount_rate' => RateCast::class,
  93. 'subtotal' => MoneyCast::class,
  94. 'tax_total' => MoneyCast::class,
  95. 'discount_total' => MoneyCast::class,
  96. 'total' => MoneyCast::class,
  97. ];
  98. public function client(): BelongsTo
  99. {
  100. return $this->belongsTo(Client::class);
  101. }
  102. public function currency(): BelongsTo
  103. {
  104. return $this->belongsTo(Currency::class, 'currency_code', 'code');
  105. }
  106. public function invoices(): HasMany
  107. {
  108. return $this->hasMany(Invoice::class, 'recurring_invoice_id');
  109. }
  110. public function lineItems(): MorphMany
  111. {
  112. return $this->morphMany(DocumentLineItem::class, 'documentable');
  113. }
  114. public function isDraft(): bool
  115. {
  116. return $this->status === RecurringInvoiceStatus::Draft;
  117. }
  118. public function isActive(): bool
  119. {
  120. return $this->status === RecurringInvoiceStatus::Active;
  121. }
  122. public function wasApproved(): bool
  123. {
  124. return $this->approved_at !== null;
  125. }
  126. public function wasEnded(): bool
  127. {
  128. return $this->ended_at !== null;
  129. }
  130. public function isNeverEnding(): bool
  131. {
  132. return $this->end_type === EndType::Never;
  133. }
  134. public function canBeApproved(): bool
  135. {
  136. return $this->isDraft() && ! $this->wasApproved();
  137. }
  138. public function canBeEnded(): bool
  139. {
  140. return $this->isActive() && ! $this->wasEnded();
  141. }
  142. public function hasLineItems(): bool
  143. {
  144. return $this->lineItems()->exists();
  145. }
  146. }