| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 | <?php
namespace App\Services;
use App\Models\Accounting\Account;
use App\Models\Banking\BankAccount;
use App\Models\Banking\ConnectedBankAccount;
use App\Models\Company;
use App\Repositories\Accounting\AccountSubtypeRepository;
use App\Repositories\Banking\ConnectedBankAccountRepository;
class ConnectedBankAccountService
{
    protected AccountSubtypeRepository $accountSubtypeRepository;
    protected ConnectedBankAccountRepository $connectedBankAccountRepository;
    public function __construct(AccountSubtypeRepository $accountSubtypeRepository, ConnectedBankAccountRepository $connectedBankAccountRepository)
    {
        $this->accountSubtypeRepository = $accountSubtypeRepository;
        $this->connectedBankAccountRepository = $connectedBankAccountRepository;
    }
    public function getOrProcessBankAccountForConnectedBankAccount(Company $company, ConnectedBankAccount $connectedBankAccount, int | string $selectedBankAccountId): BankAccount
    {
        if ($selectedBankAccountId === 'new') {
            return $this->connectedBankAccountRepository->createBankAccountForConnectedBankAccount($company, $connectedBankAccount);
        }
        return $company->bankAccounts()->find($selectedBankAccountId);
    }
    public function getOrProcessAccountForConnectedBankAccount(BankAccount $bankAccount, Company $company, ConnectedBankAccount $connectedBankAccount): Account
    {
        if ($bankAccount->account()->doesntExist()) {
            return $this->processNewAccountForBank($bankAccount, $company, $connectedBankAccount);
        }
        return $bankAccount->account;
    }
    public function processNewAccountForBank(BankAccount $bankAccount, Company $company, ConnectedBankAccount $connectedBankAccount): Account
    {
        $defaultAccountSubtypeName = $bankAccount->type->getDefaultSubtype();
        $accountSubtype = $this->accountSubtypeRepository->findAccountSubtypeByNameOrFail($company, $defaultAccountSubtypeName);
        return $this->connectedBankAccountRepository->createAccountForConnectedBankAccount($company, $connectedBankAccount, $bankAccount, $accountSubtype);
    }
}
 |