/// <summary>
        /// Calculation generic
        /// </summary>
        /// <param name="calculateParams"></param>
        /// <returns></returns>
        public async Task <ICalculateResult> CalculateAsync(ICalculateParams calculateParams)
        {
            //result instance
            var calculateGenericResult = new CalculateGenericResult();
            var genericParams          = calculateParams as CalculateGenericParams;

            var calculateOverdraftParams = new CalculateOverdraftParams()
            {
                DeleteAccumulates = true,
                SaveOverdraft     = false,
                IdentityWorkID    = genericParams.IdentityWorkID,
                InstanceID        = genericParams.InstanceID,
                OverdraftID       = genericParams.OverdraftID.Value,
                ResetCalculation  = false,
            };

            var overdraftCalculationManager = new OverdraftCalculationManager();
            await overdraftCalculationManager.CalculateAsync(calculateOverdraftParams);

            var calculateResult = overdraftCalculationManager.CalculateFormula(genericParams.Formula);

            calculateGenericResult.Result             = calculateResult.Result;
            calculateGenericResult.ResultText         = calculateResult.ResultText;
            calculateGenericResult.CalculateArguments = calculateResult.CalculateArguments;

            return(calculateGenericResult);
        }
Esempio n. 2
0
        public async Task <CalculateResult> CalculateFormula(ICalculateParams calculateParams, string formula)
        {
            Stopwatch stopwatch = new Stopwatch();

            stopwatch.Start();
            //result instance
            var calculateOverdraftDIParams = calculateParams as CalculateOverdraftDIParams;

            //Functions params // Para inyectarle a las formulas los datos necesarios para el calculo (1 sola llamada a BD)
            var dataResponse = await GetDataAsync(
                calculateOverdraftDIParams.InstanceID,
                calculateOverdraftDIParams.IdentityWorkID,
                calculateOverdraftDIParams.UserID);

            //Fill necesary data to calculate
            dataResponse = await FillDataAsync(calculateOverdraftDIParams, dataResponse);

            //Poner en 0 todos los amounts / previous calculation
            dataResponse.Overdraft.OverdraftDetails.ForEach(p =>
            {
                p.Taxed      = 0M;
                p.Exempt     = 0M;
                p.IMSSTaxed  = 0M;
                p.IMSSExempt = 0M;

                if (calculateOverdraftDIParams.ResetCalculation)
                {
                    p.IsAmount1CapturedByUser     = false;
                    p.IsAmount2CapturedByUser     = false;
                    p.IsAmount3CapturedByUser     = false;
                    p.IsAmount4CapturedByUser     = false;
                    p.IsTotalAmountCapturedByUser = false;
                    p.IsValueCapturedByUser       = false;
                    p.Value  = 0M;
                    p.Amount = 0M;
                }
            });

            var calculateOverdraftParams = new CalculateOverdraftParams();

            calculateOverdraftParams.DeleteAccumulates = false;
            calculateOverdraftParams.IdentityWorkID    = calculateOverdraftDIParams.IdentityWorkID;
            calculateOverdraftParams.InstanceID        = calculateOverdraftDIParams.InstanceID;
            calculateOverdraftParams.OverdraftID       = dataResponse.Overdraft.ID;
            calculateOverdraftParams.ResetCalculation  = true;
            calculateOverdraftParams.SaveOverdraft     = false;
            calculateOverdraftParams.UserID            = calculateOverdraftDIParams.UserID;

            FunctionParams functionParams = new FunctionParams();

            functionParams.CalculationBaseResult = dataResponse;
            functionParams.IdentityWorkID        = calculateOverdraftParams.IdentityWorkID;
            functionParams.InstanceID            = calculateOverdraftParams.InstanceID;

            //overdraftDetails - All Perceptions, Deductions and Obligations
            List <AccumulatedEmployee> accumulatedEmployees = dataResponse.AccumulatedEmployees;
            var overdraftCalculationManager = new OverdraftCalculationManager();

            //Initializate data, arguments, and functions
            overdraftCalculationManager.Initializate(functionParams);

            //Perceptions
            (Overdraft overdraft, List <AccumulatedEmployee> employeeAccumulates) = await overdraftCalculationManager.CalculateByConceptAsync(dataResponse, ConceptType.SalaryPayment,
                                                                                                                                              calculateOverdraftParams, null);

            accumulatedEmployees   = employeeAccumulates;
            dataResponse.Overdraft = overdraft;

            //Deductions
            (overdraft, employeeAccumulates) = await overdraftCalculationManager.CalculateByConceptAsync(dataResponse, ConceptType.DeductionPayment,
                                                                                                         calculateOverdraftParams, new ConcurrentBag <AccumulatedEmployee>(accumulatedEmployees));

            accumulatedEmployees   = employeeAccumulates;
            dataResponse.Overdraft = overdraft;

            //Liabilities
            //Liability
            dataResponse.IsLiability         = true;
            (overdraft, employeeAccumulates) = await overdraftCalculationManager.CalculateByConceptAsync(dataResponse, ConceptType.LiabilityPayment,
                                                                                                         calculateOverdraftParams, new ConcurrentBag <AccumulatedEmployee>(accumulatedEmployees));

            dataResponse.Overdraft   = overdraft;
            dataResponse.IsLiability = false;

            //Ajuste al neto
            await overdraftCalculationManager.amountAdjustmentAsync(dataResponse.Overdraft, calculateOverdraftParams, dataResponse);

            var calculareResult = overdraftCalculationManager.CalculateFormula(formula);

            stopwatch.Stop();
            Trace.WriteLine($"Time elapsed in the overdraft di calculation {stopwatch.Elapsed}");

            return(calculareResult);
        }