using System; using System.Collections.Generic; using System.Linq; using System.Text; using Ease.Core; using Ease.Core.Model; using System.Data; namespace HRM.BO { #region OPIProcessDetail public class OPIProcessDetail : BasicBaseObject { private List _employees; private List _processDetails; private List _opiParameters; private List _opiItems; // private DataSet _dsOPIRegister; // private List _processItems; //private List _processStatuses; public DateTime _processMonth; //public event ProcessStatus ProcessStatus; //public event ProgressStatus ProgressStatus; #region Constructor public OPIProcessDetail() { //_accountNo = string.Empty; //_bankID = null; //_branchID = null; //_categoryID = null; //_departmentID = null; //_designationID = null; //_employeeID = null; //_gender = EnumGender.None; //_gradeID = null; //_isConfirmed = false; //_isFinalize = false; //_locationID = null; //_oPIProcessID = null; //_payrollTypeID = null; //_pfMemberType = EnumPFMembershipType.Live; //_religionID = null; //_remarks = string.Empty; //_oPIProcessDetailItems = null; //_gradeSalaries = null; //_employee = null; //_arreargradeSalaries = null; //_arrearPaidgradeSalaries = null; this.opiProcessDetailItems = new List(); } #endregion #region Properties public string AccountNo { get; set; } public int? BankID { get; set; } public int? BranchID { get; set; } public int? CategoryID { get; set; } public int? DepartmentID { get; set; } public int? DesignationID { get; set; } public int EmployeeID { get; set; } public EnumGender Gender { get; set; } public int? GradeID { get; set; } public bool IsConfirmed { get; set; } public bool IsFinalize { get; set; } public int? LocationID { get; set; } public int OPIProcessID { get; set; } public int PayrollTypeID { get; set; } public EnumPFMembershipType PFMemberType { get; set; } public int ReligionID { get; set; } public string Remarks { get; set; } public List opiProcessDetailItems { get; set; } public Employee Employee { get; set; } //#region Employee : Employee //private Employee _employee; //public Employee Employee //{ // get // { // if (_employeeID.Integer > 0 && _employee == null) // { // _employee = new Employee(); // _employee = Payroll.BO.Employee.Get(_employeeID); // } // return this._employee; // } // set // { // _employee = value; // } //} //#endregion public List GradeSalaries { get; set; } public List ArrearGradeSalaries { get; set; } public List ArrearPaidGradeSalaries { get; set; } //#region Service Factory IOPIProcessDetailService : IOPIProcessDetailService //internal static IOPIProcessDetailService Service //{ // get // { // return Services.Factory.CreateService(typeof(IOPIProcessDetailService)); // } //} //#endregion //public List Errors //{ // get // { // return _processStatuses; // } //} #endregion //#region Functions //public static OPIProcessDetail Get(ID nOPIProcessDetailID) //{ // OPIProcessDetail oOPIProcessDetail = null; // #region Cache Header // oOPIProcessDetail = (OPIProcessDetail)_cache["Get", nOPIProcessDetailID]; // if (oOPIProcessDetail != null) // return oOPIProcessDetail; // #endregion // oOPIProcessDetail = OPIProcessDetail.Service.Get(nOPIProcessDetailID); // #region Cache Footer // _cache.Add(oOPIProcessDetail, "Get", nOPIProcessDetailID); // #endregion // return oOPIProcessDetail; //} //public static List Get() //{ // #region Cache Header // List oOPIProcessDetails = _cache["Get"] as List; // if (oOPIProcessDetails != null) // return oOPIProcessDetails; // #endregion // try // { // oOPIProcessDetails = Service.Get(); // } // catch (ServiceException e) // { // throw new Exception(e.Message, e); // } // #region Cache Footer // _cache.Add(oOPIProcessDetails, "Get"); // #endregion // return oOPIProcessDetails; //} //public ID Save() //{ // this.SetAuditTrailProperties(); // return OPIProcessDetail.Service.Save(this); //} //public void Delete(ID id) //{ // OPIProcessDetail.Service.Delete(id); //} //#region ProgressBar //private void UpdateprocessStatus(string statusString) //{ // if (ProcessStatus != null) ProcessStatus(statusString); //} //private void UpdateProgressStatus(EnumProcessStatus status) //{ // if (ProgressStatus != null) ProgressStatus(status); //} //#endregion //public List Process(List employees, DateTime processMonth) //{ // //SalaryException oSException = new SalaryException(); // _employees = employees; // _processMonth = processMonth; // UpdateprocessStatus("Collecting Employee basic information...."); // //this.Initialize(); // this.AddEmployeeToProcessDetail(); // //if (_processStatuses.Count > 0) return; // UpdateprocessStatus("Calculating Employee basic Salary...."); // this.BasicSalary(); // UpdateprocessStatus("Calculating Employees benifits and deduction...."); // this.OPIItems(); // //this.LeavePrepare(oSException.GetEmpLeaveStatus()); // return _processDetails; //} //private void AddEmployeeToProcessDetail() //{ // _processDetails = new List(); // UpdateProgressStatus(EnumProcessStatus.Start); // foreach (Employee employee in _employees) // { // UpdateProgressStatus(EnumProcessStatus.PerformStep); // PayrollPayrollGlobalFunctions.UpdateStatus(" Collecting information for the employee " + employee.Name + " ( " + employee.EmployeeNo + ")"); // OPIProcessDetail procDetail = new OPIProcessDetail(); // procDetail.CategoryID = employee.CategoryID; // procDetail.EmployeeID = employee.ID; // procDetail.Gender = employee.Gender; // procDetail.IsConfirmed = employee.IsConfirmed; // procDetail.PayrollTypeID = employee.PayrollTypeID; // procDetail.PFMemberType = employee.PFMemberType; // procDetail.ReligionID = employee.ReligionID; // procDetail.GradeID = employee.GradeID; // procDetail.DepartmentID = employee.DepartmentID; // procDetail.DesignationID = employee.DesignationID; // procDetail.LocationID = employee.LocationID; // if (employee.PaymentMode == EnumPaymentMode.BankTransfer) // { // procDetail.BranchID = employee.BranchID; // Branch branch = new Branch(); // branch = Branch.Get(employee.BranchID); // procDetail.BankID = branch.BankID; // procDetail.AccountNo = employee.AccountNo; // } // else // { // procDetail.BranchID = ID.FromInteger(0); // procDetail.BankID = ID.FromInteger(0); // } // procDetail.Employee = employee; // _processDetails.Add(procDetail); // } // UpdateProgressStatus(EnumProcessStatus.End); //} //private void AddProcessStatus(Employee employee, string remarks) //{ // SalaryProcessStatus status = new SalaryProcessStatus(); // status.EmployeeNo = employee.EmployeeNo; // status.Name = employee.Name; // status.Remarks = remarks; // _processStatuses.Add(status); //} //private void BasicSalary() //{ // //GetCurrentMonthSalaryItems function return current month's employee grade, salary and effect date. // //effect date must sorted, otherwise error will be generated from next function. // #region Calculate Normal Salary // List gradeSalaryItems = EmployeeGradeSalary.Service.GetCurrMonthSalaryItems(SystemInformation.CurrentSysInfo.NextPayProcessDate); // foreach (OPIProcessDetail opiProcess in _processDetails ) // { // opiProcess.GradeSalaries = EmployeeGradeSalary.Get(gradeSalaryItems, opiProcess.EmployeeID); // if (opiProcess.GradeSalaries.Count == 0) continue; // EmployeeGradeSalary.PrepareDataForCurrentSalary(opiProcess.Employee, opiProcess.GradeSalaries); // } // #endregion Calculate Normal Salary // #region calculate arrear amount // List arrearItems = EmployeeGradeSalary.Service.GetArrearItems(SystemInformation.CurrentSysInfo.PayrollTypeID.Integer); // foreach (OPIProcessDetail opiProcess in _processDetails) // { // opiProcess.ArrearGradeSalaries = EmployeeGradeSalary.Get(arrearItems, opiProcess.EmployeeID); // if (opiProcess.ArrearGradeSalaries.Count > 0) // { // DateTime arrearPaidFrom = opiProcess.ArrearGradeSalaries[0].EffectDate; // opiProcess.ArrearPaidGradeSalaries = EmployeeGradeSalary.Service.GetArrearPaidItems(opiProcess.EmployeeID, arrearPaidFrom,SystemInformation.CurrentSysInfo.PayrollTypeID.Integer); // } // } // #endregion calculate arrear amount //} //private void OPIItems() //{ // _opiParameters = OpiParameter.Get(EnumStatus.Active); // if (_opiParameters == null || _opiParameters.Count == 0) return; // List opiIndividuals = OpiParameterIndividual.Service.Get( // PayrollPayrollGlobalFunctions.PayrollFirstDateOfMonth(_processMonth), // PayrollPayrollGlobalFunctions.PayrollLastDateOfMonth(_processMonth)); // OpiParameter paramter = new OpiParameter(); // List paramters; // foreach (OPIProcessDetail detail in _processDetails) // { // // Regular Grade defined parameters // paramters = paramter.ApplicableParameters(detail.Employee, // detail, _opiParameters, detail.GradeSalaries); // this.GradeDefinedOpiItem(detail, detail.GradeSalaries, paramters); // // Arrear Grade defined parameters // paramters = paramter.ApplicableParameters(detail.Employee, // detail, _opiParameters, detail.ArrearGradeSalaries); // this.GradeDefinedOpiItem(detail, detail.GradeSalaries, paramters); // // Arrear already paid parameters // paramters = paramter.ApplicableParameters(detail.Employee, // detail, _opiParameters, detail.ArrearPaidGradeSalaries); // this.GradeDefinedOpiItem(detail, detail.GradeSalaries, paramters); // //this.IndividualOpiItem(detail, opiIndividuals); // } //} //private void Add(OPIProcessDetail processDetail, OPIProcessDetailItem item) //{ // OPIProcessDetailItem existItem = processDetail.OPIProcessDetailItems.Find(delegate(OPIProcessDetailItem fItem) { return fItem.OPIItemID == item.OPIItemID; }); // if (existItem == null) // { // processDetail.OPIProcessDetailItems.Add(item); // } // else // { // existItem.NetAmount = existItem.NetAmount + item.NetAmount; // existItem.ChangeNetAmount = existItem.ChangeNetAmount + item.ChangeNetAmount; // existItem.Description = item.Description; // } //} //private void GradeDefinedOpiItem(OPIProcessDetail detail, List gradeSalaries, // List paramters) //{ // double amount = 0, totalAmount = 0, paidAmount = 0, remainingAmount; // int totalMonth = 12, paidMonth = 0, remainingMonth = 0; // //int randomEmployee = (new Random()).Next(1, _employees.Count); // int empNumber = 1; // foreach (EmployeeGradeSalary empGradeSalary in gradeSalaries) // { // foreach (OpiParameter parameter in paramters) // { // if (parameter.EntitleType == EnumEntitleType.Grade) // { // //amount = parameter.GetGradeDefinedAmount(detail.Employee, empGradeSalary.BasicSalary, empGradeSalary.GrossSalary); // if (parameter.IsFlatAmount == true) amount = amount * empGradeSalary.FractionofFromTo; // } // else continue; // OPIProcessDetailItem opdItem = new OPIProcessDetailItem(); // switch (parameter.OpiPeriodicity) // { // case EnumOpiPeriodicity.Monthly: // opdItem.NetAmount = amount; // opdItem.ChangeNetAmount = amount; // //opdItem.TaxAmount = // break; // case EnumOpiPeriodicity.OnceOff: // opdItem.NetAmount = amount; // opdItem.ChangeNetAmount = amount; // //opdItem.TaxAmount = // break; // case EnumOpiPeriodicity.Annual: // paidMonth = Convert.ToInt32(Payroll.BO.SystemInformation.CurrentSysInfo.NextPayProcessDate.Date.Month); // remainingMonth = totalMonth - (paidMonth); // totalAmount = amount * totalMonth; // paidAmount = paidMonth * amount; // remainingAmount = totalAmount - paidAmount; // opdItem.NetAmount = remainingAmount / remainingMonth; // opdItem.ChangeNetAmount = remainingAmount / remainingMonth; // //opdItem.TaxAmount = // break; // //case EnumOpiPeriodicity.AveragePayment: // // break; // //case EnumOpiPeriodicity.OnAmount: // // indvAmnt = amount / _processDetails.Count; // // fractionAmount = (indvAmnt - Math.Round(indvAmnt, 0)) * _processDetails.Count; // // if (empNumber == gradeSalaries.Count) // // { // // opdItem.NetAmount = Math.Round(indvAmnt, 0) + fractionAmount; // // opdItem.ChangeNetAmount = Math.Round(indvAmnt, 0) + fractionAmount; // // } // // else // // { // // opdItem.NetAmount = Math.Round(indvAmnt, 0); // // opdItem.ChangeNetAmount = Math.Round(indvAmnt, 0); // // } // // //opdItem.TaxAmount = // // break; // default: // break; // } // opdItem.Description = parameter.OpiItem.Name; // opdItem.OPIItemID = parameter.OpiItemID; // opdItem.OPIProcessDetailID = this.ID; // opdItem.OPIType = parameter.OpiItem.OpiType; // _opiItems = OpiItem.Get(); // if (_opiItems != null && _opiItems.Count > 0) // opdItem.Sequence = _opiItems.GetItem(parameter.OpiItem.ID).Sequence; // this.Add(detail, opdItem); // add the item in the collection // } // empNumber++; // } //} //private void IndividualOpiItem(OPIProcessDetail detail, List opiIndividuals) //{ // //double amount = 0; // //EnumSalaryGroup groupCode = EnumSalaryGroup.Gross; // //#region Individual Allowance // //List items = opiIndividuals.FindAll(delegate(OpiParameterIndividual item) // //{ // // return item.EmployeeId.Integer == detail.Employee.ID.Integer && item.IndividualType == EnumOPIIndivdualType.AppliedToIndividual; // //}); // //foreach (OpiParameterIndividual item in items) // //{ // // amount = 0; // // OpiParameter parameter = _opiParameters.GetItem(item.OpiParameterID); // // amount = parameter.GetIndividualAmount(detail.Employee, _processMonth, item, // // detail.Employee.GrossSalary, detail.GetGrossAmount(EnumSalaryItemCode.Basic_Salary, (int)EnumSalaryItemCode.Basic_Salary)); // // EnumSalaryItemCode itemCode = EnumSalaryItemCode.Allowance; // // groupCode = EnumSalaryGroup.Gross; // // if (parameter.AllowOrDeductType == EnumAllowOrDeduct.Deduction) // // { // // itemCode = EnumSalaryItemCode.Deduction; // // groupCode = EnumSalaryGroup.Deductions; // // } // // if (item.Arreartype == EnumArrearType.ToCalculate) groupCode = EnumSalaryGroup.Arrear; // // SalaryMonthlyDetail detail = salary.GetDetail(groupCode, itemCode, parameter.AllowDeductID.Integer); // // if (detail == null) // // detail = this.AddDetail(salary, groupCode, itemCode, parameter.AllowDeductID.Integer, parameter.ID.Integer, parameter.AllowanceDeduction.Name, amount); // // else // // { // // detail.CalculatedAmount = detail.CalculatedAmount + amount; // // detail.CalculatedAmount = PayrollPayrollGlobalFunctions.Round(detail.CalculatedAmount); // // detail.ChangedAmount = detail.CalculatedAmount; // // } // // detail.Position = item.AllowDeduct.Sequence + 1; // //} // //#endregion Individual Allowance //} //#endregion //public static List GetDetail(DateTime _SalaryMonth) //{ // #region Cache Header // List oOPIProcessDetails = _cache["Get"] as List; // if (oOPIProcessDetails != null) // return oOPIProcessDetails; // #endregion // try // { // oOPIProcessDetails = Service.Get(_SalaryMonth); // } // catch (ServiceException e) // { // throw new Exception(e.Message, e); // } // #region Cache Footer // _cache.Add(oOPIProcessDetails, "Get"); // #endregion // return oOPIProcessDetails; //} } #endregion //#region IOPIProcessDetail Service //public interface IOPIProcessDetailService //{ // OPIProcessDetail Get(ID id); // List Get(); // ID Save(OPIProcessDetail item); // void Save(OPIProcess oProcess, List oPDetails); // void Delete(ID id); // List Get(DateTime _SalaryMonth); //} //#endregion }