public virtual async Task <TblInvoices> ApplyInvoiceTaxesAsync(TblInvoices invoice) { var invoiceTotalAmount = invoice.ComputeInvoiceTotalAmount(false, false); invoice.TotalTaxAmount = 0; invoice.TaxDescription = ""; if (invoiceTotalAmount > 0) { foreach (var tax in (await _taxesService.GetAsEnumerableAsync()).Where(p => p.IsActive && p.Amount > 0)) { invoice.TotalTaxAmount += (invoiceTotalAmount * tax.Amount) / 100; invoice.TaxDescription += $"{tax.GetLocalized(p => p.TaxName)} (%{tax.Amount}) + "; } } invoice.TaxDescription = invoice.TaxDescription.TrimEnd(" + "); var taxProcessors = _pluginFinder.GetPlugins <ITaxProcessor>(); foreach (var taxProcessor in taxProcessors.OrderBy(p => p.Order)) { var result = taxProcessor.ProcessorInvoice(invoice); if (result.Apply) { invoice.TotalTaxAmount += result.TaxAmountInMainCurrency; invoice.TaxDescription += result.TaxDescription + " + "; } } invoice.TaxDescription = invoice.TaxDescription.TrimEnd(" + "); await SetTaxAsync(invoice.Id, invoice.TotalTaxAmount, invoice.TaxDescription); return(invoice); }