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.

Vendor.php 4.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. <?php
  2. namespace App\Models\Common;
  3. use App\Concerns\Blamable;
  4. use App\Concerns\CompanyOwned;
  5. use App\Enums\Common\ContractorType;
  6. use App\Enums\Common\VendorType;
  7. use App\Models\Accounting\Bill;
  8. use App\Models\Accounting\Transaction;
  9. use App\Models\Setting\Currency;
  10. use Illuminate\Database\Eloquent\Factories\HasFactory;
  11. use Illuminate\Database\Eloquent\Model;
  12. use Illuminate\Database\Eloquent\Relations\BelongsTo;
  13. use Illuminate\Database\Eloquent\Relations\HasMany;
  14. use Illuminate\Database\Eloquent\Relations\MorphMany;
  15. use Illuminate\Database\Eloquent\Relations\MorphOne;
  16. class Vendor extends Model
  17. {
  18. use Blamable;
  19. use CompanyOwned;
  20. use HasFactory;
  21. protected $table = 'vendors';
  22. protected $fillable = [
  23. 'company_id',
  24. 'name',
  25. 'type',
  26. 'contractor_type',
  27. 'ssn',
  28. 'ein',
  29. 'currency_code',
  30. 'account_number',
  31. 'website',
  32. 'notes',
  33. 'created_by',
  34. 'updated_by',
  35. ];
  36. protected $casts = [
  37. 'type' => VendorType::class,
  38. 'contractor_type' => ContractorType::class,
  39. 'ssn' => 'encrypted',
  40. 'ein' => 'encrypted',
  41. ];
  42. public static function createWithRelations(array $data): self
  43. {
  44. /** @var Vendor $vendor */
  45. $vendor = self::create($data);
  46. if (isset($data['contact'], $data['contact']['first_name'])) {
  47. $vendor->contact()->create([
  48. 'is_primary' => true,
  49. 'first_name' => $data['contact']['first_name'],
  50. 'last_name' => $data['contact']['last_name'],
  51. 'email' => $data['contact']['email'],
  52. 'phones' => $data['contact']['phones'] ?? [],
  53. ]);
  54. }
  55. if (isset($data['address'], $data['address']['type'], $data['address']['address_line_1'])) {
  56. $vendor->address()->create([
  57. 'type' => $data['address']['type'],
  58. 'address_line_1' => $data['address']['address_line_1'],
  59. 'address_line_2' => $data['address']['address_line_2'] ?? null,
  60. 'country_code' => $data['address']['country_code'] ?? null,
  61. 'state_id' => $data['address']['state_id'] ?? null,
  62. 'city' => $data['address']['city'] ?? null,
  63. 'postal_code' => $data['address']['postal_code'] ?? null,
  64. ]);
  65. }
  66. return $vendor;
  67. }
  68. public function updateWithRelations(array $data): self
  69. {
  70. $this->update($data);
  71. if (isset($data['contact'], $data['contact']['first_name'])) {
  72. $this->contact()->updateOrCreate(
  73. ['is_primary' => true],
  74. [
  75. 'first_name' => $data['contact']['first_name'],
  76. 'last_name' => $data['contact']['last_name'],
  77. 'email' => $data['contact']['email'],
  78. 'phones' => $data['contact']['phones'] ?? [],
  79. ]
  80. );
  81. }
  82. if (isset($data['address'], $data['address']['type'], $data['address']['address_line_1'])) {
  83. $this->address()->updateOrCreate(
  84. ['type' => $data['address']['type']],
  85. [
  86. 'address_line_1' => $data['address']['address_line_1'],
  87. 'address_line_2' => $data['address']['address_line_2'] ?? null,
  88. 'country_code' => $data['address']['country_code'] ?? null,
  89. 'state_id' => $data['address']['state_id'] ?? null,
  90. 'city' => $data['address']['city'] ?? null,
  91. 'postal_code' => $data['address']['postal_code'] ?? null,
  92. ]
  93. );
  94. }
  95. return $this;
  96. }
  97. public function bills(): HasMany
  98. {
  99. return $this->hasMany(Bill::class);
  100. }
  101. public function transactions(): MorphMany
  102. {
  103. return $this->morphMany(Transaction::class, 'payeeable');
  104. }
  105. public function currency(): BelongsTo
  106. {
  107. return $this->belongsTo(Currency::class, 'currency_code', 'code');
  108. }
  109. public function address(): MorphOne
  110. {
  111. return $this->morphOne(Address::class, 'addressable');
  112. }
  113. public function contact(): MorphOne
  114. {
  115. return $this->morphOne(Contact::class, 'contactable');
  116. }
  117. }