public async Task <OpenDepositResponseModel> OpenDepositAsync(DepositCreateModel model)
        {
            await _depositCreateModelValidator.ValidateAndThrowAsync(model);

            var regularAccountCreateModel = _mapper.Map <CreateAccountTemplateModel>(model);

            regularAccountCreateModel.AccountActivity = AccountActivity.Passive;
            regularAccountCreateModel.AccountType     = AccountType.Regular;
            var(regularAccount, regularAccountPin)    = await _accountService.GetAccountTemplateAsync(regularAccountCreateModel);

            var depositAccountCreateModel = _mapper.Map <CreateAccountTemplateModel>(model);

            depositAccountCreateModel.AccountActivity = AccountActivity.Passive;
            depositAccountCreateModel.AccountType     = AccountType.Deposit;
            var(depositAccount, depositAccountPin)    = await _accountService.GetAccountTemplateAsync(depositAccountCreateModel);

            var depositContract = _context.Add(_mapper.Map <DepositContract>(model)).Entity;

            depositContract.DepositAccount = depositAccount;
            depositContract.RegularAccount = regularAccount;

            var bankDevelopmentFundAccount =
                await _accountService.GetBankDevelopmentFundAccountForCurrencyAsync(model.CurrencyId);

            var initialTransactions = new[]
            {
                new Transaction
                {
                    ContractNumber        = depositContract.ContractNumber,
                    CurrencyId            = depositContract.CurrencyId,
                    Amount                = depositContract.Amount,
                    CreatedAt             = depositContract.ProgramStartDate,
                    SenderAccountNumber   = BankConstants.CashDeskAccountNumber,
                    ReceiverAccountNumber = regularAccount.AccountNumber
                },
                new Transaction
                {
                    ContractNumber        = depositContract.ContractNumber,
                    CurrencyId            = depositContract.CurrencyId,
                    Amount                = depositContract.Amount,
                    CreatedAt             = depositContract.ProgramStartDate,
                    SenderAccountNumber   = regularAccount.AccountNumber,
                    ReceiverAccountNumber = bankDevelopmentFundAccount.AccountNumber
                }
            };

            _context.Transactions.AddRange(initialTransactions);

            await _context.SaveChangesAsync();

            return(new OpenDepositResponseModel
            {
                RegularAccountPin = regularAccountPin,
                DepositAccountPin = depositAccountPin
            });
        }
예제 #2
0
        public async Task <int> CreateCustomerAsync(CustomerCreateModel model)
        {
            await _customerCreateModelValidator.ValidateAndThrowAsync(model);

            var newCustomer = _mapper.Map <Customer>(model);

            _context.Add(newCustomer);
            await _context.SaveChangesAsync();

            return(newCustomer.Id);
        }
예제 #3
0
        public async Task <CreateLoanResponseModel> CreateLoanAsync(LoanCreateModel model)
        {
            await _loanCreateModelValidator.ValidateAndThrowAsync(model);

            var regularAccountCreateModel = _mapper.Map <CreateAccountTemplateModel>(model);

            regularAccountCreateModel.AccountActivity = AccountActivity.Active;
            regularAccountCreateModel.AccountType     = AccountType.Regular;
            var(regularAccount, regularAccountPin)    = await _accountService.GetAccountTemplateAsync(regularAccountCreateModel);

            var loanPaymentAccountCreateModel = _mapper.Map <CreateAccountTemplateModel>(model);

            loanPaymentAccountCreateModel.AccountActivity  = AccountActivity.Active;
            loanPaymentAccountCreateModel.AccountType      = AccountType.LoanPayment;
            var(loanPaymentAccount, loanPaymentAccountPin) = await _accountService.GetAccountTemplateAsync(loanPaymentAccountCreateModel);

            var loanContract = _context.Add(_mapper.Map <LoanContract>(model)).Entity;

            loanContract.LoanPaymentAccount = loanPaymentAccount;
            loanContract.RegularAccount     = regularAccount;

            var bankDevelopmentFundAccount =
                await _accountService.GetBankDevelopmentFundAccountForCurrencyAsync(model.CurrencyId);

            var loanTransaction = new Transaction
            {
                ContractNumber        = loanContract.ContractNumber,
                CurrencyId            = loanContract.CurrencyId,
                Amount                = loanContract.Amount,
                CreatedAt             = loanContract.ProgramStartDate,
                SenderAccountNumber   = bankDevelopmentFundAccount.AccountNumber,
                ReceiverAccountNumber = regularAccount.AccountNumber
            };

            _context.Transactions.Add(loanTransaction);

            await _context.SaveChangesAsync();

            return(new CreateLoanResponseModel
            {
                RegularAccountPin = regularAccountPin,
                LoanPaymentAccountPin = loanPaymentAccountPin
            });
        }