選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

CompanyDefaultService.php 5.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. <?php
  2. namespace App\Services;
  3. use App\Enums\CategoryType;
  4. use App\Models\Setting\{Appearance, Category, CompanyDefault, Currency, Discount, DocumentDefault, Tax};
  5. use App\Models\{Company, User};
  6. use Illuminate\Support\Facades\DB;
  7. class CompanyDefaultService
  8. {
  9. public function createCompanyDefaults(Company $company, User $user, string $currencyCode): void
  10. {
  11. DB::transaction(function () use ($company, $user, $currencyCode) {
  12. $categories = $this->createCategories($company, $user);
  13. $currency = $this->createCurrency($company, $user, $currencyCode);
  14. $salesTax = $this->createSalesTax($company, $user);
  15. $purchaseTax = $this->createPurchaseTax($company, $user);
  16. $salesDiscount = $this->createSalesDiscount($company, $user);
  17. $purchaseDiscount = $this->createPurchaseDiscount($company, $user);
  18. $this->createAppearance($company, $user);
  19. $this->createDocumentDefaults($company, $user);
  20. $companyDefaults = [
  21. 'company_id' => $company->id,
  22. 'income_category_id' => $categories['income_category_id'],
  23. 'expense_category_id' => $categories['expense_category_id'],
  24. 'currency_code' => $currency->code,
  25. 'sales_tax_id' => $salesTax->id,
  26. 'purchase_tax_id' => $purchaseTax->id,
  27. 'sales_discount_id' => $salesDiscount->id,
  28. 'purchase_discount_id' => $purchaseDiscount->id,
  29. 'created_by' => $user->id,
  30. 'updated_by' => $user->id,
  31. ];
  32. CompanyDefault::firstOrCreate(['company_id' => $company->id], $companyDefaults);
  33. }, 5);
  34. }
  35. private function createCategories(Company $company, User $user): array
  36. {
  37. $incomeCategories = ['Salary', 'Bonus', 'Interest', 'Dividends', 'Rentals'];
  38. $expenseCategories = ['Rent', 'Utilities', 'Food', 'Transportation', 'Entertainment'];
  39. $shuffledCategories = [
  40. ...array_map(static fn ($name) => ['name' => $name, 'type' => CategoryType::Income->value], $incomeCategories),
  41. ...array_map(static fn ($name) => ['name' => $name, 'type' => CategoryType::Expense->value], $expenseCategories),
  42. ];
  43. shuffle($shuffledCategories);
  44. $incomeEnabled = $expenseEnabled = false;
  45. $enabledIncomeCategoryId = null;
  46. $enabledExpenseCategoryId = null;
  47. foreach ($shuffledCategories as $category) {
  48. $enabled = false;
  49. if (! $incomeEnabled && $category['type'] === CategoryType::Income->value) {
  50. $enabled = $incomeEnabled = true;
  51. } elseif (! $expenseEnabled && $category['type'] === CategoryType::Expense->value) {
  52. $enabled = $expenseEnabled = true;
  53. }
  54. $categoryModel = Category::factory()->create([
  55. 'company_id' => $company->id,
  56. 'name' => $category['name'],
  57. 'type' => $category['type'],
  58. 'enabled' => $enabled,
  59. 'created_by' => $user->id,
  60. 'updated_by' => $user->id,
  61. ]);
  62. if ($enabled && $category['type'] === CategoryType::Income->value) {
  63. $enabledIncomeCategoryId = $categoryModel->id;
  64. } elseif ($enabled && $category['type'] === CategoryType::Expense->value) {
  65. $enabledExpenseCategoryId = $categoryModel->id;
  66. }
  67. }
  68. return [
  69. 'income_category_id' => $enabledIncomeCategoryId,
  70. 'expense_category_id' => $enabledExpenseCategoryId,
  71. ];
  72. }
  73. private function createCurrency(Company $company, User $user, string $currencyCode)
  74. {
  75. return Currency::factory()->forCurrency($currencyCode)->create([
  76. 'company_id' => $company->id,
  77. 'created_by' => $user->id,
  78. 'updated_by' => $user->id,
  79. ]);
  80. }
  81. private function createSalesTax(Company $company, User $user)
  82. {
  83. return Tax::factory()->salesTax()->create([
  84. 'company_id' => $company->id,
  85. 'created_by' => $user->id,
  86. 'updated_by' => $user->id,
  87. ]);
  88. }
  89. private function createPurchaseTax(Company $company, User $user)
  90. {
  91. return Tax::factory()->purchaseTax()->create([
  92. 'company_id' => $company->id,
  93. 'created_by' => $user->id,
  94. 'updated_by' => $user->id,
  95. ]);
  96. }
  97. private function createSalesDiscount(Company $company, User $user)
  98. {
  99. return Discount::factory()->salesDiscount()->create([
  100. 'company_id' => $company->id,
  101. 'created_by' => $user->id,
  102. 'updated_by' => $user->id,
  103. ]);
  104. }
  105. private function createPurchaseDiscount(Company $company, User $user)
  106. {
  107. return Discount::factory()->purchaseDiscount()->create([
  108. 'company_id' => $company->id,
  109. 'created_by' => $user->id,
  110. 'updated_by' => $user->id,
  111. ]);
  112. }
  113. private function createAppearance(Company $company, User $user): void
  114. {
  115. Appearance::factory()->create([
  116. 'company_id' => $company->id,
  117. 'created_by' => $user->id,
  118. 'updated_by' => $user->id,
  119. ]);
  120. }
  121. private function createDocumentDefaults(Company $company, User $user): void
  122. {
  123. DocumentDefault::factory()->invoice()->create([
  124. 'company_id' => $company->id,
  125. 'created_by' => $user->id,
  126. 'updated_by' => $user->id,
  127. ]);
  128. DocumentDefault::factory()->bill()->create([
  129. 'company_id' => $company->id,
  130. 'created_by' => $user->id,
  131. 'updated_by' => $user->id,
  132. ]);
  133. }
  134. }