company; $this->createChartOfAccounts($company); } public function createChartOfAccounts(Company $company): void { $chartOfAccounts = config('chart-of-accounts.default'); foreach ($chartOfAccounts as $type => $subtypes) { foreach ($subtypes as $subtypeName => $subtypeConfig) { $subtype = AccountSubtype::create([ 'company_id' => $company->id, 'multi_currency' => $subtypeConfig['multi_currency'] ?? false, 'category' => AccountType::from($type)->getCategory()->value, 'type' => $type, 'name' => $subtypeName, 'description' => $subtypeConfig['description'] ?? 'No description available.', ]); $this->createDefaultAccounts($company, $subtype, $subtypeConfig); } } $this->linkCategoriesToAccounts($company); } private function createDefaultAccounts(Company $company, AccountSubtype $subtype, array $subtypeConfig): void { if (isset($subtypeConfig['accounts']) && is_array($subtypeConfig['accounts'])) { $baseCode = $subtypeConfig['base_code']; foreach ($subtypeConfig['accounts'] as $accountName => $accountDetails) { Account::create([ 'company_id' => $company->id, 'category' => $subtype->type->getCategory()->value, 'type' => $subtype->type->value, 'subtype_id' => $subtype->id, 'code' => $baseCode++, 'name' => $accountName, 'description' => $accountDetails['description'] ?? 'No description available.', 'ending_balance' => 0, 'active' => true, 'default' => true, 'currency_code' => CurrencyAccessor::getDefaultCurrency(), 'created_by' => $company->owner->id, 'updated_by' => $company->owner->id, ]); } } } private function linkCategoriesToAccounts(Company $company): void { $categories = config('chart-of-accounts.category_account_map'); foreach ($categories as $categoryName => $accountName) { $category = $company->categories()->where('name', $categoryName)->first(); $account = $company->accounts()->where('name', $accountName)->first(); if ($category && $account) { $category->update(['account_id' => $account->id]); } } } }