Example #1
0
        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);
        }