Пример #1
0
        private bool EvaluateExpression(String expression, out decimal result)
        {
            if (expression.Length <= 0)
            {
                result = 0;
                return(false);
            }
            bool success = true;

            NCalc.Expression.CacheEnabled = false;
            NCalc.Expression ex = new NCalc.Expression(expression);
            if (ex.HasErrors())
            {
                success = false;
                result  = 0;
                return(success);
            }
            try
            {
                result = Decimal.Parse(ex.Evaluate().ToString());
                //result = Decimal.Parse(ex.Evaluate());
            }
            catch (Exception e)
            {
                result  = 0;
                success = false;
            }
            return(success);
        }
Пример #2
0
 private object CalculateExpression(string s)
 {
     if (string.IsNullOrWhiteSpace(s))
     {
         return(s);
     }
     NCalc.Expression exp = new NCalc.Expression(s);
     PopulateVariables(exp);
     if (exp.HasErrors())
     {
         return(s);
     }
     else
     {
         try
         {
             return(exp.Evaluate());
         }
         catch (Exception ex)
         {
             _logger.Error(ex, "Calculating expression failde");
             return(s);
         }
     }
 }
Пример #3
0
        public void Evaluate(string expression)
        {
            if (expression != null && expression.Length >= 0)
            {
                NCalc.Expression exp  = new NCalc.Expression(expression);
                object           eval = null;
                try
                {
                    eval = exp.Evaluate();
                }
                catch (ArgumentException)
                {
                    this.AddList("Error in the expression.");
                    return;
                }
                catch (EvaluateException e)
                {
                    this.AddList("Error while evaluating expression, Error Message" + e.Message);
                    return;
                }

                if (exp.HasErrors())
                {
                    this.AddList("Error while evaluating expression, Error Message" + exp.Error);
                }
                else
                {
                    this.AddList(expression, eval);
                }
            }
        }
Пример #4
0
        /// <inheritdoc />
        public string Eval(Evaluator evaluator)
        {
            var expression = new NCalc.Expression(NestedExpression.Eval(evaluator));

            if (expression.HasErrors())
            {
                return("[ERROR]");
            }
            expression.EvaluateParameter += (name, args) =>
            {
                Delegate func = null;
                try
                {
                    func = evaluator.Context.GetDelegate(name);
                }
                catch
                {
                    throw new InvalidOperationException("Invalid logical operation.");
                }

                if (func.GetMethodInfo().GetParameters().Length == 0)
                {
                    args.HasResult = true;
                    args.Result    = func.DynamicInvoke();
                }
                else
                {
                    throw new InvalidOperationException("Invalid logical operation.");
                }
            };
            return(expression.Evaluate().ToString());
        }
Пример #5
0
 private object CalculateExpression(string s)
 {
     if (string.IsNullOrWhiteSpace(s))
     {
         return(s);
     }
     NCalc.Expression exp = new NCalc.Expression(s);
     exp.EvaluateParameter += Exp_EvaluateParameter;
     PopulateVariables(exp);
     if (exp.HasErrors())
     {
         return(s);
     }
     else
     {
         try
         {
             return(exp.Evaluate());
         }
         catch (Exception ex)
         {
             /*if (_loggedExceptions.Where(x=>x.HResult == ex.HResult && x.Message == ex.Message).Count() == 0)
              * {
              *  _logger.Error(ex, "Calculating expression failde");
              *  _loggedExceptions.Enqueue(ex);
              *  if (_loggedExceptions.Count > 10)
              *      _loggedExceptions.Dequeue();
              * }*/
             return(s);
         }
     }
 }
Пример #6
0
        static void Main(string[] args)
        {
            int m = 1000000;  // <------------ Number of calculations done. Change for different results

            Stopwatch stopWatch = new Stopwatch();
            var ran = new Random();
            string se = "if(A>=17 && A<= 360, Pow(10,(1.016 * Log10( A ) - 1.71)), if(A<=17, 0.11, 7.7))";
            //se = "if(A>=17, Min(Pow(10,(1.016 * Log10( A ) - 1.71)), 7.7), 0.11)"; // Alternate arrangement
            NCalc.Expression e = new NCalc.Expression(se);
            Console.WriteLine("Using equation for Cadmium (accute): " + se);
            Console.WriteLine("# of loops: " + m);
            if (e.HasErrors())
            {
                Console.WriteLine("Errors detected!");
                Console.ReadLine();
                return;
            }
            double total = 0;

            stopWatch.Start();
            for (int i = 0; i < m; i++)
            {

                e.Parameters["A"] = ran.Next(500);
                var x = e.Evaluate();
                total += (double)x;
                //Console.WriteLine("A="+ e.Parameters["A"] + "; E = " + x);     // Uncomment to see results from equation NOTE: lower the number of loops
            }
            stopWatch.Stop();
            TimeSpan ts = stopWatch.Elapsed;
            Console.WriteLine("DONE!");
            Console.WriteLine("Average output: " + total / m);
            string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10);
            Console.WriteLine("RunTime " + elapsedTime);
            Console.WriteLine("Now executing same equation, iterating parameters inline...");

            int[] r = new int[m];
            for (int i = 0; i < m; i++)
            {
                r[i] = ran.Next(500);
            }
            stopWatch.Restart();
            e = new NCalc.Expression(se, NCalc.EvaluateOptions.IterateParameters);
            e.Parameters["A"] = r;
            var y = (IList)e.Evaluate();
            stopWatch.Stop();
            total = 0;
            foreach (double i in y) { total += i; }
            ts = stopWatch.Elapsed;
            Console.WriteLine("DONE!");
            Console.WriteLine("Average output: " + total / m);
            elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10);
            Console.WriteLine("RunTime " + elapsedTime);

            Console.ReadLine();
        }
Пример #7
0
 private static string ProcessStandardCalCommand(string message)
 {
     try
     {
         var expression = new NCalc.Expression(message, NCalc.EvaluateOptions.IgnoreCase);
         if (!expression.HasErrors())
         {
             return(Convert.ToString(expression.Evaluate()));
         }
     }
     catch (Exception) { }
     return(null);
 }
Пример #8
0
            public async Task Calculate([Remainder] string expression)
            {
                var expr = new NCalc.Expression(expression, NCalc.EvaluateOptions.IgnoreCase | NCalc.EvaluateOptions.NoCache);

                expr.EvaluateParameter += Expr_EvaluateParameter;
                var result = expr.Evaluate();

                if (!expr.HasErrors())
                {
                    await Context.Channel.SendConfirmAsync("⚙ " + GetText("result"), result.ToString()).ConfigureAwait(false);
                }
                else
                {
                    await Context.Channel.SendErrorAsync("⚙ " + GetText("error"), expr.Error).ConfigureAwait(false);
                }
            }
Пример #9
0
        //Set the function to maximize/minimize
        public static bool setFunctionToOperate(string functionAsText)
        {
            bool canEvaluate = false;

            _exp = new NCalc.Expression(functionAsText);
            NCalc.Expression _expTest = new NCalc.Expression(functionAsText);
            _expTest.Parameters["x"] = 1;
            try {
                _expTest.Evaluate();
                canEvaluate = true;
            } catch {
                canEvaluate = false;
            }

            return(!_exp.HasErrors() && !_expTest.HasErrors() && canEvaluate);
        }
Пример #10
0
        private void Validate()
        {
            if (!Expression.IsEmpty())
            {
                var expression = new NCalc.Expression(ExpressionHelper.Encode(Expression));

                if (expression.HasErrors())
                {
                    ShowError(expression.Error);
                }
                else
                {
                    var matches = _securityRegex.Matches(expression.ParsedExpression.ToString());

                    var securities = matches
                                     .Cast <Match>()
                                     .Select(m => m.Groups[1].ToString())
                                     .Select(m => new
                    {
                        Code     = m,
                        Security = TryGetSecurity(m)
                    })
                                     .ToArray();

                    var item = securities.FirstOrDefault(m => m.Security == null);

                    ShowError(item != null
                                                ? LocalizedStrings.Str1522Params.Put(item.Code)
                                                : Validate(securities.Select(s => s.Security)));
                }
            }
            else
            {
                ShowError(null);
            }
        }
