private async Task <List <SupplierBacs> > BuildSupplierPayments(IEnumerable <InvoiceTransaction> invoiceTransactions) { var results = new List <SupplierBacs>(); var transactionsByCandidateAndInvoiceId = invoiceTransactions.GroupBy(transaction => new { transaction.InvoiceId, transaction.SupplierId }); foreach (var transactionGroup in transactionsByCandidateAndInvoiceId) { var candidate = _candidateRepository.GetCandidateData(); candidate.TryGetValue(transactionGroup.Key.SupplierId, out Candidate matchingCandidate); if (matchingCandidate == null) { throw new InvalidOperationException( $"Could not load candidate with Id {transactionGroup.Key.SupplierId}"); } var bank = matchingCandidate?.BankDetails; var result = new SupplierBacs { PaymentAmount = transactionGroup.Sum(invoiceTransaction => invoiceTransaction.Gross), InvoiceReference = string.IsNullOrEmpty(transactionGroup.First().InvoiceRef) ? NotAvailable : transactionGroup.First().InvoiceRef, PaymentReference = $"SONOVATE{transactionGroup.First().InvoiceDate.GetValueOrDefault():ddMMyyyy}", AccountName = bank?.AccountName, AccountNumber = bank?.AccountNumber, SortCode = bank?.SortCode }; results.Add(result); } return(results); }
private List <SupplierBacs> BuildSupplierPayments(IEnumerable <InvoiceTransaction> invoiceTransactions) { var results = new List <SupplierBacs>(); var transactionsByCandidateAndInvoiceId = invoiceTransactions.GroupBy(transaction => new { transaction.InvoiceId, transaction.SupplierId }); foreach (var transactionGroup in transactionsByCandidateAndInvoiceId) { var candidateRepository = new CandidateRepository(); var candidate = candidateRepository.GetById(transactionGroup.Key.SupplierId); if (candidate == null) { throw new InvalidOperationException(string.Format("Could not load candidate with Id {0}", transactionGroup.Key.SupplierId)); } var result = new SupplierBacs(); var bank = candidate.BankDetails; result.AccountName = bank.AccountName; result.AccountNumber = bank.AccountNumber; result.SortCode = bank.SortCode; result.PaymentAmount = transactionGroup.Sum(invoiceTransaction => invoiceTransaction.Gross); result.InvoiceReference = string.IsNullOrEmpty(transactionGroup.First().InvoiceRef) ? NOT_AVAILABLE : transactionGroup.First().InvoiceRef; result.PaymentReference = string.Format("SONOVATE{0}", transactionGroup.First().InvoiceDate.GetValueOrDefault().ToString("ddMMyyyy")); results.Add(result); } return(results); }
private List <ISupplierBacs> BuildSupplierPayments(IEnumerable <IInvoiceTransaction> invoiceTransactions) { var results = new List <ISupplierBacs>(); var transactionsByCandidateAndInvoiceId = invoiceTransactions.GroupBy(transaction => new { transaction.InvoiceId, transaction.SupplierId }); foreach (var transactionGroup in transactionsByCandidateAndInvoiceId) { var candidateRepository = new CandidateRepository(); var candidate = candidateRepository.GetById(transactionGroup.Key.SupplierId); if (candidate == null) { throw new InvalidOperationException(string.Format(LOAD_CANDIDATE_ERROR, transactionGroup.Key.SupplierId)); } var result = new SupplierBacs(); var bank = candidate.BankDetails; result.BankDetails.AccountName = bank.AccountName; result.BankDetails.AccountNumber = bank.AccountNumber; result.BankDetails.SortCode = bank.SortCode; result.PaymentAmount = transactionGroup.Sum(invoiceTransaction => invoiceTransaction.Gross); result.InvoiceReference = string.IsNullOrEmpty(transactionGroup.First().InvoiceReference) ? NOT_AVAILABLE : transactionGroup.First().InvoiceReference; result.PaymentReference = string.Format(BACS_RESULT_REFERENCE_FORMAT, transactionGroup.First().InvoiceDate.GetValueOrDefault().ToString(BACS_RESULT_REFERENCE_DATE_FORMAT)); results.Add(result); } return(results); }