using System; using System.Collections.Generic; using System.Linq; using System.Text; using Ease.CoreV35; using Ease.CoreV35.Model; using Ease.CoreV35.Caching; using System.Data; using System.Collections; namespace Payroll.BO { [Serializable] public class MonthEnd:BasicBaseObject { private DateTime _month; private DateTime _dPaymentDate; private ObjectsTemplate _salaryMonthlys; private ObjectsTemplate _pfTransactions; private ObjectsTemplate _loanShedules; private ObjectsTemplate _incometaxes; private ObjectsTemplate _oESBDefinitions = null; private ObjectsTemplate _oESBProvisions = null; ObjectsTemplate _oSProcess = null; public MonthEnd() { } private bool Validation() { return false; } public void DoMonthEnd(DateTime month, ObjectsTemplate salaries,DateTime dPaymentDate) { _dPaymentDate = dPaymentDate; _salaryMonthlys = salaries; _loanShedules = new ObjectsTemplate(); _month = month; _oSProcess = SalaryProcess.Get(month); Process(); SalaryProcess sprocess = new SalaryProcess(); SalaryProcess.Service.MonthEnd(month,_pfTransactions,_loanShedules,_oESBProvisions,Payroll.BO.SystemInformation.CurrentSysInfo.PayrollTypeID.Integer); SystemInformation sinfo = SystemInformation.Get(); sinfo.NextPayProcessDate = month; SystemInformation.Service.Update(sinfo); } private void Process() { _oESBDefinitions = new ObjectsTemplate(); _oESBProvisions = new ObjectsTemplate(); List oPfExceptions = PFException.Get(); List oEmployees = Employee.GetAllEmps(); ESBProvision oESBProvision = null; ESBDefinition oESBDefinition = null; DataSet oDS=null; bool doProvision = ConfigurationManager.GetBoolValue("gratuity", "doprovision", EnumConfigurationType.Logic); if (doProvision) { oDS = new DataSet(); //oDS = ESBProvision.GetCumulativeProv(_month); _oESBDefinitions = ESBDefinition.Get(); } _pfTransactions = new ObjectsTemplate(); foreach(SalaryProcess oSP in _oSProcess) { oSP.PaymentDate = _dPaymentDate; oSP.MonthEndDate = Payroll.BO.SystemInformation.CurrentSysInfo.NextPayProcessDate; oSP.Update(oSP); } foreach (SalaryMonthly item in _salaryMonthlys) { Employee oEmp = oEmployees.FirstOrDefault(x => x.ID == item.EmployeeID); if (oEmp != null && oEmp.PFMemberType == EnumPFMembershipType.Live) { //_pfTransactions = new ObjectsTemplate(); #region PF transaction #region EPF PFTransaction epf = new PFTransaction(); epf.EmployeeID = item.EmployeeID; epf.MonthDate = _month; epf.TranAmount = item.GetDeductAmount(EnumSalaryItemCode.PF_Contribution, (int)EnumSalaryItemCode.PF_Contribution); epf.TranType = EnumPFTranType.PFAmount; epf.SetAuditTrail(); _pfTransactions.Add(epf); #endregion #region CPF PFException oEmpPFException = oPfExceptions.FirstOrDefault(x => x.EmployeeID == item.Employee.ID); PFTransaction cpf = new PFTransaction(); cpf.EmployeeID = item.EmployeeID; cpf.MonthDate = _month; if (oEmpPFException != null) // && oEmpPFException.StartDate <= item.SalaryMonth) // Dont open this { cpf.TranAmount = oEmpPFException.CPFPercent == 0 ? oEmpPFException.CPFAmount : GlobalFunctions.Round(item.ThisMonthBasic * (oEmpPFException.CPFPercent / 100)); } else { cpf.TranAmount = item.GetDeductAmount(EnumSalaryItemCode.PF_Contribution, (int)EnumSalaryItemCode.PF_Contribution); } cpf.TranType = EnumPFTranType.CPFAmount; cpf.SetAuditTrail(); _pfTransactions.Add(cpf); #endregion #endregion PF transaction } #region Loan Installment payment update List loans = item.Details.FindAll(delegate(SalaryMonthlyDetail detail) { return detail.ItemCode == EnumSalaryItemCode.Loan_Monthly_Installment; }); if (loans != null) { foreach (SalaryMonthlyDetail loan in loans) { LoanSchedule laonshedule = new LoanSchedule(); laonshedule.PaymentDate = _month; laonshedule.setId(loan.SupportID); _loanShedules.Add(laonshedule); } } #endregion Loan Installment payment update #region Gratuity Provision if (doProvision) { oESBDefinition = ESBDefinition.Get(_oESBDefinitions, item.Employee); if (oESBDefinition == null) throw new ServiceException("gratuity rule not found for the employee"); // add employee NO and Name oESBProvision = new ESBProvision(); oESBDefinition.CalculateProvisionAmount(item.Employee, item.Details, oESBProvision, oDS); oESBProvision.EmployeeID = item.EmployeeID; oESBProvision.SalaryMonthlyID = item.ID; oESBProvision.ProcessMonthDate = item.SalaryMonth; oESBProvision.UserID = Payroll.BO.User.CurrentUser.UserAccessTypes[0].PayrollTypeObj.ID; _oESBProvisions.Add(oESBProvision); } #endregion } #region PF Exception foreach (PFException oEmpPFException in oPfExceptions) { Employee oEmp = oEmployees.FirstOrDefault(x => x.ID == oEmpPFException.EmployeeID); if (oEmp == null) continue; if (_salaryMonthlys.Any(x => x.EmployeeID == oEmpPFException.EmployeeID)) { if (oEmp.PFMemberType == EnumPFMembershipType.Live) continue; } //if (oEmpPFException.StartDate > _month) // continue; #region EPF PFTransaction epf = new PFTransaction(); epf.EmployeeID = oEmpPFException.EmployeeID; epf.MonthDate = _month; epf.TranAmount = oEmpPFException.EPFPercent == 0 ? oEmpPFException.EPFAmount : GlobalFunctions.Round(oEmp.BasicSalary * (oEmpPFException.EPFPercent / 100)); epf.TranType = EnumPFTranType.PFAmount; epf.SetAuditTrail(); _pfTransactions.Add(epf); #endregion #region CPF PFTransaction cpf = new PFTransaction(); cpf.EmployeeID = oEmpPFException.EmployeeID; cpf.MonthDate = _month; cpf.TranAmount = oEmpPFException.CPFPercent == 0 ? oEmpPFException.CPFAmount : GlobalFunctions.Round(oEmp.BasicSalary * (oEmpPFException.CPFPercent / 100)); cpf.TranType = EnumPFTranType.CPFAmount; cpf.SetAuditTrail(); _pfTransactions.Add(cpf); #endregion } #endregion } } }