Пример #11
0
        public void doAnalyza(DateTime tuNgay, DateTime denNgay, string empID, string depID, int group1ID, bool chkLamTron)
        {
            TinhLuong   logic = new TinhLuong();
            dsTinhLuong ds    = new dsTinhLuong();

            try
            {
                //reg progress...
                lp.SetTitle("Đang lấy dữ liệu..");
                lp.OutMessage("Lấy dữ liệu ----------------------------------------------------------------------------------");

                #region get data
                ds = new dsTinhLuong();
                DateTime cMonth = new DateTime(tuNgay.Year, tuNgay.Month, 1);

                Provider.LoadData(ds, ds.tbCaLam_TinhTangCa.TableName);
                lp.OutMessage("Ca làm việc (tính tăng ca): " + ds.tbCaLam_TinhTangCa.Rows.Count);
                Provider.LoadData(ds, ds.tblRef_Allowance.TableName);
                lp.OutMessage("Phụ cấp Allowance: " + ds.tblRef_Allowance.Rows.Count);
                Provider.LoadData(ds, ds.tblEmpAllowanceFix.TableName);
                lp.OutMessage("Phụ cấp hàng tháng: " + ds.tblEmpAllowanceFix.Rows.Count);

                Provider.LoadDataByProc(ds, ds.tblEmpSalary.TableName, "p_tinhLuong_GetLuongCoBan", new SqlParameter("tuNgay", tuNgay), new SqlParameter("denNgay", denNgay));
                lp.OutMessage("Lương cơ bản: " + ds.tblEmpSalary.Rows.Count);
                //tuNgay.AddDays(-1) Sinh ngày 17 là k đc nhận thưởng con thơ nữa.
                Provider.LoadDataByProc(ds, ds.tblEmpChild.TableName, "p_tinhLuong_GetChilds", new SqlParameter("tuNgay", tuNgay), new SqlParameter("denNgay", denNgay));
                lp.OutMessage("Con thơ: " + ds.tblEmpChild.Rows.Count);
                Provider.LoadDataByProc(ds, ds.tbDangKyVangMat.TableName, "p_duLieuQuetThe_GetAllDangKyVangMat_CoThe", new SqlParameter("tuNgay", tuNgay), new SqlParameter("denNgay", denNgay));
                lp.OutMessage("Đăng ký vắng mặt: " + ds.tbDangKyVangMat.Rows.Count);
                Provider.LoadData(ds, ds.tbBangLuongCalc.TableName);
                lp.OutMessage("Công thức tính lương: " + ds.tbBangLuongCalc.Rows.Count);
                if (!string.IsNullOrWhiteSpace(empID))
                {
                    Provider.LoadDataByProc(ds, ds.tbThamSoTinhLuong.TableName, "p_tinhLuong_GetThamSoTinhLuong_WithEmp", new SqlParameter("thang", cMonth), new SqlParameter("empID", empID));
                    Provider.LoadDataByProc(ds, ds.p_tinhLuong_GetAllKetQuaQuetThe.TableName, "p_tinhLuong_GetAllKetQuaQuetThe_WithEmp", new SqlParameter("tuNgay", tuNgay), new SqlParameter("denNgay", denNgay), new SqlParameter("empID", empID));
                    Provider.LoadDataByProc(ds, ds.tblEmpAllowanceFix.TableName, "p_tinhLuong_GetPCCD_WithEmp", new SqlParameter("empID", empID));

                    lp.OutMessage(">>> " + Lng.Luong_AnalyzeData.resetBL + " (" + empID + ") " + logic.ResetBangLuong_1dong_withEmp(cMonth, empID));
                }
                else if (!string.IsNullOrWhiteSpace(depID))
                {
                    Provider.LoadDataByProc(ds, ds.tbThamSoTinhLuong.TableName, "p_tinhLuong_GetThamSoTinhLuong_WithDept", new SqlParameter("thang", cMonth), new SqlParameter("maTapThe", depID));
                    Provider.LoadDataByProc(ds, ds.p_tinhLuong_GetAllKetQuaQuetThe.TableName, "p_tinhLuong_GetAllKetQuaQuetThe_WithDept", new SqlParameter("tuNgay", tuNgay), new SqlParameter("denNgay", denNgay), new SqlParameter("maTapThe", depID));
                    Provider.LoadDataByProc(ds, ds.tblEmpAllowanceFix.TableName, "p_tinhLuong_GetPCCD_WithDept", new SqlParameter("maTapThe", depID));

                    lp.OutMessage(">>> " + Lng.Luong_AnalyzeData.resetBL + " (" + depID + ") " + logic.ResetBangLuong_1dong_withDep(cMonth, depID));
                }
                else if (group1ID > 0)
                {
                    Provider.LoadDataByProc(ds, ds.tbThamSoTinhLuong.TableName, "p_tinhLuong_GetThamSoTinhLuong_WithGroup1", new SqlParameter("thang", cMonth), new SqlParameter("group1ID", group1ID));
                    Provider.LoadDataByProc(ds, ds.p_tinhLuong_GetAllKetQuaQuetThe.TableName, "p_tinhLuong_GetAllKetQuaQuetThe_WithGroup1", new SqlParameter("tuNgay", tuNgay), new SqlParameter("denNgay", denNgay), new SqlParameter("group1ID", group1ID));
                    Provider.LoadDataByProc(ds, ds.tblEmpAllowanceFix.TableName, "p_tinhLuong_GetPCCD_WithGroup1", new SqlParameter("group1ID", group1ID));

                    lp.OutMessage(">>> " + Lng.Luong_AnalyzeData.resetBL + " (Group1: " + group1ID + ") " + logic.ResetBangLuong_1dong_withGroup1(cMonth, group1ID));
                }
                else
                {
                    Provider.LoadDataByProc(ds, ds.tbThamSoTinhLuong.TableName, "p_tinhLuong_GetThamSoTinhLuong", new SqlParameter("thang", cMonth));
                    Provider.LoadDataByProc(ds, ds.p_tinhLuong_GetAllKetQuaQuetThe.TableName, "p_tinhLuong_GetAllKetQuaQuetThe", new SqlParameter("tuNgay", tuNgay), new SqlParameter("denNgay", denNgay));
                    Provider.LoadDataByProc(ds, ds.tblEmpAllowanceFix.TableName, "p_tinhLuong_GetPCCD");

                    lp.OutMessage(Lng.Luong_AnalyzeData.resetBL + logic.ResetBangLuong_1dong(cMonth));
                }

                lp.OutMessage("Tham số tính lương: " + ds.tbThamSoTinhLuong.Rows.Count);
                lp.OutMessage(Lng.Luong_AnalyzeData.ketquaCC + ds.p_tinhLuong_GetAllKetQuaQuetThe.Rows.Count);
                lp.OutMessage("Phụ cấp cố định: " + ds.tblEmpAllowanceFix.Rows.Count);
                #endregion

                var lstEmp = ds.p_tinhLuong_GetAllKetQuaQuetThe.Select(i => i.EmployeeID).Distinct();
                lp.MaxValue     = lstEmp.Count();
                lp.CurrentValue = 0;
                foreach (string eID in lstEmp)
                {
                    try
                    {
                        var kqs = ds.p_tinhLuong_GetAllKetQuaQuetThe.Where(i => i.EmployeeID == eID).ToList();

                        var r  = ds.tbBangLuongThang_1dong.NewtbBangLuongThang_1dongRow(); r.id = Guid.NewGuid();
                        var e1 = kqs[0];
                        #region tính lương

                        TinhLuongHelper_1dong hp = new TinhLuongHelper_1dong(ds, tuNgay, denNgay, e1.EmployeeID);

                        r.thang     = cMonth;
                        r.empoyeeID = eID;

                        if (hp.luongMoi == null && hp.luongCu == null)
                        {
                            hp.luongMoi = ds.tblEmpSalary.Where(i => i.EmployeeID == e1.EmployeeID).OrderByDescending(i => i.DateChange).FirstOrDefault();
                        }
                        r.luongCB_Moi = hp.luongMoi == null ? (e1["BasicSalary"] == DBNull.Value ? 0 : e1.BasicSalary) : hp.luongMoi.BasicSalary;
                        r.luongPC_Moi = hp.luongMoi == null ? (e1["RegularAllowance"] == DBNull.Value ? 0 : e1.RegularAllowance) : hp.luongMoi.BasicSalary_Ins;

                        r.luongCB_Cu = (hp.luongCu == null) ? 0 : hp.luongCu.BasicSalary;
                        r.luongPC_Cu = (hp.luongCu == null) ? 0 : hp.luongCu.BasicSalary_Ins;
                        // Gán 0 cho ngày công:
                        r.ngayCong_bt_Cu        = r.ngayCong_Dem_Cu = r.ngayCong_ChoViec_Cu = r.ngayCong_phep_Cu = r.ngayCong_phepNam_Cu = r.ngayCong_lt_Cu = r.ngayCong_cn_Cu = r.tongNgayCong_Cu = 0;
                        r.ngayCong_bt_Moi       = r.ngayCong_Dem_Moi = r.ngayCong_ChoViec_Moi = r.ngayCong_phep_Moi = r.ngayCong_phepNam_Moi = r.ngayCong_lt_Moi = r.ngayCong_cn_Moi = r.tongNgayCong_Moi = 0;
                        r.tongNgayCong_bt_Total = r.tongNgayCong_Dem_Total = r.tongNgayCong_ChoViec_Total = r.tongNgayCong_phep_Total = r.tongNgayCong_phepNam_Total = r.tongNgayCong_lt_Total = r.tongNgayCong_cn_Total = r.tongNgayCong_Total = 0;
                        r.tienNC_bt_Cu          = r.tienNC_Dem_Cu = r.tienNC_ChoViec_Cu = r.tienNC_phep_Cu = r.tienNC_phepNam_Cu = r.tienNC_lt_Cu = r.tienNC_cn_Cu = r.tongTienNgayCong_Cu = 0;
                        r.tienNC_bt_Moi         = r.tienNC_Dem_Moi = r.tienNC_ChoViec_Moi = r.tienNC_phep_Moi = r.tienNC_phepNam_Moi = r.tienNC_lt_Moi = r.tienNC_cn_Moi = r.tongTienNgayCong_Moi = 0;
                        r.tongTienNC_bt_Total   = r.tongTienNC_Dem_Total = r.tongTienNC_ChoViec_Total = r.tongTienNC_phep_Total = r.tongTienNC_phepNam_Total = r.tongTienNC_lt_Total = r.tongTienNC_cn_Total = r.tongTienNgayCong_Total = 0;
                        // Gán 0 cho giờ tăng ca:
                        r.tgTangCa_bt_Cu        = r.tgTangCa_Dem_Cu = r.tgTangCa_cn_Cu = r.tgTangCa_lt_Cu = r.tongTgTangCa_Cu = 0;
                        r.tgTangCa_bt_Moi       = r.tgTangCa_Dem_Moi = r.tgTangCa_cn_Moi = r.tgTangCa_lt_Moi = r.tongTgTangCa_Moi = 0;
                        r.tongTgTangCa_bt_Total = r.tongTgTangCa_Dem_Total = r.tongTgTangCa_cn_Total = r.tongTgTangCa_lt_Total = r.tongTgTangCa_Total = 0;
                        r.tienTangCa_bt_Cu      = r.tienTangCa_Dem_Cu = r.tienTangCa_cn_Cu = r.tienTangCa_lt_Cu = r.tongTienTangCa_Cu = r.tienTangCa_bt_Moi = r.tienTangCa_Dem_Moi = r.tienTangCa_cn_Moi = r.tienTangCa_lt_Moi = 0;
                        r.tongTienTangCa_Moi    = r.tongTienTangCa_bt_Total = r.tongTienTangCa_Dem_Total = r.tongTienTangCa_cn_Total = r.tongTienTangCa_lt_Total = r.tongTienTangCa_Total = 0;
                        // Gán 0 cho các khoản khác
                        r.tongPhuCapKhac  = r.tongLuong = r.tienBHXH = r.tienBHTN = r.tienBHYT = r.khoanTruKhac = r.tamUngLuong = r.tongKhauTru = r.actualBankTransfer = r.luongSP = r.luongTangCaSP = r.luongSP_tong = r.luongThoiGian = r.tongTgTangCa_cn_gio = r.phiCongDoan = r.tienThuongSL = r.tongLuongTG = r.ConTho = r.PhuCapTrachNhiem = r.LuongThucNhanTinhThue = r.ThueTNCN = 0;
                        r.thuongBuaToi    = r.thuongLamCa = 0;
                        r.SoNguoiPhuThuoc = 0;
                        for (int i = 1; i < 21; i++)
                        {
                            r["Calc" + i] = 0;
                            r["PC" + i]   = 0;
                        }

                        double f;
                        foreach (var kq in kqs)
                        {
                            hp.Set_KQQT(kq);
                            #region tinh ngay cong theo luong moi
                            r.ngayCong_bt_Moi += hp.TinhNgayCong(1);
                            r.tienNC_bt_Moi   += hp.TinhTienNgayCong(1);

                            r.ngayCong_Dem_Moi += hp.TinhNgayCong(1, tinhCaDem: true);

                            var a = hp.TinhTienNgayCong(1, tinhCaDem: true);
                            r.tienNC_Dem_Moi += hp.TinhTienNgayCong(1, tinhCaDem: true);
                            //Phép năm
                            r.ngayCong_phep_Moi += hp.TinhNgayCong(5);
                            r.tienNC_phep_Moi   += hp.TinhTienNgayCong(5);
                            r.tienNC_phep_Moi   += hp.TinhTienNgayCong(5, tinhCaDem: true);
                            // các loại nghỉ khác có hưởng lương.
                            f = hp.TinhNgayCong(2);
                            r.ngayCong_phepNam_Moi += f;
                            r.tienNC_phepNam_Moi   += hp.TinhTienNgayCong(2);
                            r.tienNC_phepNam_Moi   += hp.TinhTienNgayCong(2, tinhCaDem: true);

                            r.ngayCong_lt_Moi += hp.TinhNgayCong(3);
                            r.tienNC_lt_Moi   += hp.TinhTienNgayCong(3);
                            r.tienNC_lt_Moi   += hp.TinhTienNgayCong(3, tinhCaDem: true);
                            // Tính chủ nhật sẽ đc tính vào tăng ca.
                            r.ngayCong_cn_Moi     += hp.TinhNgayCong(4);
                            r.tongTgTangCa_cn_gio += f * kq.soTiengTinhCa;
                            r.tienNC_cn_Moi       += hp.TinhTienNgayCong(4);
                            r.tienNC_cn_Moi       += hp.TinhTienNgayCong(4, tinhCaDem: true);
                            #endregion

                            #region tinh tang ca theo luong moi
                            var f1 = hp.TinhTienTangCa(1);
                            r.tgTangCa_bt_Moi   += hp.TinhGioTangCa(1);
                            r.tienTangCa_bt_Moi += hp.TinhTienTangCa(1);

                            r.tgTangCa_Dem_Moi   += hp.TinhGioTangCa(1, tinhCaDem: true);
                            r.tienTangCa_Dem_Moi += hp.TinhTienTangCa(1, tinhCaDem: true);

                            // Tính chủ nhật sẽ đc tính vào tăng ca.
                            r.tgTangCa_cn_Moi   += hp.TinhNgayCong(4) * kq.soTiengTinhCa;
                            r.tienTangCa_cn_Moi += hp.TinhTienNgayCong(4);
                            r.tienTangCa_cn_Moi += hp.TinhTienNgayCong(4, tinhCaDem: true);

                            r.tgTangCa_lt_Moi   += hp.TinhGioTangCa(3);
                            r.tienTangCa_lt_Moi += hp.TinhTienTangCa(3);
                            r.tienTangCa_lt_Moi += hp.TinhTienTangCa(3, tinhCaDem: true);
                            #endregion

                            if (hp.luongCu != null)
                            {
                                #region tinh ngay cong theo luong cu
                                r.ngayCong_bt_Cu += hp.TinhNgayCong(1, true);
                                r.tienNC_bt_Cu   += hp.TinhTienNgayCong(1, true);

                                r.ngayCong_Dem_Cu += hp.TinhNgayCong(1, true, tinhCaDem: true);
                                r.tienNC_Dem_Cu   += hp.TinhTienNgayCong(1, true, tinhCaDem: true);

                                r.ngayCong_phep_Cu += hp.TinhNgayCong(5, true);
                                r.tienNC_phep_Cu   += hp.TinhTienNgayCong(5, true);
                                r.tienNC_phep_Cu   += hp.TinhTienNgayCong(5, true, tinhCaDem: true);

                                r.ngayCong_phepNam_Cu += hp.TinhNgayCong(2, true);
                                r.tienNC_phepNam_Cu   += hp.TinhTienNgayCong(2, true);
                                r.tienNC_phepNam_Cu   += hp.TinhTienNgayCong(2, true, tinhCaDem: true);

                                r.ngayCong_lt_Cu += hp.TinhNgayCong(3, true);
                                r.tienNC_lt_Cu   += hp.TinhTienNgayCong(3, true);
                                r.tienNC_lt_Cu   += hp.TinhTienNgayCong(3, true, tinhCaDem: true);

                                // Tính chủ nhật sẽ đc tính vào tăng ca.
                                f = hp.TinhNgayCong(4, true);
                                r.ngayCong_cn_Cu      += f;
                                r.tienNC_cn_Cu        += hp.TinhTienNgayCong(4, true);
                                r.tienNC_cn_Cu        += hp.TinhTienNgayCong(4, true, tinhCaDem: true);
                                r.tongTgTangCa_cn_gio += f * kq.soTiengTinhCa;
                                #endregion

                                #region tinh tang ca theo luong cu
                                r.tgTangCa_bt_Cu   += hp.TinhGioTangCa(1, true);
                                r.tienTangCa_bt_Cu += hp.TinhTienTangCa(1, true);

                                r.tgTangCa_Dem_Cu   += hp.TinhGioTangCa(1, true, tinhCaDem: true);
                                r.tienTangCa_Dem_Cu += hp.TinhTienTangCa(1, true, tinhCaDem: true);

                                // Tính chủ nhật sẽ đc tính vào tăng ca.
                                r.tgTangCa_cn_Cu   += hp.TinhNgayCong(4, true) * kq.soTiengTinhCa;
                                r.tienTangCa_cn_Cu += hp.TinhTienNgayCong(4, true);
                                r.tienTangCa_cn_Cu += hp.TinhTienNgayCong(4, true, tinhCaDem: true);

                                r.tgTangCa_lt_Cu   += hp.TinhGioTangCa(3, true);
                                r.tienTangCa_lt_Cu += hp.TinhTienTangCa(3, true, tinhCaDem: true);
                                #endregion
                            }
                        }
                        #endregion

                        #region rounded money
                        r.tienNC_bt_Moi      = Math.Round(r.tienNC_bt_Moi, 0);
                        r.tienNC_phep_Moi    = Math.Round(r.tienNC_phep_Moi, 0);
                        r.tienNC_phepNam_Moi = Math.Round(r.tienNC_phepNam_Moi, 0);
                        r.tienNC_lt_Moi      = Math.Round(r.tienNC_lt_Moi, 0);
                        r.tienNC_cn_Moi      = Math.Round(r.tienNC_cn_Moi, 0);

                        r.tienTangCa_bt_Moi = Math.Round(r.tienTangCa_bt_Moi, 0);
                        r.tienTangCa_cn_Moi = Math.Round(r.tienTangCa_cn_Moi, 0);
                        r.tienTangCa_lt_Moi = Math.Round(r.tienTangCa_lt_Moi, 0);


                        r.tienNC_bt_Cu      = Math.Round(r.tienNC_bt_Cu, 0);
                        r.tienNC_phep_Cu    = Math.Round(r.tienNC_phep_Cu, 0);
                        r.tienNC_phepNam_Cu = Math.Round(r.tienNC_phepNam_Cu, 0);
                        r.tienNC_lt_Cu      = Math.Round(r.tienNC_lt_Cu, 0);
                        r.tienNC_cn_Cu      = Math.Round(r.tienNC_cn_Cu, 0);

                        r.tienTangCa_bt_Cu = Math.Round(r.tienTangCa_bt_Cu, 0);
                        r.tienTangCa_cn_Cu = Math.Round(r.tienTangCa_cn_Cu, 0);
                        r.tienTangCa_lt_Cu = Math.Round(r.tienTangCa_lt_Cu, 0);
                        #endregion

                        #region tinh tong
                        // Ngày công:
                        // ---------- Công----------
                        r.tongNgayCong_Moi = r.ngayCong_bt_Moi + r.ngayCong_ChoViec_Moi + r.ngayCong_phep_Moi + r.ngayCong_phepNam_Moi + r.ngayCong_lt_Moi + r.ngayCong_Dem_Moi;
                        r.tongNgayCong_Cu  = r.ngayCong_bt_Cu + r.ngayCong_ChoViec_Cu + r.ngayCong_phep_Cu + r.ngayCong_phepNam_Cu + r.ngayCong_lt_Cu + r.ngayCong_Dem_Cu;

                        r.tongNgayCong_bt_Total      = r.ngayCong_bt_Moi + r.ngayCong_bt_Cu;
                        r.tongNgayCong_Dem_Total     = r.ngayCong_Dem_Moi + r.ngayCong_Dem_Cu;
                        r.tongNgayCong_phep_Total    = r.ngayCong_phep_Moi + r.ngayCong_phep_Cu;
                        r.tongNgayCong_phepNam_Total = r.ngayCong_phepNam_Moi + r.ngayCong_phepNam_Cu;
                        r.tongNgayCong_ChoViec_Total = r.ngayCong_ChoViec_Moi + r.ngayCong_ChoViec_Cu;
                        r.tongNgayCong_lt_Total      = r.ngayCong_lt_Moi + r.ngayCong_lt_Cu;

                        r.tongNgayCong_Total = r.tongNgayCong_Moi + r.tongNgayCong_Cu;
                        // ------------Lương ngày công-------
                        r.tongTienNgayCong_Moi = r.tienNC_bt_Moi + r.tienNC_ChoViec_Moi + r.tienNC_phep_Moi + r.tienNC_phepNam_Moi + r.tienNC_lt_Moi + r.tienNC_Dem_Moi;
                        r.tongTienNgayCong_Cu  = r.tienNC_bt_Cu + r.tienNC_ChoViec_Cu + r.tienNC_phep_Cu + r.tienNC_phepNam_Cu + r.tienNC_lt_Cu + r.tienNC_Dem_Cu;

                        r.tongTienNC_bt_Total      = r.tienNC_bt_Moi + r.tienNC_bt_Cu;
                        r.tongTienNC_Dem_Total     = r.tienNC_Dem_Moi + r.tienNC_Dem_Cu;
                        r.tongTienNC_phep_Total    = r.tienNC_phep_Moi + r.tienNC_phep_Cu;
                        r.tongTienNC_phepNam_Total = r.tienNC_phepNam_Moi + r.tienNC_phepNam_Cu;
                        r.tongTienNC_ChoViec_Total = r.tienNC_ChoViec_Moi + r.tienNC_ChoViec_Cu;
                        r.tongTienNC_lt_Total      = r.tienNC_lt_Moi + r.tienNC_lt_Cu;

                        r.tongTienNgayCong_Total = r.tongTienNgayCong_Moi + r.tongTienNgayCong_Cu;
                        // Tăng ca:
                        //-------------Thời gian tăng ca--------------
                        r.tongTgTangCa_Moi = r.tgTangCa_bt_Moi + r.tgTangCa_Dem_Moi + r.tgTangCa_cn_Moi + r.tgTangCa_lt_Moi;
                        r.tongTgTangCa_Cu  = r.tgTangCa_bt_Cu + r.tgTangCa_Dem_Cu + r.tgTangCa_cn_Cu + r.tgTangCa_lt_Cu;

                        r.tongTgTangCa_bt_Total  = r.tgTangCa_bt_Moi + r.tgTangCa_bt_Cu;
                        r.tongTgTangCa_Dem_Total = r.tgTangCa_Dem_Moi + r.tgTangCa_Dem_Cu;
                        r.tongTgTangCa_cn_Total  = r.tgTangCa_cn_Moi + r.tgTangCa_cn_Cu;
                        r.tongTgTangCa_lt_Total  = r.tgTangCa_lt_Moi + r.tgTangCa_lt_Cu;

                        r.tongTgTangCa_Total = r.tongTgTangCa_Moi + r.tongTgTangCa_Cu;
                        //-------------Lương tăng ca--------------
                        r.tongTienTangCa_Moi = r.tienTangCa_bt_Moi + r.tienTangCa_Dem_Moi + r.tienTangCa_cn_Moi + r.tienTangCa_lt_Moi;
                        r.tongTienTangCa_Cu  = r.tienTangCa_bt_Cu + r.tienTangCa_Dem_Cu + r.tienTangCa_cn_Cu + r.tienTangCa_lt_Cu;

                        r.tongTienTangCa_bt_Total  = r.tienTangCa_bt_Moi + r.tienTangCa_bt_Cu;
                        r.tongTienTangCa_Dem_Total = r.tienTangCa_Dem_Moi + r.tienTangCa_Dem_Cu;
                        r.tongTienTangCa_cn_Total  = r.tienTangCa_cn_Moi + r.tienTangCa_cn_Cu;
                        r.tongTienTangCa_lt_Total  = r.tienTangCa_lt_Moi + r.tienTangCa_lt_Cu;

                        r.tongTienTangCa_Total = r.tongTienTangCa_Moi + r.tongTienTangCa_Cu;
                        #endregion

                        #region tinh thưởng, phụ cấp

                        r.tongPhuCapKhac = 0;
                        r.khoanTruKhac   = 0;
                        r.tongThuongCalc = 0;
                        var pcK = ds.tbThamSoTinhLuong.Where(i => i.employeeID == r.empoyeeID &&
                                                             (i["thang"] == DBNull.Value || i.thang == new DateTime(tuNgay.Year, tuNgay.Month, 1))
                                                             ).FirstOrDefault();

                        for (int i = 1; i < 21; i++)
                        {
                            r["PC" + i] = DbHelper.DrGetDouble(pcK, "PC" + i);
                            if ((double)r["PC" + i] > 0 || i == 3)
                            {
                                if (i == 3) //PC3: Khoản thưởng khác. + Thêm phụ cấp hàng tháng.
                                {
                                    var a = ds.tblEmpAllowanceFix.Where(p => p.EmployeeID == eID).Sum(p => p.Amount);
                                    r["PC3"] = Convert.ToDouble(r["PC3"]) + a;
                                }
                                r.tongPhuCapKhac += (double)r["PC" + i];
                            }
                            else
                            {
                                r.khoanTruKhac += (-1.0) * (double)r["PC" + i];
                            }
                        }

                        double ngaycong_rounded = (chkLamTron ? i_Round(r.ngayCong_bt_Moi + r.ngayCong_bt_Cu + r.ngayCong_Dem_Moi + r.ngayCong_Dem_Cu) : (r.ngayCong_bt_Moi + r.ngayCong_bt_Cu + r.ngayCong_Dem_Moi + r.ngayCong_Dem_Cu)) + (r.ngayCong_lt_Moi + r.ngayCong_lt_Cu);
                        // Cũ
                        var    abc = ds.tbDangKyVangMat.Where(i => i.EmployeeID == e1.EmployeeID && i.lydo == (int)Enums.eLyDoNghi.NghiPhepNam);
                        double soNgayNghiPhepNam = abc
                                                   .Sum(p => (p.nghiCaNgay == 3 ? 1 : 0.5));
                        //fix ngày nghỉ ko ảnh hưởng tới chuyên cần
                        ngaycong_rounded += ds.tbDangKyVangMat.Where(i => i.EmployeeID == e1.EmployeeID && !i.coTinhChuyenCan && i.lydo != (int)Enums.eLyDoNghi.NghiPhepNam).Sum(p => (p.nghiCaNgay == 3 ? 1 : 0.5));

                        double soNgayNghiCheDo = ds.tbDangKyVangMat.Where(i => i.EmployeeID == e1.EmployeeID && (i.lydo == (int)Enums.eLyDoNghi.KetHon || i.lydo == (int)Enums.eLyDoNghi.MaChay) && i.coTinhChuyenCan)
                                                 .Sum(p => (p.nghiCaNgay == 3 ? 1 : 0.5));
                        foreach (var dr in ds.tbBangLuongCalc)
                        {
                            if (!string.IsNullOrWhiteSpace(dr.expression))
                            {
                                NCalc.Expression exp = new NCalc.Expression(dr.expression);
                                exp.Parameters.Add("thang", r.thang);
                                exp.Parameters.Add("empoyeeID", r.empoyeeID);
                                exp.Parameters.Add("luongCB", r.luongCB_Moi);
                                exp.Parameters.Add("luongPC", r.luongPC_Moi);
                                exp.Parameters.Add("luongCB_cu", r.luongCB_Cu);
                                exp.Parameters.Add("luongPC_cu", r.luongPC_Cu);
                                exp.Parameters.Add("soNgayCongTrongThang", hp._soNgayCongTrongThang);
                                exp.Parameters.Add("soNgayNghiPhepNam", soNgayNghiPhepNam);
                                exp.Parameters.Add("ngaycong_rounded", ngaycong_rounded);
                                exp.Parameters.Add("soNgayNghiCheDo", soNgayNghiCheDo);
                                //for (int i = 1; i < 21; i++)
                                //    exp.Parameters.Add("PC" + i, r["PC" + i]);
                                for (int i = 1; i < 11; i++)
                                {
                                    exp.Parameters.Add("DataCalc" + i, DbHelper.DrGetDouble(pcK, "DataCalc" + i));
                                }

                                if (!exp.HasErrors())
                                {
                                    if (r.Table.Columns.Contains(dr.fieldName))
                                    {
                                        r[dr.fieldName] = exp.Evaluate();
                                    }
                                    else
                                    {
                                        lp.OutMessage("EmpID " + eID + " ERR: Công thức tính lương: định nghĩa sai tên trường " + dr.fieldName);
                                    }
                                }
                                r.tongThuongCalc += Convert.ToDouble(r[dr.fieldName]);
                            }
                        }
                        // Tiền con thơ.
                        r.ConTho = ds.tblEmpChild.Where(p => p.EmployeeID == eID).Count() * 50000;

                        //Khoản thưởng giới thiệu.
                        double soTienGioiThieu = ds.tbGioiThieuCongNhan.Where(p => p.EmployeeID == eID && p.Date != null && p.Date >= tuNgay && p.Date <= denNgay).Sum(p => p.Sotien);
                        r["PC4"] = (double)r["PC4"] + soTienGioiThieu;
                        #endregion

                        //PCS + AL + Paid leave + Public holiday
                        #region tinh luong SP
                        if (pcK != null && pcK.LuongSP > 0)
                        {
                            r.luongSP = pcK.LuongSP;
                        }
                        #endregion
                        r.luongThoiGian   = r.tongTienNgayCong_Total + r.tongTienTangCa_Total;
                        r.tongLuongTG     = r.luongThoiGian;
                        r.tongLuongSP     = r.luongSP;
                        r.tongPhuCapKhac += r.tongThuongCalc + r.ConTho;
                        // Calc1: chuyên cần
                        if (r.luongSP <= 0)
                        {
                            r.isLuongSP  = false;
                            r.tongLuong  = r.luongThoiGian + r.luongPC_Moi;
                            r.tongLuong += r.tongLuong > 0 ? r.tongPhuCapKhac : 0; //có lương mới đc + phụ cấp
                        }
                        else
                        {
                            r.isLuongSP  = true;
                            r.tongLuong  = r.tongTienNC_lt_Total + r.tongTienNC_phepNam_Total + r.tongTienNC_phep_Total;
                            r.tongLuong += r.luongSP + r.luongPC_Moi + r.ConTho + Convert.ToDouble(r["Calc1"]) + Convert.ToDouble(r["Calc2"]) + Convert.ToDouble(r["PC3"]) + Convert.ToDouble(r["PC4"]);
                        }
                        r.tongLuong += r.tongLuong > 0 ? r.tongPhuCapKhac : 0; //có lương mới đc + phụ cấp
                        #region khau tru
                        r.ThueTNCN    = r.tienBHXH = r.tienBHYT = r.tienBHTN = 0;
                        r.phiCongDoan = 0;
                        r.tienBH105   = 0;
                        if (e1["coBH"] != DBNull.Value && e1.coBH)
                        {
                            if (e1["coBH_ngay"] != DBNull.Value && e1.coBH_ngay < denNgay)
                            {
                                r.tienBHXH    = (r.luongCB_Moi + r.luongPC_Moi) * 8 / 100;
                                r.tienBHYT    = (r.luongCB_Moi + r.luongPC_Moi) * 1.5 / 100;
                                r.tienBHTN    = (r.luongCB_Moi + r.luongPC_Moi) * 1 / 100;
                                r.tienBH105   = r.tienBHXH + r.tienBHYT + r.tienBHTN;
                                r.phiCongDoan = 0;
                            }
                        }
                        r.tongKhauTru = r.tienBHXH + r.tienBHYT + r.tienBHTN + r.khoanTruKhac + r.phiCongDoan;
                        #endregion
                        int soNguoiPhuThuoc = (int)Provider.ExecSqlScalar(string.Format("select isnull(SoNguoiPhuThuoc,0) from tblEmployee where employeeID ='{0}'", eID));
                        r.SoNguoiPhuThuoc       = soNguoiPhuThuoc;
                        r.LuongThucNhanTinhThue = r.tongLuong - (r.tongLuong > 0 ? r.tongKhauTru : 0); //có lương mới trừ
                                                                                                       // Nếu thực nhận tính thuế < 9tr. Không phải tính.
                        if (r.LuongThucNhanTinhThue > 9000000)
                        {
                            r.ThueTNCN = TinhThueTNCN(r.LuongThucNhanTinhThue, r.SoNguoiPhuThuoc);
                        }

                        r.tongKhauTru       += r.ThueTNCN;
                        r.actualBankTransfer = r.tongLuong - (r.tongLuong > 0 ? r.tongKhauTru : 0);//có lương mới trừ

                        r.analyzeDate     = DateTime.Now;
                        r.analyzeBy       = UserDoing.id;
                        r.statePushServer = "edit";
                        ds.tbBangLuongThang_1dong.Rows.Add(r);
                    }
                    catch (Exception ex)
                    {
                        lp.OutMessage("EmpID " + eID + " ERR: " + ex.Message);
                    }
                    lp.CurrentValue += 1;
                }

                if (ds.tbBangLuongThang_1dong.GetChanges() == null)
                {
                    lp.OutMessage("\n>> " + Lng.Luong_AnalyzeData.emptmsg);
                }
                else
                {
                    var rowChanged = ds.tbBangLuongThang_1dong.GetChanges().Rows.Count;
                    lp.OutMessage("\n>> Commit data to database...");
                    SqlParameter pa = new SqlParameter("dtBangLuongThang_1dong", SqlDbType.Structured);
                    pa.TypeName = "dtBangLuongThang_1dong";
                    pa.Value    = ds.tbBangLuongThang_1dong;
                    Provider.ExecuteNonQuery("p_tinhLuong_updateBangLuongThang_1dong", pa);
                    //Provider.UpdateData(ds, ds.tbBangLuongThang.TableName);
                    lp.OutMessage("\n>> " + Lng.Luong_AnalyzeData.msg_1 + "(" + rowChanged + ") bản ghi");
                }
                lp.OutMessage(Lng.Luong_AnalyzeData.msg_2);
            }
            catch (Exception ex)
            {
                lp.OutMessage(ex.Message);
            }
        }
		private void Validate()
		{
			if (!Expression.IsEmpty())
			{
				var expression = new NCalc.Expression(ExpressionHelper.Encode(Expression));

				if (expression.HasErrors())
				{
					ShowError(expression.Error);
				}
				else
				{
					var matches = _securityRegex.Matches(expression.ParsedExpression.ToString());

					var securities = matches
						.Cast<Match>()
						.Select(m => m.Groups[1].ToString())
						.Select(m => new
						{
							Code = m, 
							Security = TryGetSecurity(m)
						})
						.ToArray();

					var item = securities.FirstOrDefault(m => m.Security == null);

					ShowError(item != null 
						? LocalizedStrings.Str1522Params.Put(item.Code) 
						: Validate(securities.Select(s => s.Security)));
				}
			}
			else
				ShowError(null);
		}
