Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

DocumentDefault.php 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. <?php
  2. namespace App\Models\Setting;
  3. use App\Models\Document\Document;
  4. use App\Scopes\CurrentCompanyScope;
  5. use App\Traits\Blamable;
  6. use App\Traits\CompanyOwned;
  7. use Database\Factories\DocumentDefaultFactory;
  8. use Illuminate\Database\Eloquent\Factories\Factory;
  9. use Illuminate\Database\Eloquent\Factories\HasFactory;
  10. use Illuminate\Database\Eloquent\Model;
  11. use Illuminate\Database\Eloquent\Relations\BelongsTo;
  12. use Illuminate\Database\Eloquent\Relations\HasMany;
  13. use Wallo\FilamentCompanies\FilamentCompanies;
  14. class DocumentDefault extends Model
  15. {
  16. use Blamable, CompanyOwned, HasFactory;
  17. protected $table = 'document_defaults';
  18. protected $fillable = [
  19. 'company_id',
  20. 'type',
  21. 'document_number_prefix',
  22. 'document_number_digits',
  23. 'document_number_next',
  24. 'payment_terms',
  25. 'template',
  26. 'title',
  27. 'subheading',
  28. 'notes',
  29. 'terms',
  30. 'footer',
  31. 'created_by',
  32. 'updated_by',
  33. ];
  34. protected static function booted(): void
  35. {
  36. static::addGlobalScope(new CurrentCompanyScope);
  37. }
  38. public function company(): BelongsTo
  39. {
  40. return $this->belongsTo(FilamentCompanies::companyModel(), 'company_id');
  41. }
  42. public function documents(): HasMany
  43. {
  44. return $this->hasMany(Document::class);
  45. }
  46. public function createdBy(): BelongsTo
  47. {
  48. return $this->belongsTo(FilamentCompanies::userModel(), 'created_by');
  49. }
  50. public function updatedBy(): BelongsTo
  51. {
  52. return $this->belongsTo(FilamentCompanies::userModel(), 'updated_by');
  53. }
  54. public static function getDocumentNumberDigits(): array
  55. {
  56. return array_combine(range(1, 20), range(1, 20));
  57. }
  58. public static function getDefaultDocumentNumberDigits(string $type = 'invoice'): int
  59. {
  60. $documentNumberDigits = self::where('type', $type)->pluck('document_number_digits', 'id')->toArray();
  61. return array_key_first($documentNumberDigits) ?? 5;
  62. }
  63. public static function getDefaultDocumentNumberNext(int|null $numDigits = null, string $type = 'invoice'): string
  64. {
  65. // Fetch the latest document
  66. $latestDocument = Document::where('type', $type)->orderBy('id', 'desc')->first();
  67. // If there are no documents yet, start from 1
  68. if (!$latestDocument) {
  69. $nextNumber = 1;
  70. } else {
  71. // Otherwise, increment the latest document's number
  72. $nextNumber = (int)$latestDocument->document_number + 1;
  73. }
  74. return str_pad($nextNumber, $numDigits, '0', STR_PAD_LEFT);
  75. }
  76. public static function getPaymentTerms(): array
  77. {
  78. return [
  79. 0 => 'Due on Receipt',
  80. 7 => 'Net 7',
  81. 10 => 'Net 10',
  82. 15 => 'Net 15',
  83. 30 => 'Net 30',
  84. 60 => 'Net 60',
  85. 90 => 'Net 90',
  86. ];
  87. }
  88. public static function getDefaultPaymentTerms(string $type = 'invoice'): int
  89. {
  90. $paymentTerms = self::where('type', $type)->pluck('payment_terms', 'id')->toArray();
  91. return array_key_first($paymentTerms) ?? 30;
  92. }
  93. public function getDocumentNumberAttribute(): string
  94. {
  95. return $this->document_number_prefix . str_pad($this->document_number_next, $this->document_number_digits, '0', STR_PAD_LEFT);
  96. }
  97. protected static function newFactory(): Factory
  98. {
  99. return DocumentDefaultFactory::new();
  100. }
  101. }