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.Linq.Mapping; using System.Data; namespace Payroll.BO { #region TaxParameter [Serializable] public class TaxParameter : AuditTrailBase { #region Cache Store private static Cache _cache = new Cache(typeof(TaxParameter)); #endregion #region Constructor public TaxParameter() { _fiscalYear = string.Empty; _assessmentYear = string.Empty; _maxInvestPercent = 0; _maxHRPercent = 0; _maxHRAmount = 0; _maxMedicalAmount = 0; _maxConvAmount = 0; _maxMedicalPercent = 0; _maxCPFPercent = 0; _maxInvExempPercent = 0; _maxInvAmount = 0; _minTaxAmount = 0; _pfIntProjection = 0; _maxAge = 0; //_isMonthlyExamtion = false; _TaxParameterSlabs = null; _InvestmentActiveMonth = DateTime.MinValue; } #endregion #region Properties #region fiscalYear : string private string _fiscalYear; public string FiscalYear { get { return _fiscalYear; } set { base.OnPropertyChange("fiscalYear", _fiscalYear, value); _fiscalYear = value; } } public DateTime FiscalyearDatefrom { get { return new DateTime(Convert.ToInt32(_fiscalYear.Substring(0, 4)), 7, 1); } } public DateTime FiscalyearDateTo { get { return new DateTime(Convert.ToInt32(_fiscalYear.Substring(5, 4)), 6, 30); } } #endregion #region assessmentYear : string private string _assessmentYear; public string AssessmentYear { get { return _assessmentYear; } set { base.OnPropertyChange("assessmentYear", _assessmentYear, value); _assessmentYear = value; } } #endregion #region maxInvestPercent : double private double _maxInvestPercent; public double MaxInvestPercent { get { return _maxInvestPercent; } set { base.OnPropertyChange("maxInvestPercent", _maxInvestPercent, value); _maxInvestPercent = value; } } #endregion #region maxHRPercent : double private double _maxHRPercent; public double MaxHRPercent { get { return _maxHRPercent; } set { base.OnPropertyChange("maxHRPercent", _maxHRPercent, value); _maxHRPercent = value; } } #endregion #region maxHRAmount : double private double _maxHRAmount; public double MaxHRAmount { get { return _maxHRAmount; } set { base.OnPropertyChange("maxHRAmount", _maxHRAmount, value); _maxHRAmount = value; } } #endregion #region maxMedicalPercent : double private double _maxMedicalPercent; public double MaxMedicalPercent { get { return _maxMedicalPercent; } set { base.OnPropertyChange("maxMedicalPercent", _maxMedicalPercent, value); _maxMedicalPercent = value; } } #endregion #region MaxMedicalAmount : double private double _maxMedicalAmount; public double MaxMedicalAmount { get { return _maxMedicalAmount; } set { base.OnPropertyChange("maxMedicalAmount", _maxMedicalAmount, value); _maxMedicalAmount = value; } } #endregion #region maxConvAmount : double private double _maxConvAmount; public double MaxConvAmount { get { return _maxConvAmount; } set { base.OnPropertyChange("maxConvAmount", _maxConvAmount, value); _maxConvAmount = value; } } #endregion #region maxCPFPercent : double private double _maxCPFPercent; public double MaxCPFPercent { get { return _maxCPFPercent; } set { base.OnPropertyChange("maxCPFPercent", _maxCPFPercent, value); _maxCPFPercent = value; } } #endregion #region maxInvExempPercent : double private double _maxInvExempPercent; public double MaxInvExempPercent { get { return _maxInvExempPercent; } set { base.OnPropertyChange("maxInvExempPercent", _maxInvExempPercent, value); _maxInvExempPercent = value; } } #endregion #region maxInvAmount : double private double _maxInvAmount; public double MaxInvAmount { get { return _maxInvAmount; } set { base.OnPropertyChange("maxInvAmount", _maxInvAmount, value); _maxInvAmount = value; } } #endregion #region minTaxAmount : double private double _minTaxAmount; public double MinTaxAmount { get { return _minTaxAmount; } set { base.OnPropertyChange("minTaxAmount", _minTaxAmount, value); _minTaxAmount = value; } } #endregion #region pfIntProjection : double private double _pfIntProjection; public double PfIntProjection { get { return _pfIntProjection; } set { base.OnPropertyChange("pfIntProjection", _pfIntProjection, value); _pfIntProjection = value; } } #endregion #region maxAge : double private double _maxAge; public double MaxAge { get { return _maxAge; } set { base.OnPropertyChange("maxAge", _maxAge, value); _maxAge = value; } } #endregion #region InvestmentActiveMonth : DateTime private DateTime? _InvestmentActiveMonth; public DateTime? InvestmentActiveMonth { get { return _InvestmentActiveMonth; } set { base.OnPropertyChange("InvestmentActiveMonth", _InvestmentActiveMonth, value); _InvestmentActiveMonth = value; } } #endregion //#region isMonthlyExamtion : bool //private bool _isMonthlyExamtion; //public bool IsMonthlyExamtion //{ // get { return _isMonthlyExamtion; } // set // { // base.OnPropertyChange("isMonthlyExamtion", _isMonthlyExamtion, value); // _isMonthlyExamtion = value; // } //} //#endregion #region TaxParameterSlab : TaxParameterSlab private ObjectsTemplate _TaxParameterSlabs = null; public ObjectsTemplate TaxParameterSlabs { get { if (_TaxParameterSlabs == null && !this.ID.IsUnassigned && this.ID.Integer > 0) { _TaxParameterSlabs = TaxParameter.GetSlabsByParamID(this.ID); } return this._TaxParameterSlabs; } set { _TaxParameterSlabs = value; } } #endregion #region Service Factory ITaxParameterService : ITaxParameterService internal static ITaxParameterService Service { get { return Services.Factory.CreateService(typeof(ITaxParameterService)); } } #endregion #endregion #region Functions public static TaxParameter Get(ID nID) { TaxParameter oTaxParameter = null; #region Cache Header oTaxParameter = (TaxParameter)_cache["Get", nID]; if (oTaxParameter != null) return oTaxParameter; #endregion oTaxParameter = TaxParameter.Service.Get(nID); #region Cache Footer _cache.Add(oTaxParameter, "Get", nID); #endregion return oTaxParameter; } //Tax Parameter From Old Table public static TaxParameter GetOldTaxParameter(ID nID) { TaxParameter oTaxParameter = null; #region Cache Header oTaxParameter = (TaxParameter)_cache["GetOldTaxParameter", nID]; if (oTaxParameter != null) return oTaxParameter; #endregion oTaxParameter = TaxParameter.Service.GetOldTaxParameter(nID); #region Cache Footer _cache.Add(oTaxParameter, "GetOldTaxParameter", nID); #endregion return oTaxParameter; } public static TaxParameter Get(string assessmentYear) { TaxParameter oTaxParameter = null; oTaxParameter = TaxParameter.Service.Get(assessmentYear); return oTaxParameter; } public double GetSlabTotal() { double amount = 0; foreach (TaxParameterSlab item in _TaxParameterSlabs) { amount = amount + item.IncomeAmount; } return amount; } public static ObjectsTemplate Get() { #region Cache Header ObjectsTemplate taxParameters = _cache["Get"] as ObjectsTemplate; if (taxParameters != null) return taxParameters; #endregion try { taxParameters = Service.Get(); } catch (ServiceException e) { throw new Exception(e.Message, e); } #region Cache Footer _cache.Add(taxParameters, "Get"); #endregion return taxParameters; } public static ObjectsTemplate Get(bool IsCurrentFY) { #region Cache Header ObjectsTemplate taxParameters = _cache["Get", IsCurrentFY] as ObjectsTemplate; if (taxParameters != null) return taxParameters; #endregion try { taxParameters = Service.Get(IsCurrentFY, Payroll.BO.SystemInformation.CurrentSysInfo.PayrollTypeID.Integer); } catch (ServiceException e) { throw new Exception(e.Message, e); } #region Cache Footer _cache.Add(taxParameters, "Get", IsCurrentFY); #endregion return taxParameters; } //Tax Card From Old Table public static DataTable GetOldTaxCard(bool IsCurrentFY) { DataTable dtTaxCard = new DataTable(); try { dtTaxCard = Service.GetOldTaxCard(IsCurrentFY, Payroll.BO.SystemInformation.CurrentSysInfo.PayrollTypeID.Integer); } catch (ServiceException e) { throw new Exception(e.Message, e); } return dtTaxCard; } public static DataTable GetFiscalYearFromOldTable() { DataTable dtFiscalYears = new DataTable(); try { dtFiscalYears = Service.GetFiscalYearFromOldTable(SystemInformation.CurrentSysInfo.PayrollTypeID); } catch (ServiceException e) { throw new Exception(e.Message, e); } return dtFiscalYears; } public static ObjectsTemplate GetTaxSlabs(ID nTaxParamID, EnumTaxSlabType TaxType) { #region Cache Header ObjectsTemplate taxParamSlabs = _cache["GetTaxSlabs", nTaxParamID, TaxType] as ObjectsTemplate; if (taxParamSlabs != null) return taxParamSlabs; #endregion try { taxParamSlabs = Service.GetTaxSlabs(nTaxParamID, TaxType); } catch (ServiceException e) { throw new Exception(e.Message, e); } #region Cache Footer _cache.Add(taxParamSlabs, "GetTaxSlabs", nTaxParamID, TaxType); #endregion return taxParamSlabs; } public static DataSet GetTSByParamAndType(ID nTaxParamID, EnumTaxSlabType TaxType) { DataSet taxParamSlabs = null; try { taxParamSlabs = Service.GetTSByParamAndType(nTaxParamID, TaxType); } catch (ServiceException e) { throw new Exception(e.Message, e); } return taxParamSlabs; } public static ObjectsTemplate GetEmployeeSlab(TaxParameter parameter, Employee employee) { foreach (TaxParameterSlab item in parameter.TaxParameterSlabs) { item.SlabTaxAmount = 0; item.SlabTaxableAmount = 0; } ObjectsTemplate employeeSlab = null; EnumTaxSlabType SlabType = EnumTaxSlabType.Male; if (employee.PersonType == EnumPersonType.Disable) SlabType = EnumTaxSlabType.Disable; else if (employee.PersonType == EnumPersonType.Freedom_Fighter) SlabType = EnumTaxSlabType.Freedom_Fighter; else { if (employee.Gender == EnumGender.Female) SlabType = EnumTaxSlabType.Female; else { SlabType = EnumTaxSlabType.Male; //int NoOfMonth = Ease.CoreV35.Utility.Global.DateFunctions.DateDiff("m", // employee.BirthDate, SystemInformation.CurrentSysInfo.TaxYearEndDate); //int NoOfYear = NoOfMonth / 12; //if (NoOfYear >= parameter.MaxAge) SlabType = EnumTaxSlabType.Age; } } employeeSlab = new ObjectsTemplate(); foreach (TaxParameterSlab item in parameter.TaxParameterSlabs) { if (item.ParamType == SlabType) employeeSlab.Add(item); } return employeeSlab; } public static ObjectsTemplate CalculateTaxOnSlab(TaxParameter parameter, Employee emp, double taxableIncome) { ObjectsTemplate empTaxSlabs = TaxParameter.GetEmployeeSlab(parameter, emp); if (empTaxSlabs == null || empTaxSlabs.Count == 0) throw new ServiceException("Employee Tax Slabs not found; Employee No:" + emp.EmployeeNo); int index = 0; //if (emp.ForeignExPat && // Ease.CoreV35.Utility.Global.DateFunctions.DateDiff("m", emp.JoiningDate, SystemInformation.CurrentSysInfo.NextPayProcessDate) > 6) //{ // empTaxSlabs[empTaxSlabs.Count - 1].SlabTaxAmount = empTaxSlabs[empTaxSlabs.Count].TaxPercent * (taxableIncome / 100); // return empTaxSlabs; //} while (taxableIncome != 0) { TaxParameterSlab slab = empTaxSlabs[index]; if (taxableIncome > slab.IncomeAmount && index != empTaxSlabs.Count - 1) { slab.SlabTaxAmount = GlobalFunctions.Round((slab.IncomeAmount * slab.TaxPercent) / 100); slab.SlabTaxableAmount = slab.IncomeAmount; taxableIncome = taxableIncome - slab.IncomeAmount; } else { slab.SlabTaxableAmount = taxableIncome; slab.SlabTaxAmount = GlobalFunctions.Round(((taxableIncome * slab.TaxPercent) / 100)); taxableIncome = 0; } index = index + 1; } return empTaxSlabs; } //Calculate Tax On Slab From Old Table public static ObjectsTemplate GetEmployeeOldSlab(TaxParameter parameter, DataRow employee) { foreach (TaxParameterSlab item in parameter.TaxParameterSlabs) { item.SlabTaxAmount = 0; item.SlabTaxableAmount = 0; } ObjectsTemplate employeeSlab = null; EnumTaxSlabType SlabType = EnumTaxSlabType.Male; //Need to consult with Mr. Ashek vai //if (employee.PersonType == EnumPersonType.Disable) // SlabType = EnumTaxSlabType.Disable; //else if (employee.PersonType == EnumPersonType.Freedom_Fighter) // SlabType = EnumTaxSlabType.Freedom_Fighter; //else //{ if ((EnumGender)Convert.ToInt16(employee["Gender"].ToString()) == EnumGender.Female) SlabType = EnumTaxSlabType.Female; else { int NoOfMonth = Ease.CoreV35.Utility.Global.DateFunctions.DateDiff("m", Convert.ToDateTime(employee["BirthDate"]), SystemInformation.CurrentSysInfo.TaxYearEndDate); int NoOfYear = NoOfMonth / 12; if (NoOfYear >= parameter.MaxAge) SlabType = EnumTaxSlabType.Age; } //} employeeSlab = new ObjectsTemplate(); foreach (TaxParameterSlab item in parameter.TaxParameterSlabs) { if (item.ParamType == SlabType) employeeSlab.Add(item); } return employeeSlab; } public static ObjectsTemplate CalculateOldTaxOnSlab(TaxParameter parameter, DataRow emp, double taxableIncome) { ObjectsTemplate empTaxSlabs = TaxParameter.GetEmployeeOldSlab(parameter, emp); if (empTaxSlabs == null || empTaxSlabs.Count == 0) throw new ServiceException("Employee Tax Slabs not found; Employee No:" + emp["EmployeeNo"]); int index = 0; //if (emp.ForeignExPat && // Ease.CoreV35.Utility.Global.DateFunctions.DateDiff("m", emp.JoiningDate, SystemInformation.CurrentSysInfo.NextPayProcessDate) > 6) //{ // empTaxSlabs[empTaxSlabs.Count - 1].SlabTaxAmount = empTaxSlabs[empTaxSlabs.Count].TaxPercent * (taxableIncome / 100); // return empTaxSlabs; //} while (taxableIncome != 0) { TaxParameterSlab slab = empTaxSlabs[index]; if (taxableIncome > slab.IncomeAmount && index != empTaxSlabs.Count - 1) { slab.SlabTaxAmount = GlobalFunctions.Round((slab.IncomeAmount * slab.TaxPercent) / 100); slab.SlabTaxableAmount = slab.IncomeAmount; taxableIncome = taxableIncome - slab.IncomeAmount; } else { slab.SlabTaxableAmount = taxableIncome; slab.SlabTaxAmount = GlobalFunctions.Round(((taxableIncome * slab.TaxPercent) / 100)); taxableIncome = 0; } index = index + 1; } return empTaxSlabs; } public static ObjectsTemplate GetSlabsByParamID(ID nTaxParamID) { #region Cache Header ObjectsTemplate taxParamSlabs = _cache["GetSlabsByParamID", nTaxParamID] as ObjectsTemplate; if (taxParamSlabs != null) return taxParamSlabs; #endregion try { taxParamSlabs = Service.GetSlabsByParamID(nTaxParamID); } catch (ServiceException e) { throw new Exception(e.Message, e); } #region Cache Footer _cache.Add(taxParamSlabs, "GetSlabsByParamID", nTaxParamID); #endregion return taxParamSlabs; } public ID Save() { this.SetAuditTrailProperties(); return TaxParameter.Service.Save(this); } public ID SaveCopy() { this.SetAuditTrailProperties(); return TaxParameter.Service.SaveCopy(this); } public void Delete() { TaxParameter.Service.Delete(ID, Payroll.BO.SystemInformation.CurrentSysInfo.PayrollTypeID.Integer); } #endregion } #endregion #region ITaxParameter Service public interface ITaxParameterService { TaxParameter Get(ID id); TaxParameter GetOldTaxParameter(ID id); TaxParameter Get(string assessmentYear); ObjectsTemplate Get(); ObjectsTemplate Get(bool IsForCurrentYear, int payrollTypeID); DataTable GetOldTaxCard(bool IsForCurrentYear, int payrollTypeID); ObjectsTemplate GetTaxSlabs(ID taxParameterID, EnumTaxSlabType TaxType); DataSet GetTSByParamAndType(ID taxParameterID, EnumTaxSlabType TaxType); ObjectsTemplate GetSlabsByParamID(ID taxParameterID); DataTable GetFiscalYearFromOldTable(ID payrollTypeID); ID Save(TaxParameter item); ID SaveCopy(TaxParameter item); void Delete(ID id, int payrollTypeID); } #endregion }