Пример #13
0
        public void doAnalyza(DateTime tuNgay, DateTime denNgay, string empID, string depID, int group1ID, bool chkLamTron)
        {
            TinhLuong   logic = new TinhLuong();
            dsTinhLuong ds    = new dsTinhLuong();
            int         soNgayCongThucTeTrongThang = Ham.DemNgayCong(tuNgay, denNgay);

            try
            {
                //reg progress...
                lp.SetTitle("Đang lấy dữ liệu..");
                lp.OutMessage("Lấy dữ liệu ----------------------------------------------------------------------------------");

                #region get data
                ds = new dsTinhLuong();
                DateTime cMonth = new DateTime(tuNgay.Year, tuNgay.Month, 1);

                Provider.LoadData(ds, ds.tbCaLam_TinhTangCa.TableName);
                lp.OutMessage("Ca làm việc (tính tăng ca): " + ds.tbCaLam_TinhTangCa.Rows.Count);
                Provider.LoadData(ds, ds.tblRef_Allowance.TableName);
                lp.OutMessage("Phụ cấp Allowance: " + ds.tblRef_Allowance.Rows.Count);

                Provider.LoadDataByProc(ds, ds.tblEmpSalary.TableName, "p_tinhLuong_GetLuongCoBan", new SqlParameter("tuNgay", tuNgay), new SqlParameter("denNgay", denNgay));
                lp.OutMessage("Lương cơ bản: " + ds.tblEmpSalary.Rows.Count);
                //tuNgay.AddDays(-1) Sinh ngày 17 là k đc nhận thưởng con thơ nữa.
                Provider.LoadDataByProc(ds, ds.tblEmpChild.TableName, "p_tinhLuong_GetChilds", new SqlParameter("tuNgay", tuNgay), new SqlParameter("denNgay", denNgay));
                lp.OutMessage("Con thơ: " + ds.tblEmpChild.Rows.Count);
                Provider.LoadDataByProc(ds, ds.tbDangKyVangMat.TableName, "p_duLieuQuetThe_GetAllDangKyVangMat_CoThe", new SqlParameter("tuNgay", tuNgay), new SqlParameter("denNgay", denNgay));
                lp.OutMessage("Đăng ký vắng mặt: " + ds.tbDangKyVangMat.Rows.Count);
                Provider.LoadData(ds, ds.tbBangLuongCalc.TableName);
                lp.OutMessage("Công thức tính lương: " + ds.tbBangLuongCalc.Rows.Count);

                if (!string.IsNullOrWhiteSpace(empID))
                {
                    Provider.LoadDataByProc(ds, ds.tbThamSoTinhLuong.TableName, "p_tinhLuong_GetThamSoTinhLuong_WithEmp", new SqlParameter("thang", cMonth), new SqlParameter("empID", empID));
                    Provider.LoadDataByProc(ds, ds.p_tinhLuong_GetAllKetQuaQuetThe.TableName, "p_tinhLuong_GetAllKetQuaQuetThe_WithEmp", new SqlParameter("tuNgay", tuNgay), new SqlParameter("denNgay", denNgay), new SqlParameter("empID", empID));
                    Provider.LoadDataByProc(ds, ds.tblEmpAllowanceFix.TableName, "p_tinhLuong_GetPCCD_WithEmp", new SqlParameter("empID", empID));

                    lp.OutMessage(">>> " + Lng.Luong_AnalyzeData.resetBL + " (" + empID + ") " + logic.ResetBangLuong_withEmp(cMonth, empID));
                }
                else if (!string.IsNullOrWhiteSpace(depID))
                {
                    Provider.LoadDataByProc(ds, ds.tbThamSoTinhLuong.TableName, "p_tinhLuong_GetThamSoTinhLuong_WithDept", new SqlParameter("thang", cMonth), new SqlParameter("maTapThe", depID));
                    Provider.LoadDataByProc(ds, ds.p_tinhLuong_GetAllKetQuaQuetThe.TableName, "p_tinhLuong_GetAllKetQuaQuetThe_WithDept", new SqlParameter("tuNgay", tuNgay), new SqlParameter("denNgay", denNgay), new SqlParameter("maTapThe", depID));
                    Provider.LoadDataByProc(ds, ds.tblEmpAllowanceFix.TableName, "p_tinhLuong_GetPCCD_WithDept", new SqlParameter("maTapThe", depID));

                    lp.OutMessage(">>> " + Lng.Luong_AnalyzeData.resetBL + " (" + depID + ") " + logic.ResetBangLuong_withDep(cMonth, depID));
                }
                else if (group1ID > 0)
                {
                    Provider.LoadDataByProc(ds, ds.tbThamSoTinhLuong.TableName, "p_tinhLuong_GetThamSoTinhLuong_WithGroup1", new SqlParameter("thang", cMonth), new SqlParameter("group1ID", group1ID));
                    Provider.LoadDataByProc(ds, ds.p_tinhLuong_GetAllKetQuaQuetThe.TableName, "p_tinhLuong_GetAllKetQuaQuetThe_WithGroup1", new SqlParameter("tuNgay", tuNgay), new SqlParameter("denNgay", denNgay), new SqlParameter("group1ID", group1ID));
                    Provider.LoadDataByProc(ds, ds.tblEmpAllowanceFix.TableName, "p_tinhLuong_GetPCCD_WithGroup1", new SqlParameter("group1ID", group1ID));

                    lp.OutMessage(">>> " + Lng.Luong_AnalyzeData.resetBL + " (Group1: " + group1ID + ") " + logic.ResetBangLuong_withGroup1(cMonth, group1ID));
                }
                else
                {
                    Provider.LoadDataByProc(ds, ds.tbThamSoTinhLuong.TableName, "p_tinhLuong_GetThamSoTinhLuong", new SqlParameter("thang", cMonth));
                    Provider.LoadDataByProc(ds, ds.p_tinhLuong_GetAllKetQuaQuetThe.TableName, "p_tinhLuong_GetAllKetQuaQuetThe", new SqlParameter("tuNgay", tuNgay), new SqlParameter("denNgay", denNgay));
                    Provider.LoadDataByProc(ds, ds.tblEmpAllowanceFix.TableName, "p_tinhLuong_GetPCCD");

                    lp.OutMessage(Lng.Luong_AnalyzeData.resetBL + logic.ResetBangLuong(cMonth));
                }

                lp.OutMessage("Tham số tính lương: " + ds.tbThamSoTinhLuong.Rows.Count);
                lp.OutMessage(Lng.Luong_AnalyzeData.ketquaCC + ds.p_tinhLuong_GetAllKetQuaQuetThe.Rows.Count);
                lp.OutMessage("Phụ cấp cố định: " + ds.tblEmpAllowanceFix.Rows.Count);
                #endregion

                var lstEmp = ds.p_tinhLuong_GetAllKetQuaQuetThe.Select(i => i.EmployeeID).Distinct();
                lp.MaxValue     = lstEmp.Count();
                lp.CurrentValue = 0;
                foreach (string eID in lstEmp)
                {
                    try
                    {
                        var kqs = ds.p_tinhLuong_GetAllKetQuaQuetThe.Where(i => i.EmployeeID == eID).ToList();

                        var r  = ds.tbBangLuongThang.NewtbBangLuongThangRow(); r.laBangLuongCu = false; r.id = Guid.NewGuid();
                        var r2 = ds.tbBangLuongThang.NewtbBangLuongThangRow(); r2.laBangLuongCu = true; r2.id = Guid.NewGuid();
                        var e1 = kqs[0];
                        #region tính lương

                        TinhLuongHelper hp = new TinhLuongHelper(ds, tuNgay, denNgay, e1.EmployeeID);
                        r.thang     = r2.thang = cMonth;
                        r.empoyeeID = r2.empoyeeID = eID;

                        if (hp.luongMoi == null && hp.luongCu == null)
                        {
                            hp.luongMoi = ds.tblEmpSalary.Where(i => i.EmployeeID == e1.EmployeeID).OrderByDescending(i => i.DateChange).FirstOrDefault();
                        }
                        r.luongCB = hp.luongMoi == null ? (e1["BasicSalary"] == DBNull.Value ? 0 : e1.BasicSalary) : hp.luongMoi.BasicSalary;
                        r.luongPC = hp.luongMoi == null ? (e1["RegularAllowance"] == DBNull.Value ? 0 : e1.RegularAllowance) : hp.luongMoi.BasicSalary_Ins;

                        r2.luongCB = (hp.luongCu == null) ? 0 : hp.luongCu.BasicSalary;
                        r2.luongPC = (hp.luongCu == null) ? 0 : hp.luongCu.BasicSalary_Ins;


                        r.ngaycong_bt = r.tienNC_bt = r.ngaycong_phep = r.tienNC_phep = r.ngaycong_phepNam = r.tienNC_phepNam = r.ngaycong_lt = r.tienNC_lt = r.ngaycong_cn = r.tienNC_cn = r.tongNgayCong = r.tienNgayCong = r.thuongLamCa = r.thuongBuaToi = r.ngayCong_Dem = 0;
                        r.tgTangCa_bt = r.tienTangCa_bt = r.tgTangCa_cn = r.tienTangCa_cn = r.tgTangCa_lt = r.tienTangCa_lt = r.tongThoiGianTangCa = r.tienTangCa = r.tgTangCa_Dem = 0;

                        r2.ngaycong_bt = r2.tienNC_bt = r2.ngaycong_phep = r2.tienNC_phep = r2.ngaycong_phepNam = r2.tienNC_phepNam = r2.ngaycong_lt = r2.tienNC_lt = r2.ngaycong_cn = r2.tienNC_cn = r2.tongNgayCong = r2.tienNgayCong = r2.thuongLamCa = r2.thuongBuaToi = r2.ngayCong_Dem = 0;
                        r2.tgTangCa_bt = r2.tienTangCa_bt = r2.tgTangCa_cn = r2.tienTangCa_cn = r2.tgTangCa_lt = r2.tienTangCa_lt = r2.tongThoiGianTangCa = r2.tienTangCa = r2.tgTangCa_Dem = 0;

                        r.tongLuongTG         = r2.tongLuongTG = r.PhuCapTrachNhiem = r2.PhuCapTrachNhiem = 0;
                        r.tongTgTangCa_cn_gio = r2.tongTgTangCa_cn_gio = 0;
                        r.luongSP             = r.luongTangCaSP = r.luongSP_tong = 0;


                        for (int i = 1; i < 21; i++)
                        {
                            r["Calc" + i]  = 0;
                            r2["Calc" + i] = 0;
                            r["PC" + i]    = 0;
                            r2["PC" + i]   = 0;
                        }

                        double f;

                        foreach (var kq in kqs)
                        {
                            hp.Set_KQQT(kq);

                            #region tinh ngay cong theo luong moi
                            r.ngaycong_bt += hp.TinhNgayCong(1);
                            r.tienNC_bt   += hp.TinhTienNgayCong(1);

                            r.ngaycong_phep += hp.TinhNgayCong(2);
                            r.tienNC_phep   += hp.TinhTienNgayCong(2);

                            f = hp.TinhNgayCong(5);
                            r.ngaycong_phepNam += f;
                            r.tienNC_phepNam   += hp.TinhTienNgayCong(5);

                            r.ngaycong_lt += hp.TinhNgayCong(3);
                            r.tienNC_lt   += hp.TinhTienNgayCong(3);

                            f                      = hp.TinhNgayCong(4);
                            r.ngaycong_cn         += f;
                            r.tongTgTangCa_cn_gio += f * kq.soTiengTinhCa;
                            r.tienNC_cn           += hp.TinhTienNgayCong(4);
                            #endregion

                            #region tinh tang ca theo luong moi
                            var f1 = hp.TinhTienTangCa(1);
                            r.tgTangCa_bt   += hp.TinhGioTangCa(1);
                            r.tienTangCa_bt += hp.TinhTienTangCa(1);

                            f                      = hp.TinhGioTangCa(2);
                            r.tgTangCa_cn         += f;
                            r.tongTgTangCa_cn_gio += f;
                            r.tienTangCa_cn       += hp.TinhTienTangCa(2);

                            r.tgTangCa_lt   += hp.TinhGioTangCa(3);
                            r.tienTangCa_lt += hp.TinhTienTangCa(3);
                            #endregion


                            if (hp.luongCu != null)
                            {
                                #region tinh ngay cong theo luong cu
                                r2.ngaycong_bt += hp.TinhNgayCong(1, true);
                                r2.tienNC_bt   += hp.TinhTienNgayCong(1, true);

                                r2.ngaycong_phep += hp.TinhNgayCong(2, true);
                                r2.tienNC_phep   += hp.TinhTienNgayCong(2, true);

                                r2.ngaycong_phepNam += hp.TinhNgayCong(5, true);
                                r2.tienNC_phepNam   += hp.TinhTienNgayCong(5, true);

                                r2.ngaycong_lt += hp.TinhNgayCong(3, true);
                                r2.tienNC_lt   += hp.TinhTienNgayCong(3, true);


                                f = hp.TinhNgayCong(4, true);
                                r2.ngaycong_cn         += f;
                                r2.tienNC_cn           += hp.TinhTienNgayCong(4, true);
                                r2.tongTgTangCa_cn_gio += f * kq.soTiengTinhCa;

                                #endregion

                                #region tinh tang ca theo luong cu
                                r2.tgTangCa_bt   += hp.TinhGioTangCa(1, true);
                                r2.tienTangCa_bt += hp.TinhTienTangCa(1, true);

                                f = hp.TinhGioTangCa(2, true);
                                r2.tgTangCa_cn         += f;
                                r2.tongTgTangCa_cn_gio += f;
                                r2.tienTangCa_cn       += hp.TinhTienTangCa(2, true);

                                r2.tgTangCa_lt   += hp.TinhGioTangCa(3, true);
                                r2.tienTangCa_lt += hp.TinhTienTangCa(3, true);

                                #endregion
                            }
                        }
                        #endregion

                        #region rounded money
                        r.tienNC_bt      = Math.Round(r.tienNC_bt, 0);
                        r.tienNC_phep    = Math.Round(r.tienNC_phep, 0);
                        r.tienNC_phepNam = Math.Round(r.tienNC_phepNam, 0);
                        r.tienNC_lt      = Math.Round(r.tienNC_lt, 0);
                        r.tienNC_cn      = Math.Round(r.tienNC_cn, 0);
                        r.tienNgayCong   = Math.Round(r.tienNgayCong, 0);

                        r.tienTangCa_bt = Math.Round(r.tienTangCa_bt, 0);
                        r.tienTangCa_cn = Math.Round(r.tienTangCa_cn, 0);
                        r.tienTangCa_lt = Math.Round(r.tienTangCa_lt, 0);
                        r.tienTangCa    = Math.Round(r.tienTangCa, 0);



                        r2.tienNC_bt      = Math.Round(r2.tienNC_bt, 0);
                        r2.tienNC_phep    = Math.Round(r2.tienNC_phep, 0);
                        r2.tienNC_phepNam = Math.Round(r2.tienNC_phepNam, 0);
                        r2.tienNC_lt      = Math.Round(r2.tienNC_lt, 0);
                        r2.tienNC_cn      = Math.Round(r2.tienNC_cn, 0);
                        r2.tienNgayCong   = Math.Round(r2.tienNgayCong, 0);

                        r2.tienTangCa_bt = Math.Round(r2.tienTangCa_bt, 0);
                        r2.tienTangCa_cn = Math.Round(r2.tienTangCa_cn, 0);
                        r2.tienTangCa_lt = Math.Round(r2.tienTangCa_lt, 0);
                        r2.tienTangCa    = Math.Round(r2.tienTangCa);
                        #endregion

                        #region tinh tong

                        r.tongNgayCong       = r.ngaycong_bt + r.ngaycong_phep + r.ngaycong_phepNam + r.ngaycong_lt;
                        r.tienNgayCong       = r.tienNC_bt + r.tienNC_phep + r.tienNC_phepNam + r.tienNC_lt;
                        r.tongThoiGianTangCa = r.tgTangCa_bt + r.tgTangCa_lt + r.tongTgTangCa_cn_gio;
                        r.tienTangCa         = r.tienTangCa_bt + r.tienTangCa_lt + r.tienTangCa_cn + r.tienNC_cn;

                        r2.tongNgayCong       = r2.ngaycong_bt + r2.ngaycong_phep + r2.ngaycong_phepNam + r2.ngaycong_lt;
                        r2.tienNgayCong       = r2.tienNC_bt + r2.tienNC_phep + r2.tienNC_phepNam + r2.tienNC_lt;
                        r2.tongThoiGianTangCa = r2.tgTangCa_bt + r2.tgTangCa_lt + r2.tongTgTangCa_cn_gio;
                        r2.tienTangCa         = r2.tienTangCa_bt + r2.tienTangCa_lt + r2.tienTangCa_cn + r2.tienNC_cn;

                        #endregion

                        #region tinh thưởng, phụ cấp

                        r.tongPhuCapKhac = r2.tongPhuCapKhac = 0;
                        r.khoanTruKhac   = r2.khoanTruKhac = 0;
                        r.tongThuongCalc = r2.tongThuongCalc = 0;
                        var pcK = ds.tbThamSoTinhLuong.Where(i => i.employeeID == r.empoyeeID &&
                                                             (i["thang"] == DBNull.Value || i.thang == new DateTime(tuNgay.Year, tuNgay.Month, 1))
                                                             ).FirstOrDefault();

                        for (int i = 1; i < 21; i++)
                        {
                            r["PC" + i] = DbHelper.DrGetDouble(pcK, "PC" + i);
                            if (r["PC" + i] != null && (double)r["PC" + i] > 0)
                            {
                                r.tongPhuCapKhac += (double)r["PC" + i];
                            }
                            else
                            {
                                r.khoanTruKhac += (-1.0) * (double)r["PC" + i];
                            }
                        }

                        double ngaycong_rounded = (chkLamTron ? i_Round(r.ngaycong_bt + r2.ngaycong_bt) : r.ngaycong_bt + r2.ngaycong_bt) + (r.ngaycong_lt + r2.ngaycong_lt);
                        // Cũ
                        //double soNgayNghiPhepNam = ds.tbDangKyVangMat.Where(i => i.EmployeeID == e1.EmployeeID && i.lydo == (int)Enums.eLyDoNghi.NghiPhepNam && i.coTinhChuyenCan)
                        //    .Sum(i => TinhNgayCongPhep(i));
                        double soNgayNghiPhepNam = ds.tbDangKyVangMat.Where(i => i.EmployeeID == e1.EmployeeID && i.lydo == (int)Enums.eLyDoNghi.NghiPhepNam)
                                                   .Sum(i => TinhNgayCongPhep(i));
                        double ngaycongthucte = ngaycong_rounded;
                        //fix ngày nghỉ ko ảnh hưởng tới chuyên cần
                        ngaycong_rounded += ds.tbDangKyVangMat.Where(i => i.EmployeeID == e1.EmployeeID && !i.coTinhChuyenCan && i.lydo != (int)Enums.eLyDoNghi.NghiPhepNam).Sum(i => TinhNgayCongPhep(i));

                        double soNgayNghiCheDo = ds.tbDangKyVangMat.Where(i => i.EmployeeID == e1.EmployeeID && (i.lydo == (int)Enums.eLyDoNghi.KetHon || i.lydo == (int)Enums.eLyDoNghi.MaChay) && i.coTinhChuyenCan)
                                                 .Sum(i => TinhNgayCongPhep(i));

                        hp._soNgayCongTrongThang = soNgayCongThucTeTrongThang;


                        foreach (var dr in ds.tbBangLuongCalc)
                        {
                            if (!string.IsNullOrWhiteSpace(dr.expression))
                            {
                                NCalc.Expression exp = new NCalc.Expression(dr.expression);
                                exp.Parameters.Add("thang", r.thang);
                                exp.Parameters.Add("empoyeeID", r.empoyeeID);
                                exp.Parameters.Add("luongCB", r.luongCB);
                                exp.Parameters.Add("luongPC", r.luongPC);
                                exp.Parameters.Add("luongCB_cu", r2.luongCB);
                                exp.Parameters.Add("luongPC_cu", r2.luongPC);
                                exp.Parameters.Add("soNgayCongTrongThang", hp._soNgayCongTrongThang);
                                exp.Parameters.Add("soNgayNghiPhepNam", soNgayNghiPhepNam);
                                exp.Parameters.Add("ngaycong_rounded", ngaycong_rounded);
                                exp.Parameters.Add("soNgayNghiCheDo", soNgayNghiCheDo);
                                exp.Parameters.Add("ngaycongthucte", ngaycongthucte);
                                //for (int i = 1; i < 21; i++)
                                //    exp.Parameters.Add("PC" + i, r["PC" + i]);
                                for (int i = 1; i < 11; i++)
                                {
                                    exp.Parameters.Add("DataCalc" + i, DbHelper.DrGetDouble(pcK, "DataCalc" + i));
                                }

                                if (!exp.HasErrors())
                                {
                                    if (r.Table.Columns.Contains(dr.fieldName))
                                    {
                                        r[dr.fieldName] = exp.Evaluate();
                                    }
                                    else
                                    {
                                        lp.OutMessage("EmpID " + eID + " ERR: Công thức tính lương: định nghĩa sai tên trường " + dr.fieldName);
                                    }
                                }
                                r.tongThuongCalc += Convert.ToDouble(r[dr.fieldName]);
                            }
                        }
                        hp._soNgayCongTrongThang = soNgayCongThucTeTrongThang > 26 ? 26 : soNgayCongThucTeTrongThang;
                        // Tính khoản phụ cấp cho nhân viên.
                        double Phucap = 0;
                        if (r.ngaycong_bt + r.ngaycong_lt + r.ngayCong_Dem > 13)
                        {
                            Phucap = r.luongPC;
                        }
                        else
                        {
                            var phucapMoi = r.luongPC / hp._soNgayCongTrongThang * (r.ngaycong_bt + r.ngaycong_lt + r.ngayCong_Dem + r.ngaycong_phepNam);
                            var phucapCu  = r2.luongPC / hp._soNgayCongTrongThang * (r2.ngaycong_bt + r2.ngaycong_lt + r2.ngayCong_Dem + r2.ngaycong_phepNam);
                            Phucap = phucapCu + phucapMoi;
                        }
                        r.PhuCapTrachNhiem = Phucap;
                        #endregion

                        #region tinh luong SP
                        r2.luongSP = r2.luongTangCaSP = r2.luongSP_tong = 0;
                        if (pcK == null || pcK.LuongSP == 0)
                        {
                            r.luongSP = r.luongTangCaSP = r.luongSP_tong = 0;
                        }
                        else
                        {
                            r.luongSP = pcK.LuongSP;
                        }
                        #endregion
                        r.luongThoiGian = r.tienNgayCong + r.tienTangCa + (r2.tienNgayCong + r2.tienTangCa);
                        // PC2: Tiền con thơ
                        r.ConTho = (ds.tblEmpChild.Where(p => p.EmployeeID == eID).Count() >= 1 ? 1 : 0) * 50000;
                        // Tính tổng lương
                        r.tongPhuCapKhac += r.tongThuongCalc + r.ConTho;
                        r.tongLuongTG     = r.luongThoiGian + r.ConTho + r.tongThuongCalc;
                        r.tongLuong       = r.luongThoiGian;
                        r.tongLuong      += r.tongLuong > 0 ? (r.tongPhuCapKhac + r.PhuCapTrachNhiem) : 0;

                        r2.tongLuongTG   = 0;
                        r2.luongThoiGian = 0;
                        r2.tongLuong     = 0;

                        #region khau tru
                        r.ThueTNCN    = 0;
                        r.BH105       = 0;
                        r.phiCongDoan = 0;
                        r2.BH105      = 0;
                        if (e1["coBH"] != DBNull.Value && e1.coBH)
                        {
                            if (e1["coBH_ngay"] != DBNull.Value && e1.coBH_ngay < denNgay)
                            {
                                r.BH105 = (r.luongCB + r.luongPC) * 10.5 / 100;
                            }
                        }
                        r.tongKhauTru  = r.BH105 + r.khoanTruKhac + r.phiCongDoan;
                        r2.tongKhauTru = 0;
                        #endregion
                        int soNguoiPhuThuoc = (int)Provider.ExecSqlScalar(string.Format("select isnull(SoNguoiPhuThuoc,0) from tblEmployee where employeeID ='{0}'", eID));
                        r.SoNguoiPhuThuoc       = soNguoiPhuThuoc;
                        r.LuongThucNhanTinhThue = r.tongLuong - (r.tongLuong > 0 ? r.tongKhauTru : 0); //có lương mới trừ
                        // Nếu thực nhận tính thuế < 9tr. Không phải tính.
                        if (r.LuongThucNhanTinhThue > 9000000)
                        {
                            r.ThueTNCN = TinhThueTNCN(r.LuongThucNhanTinhThue, r.SoNguoiPhuThuoc);
                        }

                        r.tongKhauTru        += r.ThueTNCN;
                        r.actualBankTransfer  = r.tongLuong - (r.tongLuong > 0 ? r.tongKhauTru : 0);//có lương mới trừ
                        r2.actualBankTransfer = 0;

                        r.analyzeDate      = r2.analyzeDate = DateTime.Now;
                        r.analyzeBy        = r2.analyzeBy = UserDoing.id;
                        r.statePushServer  = "edit";
                        r2.statePushServer = "edit";

                        ds.tbBangLuongThang.Rows.Add(r);
                        if (hp.luongCu != null)
                        {
                            ds.tbBangLuongThang.Rows.Add(r2);
                        }
                    }
                    catch (Exception ex)
                    {
                        lp.OutMessage("EmpID " + eID + " ERR: " + ex.Message);
                    }
                    lp.CurrentValue += 1;
                }

                if (ds.tbBangLuongThang.GetChanges() == null)
                {
                    lp.OutMessage("\n>> " + Lng.Luong_AnalyzeData.emptmsg);
                }
                else
                {
                    var rowChanged = ds.tbBangLuongThang.GetChanges().Rows.Count;
                    lp.OutMessage("\n>> Commit data to database...");
                    SqlParameter pa = new SqlParameter("dtBangLuongThang", SqlDbType.Structured);
                    pa.TypeName = "dtBangLuongThang";
                    pa.Value    = ds.tbBangLuongThang;
                    Provider.ExecuteNonQuery("p_tinhLuong_updateBangLuongThang", pa);
                    //Provider.UpdateData(ds, ds.tbBangLuongThang.TableName);
                    lp.OutMessage("\n>> " + Lng.Luong_AnalyzeData.msg_1 + "(" + rowChanged + ") bản ghi");
                }
                lp.OutMessage(Lng.Luong_AnalyzeData.msg_2);
            }
            catch (Exception ex)
            {
                lp.OutMessage(ex.Message);
            }
        }
Пример #14
0
        //Set the function to maximize/minimize
        public static bool setFunctionToOperate(string functionAsText)
        {
            bool canEvaluate = false;
            _exp = new NCalc.Expression(functionAsText);
            NCalc.Expression _expTest = new NCalc.Expression(functionAsText);
            _expTest.Parameters["x"] = 1;
            try {
                _expTest.Evaluate();
                canEvaluate = true;
            } catch {
                canEvaluate = false;
            }

            return !_exp.HasErrors() && !_expTest.HasErrors() && canEvaluate;
        }