您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

CompanyDefaultService.php 5.8KB

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