public Sal_SalaryDepartmentItem SetItemSalDep(Sal_SalaryDepartmentItem depItem, List<Att_AttendanceTableItem> lstAttItemPro, DateTime idx) { Att_AttendanceTableItem attItem = lstAttItemPro.Where(att => att.WorkDate == idx).FirstOrDefault(); if (attItem == null) { return depItem; } //AppConfig var service = new Sys_AttOvertimePermitConfigServices(); var value52 = service.GetConfigValue<string>(AppConfig.HRM_SAL_CONFIG_VALUE52); var value59 = service.GetConfigValue<string>(AppConfig.HRM_SAL_CONFIG_VALUE59); var value8 = service.GetConfigValue<string>(AppConfig.HRM_SAL_CONFIG_VALUE8); // OverTimeStatus.E_APPROVED? //Lấy giờ công và giờ ca đêm if (value52 == AppConfig.E_RATE_BY_ATUALARISING.ToString()) { //Nếu có check cấu hình chung là lấy giờ công trả lương if (value59.ToLower() == true.ToString().ToLower()) { double workPaidHour = attItem.WorkPaidHours; //Nếu có thai sản thì trừ đi 1h if (attItem.IsHavingPregTreatment == true && workPaidHour > 0) workPaidHour = workPaidHour - 1; depItem.PaidWorkHours += workPaidHour; } else { double workpaidhournonpreg = 0; // attItem.WorkPaidHourNonPreg != null ? attItem.WorkPaidHourNonPreg.Value : 0; workpaidhournonpreg = Math.Round(workpaidhournonpreg, 2); depItem.PaidWorkHours += workpaidhournonpreg; } //(bổ sung lấy giờ ca đêm để tính tiền phụ trội ca đêm) double nightshifthour = attItem.NightShiftHours != null ? attItem.NightShiftHours : 0; nightshifthour = Math.Round(nightshifthour, 2); double nightshifthourDept = depItem.NightShiftHours != null ? depItem.NightShiftHours.Value : 0; depItem.NightShiftHours = nightshifthourDept + nightshifthour; } else { //Nếu có check cấu hình chung là lấy giờ công trả lương if (value59.ToLower() == true.ToString().ToLower()) { double workPaidHour = attItem.WorkPaidHours; //Nếu có thai sản thì trừ đi 1h if (attItem.IsHavingPregTreatment == true && workPaidHour > 0) workPaidHour = workPaidHour - 1; depItem.PaidWorkHours += workPaidHour; } else { double workpaidhournonpreg = 0; // attItem.WorkPaidHourNonPreg != null ? attItem.WorkPaidHourNonPreg.Value : 0; workpaidhournonpreg = Math.Round(workpaidhournonpreg, 1); depItem.PaidWorkHours += workpaidhournonpreg; } } #region Gan OT List<int> lstOT = new List<int>(); Double rate = 0; //Hệ số tăng ca, kiểm tra nếu = 0 sẽ loại bỏ khỏi việc tính lương BP, vì đây là trường hợp đặc biệt (tăng ca biệt phái)-->theo phongphu. Double hourOT = 0; lstOT.Add(1); lstOT.Add(2); lstOT.Add(3); lstOT.Add(4); #region Tính OT khi được duyệt if (value8 == OverTimeStatus.E_APPROVED.ToString()) { foreach (var item in lstOT) { switch (item) { #region case 1 case 1: if (depItem.Overtime1TypeID != null && depItem.Overtime1TypeID == attItem.OvertimeTypeID) { depItem.Overtime1Hours += attItem.OvertimeRegisterHours; break; } else if (depItem.Overtime1TypeID == null) { depItem.Overtime1TypeID = attItem.OvertimeTypeID; depItem.Overtime1Hours = attItem.OvertimeRegisterHours; break; } else if (depItem.Overtime2TypeID != null && depItem.Overtime2TypeID == attItem.OvertimeTypeID) { depItem.Overtime2Hours += attItem.OvertimeRegisterHours; break; } else if (depItem.Overtime2TypeID == null) { depItem.Overtime2TypeID = attItem.OvertimeTypeID; depItem.Overtime2Hours = attItem.OvertimeRegisterHours; break; } else if (depItem.Overtime3TypeID != null && depItem.Overtime3TypeID == attItem.OvertimeTypeID) { depItem.Overtime3Hours += attItem.OvertimeRegisterHours; break; } else if (depItem.Overtime3TypeID == null) { depItem.Overtime3TypeID = attItem.OvertimeTypeID; depItem.Overtime3Hours = attItem.OvertimeRegisterHours; break; } else if (depItem.Overtime4TypeID != null && depItem.Overtime4TypeID == attItem.OvertimeTypeID) { depItem.Overtime4Hours += attItem.OvertimeRegisterHours; break; } else if (depItem.Overtime4TypeID == null) { depItem.Overtime4TypeID = attItem.OvertimeTypeID; depItem.Overtime4Hours = attItem.OvertimeRegisterHours; break; } else if (depItem.Overtime5TypeID != null && depItem.Overtime5TypeID == attItem.OvertimeTypeID) { depItem.Overtime5Hours += attItem.OvertimeRegisterHours; break; } else if (depItem.Overtime5TypeID == null) { depItem.Overtime5TypeID = attItem.OvertimeTypeID; depItem.Overtime5Hours = attItem.OvertimeRegisterHours; break; } else if (depItem.Overtime6TypeID != null && depItem.Overtime6TypeID == attItem.OvertimeTypeID) { depItem.Overtime6Hours += attItem.OvertimeRegisterHours; break; } else if (depItem.Overtime6TypeID == null) { depItem.Overtime6TypeID = attItem.OvertimeTypeID; depItem.Overtime6Hours = attItem.OvertimeRegisterHours; break; } break; #endregion #region case 2 case 2: if (depItem.Overtime1TypeID != null && depItem.Overtime1TypeID == attItem.ExtraOvertimeTypeID) { depItem.Overtime1Hours += attItem.ExtraOvertimeRegisterHours; break; } else if (depItem.Overtime1TypeID == null) { depItem.Overtime1TypeID = attItem.ExtraOvertimeTypeID; depItem.Overtime1Hours = attItem.ExtraOvertimeRegisterHours; break; } else if (depItem.Overtime2TypeID != null && depItem.Overtime2TypeID == attItem.ExtraOvertimeTypeID) { depItem.Overtime2Hours += attItem.ExtraOvertimeRegisterHours; break; } else if (depItem.Overtime2TypeID == null) { depItem.Overtime2TypeID = attItem.ExtraOvertimeTypeID; depItem.Overtime2Hours = attItem.ExtraOvertimeRegisterHours; break; } else if (depItem.Overtime3TypeID != null && depItem.Overtime3TypeID == attItem.ExtraOvertimeTypeID) { depItem.Overtime3Hours += attItem.ExtraOvertimeRegisterHours; break; } else if (depItem.Overtime3TypeID == null) { depItem.Overtime3TypeID = attItem.ExtraOvertimeTypeID; depItem.Overtime3Hours = attItem.ExtraOvertimeRegisterHours; break; } else if (depItem.Overtime4TypeID != null && depItem.Overtime4TypeID == attItem.ExtraOvertimeTypeID) { depItem.Overtime4Hours += attItem.ExtraOvertimeRegisterHours; break; } else if (depItem.Overtime4TypeID == null) { depItem.Overtime4TypeID = attItem.ExtraOvertimeTypeID; depItem.Overtime4Hours = attItem.ExtraOvertimeRegisterHours; break; } else if (depItem.Overtime5TypeID != null && depItem.Overtime5TypeID == attItem.ExtraOvertimeTypeID) { depItem.Overtime5Hours += attItem.ExtraOvertimeRegisterHours; break; } else if (depItem.Overtime5TypeID == null) { depItem.Overtime5TypeID = attItem.ExtraOvertimeTypeID; depItem.Overtime5Hours = attItem.ExtraOvertimeRegisterHours; break; } else if (depItem.Overtime6TypeID != null && depItem.Overtime6TypeID == attItem.ExtraOvertimeTypeID) { depItem.Overtime6Hours += attItem.ExtraOvertimeRegisterHours; break; } else if (depItem.Overtime6TypeID == null) { depItem.Overtime6TypeID = attItem.ExtraOvertimeTypeID; depItem.Overtime6Hours = attItem.ExtraOvertimeRegisterHours; break; } break; #endregion #region case3 case 3: if (depItem.Overtime1TypeID != null && depItem.Overtime1TypeID == attItem.ExtraOvertimeType2ID) { depItem.Overtime1Hours += attItem.ExtraOvertimeRegisterHours2; break; } else if (depItem.Overtime1TypeID == null) { depItem.Overtime1TypeID = attItem.ExtraOvertimeType2ID; depItem.Overtime1Hours = attItem.ExtraOvertimeRegisterHours2; break; } else if (depItem.Overtime2TypeID != null && depItem.Overtime2TypeID == attItem.ExtraOvertimeType2ID) { depItem.Overtime2Hours += attItem.ExtraOvertimeRegisterHours2; break; } else if (depItem.Overtime2TypeID == null) { depItem.Overtime2TypeID = attItem.ExtraOvertimeType2ID; depItem.Overtime2Hours = attItem.ExtraOvertimeRegisterHours2; break; } else if (depItem.Overtime3TypeID != null && depItem.Overtime3TypeID == attItem.ExtraOvertimeType2ID) { depItem.Overtime3Hours += attItem.ExtraOvertimeRegisterHours2; break; } else if (depItem.Overtime3TypeID == null) { depItem.Overtime3TypeID = attItem.ExtraOvertimeType2ID; depItem.Overtime3Hours = attItem.ExtraOvertimeRegisterHours2; break; } else if (depItem.Overtime4TypeID != null && depItem.Overtime4TypeID == attItem.ExtraOvertimeType2ID) { depItem.Overtime4Hours += attItem.ExtraOvertimeRegisterHours2; break; } else if (depItem.Overtime4TypeID == null) { depItem.Overtime4TypeID = attItem.ExtraOvertimeType2ID; depItem.Overtime4Hours = attItem.ExtraOvertimeRegisterHours2; break; } else if (depItem.Overtime5TypeID != null && depItem.Overtime5TypeID == attItem.ExtraOvertimeType2ID) { depItem.Overtime5Hours += attItem.ExtraOvertimeRegisterHours2; break; } else if (depItem.Overtime5TypeID == null) { depItem.Overtime5TypeID = attItem.ExtraOvertimeType2ID; depItem.Overtime5Hours = attItem.ExtraOvertimeRegisterHours2; break; } else if (depItem.Overtime6TypeID != null && depItem.Overtime6TypeID == attItem.ExtraOvertimeType2ID) { depItem.Overtime6Hours += attItem.ExtraOvertimeRegisterHours2; break; } else if (depItem.Overtime6TypeID == null) { depItem.Overtime6TypeID = attItem.ExtraOvertimeType2ID; depItem.Overtime6Hours = attItem.ExtraOvertimeRegisterHours2; break; } break; #endregion #region case 4 case 4: if (depItem.Overtime1TypeID != null && depItem.Overtime1TypeID == attItem.ExtraOvertimeType3ID) { depItem.Overtime1Hours += attItem.ExtraOvertimeRegisterHours3; break; } else if (depItem.Overtime1TypeID == null) { depItem.Overtime1TypeID = attItem.ExtraOvertimeType3ID; depItem.Overtime1Hours = attItem.ExtraOvertimeRegisterHours3; break; } else if (depItem.Overtime2TypeID != null && depItem.Overtime2TypeID == attItem.ExtraOvertimeType3ID) { depItem.Overtime2Hours += attItem.ExtraOvertimeRegisterHours3; break; } else if (depItem.Overtime2TypeID == null) { depItem.Overtime2TypeID = attItem.ExtraOvertimeType3ID; depItem.Overtime2Hours = attItem.ExtraOvertimeRegisterHours3; break; } else if (depItem.Overtime3TypeID != null && depItem.Overtime3TypeID == attItem.ExtraOvertimeType3ID) { depItem.Overtime3Hours += attItem.ExtraOvertimeRegisterHours3; break; } else if (depItem.Overtime3TypeID == null) { depItem.Overtime3TypeID = attItem.ExtraOvertimeType3ID; depItem.Overtime3Hours = attItem.ExtraOvertimeRegisterHours3; break; } else if (depItem.Overtime4TypeID != null && depItem.Overtime4TypeID == attItem.ExtraOvertimeType3ID) { depItem.Overtime4Hours += attItem.ExtraOvertimeRegisterHours3; break; } else if (depItem.Overtime4TypeID == null) { depItem.Overtime4TypeID = attItem.ExtraOvertimeType3ID; depItem.Overtime4Hours = attItem.ExtraOvertimeRegisterHours3; break; } else if (depItem.Overtime5TypeID != null && depItem.Overtime5TypeID == attItem.ExtraOvertimeType3ID) { depItem.Overtime5Hours += attItem.ExtraOvertimeRegisterHours3; break; } else if (depItem.Overtime5TypeID == null) { depItem.Overtime5TypeID = attItem.ExtraOvertimeType3ID; depItem.Overtime5Hours = attItem.ExtraOvertimeRegisterHours3; break; } else if (depItem.Overtime6TypeID != null && depItem.Overtime6TypeID == attItem.ExtraOvertimeType3ID) { depItem.Overtime6Hours += attItem.ExtraOvertimeRegisterHours3; break; } else if (depItem.Overtime6TypeID == null) { depItem.Overtime6TypeID = attItem.ExtraOvertimeType3ID; depItem.Overtime6Hours = attItem.ExtraOvertimeRegisterHours3; break; } break; #endregion } } } #endregion #region Tính OT với các trạng thái khác else { foreach (var item in lstOT) { switch (item) { #region case 1 case 1: rate = attItem.Cat_OvertimeType != null ? attItem.Cat_OvertimeType.Rate : 0; if (rate == 0) break; hourOT = Math.Round(attItem.OvertimeHours != null ? attItem.OvertimeHours : 0, 2); if (depItem.Overtime1TypeID != null && depItem.Overtime1TypeID == attItem.OvertimeTypeID) { depItem.Overtime1Hours += hourOT; break; } else if (depItem.Overtime1TypeID == null) { depItem.Overtime1TypeID = attItem.OvertimeTypeID; depItem.Overtime1Hours = hourOT; break; } else if (depItem.Overtime2TypeID != null && depItem.Overtime2TypeID == attItem.OvertimeTypeID) { depItem.Overtime2Hours += hourOT; break; } else if (depItem.Overtime2TypeID == null) { depItem.Overtime2TypeID = attItem.OvertimeTypeID; depItem.Overtime2Hours = hourOT; break; } else if (depItem.Overtime3TypeID != null && depItem.Overtime3TypeID == attItem.OvertimeTypeID) { depItem.Overtime3Hours += hourOT; break; } else if (depItem.Overtime3TypeID == null) { depItem.Overtime3TypeID = attItem.OvertimeTypeID; depItem.Overtime3Hours = hourOT; break; } else if (depItem.Overtime4TypeID != null && depItem.Overtime4TypeID == attItem.OvertimeTypeID) { depItem.Overtime4Hours += hourOT; break; } else if (depItem.Overtime4TypeID == null) { depItem.Overtime4TypeID = attItem.OvertimeTypeID; depItem.Overtime4Hours = hourOT; break; } else if (depItem.Overtime5TypeID != null && depItem.Overtime5TypeID == attItem.OvertimeTypeID) { depItem.Overtime5Hours += hourOT; break; } else if (depItem.Overtime5TypeID == null) { depItem.Overtime5TypeID = attItem.OvertimeTypeID; depItem.Overtime5Hours = hourOT; break; } else if (depItem.Overtime6TypeID != null && depItem.Overtime6TypeID == attItem.OvertimeTypeID) { depItem.Overtime6Hours += hourOT; break; } else if (depItem.Overtime6TypeID == null) { depItem.Overtime6TypeID = attItem.OvertimeTypeID; depItem.Overtime6Hours = hourOT; break; } break; #endregion #region case 2 case 2: rate = attItem.Cat_OvertimeType1 != null ? attItem.Cat_OvertimeType1.Rate : 0; if (rate == 0) break; hourOT = Math.Round(attItem.ExtraOvertimeHours != null ? attItem.ExtraOvertimeHours : 0, 2); if (depItem.Overtime1TypeID != null && depItem.Overtime1TypeID == attItem.ExtraOvertimeTypeID) { depItem.Overtime1Hours += hourOT; break; } else if (depItem.Overtime1TypeID == null) { depItem.Overtime1TypeID = attItem.ExtraOvertimeTypeID; depItem.Overtime1Hours = hourOT; break; } else if (depItem.Overtime2TypeID != null && depItem.Overtime2TypeID == attItem.ExtraOvertimeTypeID) { depItem.Overtime2Hours += hourOT; break; } else if (depItem.Overtime2TypeID == null) { depItem.Overtime2TypeID = attItem.ExtraOvertimeTypeID; depItem.Overtime2Hours = hourOT; break; } else if (depItem.Overtime3TypeID != null && depItem.Overtime3TypeID == attItem.ExtraOvertimeTypeID) { depItem.Overtime3Hours += hourOT; break; } else if (depItem.Overtime3TypeID == null) { depItem.Overtime3TypeID = attItem.ExtraOvertimeTypeID; depItem.Overtime3Hours = hourOT; break; } else if (depItem.Overtime4TypeID != null && depItem.Overtime4TypeID == attItem.ExtraOvertimeTypeID) { depItem.Overtime4Hours += hourOT; break; } else if (depItem.Overtime4TypeID == null) { depItem.Overtime4TypeID = attItem.ExtraOvertimeTypeID; depItem.Overtime4Hours = hourOT; break; } else if (depItem.Overtime5TypeID != null && depItem.Overtime5TypeID == attItem.ExtraOvertimeTypeID) { depItem.Overtime5Hours += hourOT; break; } else if (depItem.Overtime5TypeID == null) { depItem.Overtime5TypeID = attItem.ExtraOvertimeTypeID; depItem.Overtime5Hours = hourOT; break; } else if (depItem.Overtime6TypeID != null && depItem.Overtime6TypeID == attItem.ExtraOvertimeTypeID) { depItem.Overtime6Hours += hourOT; break; } else if (depItem.Overtime6TypeID == null) { depItem.Overtime6TypeID = attItem.ExtraOvertimeTypeID; depItem.Overtime6Hours = hourOT; break; } break; #endregion #region case3 case 3: rate = attItem.Cat_OvertimeType2 != null ? attItem.Cat_OvertimeType2.Rate : 0; if (rate == 0) break; hourOT = Math.Round(attItem.ExtraOvertimeHours2 != null ? attItem.ExtraOvertimeHours2 : 0, 2); if (depItem.Overtime1TypeID != null && depItem.Overtime1TypeID == attItem.ExtraOvertimeType2ID) { depItem.Overtime1Hours += hourOT; break; } else if (depItem.Overtime1TypeID == null) { depItem.Overtime1TypeID = attItem.ExtraOvertimeType2ID; depItem.Overtime1Hours = hourOT; break; } else if (depItem.Overtime2TypeID != null && depItem.Overtime2TypeID == attItem.ExtraOvertimeType2ID) { depItem.Overtime2Hours += hourOT; break; } else if (depItem.Overtime2TypeID == null) { depItem.Overtime2TypeID = attItem.ExtraOvertimeType2ID; depItem.Overtime2Hours = hourOT; break; } else if (depItem.Overtime3TypeID != null && depItem.Overtime3TypeID == attItem.ExtraOvertimeType2ID) { depItem.Overtime3Hours += hourOT; break; } else if (depItem.Overtime3TypeID == null) { depItem.Overtime3TypeID = attItem.ExtraOvertimeType2ID; depItem.Overtime3Hours = hourOT; break; } else if (depItem.Overtime4TypeID != null && depItem.Overtime4TypeID == attItem.ExtraOvertimeType2ID) { depItem.Overtime4Hours += hourOT; break; } else if (depItem.Overtime4TypeID == null) { depItem.Overtime4TypeID = attItem.ExtraOvertimeType2ID; depItem.Overtime4Hours = hourOT; break; } else if (depItem.Overtime5TypeID != null && depItem.Overtime5TypeID == attItem.ExtraOvertimeType2ID) { depItem.Overtime5Hours += hourOT; break; } else if (depItem.Overtime5TypeID == null) { depItem.Overtime5TypeID = attItem.ExtraOvertimeType2ID; depItem.Overtime5Hours = hourOT; break; } else if (depItem.Overtime6TypeID != null && depItem.Overtime6TypeID == attItem.ExtraOvertimeType2ID) { depItem.Overtime6Hours += hourOT; break; } else if (depItem.Overtime6TypeID == null) { depItem.Overtime6TypeID = attItem.ExtraOvertimeType2ID; depItem.Overtime6Hours = hourOT; break; } break; #endregion #region case 4 case 4: rate = attItem.Cat_OvertimeType3 != null ? attItem.Cat_OvertimeType3.Rate : 0; if (rate == 0) break; hourOT = Math.Round(attItem.ExtraOvertimeHours3 != null ? attItem.ExtraOvertimeHours3 : 0, 2); if (depItem.Overtime1TypeID != null && depItem.Overtime1TypeID == attItem.ExtraOvertimeType3ID) { depItem.Overtime1Hours += hourOT; break; } else if (depItem.Overtime1TypeID == null) { depItem.Overtime1TypeID = attItem.ExtraOvertimeType3ID; depItem.Overtime1Hours = hourOT; break; } else if (depItem.Overtime2TypeID != null && depItem.Overtime2TypeID == attItem.ExtraOvertimeType3ID) { depItem.Overtime2Hours += hourOT; break; } else if (depItem.Overtime2TypeID == null) { depItem.Overtime2TypeID = attItem.ExtraOvertimeType3ID; depItem.Overtime2Hours = hourOT; break; } else if (depItem.Overtime3TypeID != null && depItem.Overtime3TypeID == attItem.ExtraOvertimeType3ID) { depItem.Overtime3Hours += hourOT; break; } else if (depItem.Overtime3TypeID == null) { depItem.Overtime3TypeID = attItem.ExtraOvertimeType3ID; depItem.Overtime3Hours = hourOT; break; } else if (depItem.Overtime4TypeID != null && depItem.Overtime4TypeID == attItem.ExtraOvertimeType3ID) { depItem.Overtime4Hours += hourOT; break; } else if (depItem.Overtime4TypeID == null) { depItem.Overtime4TypeID = attItem.ExtraOvertimeType3ID; depItem.Overtime4Hours = hourOT; break; } else if (depItem.Overtime5TypeID != null && depItem.Overtime5TypeID == attItem.ExtraOvertimeType3ID) { depItem.Overtime5Hours += hourOT; break; } else if (depItem.Overtime5TypeID == null) { depItem.Overtime5TypeID = attItem.ExtraOvertimeType3ID; depItem.Overtime5Hours = hourOT; break; } else if (depItem.Overtime6TypeID != null && depItem.Overtime6TypeID == attItem.ExtraOvertimeType3ID) { depItem.Overtime6Hours += hourOT; break; } else if (depItem.Overtime6TypeID == null) { depItem.Overtime6TypeID = attItem.ExtraOvertimeType3ID; depItem.Overtime6Hours = hourOT; break; } break; #endregion } } } #endregion #endregion return depItem; }
public List<Sal_SalaryDepartmentItem> CalSalaryLineItemProfile(Sal_SalaryDepartment salDepartment, List<Att_AttendanceTableItem> lstAttItemPro, Hre_Profile pro, List<Sal_BasicSalary> lstBasicSalPro, List<Att_Roster> lstRosterPro, DateTime dfrom, DateTime dto, DateTime monthYear, Sal_SalaryDepartmentItem itemProAdd) { List<Sal_SalaryDepartmentItem> lstItem = new List<Sal_SalaryDepartmentItem>(); Double ratePer = 0; //Lấy hệ số trong lương cơ bản Sal_BasicSalary basSal = new Sal_BasicSalary(); if (lstBasicSalPro.Count == 2) basSal = lstBasicSalPro[1]; else if (lstBasicSalPro.Count == 1) basSal = lstBasicSalPro[0]; if (ratePer != basSal.PersonalRate) { ratePer = basSal.PersonalRate != null ? basSal.PersonalRate.Value : 0; Sal_SalaryDepartmentItem depItem = null; string stFIX = EnumDropDown.StatusLoadEnumSalDepartItem.E_FIX.ToString(); string stEDIT_FIX = EnumDropDown.StatusLoadEnumSalDepartItem.E_EDIT_FIX.ToString(); if (itemProAdd != null && itemProAdd.ID.ToString() != Guid.Empty.ToString() && itemProAdd.Status != stFIX && itemProAdd.Status != stEDIT_FIX) { depItem = itemProAdd; } else { depItem = new Sal_SalaryDepartmentItem(); } depItem.Sal_SalaryDepartment = salDepartment; depItem.DateFrom = dfrom; depItem.DateTo = dto; depItem.ProfileID = pro.ID; depItem.Rate = ratePer; if (itemProAdd != null) depItem.Status = itemProAdd.Status; for (DateTime idx = dfrom; idx <= dto; idx = idx.AddDays(1)) { //(3.Use general: Insert chi tiết --> Gần Finished) depItem = SetItemSalDep(depItem, lstAttItemPro, idx); } //AppConfig var service = new Sys_AttOvertimePermitConfigServices(); var value56 = service.GetConfigValue<string>(AppConfig.HRM_SAL_CONFIG_VALUE56); var value57 = service.GetConfigValue<string>(AppConfig.HRM_SAL_CONFIG_VALUE57); var value58 = service.GetConfigValue<string>(AppConfig.HRM_SAL_CONFIG_VALUE58); //Nếu có check áp dụng trừ số giờ cho nữ string gender = EnumDropDown.Gender.E_FEMALE.ToString(); if (value56.ToLower() == true.ToString().ToLower() && pro.Gender == gender) { if (!value57.IsNullOrEmpty() && !value58.IsNullOrEmpty()) { double hoursub = Convert.ToDouble(value57); double daywork = Convert.ToDouble(value58); if (hoursub > 0 && daywork > 0) { var lstAttItem = lstAttItemPro.Where(p => p.IsHavingPregTreatment == true).ToList(); //Nếu nhân viên không có thai sản if (lstAttItem.Count <= 0) { if (depItem.PaidWorkHours / 8 > daywork) depItem.PaidWorkHours = depItem.PaidWorkHours - hoursub; } } } } lstItem.Add(depItem); } return lstItem; }
public List<Sal_SalaryDepartmentItem> CalSalaryItemProfile(Sal_SalaryDepartment salDepartment, List<Att_AttendanceTableItem> lstAttItemPro, Hre_Profile pro, List<Sal_SalaryDepartmentItem> lstItemPro, DateTime dfrom, DateTime dto, DateTime monthYear) { List<Sal_SalaryDepartmentItem> lstItem = new List<Sal_SalaryDepartmentItem>(); List<Sal_SalaryDepartmentItem> lstDepItemPro = lstItemPro.Where(p => p.ProfileID == pro.ID).ToList(); Double ratePer = 0; //Lấy hệ số từ bảng Sal_SalaryDepartmentItem foreach (Sal_SalaryDepartmentItem rtDepItem in lstDepItemPro) { ratePer = rtDepItem.Rate != null ? rtDepItem.Rate : 0; Sal_SalaryDepartmentItem depItem = new Sal_SalaryDepartmentItem(); //depItem.Sal_SalaryDepartment = salDepartment; depItem.SalaryDepartmentID = salDepartment.ID; depItem.DateFrom = dfrom; depItem.DateTo = dto; depItem.ProfileID = pro.ID; depItem.Rate = ratePer; for (DateTime idx = dfrom; idx <= dto; idx = idx.AddDays(1)) { //(3.Use general: Insert chi tiết --> Gần Finished) depItem = SetItemSalDep(depItem, lstAttItemPro, idx); } lstItem.Add(depItem); } return lstItem; }
public Hashtable ComputeSalGroup(IUnitOfWork unitOfWork, DateTime monthYear, List<Sal_SalaryDepartment> lstSalDep, List<Sal_SalaryDepartmentItem> lstSalDepItem, ref List<Sal_SalaryDepartmentItem> lstItemDelete, DateTime DateStart, DateTime DateEnd, List<Cat_OrgStructure> listOrg) { #region Query Data Hashtable htSalGroup = new Hashtable(); //Nhân viên var reposProfile = new CustomBaseRepository<Hre_Profile>(unitOfWork); //Nhân viên var reposSalaryDepartmentItem = new CustomBaseRepository<Sal_SalaryDepartmentItem>(unitOfWork); //Bảng công var reposAttendanceTb = new CustomBaseRepository<Att_AttendanceTable>(unitOfWork); //Bảng công chi tiết var reposAttendanceTbItem = new CustomBaseRepository<Att_AttendanceTableItem>(unitOfWork); //Ca làm việc var reposAttRoster = new CustomBaseRepository<Att_Roster>(unitOfWork); //Lương cơ bản var reposBasicSalary = new CustomBaseRepository<Sal_BasicSalary>(unitOfWork); //Chế độ lương var reposSalGrade = new CustomBaseRepository<Sal_Grade>(unitOfWork); #endregion foreach (Sal_SalaryDepartment salDep in lstSalDep) { List<Sal_SalaryDepartmentItem> rsDepItem = new List<Sal_SalaryDepartmentItem>(); DateStart = salDep.DateFrom != null ? salDep.DateFrom.Value : DateStart; DateEnd = salDep.DateTo != null ? salDep.DateTo.Value : DateEnd; List<Guid> guidPro = new List<Guid>(); List<Guid> guidOrgAllChild = new List<Guid>(); List<Att_Roster> lstRosterLine = new List<Att_Roster>(); #region Lấy danh sách nhân viên trong phòng ban hoặc chuyền if (salDep.TypeCompute == MethodComputeGroupSalary.E_COMPUTE_LINE.ToString()) { lstRosterLine = reposAttRoster.FindBy(rs => rs.ProductionLineID == salDep.ProductionLineID && rs.IsDelete == null && rs.DateStart <= DateEnd && rs.DateEnd >= DateStart).ToList(); guidPro = lstRosterLine.Select(wh => wh.ProfileID).ToList(); } else { if (salDep.OrgStructureID == null) continue; List<Cat_OrgStructure> lstChildsStructure = null; Cat_OrgStructure DepartmentFilter = listOrg.FirstOrDefault(p => p.ID == salDep.OrgStructureID); if (DepartmentFilter != null) lstChildsStructure = GetChilds(listOrg, DepartmentFilter.ID); else lstChildsStructure = listOrg.Where(o => o.ID == salDep.OrgStructureID && o.IsDelete == null).ToList(); guidOrgAllChild = lstChildsStructure.Select(s => s.ID).Distinct().ToList(); //Lấy tất cả ID nhân viên trong các phòng ban trên. guidPro = reposProfile.FindBy(hr => hr.IsDelete == null && guidOrgAllChild.Contains(hr.OrgStructureID.Value)).Select(hr => hr.ID).ToList(); } #endregion //Danh sách NV bao gồm các trạng thái (new, edit, fix, remove) string stNEW = EnumDropDown.StatusLoadEnumSalDepartItem.E_NEW.ToString(); string stEDIT = EnumDropDown.StatusLoadEnumSalDepartItem.E_EDIT.ToString(); string stREMOVE = EnumDropDown.StatusLoadEnumSalDepartItem.E_REMOVE.ToString(); string stFIX = EnumDropDown.StatusLoadEnumSalDepartItem.E_FIX.ToString(); string stEDIT_FIX = EnumDropDown.StatusLoadEnumSalDepartItem.E_EDIT_FIX.ToString(); string[] strStatus = new string[] { stNEW, stREMOVE, stEDIT, stFIX, stEDIT_FIX }; var lstSalDepItemStatus = lstSalDepItem.Where(st => st.SalaryDepartmentID == salDep.ID && !String.IsNullOrEmpty(st.Status) && strStatus.Contains(st.Status)).ToList(); List<Guid> lstProAdd = new List<Guid>(); List<Guid> lstProFix = new List<Guid>(); List<Guid> lstProEdit = new List<Guid>(); List<Sal_SalaryDepartmentItem> lstItemRemove = new List<Sal_SalaryDepartmentItem>(); if (lstSalDepItemStatus.Count > 0) { #region LẤY RA DS NHÂN VIÊN VỚI CÁC TRẠNG THÁI //Nếu tồn tại nhân viên là Fix, thì sẽ chỉ tính những profile có trạng thái fix, bỏ qua các trạng thái khác. //Bổ sung thêm trạng thái Edit_Fix lstProFix = lstSalDepItemStatus.Where(st => st.Status == stFIX || st.Status == stEDIT_FIX).Select(st => st.ProfileID).ToList(); //Lấy danh sách NV ko phải trạng thái fix trong departmentitem để xóa đi ( vì chỉ tính lương cho NV có Fix) List<Sal_SalaryDepartmentItem> lstSalDepItemStatusNotFix = lstSalDepItem.Where(st => st.SalaryDepartmentID == salDep.ID && st.IsDelete == null).ToList(); lstSalDepItemStatusNotFix = lstSalDepItemStatusNotFix.Where(st => st.Status == null || (st.Status != stFIX && st.Status != stEDIT_FIX)).ToList(); if (lstProFix != null && lstProFix.Count > 0) { //Lấy những nhân viên không phải là Fix đưa vào trong lstItemDelete để xóa đi. if (lstSalDepItemStatusNotFix.Count > 0) lstItemDelete.AddRange(lstSalDepItemStatusNotFix); //Chỉ add những nhân viên có Fix vào để tính. guidPro.Clear(); foreach (Guid id in lstProFix) { guidPro.Add(id); } } //Nếu ko có nhân viên nào là Fix, bắt đầu kiểm tra: New, edit, remove else { //New lstProAdd = lstSalDepItemStatus.Where(st => st.Status == stNEW).Select(st => st.ProfileID).ToList(); foreach (Guid id in lstProAdd) { if (!guidPro.Contains(id)) guidPro.Add(id); } //Edit lstProEdit = lstSalDepItemStatus.Where(st => st.Status == stEDIT).Select(st => st.ProfileID).ToList(); foreach (Guid id in lstProEdit) { if (!guidPro.Contains(id)) guidPro.Add(id); } //Remove lstItemRemove = lstSalDepItemStatus.Where(st => st.Status == stREMOVE).ToList(); List<Guid> lstProRemove = lstItemRemove.Select(st => st.ProfileID).ToList(); foreach (Guid id in lstProRemove) { if (guidPro.Contains(id)) guidPro.Remove(id); } } #endregion } //Lấy grade theo ds nhân viên var lstGradeAll = reposSalGrade.FindBy(gr => gr.IsDelete == null && guidPro.Contains(gr.ProfileID)).ToList(); //Lấy Lương cơ bản theo ds nhân viên var lstBasicSal = reposBasicSalary.FindBy(sal => sal.IsDelete == null && sal.DateOfEffect <= DateEnd && guidPro.Contains(sal.ProfileID)).ToList(); //Lấy roster theo ds nhân viên var lstAllRoster = reposAttRoster.FindBy(rs => guidPro.Contains(rs.ProfileID) && rs.IsDelete == null && rs.DateStart <= DateEnd && rs.DateEnd >= DateStart) .Select(rs => new { rs.ID, rs.ProfileID, rs.DateStart, rs.DateEnd, rs.SalaryType, rs.Cat_Shift }).ToList(); //Lấy bảng công theo ds nv var lstAttAtendance = reposAttendanceTb.FindBy(att => att.IsDelete == null && att.MonthYear == monthYear && guidPro.Contains(att.ProfileID)).ToList(); var lstAttAtendanceID = lstAttAtendance.Select(att => att.ID).ToList(); //Lấy bảng công chi tiết var lstAttAttendanceItem = reposAttendanceTbItem.FindBy(it => it.IsDelete == null && lstAttAtendanceID.Contains(it.AttendanceTableID)).ToList(); //Sau khi tiến hành các bước trên, sẽ có 1 danh sách nhân viên cuối cùng để xử lý. var lstProfileOrg = reposProfile.FindBy(hr => guidPro.Contains(hr.ID)).ToList(); #region " Nếu tồn tại trạng thái Fix" if (lstProFix != null && lstProFix.Count > 0) { foreach (Hre_Profile _pro in lstProfileOrg) { //Trạng thái: EDIT_FIX //Những nhân viên đã được cố định và chỉnh sửa: Hệ số, giờ làm việc, OT thì sẽ lưu lại trong sal_departmentitem, và sẽ được lấy lên từ đây để tính, ko thông qua basicsalary nữa. Sal_SalaryDepartmentItem itemProEditFix = new Sal_SalaryDepartmentItem(); if (lstProFix.Contains(_pro.ID)) { itemProEditFix = lstSalDepItem.Where(it => it.ProfileID == _pro.ID && it.SalaryDepartmentID == salDep.ID && it.Status == stEDIT_FIX).FirstOrDefault(); if (itemProEditFix != null) { rsDepItem.Add(itemProEditFix); continue; } } Sal_SalaryDepartmentItem itemProFix = new Sal_SalaryDepartmentItem(); ; itemProFix = lstSalDepItem.Where(it => it.ProfileID == _pro.ID && it.SalaryDepartmentID == salDep.ID && it.Status == stFIX).FirstOrDefault(); #region Ver8 chưa dùng //Sal_Grade grade = GradeDAO.GetGrade(lstGradeAll, _pro.ID, DateEnd); //if (grade == null) //{ // continue; //} //Cat_GradeCfg gradeCfg = lstGradeCfg.Where(gra => gra.ID == grade.GradeID).FirstOrDefault(); //if (gradeCfg == null || gradeCfg.Formula != enumFomula) // continue; //AttendanceService.GetSalaryDateRange(gradeCfg, sys_AppConfig, null, monthYear, out DateStart, out DateEnd); //if (salDep.DateFrom != null && salDep.DateFrom.Value >= DateStart && salDep.DateFrom.Value <= DateEnd) //{ // DateStart = salDep.DateFrom.Value; //} //if (salDep.DateTo != null && salDep.DateTo.Value >= DateStart && salDep.DateTo.Value <= DateEnd) //{ // DateEnd = salDep.DateTo.Value; //} #endregion //dữ liệu công var _att = lstAttAtendance.Where(att => att.ProfileID == _pro.ID).Select(att => new { att.ID }).FirstOrDefault(); if (_att == null) continue; var _attLstItem1 = lstAttAttendanceItem.Where(at => at.AttendanceTableID == _att.ID).ToList(); List<Att_AttendanceTableItem> _attLstItem = new List<Att_AttendanceTableItem>(); #region Xử lý trường hợp 1 tháng có 2 cách tính lương ( lương bộ phận và lương thời gian). Vì vậy cần kiểm tra roster để lấy công cho phù hợp. if (lstAllRoster.Count > 0) { var roster = lstAllRoster.Where(ro => ro.ProfileID == _pro.ID && ro.DateStart.Year == monthYear.Year && ro.DateEnd.Month >= monthYear.Month && ro.DateStart.Month <= monthYear.Month && ro.SalaryType != null && ro.SalaryType == SalaryRosterType.E_DEPTSAL.ToString()).FirstOrDefault(); if (roster != null && roster.Cat_Shift != null) { _attLstItem = _attLstItem1.Where(it => it.ShiftID.HasValue && it.ShiftID.Value == roster.Cat_Shift.ID && it.WorkDate >= roster.DateStart && it.WorkDate <= roster.DateEnd && it.DutyCode == DutyCode.E_ON.ToString()).ToList(); } else //Trừ bớt các ngày công là timesal { var rostertimesal = lstAllRoster.Where(ro => ro.ProfileID == _pro.ID && ro.DateStart.Year == monthYear.Year && ro.DateEnd.Month >= monthYear.Month && ro.DateStart.Month <= monthYear.Month && ro.SalaryType != null && ro.SalaryType == SalaryRosterType.E_TIMESAL.ToString()).FirstOrDefault(); if (rostertimesal != null && rostertimesal.Cat_Shift != null) { List<Att_AttendanceTableItem> lstattitemtimesal = _attLstItem1.Where(it => it.ShiftID.HasValue && it.ShiftID.Value == rostertimesal.Cat_Shift.ID && it.WorkDate >= rostertimesal.DateStart && it.WorkDate <= rostertimesal.DateEnd && it.DutyCode == DutyCode.E_ON.ToString()).ToList(); foreach (Att_AttendanceTableItem it in lstattitemtimesal) { if (it != null) _attLstItem1.Remove(it); } } } } if (_attLstItem.Count < 1) _attLstItem = _attLstItem1; #endregion List<Sal_BasicSalary> lstBasicSalPro = lstBasicSal.Where(sal => sal.ProfileID == _pro.ID).OrderByDescending(sal => sal.DateOfEffect).ToList(); //Xóa những nhân viên được Fix có lương cơ bản đã đc tính trước đó, để tính lại. if (lstBasicSalPro != null && lstBasicSalPro.Count > 0) { List<Sal_SalaryDepartmentItem> lstItemFix = lstSalDepItem.Where(it => it.ProfileID == _pro.ID && it.SalaryDepartmentID == salDep.ID && (it.Status == stFIX || it.Status == stEDIT_FIX)).ToList(); if (lstItemFix != null && lstItemFix.Count > 0) lstItemDelete.AddRange(lstItemFix); } //Bắt đầu thêm giờ công, hệ số, giờ OT lần lượt cho từng người (XC 1.2) if (salDep.TypeCompute == MethodComputeGroupSalary.E_COMPUTE_LINE.ToString()) { List<Att_Roster> lstRosterPro = lstRosterLine.Where(rs => rs.ProfileID == _pro.ID).ToList(); rsDepItem.AddRange(CalSalaryLineItemProfile(salDep, _attLstItem, _pro, lstBasicSalPro, lstRosterPro, DateStart, DateEnd, monthYear, itemProFix)); } else { rsDepItem.AddRange(CalSalaryDepartmentItemProfile(salDep, _attLstItem, _pro, lstBasicSalPro, DateStart, DateEnd, monthYear, itemProFix)); } } } #endregion #region " Không tồn tại trạng thái Fix" else { //test //lstProfileOrg = lstProfileOrg.Where(hr => hr.CodeEmp == "VPM183").ToList(); //end test foreach (Hre_Profile _pro in lstProfileOrg) { //Trạng thái: NEW //Những nhân viên trong trạng thái này sẽ ko thuộc phòng ban hoặc chuyền ban đầu. Khi đó các hệ số, giờ làm việc, OT sẽ được thêm vào và lưu trong sal_departmentitem Sal_SalaryDepartmentItem itemProAdd = new Sal_SalaryDepartmentItem(); if (lstProAdd.Contains(_pro.ID)) { itemProAdd = lstSalDepItem.Where(it => it.ProfileID == _pro.ID && it.SalaryDepartmentID == salDep.ID && it.Status == stNEW).FirstOrDefault(); rsDepItem.Add(itemProAdd); continue; } //Trạng thái: EDIT //Những nhân viên đã được chỉnh sửa: Hệ số, giờ làm việc, OT thì sẽ lưu lại trong sal_departmentitem, và sẽ được lấy lên từ đây để tính, ko thông qua basicsalary nữa. if (lstProEdit.Contains(_pro.ID)) { itemProAdd = lstSalDepItem.Where(it => it.ProfileID == _pro.ID && it.SalaryDepartmentID == salDep.ID && it.Status == stEDIT).FirstOrDefault(); rsDepItem.Add(itemProAdd); continue; } #region Ver8 chưa dùng //Sal_Grade grade = GradeDAO.GetGrade(lstGradeAll, _pro.ID, DateEnd); //if (grade == null) //{ // continue; //} //Cat_GradeCfg gradeCfg = lstGradeCfg.Where(gra => gra.ID == grade.GradeID).FirstOrDefault(); //if (gradeCfg == null || gradeCfg.Formula != enumFomula) // continue; //List<Sal_SalaryDepartmentItem> lstItemPro = lstSalDepItem.Where(it => it.ProfileID == _pro.ID && it.SalaryDepartmentID == salDep.ID // && (String.IsNullOrEmpty(it.Status) || !strStatus.Contains(it.Status))).ToList(); //lstItemDelete.AddRange(lstItemPro); //AttendanceService.GetSalaryDateRange(gradeCfg, sys_AppConfig, null, monthYear, out DateStart, out DateEnd); //if (salDep.DateFrom != null && salDep.DateFrom.Value >= DateStart && salDep.DateFrom.Value <= DateEnd) //{ // DateStart = salDep.DateFrom.Value; //} //if (salDep.DateTo != null && salDep.DateTo.Value >= DateStart && salDep.DateTo.Value <= DateEnd) //{ // DateEnd = salDep.DateTo.Value; //} #endregion //dữ liệu công var _att = lstAttAtendance.Where(att => att.ProfileID == _pro.ID).Select(att => new { att.ID }).FirstOrDefault(); if (_att == null) continue; var _attLstItem1 = lstAttAttendanceItem.Where(at => at.AttendanceTableID == _att.ID).ToList(); List<Att_AttendanceTableItem> _attLstItem = new List<Att_AttendanceTableItem>(); #region Xử lý trường hợp 1 tháng có 2 cách tính lương ( lương bộ phận và lương thời gian). Vì vậy cần kiểm tra roster để lấy công cho phù hợp. if (lstAllRoster.Count > 0) { var roster = lstAllRoster.Where(ro => ro.ProfileID == _pro.ID && ro.DateStart.Year == monthYear.Year && ro.DateEnd.Month >= monthYear.Month && ro.DateStart.Month <= monthYear.Month && ro.SalaryType != null && ro.SalaryType == SalaryRosterType.E_DEPTSAL.ToString()).FirstOrDefault(); if (roster != null && roster.Cat_Shift != null) { _attLstItem = _attLstItem1.Where(it => it.ShiftID.HasValue && it.ShiftID.Value == roster.Cat_Shift.ID && it.WorkDate >= roster.DateStart && it.WorkDate <= roster.DateEnd && it.DutyCode == DutyCode.E_ON.ToString()).ToList(); } else //Trừ bớt các ngày công là timesal { var rostertimesal = lstAllRoster.Where(ro => ro.ProfileID == _pro.ID && ro.DateStart.Year == monthYear.Year && ro.DateEnd.Month >= monthYear.Month && ro.DateStart.Month <= monthYear.Month && ro.SalaryType != null && ro.SalaryType == SalaryRosterType.E_TIMESAL.ToString()).FirstOrDefault(); if (rostertimesal != null && rostertimesal.Cat_Shift != null) { List<Att_AttendanceTableItem> lstattitemtimesal = _attLstItem1.Where(it => it.ShiftID.HasValue && it.ShiftID.Value == rostertimesal.Cat_Shift.ID && it.WorkDate >= rostertimesal.DateStart && it.WorkDate <= rostertimesal.DateEnd && it.DutyCode == DutyCode.E_ON.ToString()).ToList(); foreach (Att_AttendanceTableItem it in lstattitemtimesal) { if (it != null) _attLstItem1.Remove(it); } } } } if (_attLstItem.Count < 1) _attLstItem = _attLstItem1; #endregion List<Sal_BasicSalary> lstBasicSalPro = lstBasicSal.Where(sal => sal.ProfileID == _pro.ID).OrderByDescending(sal => sal.DateOfEffect).ToList(); //Bắt đầu thêm giờ công, hệ số, giờ OT lần lượt cho từng người (XC 1.2) if (salDep.TypeCompute == MethodComputeGroupSalary.E_COMPUTE_LINE.ToString()) { List<Att_Roster> lstRosterPro = lstRosterLine.Where(rs => rs.ProfileID == _pro.ID).ToList(); rsDepItem.AddRange(CalSalaryLineItemProfile(salDep, _attLstItem, _pro, lstBasicSalPro, lstRosterPro, DateStart, DateEnd, monthYear, itemProAdd)); } else { rsDepItem.AddRange(CalSalaryDepartmentItemProfile(salDep, _attLstItem, _pro, lstBasicSalPro, DateStart, DateEnd, monthYear, itemProAdd)); } } } #endregion //Trả về 0 các trạng thái REMOVE đã tính lần đầu lstItemRemove.ForEach(it => it.AmoutSalary = 0); //Tính toán tiền lương và các loại tiền OT (XC Finished) ComputeAmountPro(rsDepItem, salDep); foreach (var t in rsDepItem) { t.ID = Guid.NewGuid(); reposSalaryDepartmentItem.Add(t); } //View lên lưới những nhân viên đã chuyển qua trạng thái là E_REMOVE. //Mục đích: Nếu muốn tính lại cho những NV này thì edit chuyển trạng thái lại để tính. rsDepItem.AddRange(lstItemRemove); htSalGroup.Add(salDep, rsDepItem); } return htSalGroup; }