CEL_Payroll/Payroll.BO/Tax/TaxCalculator.cs

3041 lines
156 KiB
C#
Raw Normal View History

2024-09-17 14:30:13 +06:00
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 Ease.CoreV35.Utility;
using System.Data;
namespace Payroll.BO
{
public abstract class AbstractTaxCalculator
{
#region Define Class Variable
protected SalaryMonthly _salary;
private BonusProcess.BonusProcessDetail _bonus;
protected Employee _employee;
protected TaxParameter _taxParameter;
private TaxParameter _PrvYeartaxParameter;
protected ObjectsTemplate<TaxParameterSlab> _taxSlabs;
private ObjectsTemplate<IncomeTax> _currentYearTax;
private ObjectsTemplate<IncomeTax> _prvYearTotalIncomes;
protected ObjectsTemplate<ADParameter> _adParameters;
private ObjectsTemplate<TaxMergeMaster> _mergeItems;
private ObjectsTemplate<ProcessItem> _processItems;
private ObjectsTemplate<ITEmpHead> _assignedHeads;
private ObjectsTemplate<BonusParameter> _projectionBonusParams;
protected List<BonusParameter> _ApplicableBonusParams;
protected double _projectedMonth;
protected double _onceoffAmount;
protected bool _isActualInvestment;
ObjectsTemplate<OTProcess> _oTProcesss = null;
#endregion Define Class Variable
public AbstractTaxCalculator()
{
_isActualInvestment = false;
_salary = null;
_taxSlabs = null;
TaxParameter param = TaxParameter.Get(Payroll.BO.SystemInformation.CurrentSysInfo.TaxParamID);
_mergeItems = TaxMergeMaster.GetbyTaxParameter(param.ID);
if (param != null)
_assignedHeads = ITEmpHead.Get(param.ID.Integer);
_processItems = ProcessItem.Get();
_onceoffAmount = 0;
}
public AbstractTaxCalculator(ID taxParameterID)
{
_isActualInvestment = false;
_salary = null;
_taxSlabs = null;
TaxParameter param = TaxParameter.Get(taxParameterID);
_mergeItems = TaxMergeMaster.GetbyTaxParameter(param.ID);
if (param != null)
_assignedHeads = ITEmpHead.Get(param.ID.Integer);
_processItems = ProcessItem.Get();
_onceoffAmount = 0;
}
public abstract TaxParameter TaxParameter { set; }
public abstract Employee Employee { set; }
public abstract SalaryMonthly Salary { set; }
public abstract ObjectsTemplate<ADParameter> AdParameters { set; }
public ObjectsTemplate<IncomeTax> CurrentYearTax
{
get
{
if (_currentYearTax == null)
{
_currentYearTax = IncomeTax.Get(_employee.ID, EnumIncomeTaxDataFrom.ProcessTempData);
}
return _currentYearTax;
}
set
{
_currentYearTax = value;
}
}
public BonusProcess.BonusProcessDetail Bonus
{
set
{
_bonus = value;
}
}
public ObjectsTemplate<IncomeTax> Calculate()
{
ObjectsTemplate<IncomeTax> returnedItems = new ObjectsTemplate<IncomeTax>();
return returnedItems;
}
private void EmployeeSlab()
{
//TaxParameter.Get
}
private void Add(IncomeTax taxItem)
{
if (taxItem.Position == 0)
{
ProcessItem pitem = _processItems.Find(delegate(ProcessItem item)
{ return item.ItemCode == (int)taxItem.ItemGroup; });
if (pitem == null) throw new ServiceException("Tax process item code not found in the process collection; Item Code:" + taxItem.ItemGroup.ToString());
taxItem.Position = pitem.Position;
}
IncomeTax existItem = _currentYearTax.Find(delegate(IncomeTax item)
{ return item.ItemGroup == taxItem.ItemGroup && item.ItemID == taxItem.ItemID; });
if (existItem == null) _currentYearTax.Add(taxItem);
else
{
existItem.PreviousAmount = existItem.PreviousAmount + taxItem.PreviousAmount;
existItem.ThisMonthAmount = existItem.ThisMonthAmount + taxItem.ThisMonthAmount;
existItem.ProjectedAmount = existItem.ProjectedAmount + taxItem.ProjectedAmount;
existItem.Position = taxItem.Position;
existItem.Description = taxItem.Description;
}
}
protected IncomeTax Add(EnumIncomeTaxItemGroup group, int itemId,
string description, double thismonthAmount,
double projectedamount, EnumIncomeTaxSide side)
{
IncomeTax existItem = _currentYearTax.Find(delegate(IncomeTax item)
{ return item.ItemGroup == group && item.ItemID == itemId; });
if (existItem == null)
{
ProcessItem pitem = _processItems.Find(delegate(ProcessItem item)
{ return item.ItemCode == (int)group; });
if (pitem == null) throw new ServiceException("Tax process item code not found in the process collection; Item Code:" + group.ToString());
IncomeTax taxItem = new IncomeTax();
taxItem.ItemGroup = group;
taxItem.ItemID = itemId;
taxItem.Description = (description == string.Empty) ? pitem.UserDescription : description;
taxItem.Position = pitem.Position;
taxItem.PreviousAmount = projectedamount;
taxItem.ThisMonthAmount = thismonthAmount;
taxItem.ProjectedAmount = projectedamount;
taxItem.EmployeeID = _employee.ID;
taxItem.Side = side;
_currentYearTax.Add(taxItem);
return taxItem;
}
else
{
if (existItem.Position == 0)
{
ProcessItem pitem = _processItems.Find(delegate(ProcessItem item)
{ return item.ItemCode == (int)group; });
if (pitem == null) throw new ServiceException("Tax process item code not found in the process collection; Item Code:" + group.ToString());
existItem.Position = pitem.Position;
}
existItem.ThisMonthAmount = existItem.ThisMonthAmount + thismonthAmount;
existItem.ProjectedAmount = existItem.ProjectedAmount + projectedamount;
existItem.Description = description;
existItem.Side = side;
return existItem;
}
}
protected void CalcualteprojectMonth()
{
//_projectedMonth = 12 - Ease.CoreV35.Utility.Global.DateFunctions.DateDiff ("m",
// SystemInformation.CurrentSysInfo.TaxYearEndDate,
// SystemInformation.CurrentSysInfo.NextPayProcessDate);
_projectedMonth = 12 - (((SystemInformation.CurrentSysInfo.NextPayProcessDate.Year - SystemInformation.CurrentSysInfo.TaxYearEndDate.Year) * 12)
+ SystemInformation.CurrentSysInfo.NextPayProcessDate.Month - SystemInformation.CurrentSysInfo.TaxYearEndDate.Month);
if (_projectedMonth < 0) _projectedMonth = 0;
//_projectedMonth= Ease.CoreV35.Utility.Global.DateFunctions.DateDiff("m",
// new DateTime(2010, 12, 31), new DateTime(2011, 6, 30));
if (_employee.EndOfContractDate != null && _employee.EndOfContractDate != DateTime.MinValue)
{
if (_employee.EndOfContractDate < _taxParameter.FiscalyearDateTo)
_projectedMonth = GetProjectionMonth((DateTime)_employee.EndOfContractDate);
}
}
protected void CalculateOT()
{
// find current month OT
//if (_oTProcesss == null)
// _oTProcesss = OTProcess.Get(SystemInformation.CurrentSysInfo.NextPayProcessDate);
//List<OTProcess> ops = _oTProcesss.FindAll(delegate(OTProcess item)
//{ return item.EmployeeID.Integer == _employee.ID.Integer; });
//if (ops == null) return;
//if (ops.Count == 0) return;
double opAmount = 0;
//foreach (OTProcess op in ops)
// opAmount += op.Amount;
foreach (SalaryMonthlyDetail smd in _salary.Details)
{
if (smd.ItemCode == EnumSalaryItemCode.Over_Time_Amount)
opAmount += smd.ChangedAmount;
}
IncomeTax otItem = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.TimeCard, (int)EnumIncomeTaxItemGroup.TimeCard);
if (otItem == null) otItem = this.Add(EnumIncomeTaxItemGroup.TimeCard, (int)EnumIncomeTaxItemGroup.TimeCard, string.Empty, 0, 0, EnumIncomeTaxSide.Dec_SalaryIncome);
// update this month amount
otItem.ThisMonthAmount = opAmount;
otItem.ProjectedAmount = 0;// op.Amount* _projectedMonth;
otItem.Side = EnumIncomeTaxSide.Inc_SalaryIncome;
}
private double GetProjectionMonth(DateTime date)
{
double nFraction;
//If Month is July then no need for Projection
if (date.Month == 7)
nFraction = Convert.ToDouble(0);
else
nFraction = GlobalFunctions.Round(GlobalFunctions.GetFraction(SystemInformation.CurrentSysInfo.NextPayProcessDate.AddDays(1), date));
return nFraction;
}
private double GetAmountfromSalary(SalaryMonthlyDetail detail)
{
if (detail.itemGroupCode == EnumSalaryGroup.Arrear)
_onceoffAmount = _onceoffAmount + detail.ChangedAmount;
if (detail.itemGroupCode == EnumSalaryGroup.Gross || detail.itemGroupCode == EnumSalaryGroup.Arrear)
return detail.ChangedAmount;
else return -detail.ChangedAmount;
}
private IncomeTax GetTaxItem(EnumTaxMergeType type, int ItemId, string itemName)
{
IncomeTax taxItem = TaxMergeMaster.Extract(
_mergeItems, type, ItemId);
if (taxItem == null) throw new ServiceException("Tax setup not found for the Item :" + itemName);
if (taxItem != null)
taxItem.EmployeeID = _employee.ID;
return taxItem;
}
private IncomeTax GetTaxItem2(EnumTaxMergeType type, int ItemId, string itemName)
{
IncomeTax taxItem = TaxMergeMaster.Extract(
_mergeItems, type, ItemId);
if (taxItem == null) throw new ServiceException("Tax setup not found for the Item :" + itemName);
if (taxItem != null)
taxItem.EmployeeID = _employee.ID;
return taxItem;
}
protected void CalculateExemptionOnward2023()
{
double annualIncome = this.GetAnnualIncome();
IncomeTax exempted = _currentYearTax.FirstOrDefault(x => x.EmployeeID == _employee.ID
&& x.ItemGroup == EnumIncomeTaxItemGroup.AnnualExemption && x.ItemID == (int)EnumIncomeTaxItemGroup.AnnualExemption);
if (exempted == null) exempted = this.Add(EnumIncomeTaxItemGroup.AnnualExemption,
(int)EnumIncomeTaxItemGroup.AnnualExemption, string.Empty, 0, 0,
EnumIncomeTaxSide.Dec_AnnualIncome);
if (annualIncome > 0)
{
exempted.ProjectedAmount = Math.Ceiling((annualIncome / 3) * 1);
if (exempted.ProjectedAmount > 450000)
{
exempted.ProjectedAmount = 450000;
}
}
exempted.TotalAmount = exempted.ProjectedAmount;
}
protected void InitializeForNextMonth()
{
//commented by ashek 15 feb 2016
//if (_currentYearTax == null || _currentYearTax.Count ==0)
//{
// _currentYearTax = new ObjectsTemplate<IncomeTax>();
// _currentYearTax = IncomeTax.Get(_employee.ID, EnumIncomeTaxDataFrom.ProcessTempData);
//}
if (_currentYearTax == null || _currentYearTax.Count == 0)
{
_currentYearTax = new ObjectsTemplate<IncomeTax>();
_currentYearTax = IncomeTax.Get(_employee.ID, EnumIncomeTaxDataFrom.ProcessTempData);
}
foreach (IncomeTax item in _currentYearTax)
{
item.PreviousAmount = item.PreviousAmount + item.ThisMonthAmount;
item.ThisMonthAmount = 0;
item.ProjectedAmount = 0;
}
}
private SalaryMonthlyDetail CreateSalaryDetail(string description, EnumSalaryItemCode itemCode, int itemid, ID supportid, double amount)
{
SalaryMonthlyDetail odetail = new SalaryMonthlyDetail();
odetail.Description = description;
odetail.itemGroupCode = EnumSalaryGroup.Gross;
odetail.ItemCode = itemCode;
odetail.ItemID = itemid;
odetail.ChangedAmount = amount;
odetail.SupportID = supportid;
return odetail;
}
protected void CalculateOnlyProjection()
{
foreach (IncomeTax item in this.CurrentYearTax)
item.ProjectedAmount = 0;
List<ADParameter> adParams = null;
ObjectsTemplate<ADParameterEmployee> adParamEmps = null;
EmployeeGradeSalary oEmpGSalary = new EmployeeGradeSalary();
List<TaxRawItem> rawItems = new List<TaxRawItem>();
_projectedMonth = _projectedMonth + 1;
_salary = new SalaryMonthly();
_salary.Details.Add(this.CreateSalaryDetail("Basic Salary", EnumSalaryItemCode.Basic_Salary, (int)EnumSalaryItemCode.Basic_Salary, ID.FromInteger(0), _employee.BasicSalary));
if (_adParameters == null) _adParameters = ADParameter.Get(EnumStatus.Regardless, EnumAllowOrDeduct.Allowance);
adParams = ADParameter.GetApplicableParameters(_employee, _employee.GradeID, _adParameters);
if (adParams != null)
{
foreach (ADParameter adParam in adParams)
{
if (adParam.EntitleType == EnumEntitleType.Grade)
_salary.Details.Add(this.CreateSalaryDetail(adParam.AllowanceDeduction.Name,
EnumSalaryItemCode.Allowance, adParam.AllowanceDeduction.ID.Integer, adParam.ID, adParam.GetGradeDefinedAmount(_employee, _employee.BasicSalary,
_employee.GrossSalary, new EmployeeGradeSalary())));
}
}
adParamEmps = ADParameterEmployee.GetByEmployee(_employee.ID, EnumAllowOrDeduct.Allowance, EnumADEmpType.AppliedToIndividual);
if (adParamEmps != null)
{
foreach (ADParameterEmployee adEmp in adParamEmps)
{
_salary.Details.Add(this.CreateSalaryDetail(adEmp.AllowDeduct.Name,
EnumSalaryItemCode.Allowance, adEmp.AllowDeduct.ID.Integer, adEmp.ADParameterID, adEmp.MonthlyAmount));
}
}
this.IncludePayslipItems();
foreach (IncomeTax item in this.CurrentYearTax)
{
item.PreviousAmount = 0;
item.ThisMonthAmount = 0;
}
}
private bool IsExamptedItem(IncomeTax Item)
{
bool IsExamptedItem = false;
if (Item.ItemGroup == EnumIncomeTaxItemGroup.House_Rent_Allowance)
IsExamptedItem = true;
else if (Item.ItemGroup == EnumIncomeTaxItemGroup.Conveyance_Allowance)
IsExamptedItem = true;
else if (Item.ItemGroup == EnumIncomeTaxItemGroup.Medical_Allowance)
IsExamptedItem = true;
else if (Item.ItemGroup == EnumIncomeTaxItemGroup.LFA_Allowance)
IsExamptedItem = true;
return IsExamptedItem;
}
private IncomeTax PayslipAllowanceDeduction(SalaryMonthlyDetail salaryDetail, EnumTaxMergeType type)
{
EmployeeGradeSalary oEmpGSalary = new EmployeeGradeSalary();
IncomeTax item = null;
ADParameter adparameter = _adParameters.GetItem(salaryDetail.SupportID);
if (adparameter == null)
throw new ServiceException("Allowance/deduction parameter not found for " + salaryDetail.Description);
if (adparameter.IsTaxable == false) return null;
item = this.GetTaxItem(type, salaryDetail.ItemID, salaryDetail.Description);
item.ThisMonthAmount = GlobalFunctions.Round(item.ThisMonthAmount + GetAmountfromSalary(salaryDetail));
if (adparameter.Periodicity == EnumPeriodicity.OneOff)
{
if (IsExamptedItem(item) == false)
_onceoffAmount = _onceoffAmount + item.ThisMonthAmount;
}
else
{
if (salaryDetail.itemGroupCode == EnumSalaryGroup.Gross)
{
if (adparameter.EntitleType == EnumEntitleType.Grade)
item.ProjectedAmount = GlobalFunctions.Round(adparameter.GetGradeDefinedAmount(_employee, _employee.BasicSalary, _employee.GrossSalary, oEmpGSalary)) * _projectedMonth;
else
{
DateTime fromDate = GlobalFunctions.FirstDateOfMonth(SystemInformation.CurrentSysInfo.NextPayProcessDate);
DateTime toDate = SystemInformation.CurrentSysInfo.NextPayProcessDate;
if (salaryDetail.SupportID != null)
{
ADParameterEmployee oempadp = salaryDetail.ADParamEmployee;
if (oempadp == null)
oempadp = ADParameterEmployee.Get(_employee.ID, ID.FromInteger(salaryDetail.ItemID), salaryDetail.SupportID, EnumArrearType.NotPresent);
//ADParameterEmployee oempadp = ADParameterEmployee.Get(_employee.ID, ID.FromInteger(salaryDetail.ItemID), salaryDetail.SupportID);
if (oempadp != null)
{
fromDate = GlobalFunctions.FirstDateOfMonth(SystemInformation.CurrentSysInfo.NextPayProcessDate.AddMonths(1));
if (oempadp.TillDate == null || oempadp.TillDate == DateTime.MinValue)
toDate = _taxParameter.FiscalyearDateTo;
else toDate = (DateTime)oempadp.TillDate;
double nproject = 0;
if (fromDate > toDate) nproject = 0;
else
{
if (toDate > _taxParameter.FiscalyearDateTo) toDate = _taxParameter.FiscalyearDateTo;
nproject = GlobalFunctions.GetFraction(fromDate, toDate);
}
//if (item.ItemGroup == EnumIncomeTaxItemGroup.Other_Allowance && item.ItemID==27)
// item.ProjectedAmount = GlobalFunctions.Round(oempadp.GetAmount(_employee.BasicSalary, 0)) * 6;
//else
item.ProjectedAmount = GlobalFunctions.Round(oempadp.GetAmount(_employee.BasicSalary, 0)) * nproject;
}
else item.ProjectedAmount = GlobalFunctions.Round(item.ThisMonthAmount) * _projectedMonth;
}
else item.ProjectedAmount = GlobalFunctions.Round(item.ThisMonthAmount) * _projectedMonth;
}
}
}
return item;
}
protected void IncludePayslipItems()
{
foreach (SalaryMonthlyDetail salaryDetail in _salary.Details)
{
IncomeTax item = null;
switch (salaryDetail.ItemCode)
{
case EnumSalaryItemCode.Basic_Salary:
item = GetTaxItem(EnumTaxMergeType.NONE, (int)EnumIncomeTaxItemGroup.Basic_Salary, salaryDetail.Description);
item.ThisMonthAmount = GlobalFunctions.Round(GetAmountfromSalary(salaryDetail));
if (salaryDetail.itemGroupCode == EnumSalaryGroup.Gross) item.ProjectedAmount = GlobalFunctions.Round(_employee.BasicSalary) * _projectedMonth;
break;
case EnumSalaryItemCode.Over_Time_Amount:
item = GetTaxItem(EnumTaxMergeType.OT, salaryDetail.ItemID, salaryDetail.Description);
if (item == null) throw new ServiceException("Tax grouping not found for " + salaryDetail.Description);
item.ThisMonthAmount = GlobalFunctions.Round(GetAmountfromSalary(salaryDetail));
this._onceoffAmount = this._onceoffAmount + item.ThisMonthAmount;
break;
case EnumSalaryItemCode.Bonus:
item = GetTaxItem(EnumTaxMergeType.Bonus, salaryDetail.ItemID, salaryDetail.Description);
if (item == null) throw new ServiceException("Tax grouping not found for " + salaryDetail.Description);
item.ThisMonthAmount = GlobalFunctions.Round(GetAmountfromSalary(salaryDetail));
// this._onceoffAmount = this._onceoffAmount + item.ThisMonthAmount;
break;
case EnumSalaryItemCode.Allowance:
item = this.PayslipAllowanceDeduction(salaryDetail, EnumTaxMergeType.Allowance);
if (item == null) continue;
if(item.ItemGroup==EnumIncomeTaxItemGroup.Conveyance_Allowance)
{
DataSet ds = IncomeTax.GetTaxAdj(EnumIncomeTaxItemGroup.Conveyance_Allowance, (int)EnumIncomeTaxItemGroup.Conveyance_Allowance, _employee.ID);
if (ds != null && ds.Tables.Count > 0)
{
foreach (DataRow dr in ds.Tables[0].Rows)
{
item.ThisMonthAmount = Convert.ToDouble(dr[6].ToString());
}
}
}
break;
case EnumSalaryItemCode.Deduction:
item = this.PayslipAllowanceDeduction(salaryDetail, EnumTaxMergeType.Deduction);
if (item == null) continue;// throw new ServiceException("Tax grouping not found for " + salaryDetail.Description);
item.ThisMonthAmount = GlobalFunctions.Round(GetAmountfromSalary(salaryDetail));
//if (item == null) continue;
break;
//case EnumSalaryItemCode.PF_Contribution:
// item = GetTaxItem(EnumTaxMergeType.NONE, (int)EnumIncomeTaxItemGroup.Company_Contri_PF, salaryDetail.Description);
// item.ThisMonthAmount =GlobalFunctions.Round(GetAmountfromSalary(salaryDetail));
// break;
default:
break;
}
if (item != null)
{
if (salaryDetail.itemGroupCode == EnumSalaryGroup.Deductions)
{
item.Side = EnumIncomeTaxSide.Dec_SalaryIncome;
}
else
{ item.Side = EnumIncomeTaxSide.Inc_SalaryIncome; }
}
if (item != null && item.ThisMonthAmount != 0) this.Add(item);
}
}
protected void CalculateExamtion()
{
this.CalculateExemptionOnward2023();
return;
#region get Examtion items from processItem
var examtionItems = from pItem in _processItems
where pItem.ItemGroup == 7
select pItem;
#endregion
bool monthlyexemption = true;// ConfigurationManager.GetBoolValue("incometax", "monthlyexemption", EnumConfigurationType.Logic);
ObjectsTemplate<EmpLifeCycle> oCycles = EmpLifeCycle.GetByEmpID(_employee.ID);
foreach (var processItem in examtionItems)
{
double tempAmount = 0;
#region House rent allowance
if (processItem.ItemCode == (int)EnumIncomeTaxItemGroup.Exemption_House_Rent_Allowance)
{
IncomeTax basicItem = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Basic_Salary, (int)EnumIncomeTaxItemGroup.Basic_Salary);
IncomeTax HRItem = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.House_Rent_Allowance, (int)EnumIncomeTaxItemGroup.House_Rent_Allowance);
if (HRItem == null || HRItem.TotalAmount == 0) continue; //throw new ServiceException("House rent allowance not found in the collection while calculating HR Examtion");
//continue; //
IncomeTax HrExption = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Exemption_House_Rent_Allowance, (int)EnumIncomeTaxItemGroup.Exemption_House_Rent_Allowance);
if (HrExption == null) HrExption = this.Add(EnumIncomeTaxItemGroup.Exemption_House_Rent_Allowance,
(int)EnumIncomeTaxItemGroup.Exemption_House_Rent_Allowance, string.Empty, 0, 0, EnumIncomeTaxSide.Dec_SalaryIncome);
//if (oCycles != null && oCycles.Count>0)
//{
// EmpLifeCycle cycle = oCycles.Find(x => x.IsContinue==true);
// if (cycle != null)
// _employee.JoiningDate = cycle.EffectDate;
//}
if (_employee.JoiningDate < new DateTime(_taxParameter.FiscalyearDatefrom.Year, 7, 1))
{
monthlyexemption = false;
}
else
monthlyexemption = true;
if (monthlyexemption == false)
{
HrExption.ProjectedAmount = 0;
HrExption.ThisMonthAmount = 0;
HrExption.PreviousAmount = 0;
HrExption.TotalAmount = 0;
if (_taxParameter.MaxHRPercent != 0)
{
double hrAmount = (basicItem.TotalAmount * _taxParameter.MaxHRPercent) / 100;
if (hrAmount > _taxParameter.MaxHRAmount)
HrExption.ProjectedAmount = _taxParameter.MaxHRAmount;
else HrExption.ProjectedAmount = hrAmount;
if (HrExption.TotalAmount > HRItem.TotalAmount || Math.Abs(HrExption.TotalAmount - HRItem.TotalAmount) < 10)
HrExption.ProjectedAmount = HRItem.TotalAmount -
(HrExption.ThisMonthAmount + HrExption.PreviousAmount);
}
else
{
if (HRItem.TotalAmount > _taxParameter.MaxHRAmount)
HrExption.ProjectedAmount = _taxParameter.MaxHRAmount;
else HrExption.ProjectedAmount = HRItem.TotalAmount;
if (HrExption.TotalAmount > HRItem.TotalAmount || Math.Abs(HrExption.TotalAmount - HRItem.TotalAmount) < 10)
HrExption.ProjectedAmount = HRItem.TotalAmount -
(HrExption.ThisMonthAmount + HrExption.PreviousAmount);
}
}
else
{
#region monthly Examption
//if (HRItem.TotalAmount > _taxParameter.MaxHRAmount)
//{
// tempAmount = _taxParameter.MaxHRAmount - HrExption.PreviousAmount;
// HrExption.ThisMonthAmount = tempAmount / (_projectedMonth + 1);
// HrExption.ProjectedAmount = _taxParameter.MaxHRAmount -
// (HrExption.ThisMonthAmount + HrExption.PreviousAmount);
// if (HrExption.TotalAmount > _taxParameter.MaxHRAmount || Math.Abs(HrExption.TotalAmount - HRItem.TotalAmount) < 10)
// HrExption.ProjectedAmount = HrExption.TotalAmount - _taxParameter.MaxHRAmount;
//}
//else
//{
double def = 0;
double nFracAmount = 0;
#region This code needed for only this month to calculate previous month
double maxMonthlyAmount = _taxParameter.MaxHRAmount / 12;
if (HrExption.PreviousAmount == 0 && _employee.JoiningDate < new DateTime(_taxParameter.FiscalyearDatefrom.Year, 7, 1))
{
if (maxMonthlyAmount * 7 < HRItem.PreviousAmount)
{
HrExption.PreviousAmount = maxMonthlyAmount * 7;
}
else HrExption.PreviousAmount = HRItem.PreviousAmount;
}
else
{
if (HRItem.ThisMonthAmount < maxMonthlyAmount)
maxMonthlyAmount = HRItem.ThisMonthAmount;
if (_employee.JoiningDate == GlobalFunctions.FirstDateOfMonth(_employee.JoiningDate))
def = Global.DateFunctions.DateDiff("m", _employee.JoiningDate, GlobalFunctions.LastDateOfMonth(_taxParameter.FiscalyearDateTo)) + 1;
else
{
def = Global.DateFunctions.DateDiff("m", _employee.JoiningDate, GlobalFunctions.LastDateOfMonth(_taxParameter.FiscalyearDateTo));
TimeSpan ts = GlobalFunctions.LastDateOfMonth(_employee.JoiningDate) - _employee.JoiningDate;
nFracAmount = (maxMonthlyAmount / (double)DateTime.DaysInMonth(_employee.JoiningDate.Year, _employee.JoiningDate.Month)) * ((double)ts.Days + 1);
}
HrExption.PreviousAmount = (maxMonthlyAmount * def) + nFracAmount;
}
if (HRItem.ThisMonthAmount < maxMonthlyAmount)
{
double nBasic = basicItem.ThisMonthAmount * def;
nBasic = (nBasic * 50) / 100;
if (HrExption.PreviousAmount < nBasic)
HrExption.PreviousAmount = nBasic;
}
#endregion
if (maxMonthlyAmount < HRItem.ThisMonthAmount)
{
HrExption.ThisMonthAmount = maxMonthlyAmount;
HrExption.ProjectedAmount = maxMonthlyAmount * _projectedMonth;
}
else
{
HrExption.ThisMonthAmount = HRItem.ThisMonthAmount;
HrExption.ProjectedAmount = HRItem.ThisMonthAmount * _projectedMonth;
if (_salary != null && _salary.Details.Any(x => x.itemGroupCode == EnumSalaryGroup.UnauthLeave))
{
double unhraount = 0;
SalaryMonthlyDetail odt = _salary.Details.FirstOrDefault(x => x.itemGroupCode == EnumSalaryGroup.Gross
&& x.ItemCode == EnumSalaryItemCode.Allowance && x.ItemID == 1);
if (odt != null)
unhraount = odt.ChangedAmount;
HrExption.ProjectedAmount = (unhraount + HRItem.ThisMonthAmount) * _projectedMonth;
}
}
// HrExption.ThisMonthAmount = HRItem.ThisMonthAmount;
//tempAmount = HRItem.TotalAmount - HrExption.PreviousAmount;
//HrExption.ThisMonthAmount = HRItem.ThisMonthAmount;
//HrExption.ProjectedAmount = HRItem.ProjectedAmount;
//if (HrExption.TotalAmount > HRItem.TotalAmount || Math.Abs(HrExption.TotalAmount - HRItem.TotalAmount) < 10)
// HrExption.ProjectedAmount = HRItem.TotalAmount -
// (HrExption.ThisMonthAmount + HrExption.PreviousAmount);
//}
#endregion monthly Examption
}
if (_employee.JoiningDate < new DateTime(_taxParameter.FiscalyearDatefrom.Year, 7, 1))
{
HrExption.ThisMonthAmount = GlobalFunctions.Round(HrExption.ThisMonthAmount);
HrExption.ProjectedAmount = GlobalFunctions.Round(HrExption.ProjectedAmount);
HrExption.TotalAmount = HrExption.ThisMonthAmount + HrExption.PreviousAmount + HrExption.ProjectedAmount;
}
else
{
HrExption.ThisMonthAmount = 0;
HrExption.ProjectedAmount = 0;
}
DataSet ds = IncomeTax.GetTaxAdj(EnumIncomeTaxItemGroup.Exemption_House_Rent_Allowance, (int)EnumIncomeTaxItemGroup.Exemption_House_Rent_Allowance, _employee.ID);
if(ds!=null && ds.Tables.Count>0)
{
foreach(DataRow dr in ds.Tables[0].Rows)
{
HrExption.PreviousAmount = Convert.ToDouble(dr[4].ToString());
}
}
HrExption.TotalAmount = HrExption.PreviousAmount;
}
#endregion House rent allowance
#region Conveyance Allowance Examtion
else if (processItem.ItemCode == (int)EnumIncomeTaxItemGroup.Exemption_Conveyance_Allowance)
{
monthlyexemption = false;
IncomeTax CnvItem = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Conveyance_Allowance, (int)EnumIncomeTaxItemGroup.Conveyance_Allowance);
if (CnvItem == null || CnvItem.TotalAmount == 0) continue;
IncomeTax CvExption = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Exemption_Conveyance_Allowance, (int)EnumIncomeTaxItemGroup.Exemption_Conveyance_Allowance);
if (CvExption == null) CvExption = this.Add(EnumIncomeTaxItemGroup.Exemption_Conveyance_Allowance, (int)EnumIncomeTaxItemGroup.Exemption_Conveyance_Allowance, string.Empty, 0, 0, EnumIncomeTaxSide.Dec_SalaryIncome);
IncomeTax taxItem = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Cmp_Provided_car, (int)EnumIncomeTaxItemGroup.Cmp_Provided_car);
if (taxItem != null && taxItem.TotalAmount >0)
{
CvExption.ThisMonthAmount = 0;
CvExption.ProjectedAmount = 0;
CvExption.PreviousAmount = 0;
continue;
}
if (monthlyexemption == false)
{
CvExption.TotalAmount = 0;
CvExption.ProjectedAmount = 0;
CvExption.PreviousAmount = 0;
CvExption.ThisMonthAmount = 0;
if (CnvItem.TotalAmount > _taxParameter.MaxConvAmount || Math.Abs(CnvItem.TotalAmount - _taxParameter.MaxConvAmount) < 10)
CvExption.ProjectedAmount = _taxParameter.MaxConvAmount;
else CvExption.ProjectedAmount = CnvItem.TotalAmount;
}
else
{
if (CnvItem.TotalAmount > _taxParameter.MaxConvAmount)
CvExption.ThisMonthAmount = _taxParameter.MaxConvAmount / 12;
else CvExption.ThisMonthAmount = CnvItem.ThisMonthAmount;
if (CnvItem.TotalAmount > _taxParameter.MaxConvAmount || Math.Abs(CnvItem.TotalAmount - _taxParameter.MaxConvAmount) < 10)
{
CvExption.ProjectedAmount = _taxParameter.MaxConvAmount - (
CvExption.ThisMonthAmount + CvExption.PreviousAmount);
}
else
{
CvExption.ProjectedAmount = CnvItem.TotalAmount - (
CvExption.ThisMonthAmount + CvExption.PreviousAmount);
}
}
CvExption.Side = EnumIncomeTaxSide.Dec_SalaryIncome;
CvExption.ThisMonthAmount = GlobalFunctions.Round(CvExption.ThisMonthAmount);
CvExption.ProjectedAmount = GlobalFunctions.Round(CvExption.ProjectedAmount);
CvExption.TotalAmount = CvExption.ThisMonthAmount + CvExption.PreviousAmount + CvExption.ProjectedAmount;
}
#endregion Conveyance Allowance Examtion
#region Other Allowance Examption
else if (processItem.ItemCode == (int)EnumIncomeTaxItemGroup.Exemption_Medical_Allowance)
{
monthlyexemption = false;
IncomeTax MedicalItem = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Medical_Allowance, (int)EnumIncomeTaxItemGroup.Medical_Allowance);
if (MedicalItem == null) continue; //throw new ServiceException("Conveyance allowance not found in the collection while calculating HR Examtion");
IncomeTax mdExption = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Exemption_Medical_Allowance, (int)EnumIncomeTaxItemGroup.Exemption_Medical_Allowance);
if (mdExption == null) mdExption = this.Add(EnumIncomeTaxItemGroup.Exemption_Medical_Allowance, (int)EnumIncomeTaxItemGroup.Exemption_Medical_Allowance, string.Empty, 0, 0, EnumIncomeTaxSide.Dec_SalaryIncome);
IncomeTax basicItem = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Basic_Salary, (int)EnumIncomeTaxItemGroup.Basic_Salary);
//Sumon on 24 June 2014
double nMamount = 0;
if (basicItem != null) nMamount = basicItem.TotalAmount *
(double)((_taxParameter.MaxMedicalPercent != 0) ? _taxParameter.MaxMedicalPercent / 100 : 0);
if (MedicalItem == null || MedicalItem.TotalAmount == 0)
mdExption.ProjectedAmount = 0.00;
else if (nMamount > _taxParameter.MaxMedicalAmount)
mdExption.ProjectedAmount = MedicalItem.TotalAmount < _taxParameter.MaxMedicalAmount ? MedicalItem.TotalAmount : GlobalFunctions.Round(_taxParameter.MaxMedicalAmount);
else
mdExption.ProjectedAmount = MedicalItem.TotalAmount > nMamount ?MedicalItem.TotalAmount: GlobalFunctions.Round(nMamount) ;
//End
//mdExption.ProjectedAmount =GlobalFunctions.Round(MedicalItem.TotalAmount);
mdExption.TotalAmount = mdExption.ThisMonthAmount + mdExption.PreviousAmount + mdExption.ProjectedAmount;
if (MedicalItem.TotalAmount<mdExption.TotalAmount)
{
mdExption.PreviousAmount = MedicalItem.PreviousAmount;
mdExption.ThisMonthAmount = MedicalItem.ThisMonthAmount;
mdExption.ProjectedAmount = MedicalItem.ProjectedAmount;
}
mdExption.Side = EnumIncomeTaxSide.Dec_SalaryIncome;
// this.Add(mdExption);
}
else if (processItem.ItemCode == (int)EnumIncomeTaxItemGroup.Exemption_LFA_Allowance)
{
IncomeTax LFAItem = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.LFA_Allowance, (int)EnumIncomeTaxItemGroup.LFA_Allowance);
if (LFAItem == null) continue;// throw new ServiceException("LFA allowance not found in the collection while calculating HR Examtion");
//continue; //
IncomeTax lfaExption = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Exemption_LFA_Allowance, (int)EnumIncomeTaxItemGroup.Exemption_LFA_Allowance);
if (lfaExption == null) lfaExption = this.Add(EnumIncomeTaxItemGroup.Exemption_LFA_Allowance, (int)EnumIncomeTaxItemGroup.Exemption_LFA_Allowance, string.Empty, 0, 0, EnumIncomeTaxSide.Dec_SalaryIncome);
lfaExption.ProjectedAmount = GlobalFunctions.Round(LFAItem.TotalAmount);
lfaExption.TotalAmount = lfaExption.ThisMonthAmount + lfaExption.PreviousAmount + lfaExption.ProjectedAmount;
lfaExption.Side = EnumIncomeTaxSide.Dec_SalaryIncome;
// this.Add(mdExption);
}
#endregion Other Allowance Examption
}
}
protected void CalculateExamtionPrev()
{
#region get Examtion items from processItem
var examtionItems = from pItem in _processItems
where pItem.ItemGroup == 7
select pItem;
#endregion
bool monthlyexemption = true;// ConfigurationManager.GetBoolValue("incometax", "monthlyexemption", EnumConfigurationType.Logic);
ObjectsTemplate<EmpLifeCycle> oCycles = EmpLifeCycle.GetByEmpID(_employee.ID);
foreach (var processItem in examtionItems)
{
double tempAmount = 0;
#region House rent allowance
if (processItem.ItemCode == (int)EnumIncomeTaxItemGroup.Exemption_House_Rent_Allowance)
{
IncomeTax basicItem = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Basic_Salary, (int)EnumIncomeTaxItemGroup.Basic_Salary);
IncomeTax HRItem = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.House_Rent_Allowance, (int)EnumIncomeTaxItemGroup.House_Rent_Allowance);
if (HRItem == null || HRItem.TotalAmount == 0) continue; //throw new ServiceException("House rent allowance not found in the collection while calculating HR Examtion");
//continue; //
IncomeTax HrExption = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Exemption_House_Rent_Allowance, (int)EnumIncomeTaxItemGroup.Exemption_House_Rent_Allowance);
if (HrExption == null) HrExption = this.Add(EnumIncomeTaxItemGroup.Exemption_House_Rent_Allowance,
(int)EnumIncomeTaxItemGroup.Exemption_House_Rent_Allowance, string.Empty, 0, 0, EnumIncomeTaxSide.Dec_SalaryIncome);
//if (oCycles != null && oCycles.Count>0)
//{
// EmpLifeCycle cycle = oCycles.Find(x => x.IsContinue==true);
// if (cycle != null)
// _employee.JoiningDate = cycle.EffectDate;
//}
if (_employee.JoiningDate < new DateTime(2016, 7, 1))
{
monthlyexemption = false;
}
else
monthlyexemption = true;
if (monthlyexemption == false)
{
HrExption.ProjectedAmount = 0;
HrExption.ThisMonthAmount = 0;
HrExption.PreviousAmount = 0;
HrExption.TotalAmount = 0;
if (_taxParameter.MaxHRPercent != 0)
{
double hrAmount = (basicItem.TotalAmount * _taxParameter.MaxHRPercent) / 100;
if (hrAmount > _taxParameter.MaxHRAmount)
HrExption.ProjectedAmount = _taxParameter.MaxHRAmount;
else HrExption.ProjectedAmount = hrAmount;
if (HrExption.TotalAmount > HRItem.TotalAmount || Math.Abs(HrExption.TotalAmount - HRItem.TotalAmount) < 10)
HrExption.ProjectedAmount = HRItem.TotalAmount -
(HrExption.ThisMonthAmount + HrExption.PreviousAmount);
}
else
{
if (HRItem.TotalAmount > _taxParameter.MaxHRAmount)
HrExption.ProjectedAmount = _taxParameter.MaxHRAmount;
else HrExption.ProjectedAmount = HRItem.TotalAmount;
if (HrExption.TotalAmount > HRItem.TotalAmount || Math.Abs(HrExption.TotalAmount - HRItem.TotalAmount) < 10)
HrExption.ProjectedAmount = HRItem.TotalAmount -
(HrExption.ThisMonthAmount + HrExption.PreviousAmount);
}
}
else
{
#region monthly Examption
//if (HRItem.TotalAmount > _taxParameter.MaxHRAmount)
//{
// tempAmount = _taxParameter.MaxHRAmount - HrExption.PreviousAmount;
// HrExption.ThisMonthAmount = tempAmount / (_projectedMonth + 1);
// HrExption.ProjectedAmount = _taxParameter.MaxHRAmount -
// (HrExption.ThisMonthAmount + HrExption.PreviousAmount);
// if (HrExption.TotalAmount > _taxParameter.MaxHRAmount || Math.Abs(HrExption.TotalAmount - HRItem.TotalAmount) < 10)
// HrExption.ProjectedAmount = HrExption.TotalAmount - _taxParameter.MaxHRAmount;
//}
//else
//{
double def = 0;
double nFracAmount = 0;
#region This code needed for only this month to calculate previous month
double maxMonthlyAmount = _taxParameter.MaxHRAmount / 12;
if (HrExption.PreviousAmount == 0 && _employee.JoiningDate < new DateTime(2016, 7, 1))
{
if (maxMonthlyAmount * 7 < HRItem.PreviousAmount)
{
HrExption.PreviousAmount = maxMonthlyAmount * 7;
}
else HrExption.PreviousAmount = HRItem.PreviousAmount;
}
else
{
if (HRItem.ThisMonthAmount < maxMonthlyAmount)
maxMonthlyAmount = HRItem.ThisMonthAmount;
if (_employee.JoiningDate == GlobalFunctions.FirstDateOfMonth(_employee.JoiningDate))
def = Global.DateFunctions.DateDiff("m", _employee.JoiningDate, GlobalFunctions.LastDateOfMonth(_taxParameter.FiscalyearDateTo)) + 1;
else
{
def = Global.DateFunctions.DateDiff("m", _employee.JoiningDate, GlobalFunctions.LastDateOfMonth(_taxParameter.FiscalyearDateTo));
TimeSpan ts = GlobalFunctions.LastDateOfMonth(_employee.JoiningDate) - _employee.JoiningDate;
nFracAmount = (maxMonthlyAmount / (double)DateTime.DaysInMonth(_employee.JoiningDate.Year, _employee.JoiningDate.Month)) * ((double)ts.Days + 1);
}
HrExption.PreviousAmount = (maxMonthlyAmount * def) + nFracAmount;
}
if (HRItem.ThisMonthAmount < maxMonthlyAmount)
{
double nBasic = basicItem.ThisMonthAmount * def;
nBasic = (nBasic * 50) / 100;
if (HrExption.PreviousAmount < nBasic)
HrExption.PreviousAmount = nBasic;
}
#endregion
if (maxMonthlyAmount < HRItem.ThisMonthAmount)
{
HrExption.ThisMonthAmount = maxMonthlyAmount;
HrExption.ProjectedAmount = maxMonthlyAmount * _projectedMonth;
}
else
{
HrExption.ThisMonthAmount = HRItem.ThisMonthAmount;
HrExption.ProjectedAmount = HRItem.ThisMonthAmount * _projectedMonth;
if (_salary != null && _salary.Details.Any(x => x.itemGroupCode == EnumSalaryGroup.UnauthLeave))
{
double unhraount = 0;
SalaryMonthlyDetail odt = _salary.Details.FirstOrDefault(x => x.itemGroupCode == EnumSalaryGroup.Gross
&& x.ItemCode == EnumSalaryItemCode.Allowance && x.ItemID == 1);
if (odt != null)
unhraount = odt.ChangedAmount;
HrExption.ProjectedAmount = (unhraount + HRItem.ThisMonthAmount) * _projectedMonth;
}
}
// HrExption.ThisMonthAmount = HRItem.ThisMonthAmount;
//tempAmount = HRItem.TotalAmount - HrExption.PreviousAmount;
//HrExption.ThisMonthAmount = HRItem.ThisMonthAmount;
//HrExption.ProjectedAmount = HRItem.ProjectedAmount;
//if (HrExption.TotalAmount > HRItem.TotalAmount || Math.Abs(HrExption.TotalAmount - HRItem.TotalAmount) < 10)
// HrExption.ProjectedAmount = HRItem.TotalAmount -
// (HrExption.ThisMonthAmount + HrExption.PreviousAmount);
//}
#endregion monthly Examption
}
if (_employee.JoiningDate < new DateTime(2016, 7, 1))
{
HrExption.ThisMonthAmount = GlobalFunctions.Round(HrExption.ThisMonthAmount);
HrExption.ProjectedAmount = GlobalFunctions.Round(HrExption.ProjectedAmount);
HrExption.TotalAmount = HrExption.ThisMonthAmount + HrExption.PreviousAmount + HrExption.ProjectedAmount;
}
else
{
HrExption.ThisMonthAmount = 0;
HrExption.ProjectedAmount = 0;
}
DataSet ds = IncomeTax.GetTaxAdj(EnumIncomeTaxItemGroup.Exemption_House_Rent_Allowance, (int)EnumIncomeTaxItemGroup.Exemption_House_Rent_Allowance, _employee.ID);
if (ds != null && ds.Tables.Count > 0)
{
foreach (DataRow dr in ds.Tables[0].Rows)
{
HrExption.PreviousAmount = Convert.ToDouble(dr[4].ToString());
HrExption.TotalAmount = HrExption.PreviousAmount;
}
}
}
#endregion House rent allowance
#region Conveyance Allowance Examtion
else if (processItem.ItemCode == (int)EnumIncomeTaxItemGroup.Exemption_Conveyance_Allowance)
{
monthlyexemption = false;
IncomeTax CnvItem = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Conveyance_Allowance, (int)EnumIncomeTaxItemGroup.Conveyance_Allowance);
if (CnvItem == null || CnvItem.TotalAmount == 0) continue;
IncomeTax CvExption = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Exemption_Conveyance_Allowance, (int)EnumIncomeTaxItemGroup.Exemption_Conveyance_Allowance);
if (CvExption == null) CvExption = this.Add(EnumIncomeTaxItemGroup.Exemption_Conveyance_Allowance, (int)EnumIncomeTaxItemGroup.Exemption_Conveyance_Allowance, string.Empty, 0, 0, EnumIncomeTaxSide.Dec_SalaryIncome);
IncomeTax taxItem = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Cmp_Provided_car, (int)EnumIncomeTaxItemGroup.Cmp_Provided_car);
if (taxItem != null && taxItem.TotalAmount > 0)
{
CvExption.ThisMonthAmount = 0;
CvExption.ProjectedAmount = 0;
CvExption.PreviousAmount = 0;
continue;
}
if (monthlyexemption == false)
{
CvExption.TotalAmount = 0;
CvExption.ProjectedAmount = 0;
CvExption.PreviousAmount = 0;
CvExption.ThisMonthAmount = 0;
if (CnvItem.TotalAmount > _taxParameter.MaxConvAmount || Math.Abs(CnvItem.TotalAmount - _taxParameter.MaxConvAmount) < 10)
CvExption.ProjectedAmount = _taxParameter.MaxConvAmount;
else CvExption.ProjectedAmount = CnvItem.TotalAmount;
}
else
{
if (CnvItem.TotalAmount > _taxParameter.MaxConvAmount)
CvExption.ThisMonthAmount = _taxParameter.MaxConvAmount / 12;
else CvExption.ThisMonthAmount = CnvItem.ThisMonthAmount;
if (CnvItem.TotalAmount > _taxParameter.MaxConvAmount || Math.Abs(CnvItem.TotalAmount - _taxParameter.MaxConvAmount) < 10)
{
CvExption.ProjectedAmount = _taxParameter.MaxConvAmount - (
CvExption.ThisMonthAmount + CvExption.PreviousAmount);
}
else
{
CvExption.ProjectedAmount = CnvItem.TotalAmount - (
CvExption.ThisMonthAmount + CvExption.PreviousAmount);
}
}
CvExption.Side = EnumIncomeTaxSide.Dec_SalaryIncome;
CvExption.ThisMonthAmount = GlobalFunctions.Round(CvExption.ThisMonthAmount);
CvExption.ProjectedAmount = GlobalFunctions.Round(CvExption.ProjectedAmount);
CvExption.TotalAmount = CvExption.ThisMonthAmount + CvExption.PreviousAmount + CvExption.ProjectedAmount;
}
#endregion Conveyance Allowance Examtion
#region Other Allowance Examption
else if (processItem.ItemCode == (int)EnumIncomeTaxItemGroup.Exemption_Medical_Allowance)
{
monthlyexemption = false;
IncomeTax MedicalItem = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Medical_Allowance, (int)EnumIncomeTaxItemGroup.Medical_Allowance);
if (MedicalItem == null) continue; //throw new ServiceException("Conveyance allowance not found in the collection while calculating HR Examtion");
IncomeTax mdExption = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Exemption_Medical_Allowance, (int)EnumIncomeTaxItemGroup.Exemption_Medical_Allowance);
if (mdExption == null) mdExption = this.Add(EnumIncomeTaxItemGroup.Exemption_Medical_Allowance, (int)EnumIncomeTaxItemGroup.Exemption_Medical_Allowance, string.Empty, 0, 0, EnumIncomeTaxSide.Dec_SalaryIncome);
IncomeTax basicItem = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Basic_Salary, (int)EnumIncomeTaxItemGroup.Basic_Salary);
//Sumon on 24 June 2014
double nMamount = 0;
if (basicItem != null) nMamount = basicItem.TotalAmount *
(double)((_taxParameter.MaxMedicalPercent != 0) ? _taxParameter.MaxMedicalPercent / 100 : 0);
if (MedicalItem == null || MedicalItem.TotalAmount == 0)
mdExption.ProjectedAmount = 0.00;
else if (nMamount > _taxParameter.MaxMedicalAmount)
mdExption.ProjectedAmount = MedicalItem.TotalAmount < _taxParameter.MaxMedicalAmount ? MedicalItem.TotalAmount : GlobalFunctions.Round(_taxParameter.MaxMedicalAmount);
else
mdExption.ProjectedAmount = MedicalItem.TotalAmount > nMamount ? GlobalFunctions.Round(nMamount) : MedicalItem.TotalAmount;
//End
//mdExption.ProjectedAmount =GlobalFunctions.Round(MedicalItem.TotalAmount);
mdExption.TotalAmount = mdExption.ThisMonthAmount + mdExption.PreviousAmount + mdExption.ProjectedAmount;
mdExption.Side = EnumIncomeTaxSide.Dec_SalaryIncome;
// this.Add(mdExption);
}
else if (processItem.ItemCode == (int)EnumIncomeTaxItemGroup.Exemption_LFA_Allowance)
{
IncomeTax LFAItem = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.LFA_Allowance, (int)EnumIncomeTaxItemGroup.LFA_Allowance);
if (LFAItem == null) continue;// throw new ServiceException("LFA allowance not found in the collection while calculating HR Examtion");
//continue; //
IncomeTax lfaExption = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Exemption_LFA_Allowance, (int)EnumIncomeTaxItemGroup.Exemption_LFA_Allowance);
if (lfaExption == null) lfaExption = this.Add(EnumIncomeTaxItemGroup.Exemption_LFA_Allowance, (int)EnumIncomeTaxItemGroup.Exemption_LFA_Allowance, string.Empty, 0, 0, EnumIncomeTaxSide.Dec_SalaryIncome);
lfaExption.ProjectedAmount = GlobalFunctions.Round(LFAItem.TotalAmount);
lfaExption.TotalAmount = lfaExption.ThisMonthAmount + lfaExption.PreviousAmount + lfaExption.ProjectedAmount;
lfaExption.Side = EnumIncomeTaxSide.Dec_SalaryIncome;
// this.Add(mdExption);
}
#endregion Other Allowance Examption
}
}
protected void CalculateCPF()
{
if (_employee.PFMemberType != EnumPFMembershipType.Live) return;
IncomeTax pfItem = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Company_Contri_PF, (int)EnumIncomeTaxItemGroup.Company_Contri_PF);
if (pfItem == null) pfItem = this.Add(EnumIncomeTaxItemGroup.Company_Contri_PF, (int)EnumIncomeTaxItemGroup.Company_Contri_PF, string.Empty, 0, 0, EnumIncomeTaxSide.Inc_AnnualIncome);
IncomeTax BasicItem = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Basic_Salary, (int)EnumIncomeTaxItemGroup.Basic_Salary);
if (_salary != null)
pfItem.ThisMonthAmount = _salary.GetDeductAmount(EnumSalaryItemCode.PF_Contribution, (int)EnumSalaryItemCode.PF_Contribution);
else
pfItem.ThisMonthAmount = (BasicItem.ThisMonthAmount
* SystemInformation.CurrentSysInfo.pFContriCompany) / 100;
pfItem.ProjectedAmount = (BasicItem.ProjectedAmount
* SystemInformation.CurrentSysInfo.pFContriCompany) / 100;
pfItem.ThisMonthAmount = GlobalFunctions.Round(pfItem.ThisMonthAmount);
pfItem.ProjectedAmount = GlobalFunctions.Round(pfItem.ProjectedAmount);
}
protected void CalculateUpdateBonusProjection(double nAmount)
{
if (_employee.ForeignExPat == true) return;
ObjectsTemplate<FestivalBonusProjection> taxProjections = FestivalBonusProjection.Get(EnumStatus.Active);
IncomeTax pfItem = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Bonus, (int)EnumIncomeTaxItemGroup.Bonus);
if (pfItem == null) pfItem = this.Add(EnumIncomeTaxItemGroup.Bonus, (int)EnumIncomeTaxItemGroup.Bonus, "Festival Bonus", 0, 0, EnumIncomeTaxSide.Inc_SalaryIncome);
pfItem.ProjectedAmount = nAmount + pfItem.ProjectedAmount;
if (pfItem.ProjectedAmount <= 0)
pfItem.ProjectedAmount = 0;
pfItem.ProjectedAmount = GlobalFunctions.Round(pfItem.ProjectedAmount);
}
protected void CalculateBonusProjection()
{
List<BonusParameter> oparams = null;
if (_projectionBonusParams == null)
{
_projectionBonusParams = new ObjectsTemplate<BonusParameter>();
ObjectsTemplate<BonusParameter> ops = BonusParameter.Get(EnumStatus.Regardless);
foreach (BonusParameter oitem in ops)
if (oitem.IsFestival == true)
{
oitem.SetupDetails = BonusParameter.Service.GetSetupDetail(oitem.ID);
_projectionBonusParams.Add(oitem);
}
}
if (_projectionBonusParams == null || _projectionBonusParams.Count == 0) return;
oparams = BonusParameter.GetApplicableParametersByGrade(_employee, _employee.GradeID, _projectionBonusParams);
if (oparams == null) return;
_ApplicableBonusParams = oparams;
IncomeTax pfItem = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Bonus, (int)EnumIncomeTaxItemGroup.Bonus);
if (pfItem == null) pfItem = this.Add(EnumIncomeTaxItemGroup.Bonus, (int)EnumIncomeTaxItemGroup.Bonus, "Festival Bonus", 0, 0, EnumIncomeTaxSide.Inc_SalaryIncome);
foreach (BonusParameter item in oparams)
{
//pfItem.ProjectedAmount =0;
ObjectsTemplate<BonusParameter> paramAll = BonusParameter.Get(EnumStatus.Regardless);
List<EnmSetupManagerTranType> oSetupManagerTranTypes = SetupDetail.GetTypes(EnumParameterSetup.Bonus);
ObjectsTemplate<SetupDetail> oSetupDetails = SetupDetail.GetParameters(EnumParameterSetup.Bonus);
ObjectsTemplate<BonusParameter> oParams = BonusParameter.ApplicableParameters3(_employee, item.BonusID, oSetupManagerTranTypes, oSetupDetails, paramAll);
ObjectsTemplate<ADParameter> adParams = ADParameter.Get(_employee.GradeID, EnumEntitleType.Grade, EnumAllowOrDeduct.Allowance);
ObjectsTemplate<ADParameterEmployee> adParamEmps = ADParameterEmployee.GetByEmployee(_employee.ID, EnumAllowOrDeduct.Allowance, EnumADEmpType.AppliedToIndividual);
ObjectsTemplate<GrossDefination> grossDefinitions = GrossDefination.Get();
EmployeeGradeSalary ogs = EmployeeGradeSalary.GetBasicOnDate(_employee.ID, SystemInformation.CurrentSysInfo.NextPayProcessDate);
double bonusAmount = BonusCalculator.GetMonthlyGrossAmount(_employee, adParams, adParamEmps, grossDefinitions, SystemInformation.CurrentSysInfo.NextPayProcessDate, ogs);
double nPaid = BonusProcess.GetBonusPaidAmount(_taxParameter.FiscalyearDatefrom, _taxParameter.FiscalyearDateTo, _employee.ID, item.BonusID.Integer);
pfItem.ProjectedAmount = (bonusAmount * item.PercentOfGross)/100 - nPaid;
//DateTime oEndMonth = new DateTime(((item.TaxProjectInMonth <= 6) ? _taxParameter.FiscalyearDateTo.Year : _taxParameter.FiscalyearDatefrom.Year), item.TaxProjectInMonth, 1);
//if (item.TaxProjectInMonth != null && oEndMonth > Global.DateFunctions.FirstDateOfMonth(SystemInformation.CurrentSysInfo.NextPayProcessDate))
//{
// BonusCalculator ocal = new BonusCalculator();
// double nn=ocal.CalcluateBonus(item, _employee, _employee.BasicSalary, _employee.GrossSalary,
// Global.DateFunctions.LastDateOfYear(SystemInformation.CurrentSysInfo.NextPayProcessDate));
// if (_employee.ReligionID.Integer == 2)
// pfItem.ProjectedAmount = 0;
// else if (_employee.ReligionID.Integer == 4)
// pfItem.ProjectedAmount = _employee.BasicSalary*2;
// else
// pfItem.ProjectedAmount = _employee.BasicSalary;// *2;
// // if not religion islam
// // if thier is an amount in previous then no need to projection
// // else projected amount will be basic * 2;
// // for islam
// // Payroll month in between july to dec then
// // prevous amount =0 then basic * 2
// // else basic *1
// // else basic *1
// //pfItem.ProjectedAmount = pfItem.ProjectedAmount + ocal.CalcluateBonus(item, _employee, _employee.BasicSalary, _employee.GrossSalary,
// // Global.DateFunctions.LastDateOfYear(SystemInformation.CurrentSysInfo.NextPayProcessDate));
// //}
// //Non Muslim
// //////////if(_employee.ReligionID.Integer==2||_employee.ReligionID.Integer==3||_employee.ReligionID.Integer==4)
// //////////{
// ////////// if(pfItem.PreviousAmount==0)
// ////////// {
// ////////// pfItem.ProjectedAmount= _employee.BasicSalary * 2;
// ////////// }
// //////////}
// //////////else
// //////////{
// ////////// if (SystemInformation.CurrentSysInfo.NextPayProcessDate >= new DateTime(SystemInformation.CurrentSysInfo.NextPayProcessDate.Year, 7, 1)
// ////////// && SystemInformation.CurrentSysInfo.NextPayProcessDate >= GlobalFunctions.LastDateOfMonth(new DateTime(SystemInformation.CurrentSysInfo.NextPayProcessDate.Year, 12, 1)))
// ////////// {
// ////////// if (pfItem.PreviousAmount == 0)
// ////////// {
// ////////// pfItem.ProjectedAmount = _employee.BasicSalary * 2;
// ////////// }
// ////////// else
// ////////// {
// ////////// pfItem.ProjectedAmount = _employee.BasicSalary;
// ////////// }
// ////////// }
// ////////// else
// ////////// {
// ////////// pfItem.ProjectedAmount = _employee.BasicSalary;
// ////////// }
// //////////}
// //if (_employee.ReligionID.Integer == 2 || _employee.ReligionID.Integer == 4)
// //{
// // pfItem.ProjectedAmount = 0;
// //}
// //else if (_employee.ReligionID.Integer == 1)
// //{
// // pfItem.ProjectedAmount = _employee.BasicSalary;
// //}
// //else if (_employee.ReligionID.Integer == 3)
// //{
// // pfItem.ProjectedAmount = _employee.BasicSalary * 2;
// //}
//}
}
if (Payroll.BO.SystemInformation.CurrentSysInfo.NextPayProcessDate.Month == 6) // Forcely zero on month Jun
pfItem.ProjectedAmount = 0;
// pfItem.ProjectedAmount = pfItem.ProjectedAmount - (pfItem.PreviousAmount + pfItem.ThisMonthAmount);
if (pfItem.ProjectedAmount <= 0)
pfItem.ProjectedAmount = 0;
pfItem.ProjectedAmount =GlobalFunctions.Round(pfItem.ProjectedAmount);
}
protected void CalculateInvestment()
{
IncomeTax InvestmentItem = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Tax_Credit_On_Investment,
(int)EnumIncomeTaxItemGroup.Tax_Credit_On_Investment);
if (InvestmentItem == null) InvestmentItem = this.Add(EnumIncomeTaxItemGroup.Tax_Credit_On_Investment, (int)EnumIncomeTaxItemGroup.Tax_Credit_On_Investment, string.Empty, 0, 0, EnumIncomeTaxSide.Dec_GrossTax);
if (_employee.ForeignExPat == true) return;
bool binvestmenton = ConfigurationManager.GetBoolValue("incometax", "investmentwithoutpf", EnumConfigurationType.Logic);
IncomeTax AnnualItem = null;
//if (binvestmenton == true)
// AnnualItem = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Annual_Salary_Income,
// (int)EnumIncomeTaxItemGroup.Annual_Salary_Income);
//else
AnnualItem = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Annual_Income,
(int)EnumIncomeTaxItemGroup.Annual_Income);
double investmentCanBeShown = ((AnnualItem.TotalAmount * _taxParameter.MaxInvestPercent) / 100);
if (investmentCanBeShown > _taxParameter.MaxInvAmount) investmentCanBeShown = _taxParameter.MaxInvAmount;
double investAmount = investmentCanBeShown;
_isActualInvestment = true;
if (_taxParameter.InvestmentActiveMonth == null) _isActualInvestment = false;
//else
//{
// DateTime investmonth = new DateTime(_taxParameter.FiscalyearDatefrom.Year, ((DateTime)_taxParameter.InvestmentActiveMonth).Month, 1);
// investmonth = GlobalFunctions.LastDateOfMonth(investmonth);
// if (investmonth <= SystemInformation.CurrentSysInfo.NextPayProcessDate)
// _isActualInvestment = true;
//}
double nPFAmount = 0;
if (_isActualInvestment == true)
{
IncomeTax ActualInvestment = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Investment_Actual,
(int)EnumIncomeTaxItemGroup.Investment_Actual);
if (ActualInvestment == null)
ActualInvestment = this.Add(EnumIncomeTaxItemGroup.Investment_Actual, (int)EnumIncomeTaxItemGroup.Investment_Actual, string.Empty, 0, 0, EnumIncomeTaxSide.Tax_Info_Item);
IncomeTax pfItem = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Company_Contri_PF,
(int)EnumIncomeTaxItemGroup.Company_Contri_PF);
investAmount = 0;
if (pfItem != null)
{
investAmount = investAmount + (pfItem.TotalAmount * 2);
nPFAmount = pfItem.TotalAmount * 2;
}
EmployeeTaxInvestment etax = new EmployeeTaxInvestment();
double nactualInvt = etax.GetAmount(_taxParameter.ID, _employee.ID);
#region Added By ashek
double nAllowedInvestment = (AnnualItem.TotalAmount * 25) / 100;
double nActual=nAllowedInvestment-nPFAmount;
if (nactualInvt > nActual)
investAmount = nActual;
else
investAmount = nactualInvt;
#endregion
//investAmount = investAmount + nactualInvt;
ActualInvestment.ProjectedAmount = investAmount;//nactualInvt;
ActualInvestment.TotalAmount = investAmount;// nactualInvt;
investAmount += nPFAmount;
}
IncomeTax InvestmentAllowed = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Investment_Allowed,
(int)EnumIncomeTaxItemGroup.Investment_Allowed);
if (InvestmentAllowed == null) InvestmentAllowed = this.Add(EnumIncomeTaxItemGroup.Investment_Allowed,
(int)EnumIncomeTaxItemGroup.Investment_Allowed, string.Empty, 0, 0, EnumIncomeTaxSide.Tax_Info_Item);
InvestmentAllowed.ProjectedAmount = GlobalFunctions.Round(investmentCanBeShown);
InvestmentAllowed.TotalAmount = GlobalFunctions.Round(investmentCanBeShown);
double taxCredit = 0;
taxCredit = (investAmount * _taxParameter.MaxInvExempPercent) / 100;
double nTempRebate = (investAmount * _taxParameter.MaxInvExempPercent) / 100;
if (nTempRebate > (AnnualItem.TotalAmount * .03))
nTempRebate = AnnualItem.TotalAmount * .03;
if (nTempRebate > 1000000)
nTempRebate = 1000000;
InvestmentItem.ProjectedAmount = GlobalFunctions.Round(taxCredit);
InvestmentItem.TotalAmount = GlobalFunctions.Round(taxCredit);
}
protected void PrvYearTaxRebate()
{
if (_prvYearTotalIncomes == null)
_prvYearTotalIncomes = IncomeTax.GetPrvYear(_taxParameter.ID,
EnumIncomeTaxItemGroup.Annual_Income, (int)EnumIncomeTaxItemGroup.Annual_Income);
if (_prvYearTotalIncomes == null) return;
IncomeTax prvYearIncome = IncomeTax.Get(_prvYearTotalIncomes, _employee.ID,
EnumIncomeTaxItemGroup.Annual_Income, (int)EnumIncomeTaxItemGroup.Annual_Income);
if (prvYearIncome == null) return;
IncomeTax CurrYearIncome = IncomeTax.Get(_currentYearTax, _employee.ID,
EnumIncomeTaxItemGroup.Annual_Income, (int)EnumIncomeTaxItemGroup.Annual_Income);
if (CurrYearIncome == null) return;
if (_PrvYeartaxParameter == null) _PrvYeartaxParameter = Payroll.BO.TaxParameter.Get(_taxParameter.FiscalYear);
if (_PrvYeartaxParameter == null) return;
double currAmount = CurrYearIncome.TotalAmount;
double PrvAmount = prvYearIncome.TotalAmount;
double exemptedAmount = 0;
if (PrvAmount >= _PrvYeartaxParameter.GetSlabTotal() && currAmount > _taxParameter.GetSlabTotal())
{
if (currAmount >= (PrvAmount + (PrvAmount * 10) / 100))
{
exemptedAmount = currAmount - PrvAmount;
exemptedAmount = (exemptedAmount * 25) / 100; // 25%
exemptedAmount = (exemptedAmount * 10) / 100; // 10%
IncomeTax grossRebate = IncomeTax.Get(_currentYearTax, _employee.ID,
EnumIncomeTaxItemGroup.Tax_Gross_Rebate, (int)EnumIncomeTaxItemGroup.Tax_Gross_Rebate);
if (grossRebate == null) grossRebate = this.Add(EnumIncomeTaxItemGroup.Tax_Gross_Rebate, (int)EnumIncomeTaxItemGroup.Tax_Gross_Rebate, string.Empty, 0, 0, EnumIncomeTaxSide.Dec_GrossTax);
grossRebate.ProjectedAmount = GlobalFunctions.Round(exemptedAmount);
this.Add(grossRebate);
}
}
}
protected void CmpProvidedHouseAndTransport(DateTime month)
{
try
{
if (_assignedHeads == null) return;
ObjectsTemplate<ITEmpHead> Items = ITEmpHead.Get(_assignedHeads, _employee.ID);
if (Items == null || Items.Count == 0) return;
DateTime fromDate = GlobalFunctions.FirstDateOfMonth(month);
DateTime toDate = GlobalFunctions.LastDateOfMonth(month);
bool bvalid = false;
IncomeTax basicSalaryItem = IncomeTax.Get(_currentYearTax, _employee.ID,
EnumIncomeTaxItemGroup.Basic_Salary,
(int)EnumIncomeTaxItemGroup.Basic_Salary);
if (basicSalaryItem == null) throw new ServiceException("Basic salary item not found in the collection on "
+ " calculating Company provided Car/HouseRent of the Employee No:" + _employee.EmployeeNo);
double tempAmount = 0;
double carparcent = ((double)5 / (double)100);
double hrPercent = ((double)25 / (double)100);
foreach (ITEmpHead item in Items)
{
IncomeTax taxItem;
bvalid = false;
if (item.StartDate >= fromDate) { fromDate = item.StartDate; }
if (item.EndDate <= toDate) { toDate = item.EndDate; }
if (item.StartDate <= fromDate && item.EndDate >= fromDate) bvalid = true;
else bvalid = false;
if (item.StartDate <= toDate && item.EndDate >= toDate) bvalid = true;
else bvalid = false;
if (bvalid == false)
{
DataSet ds = IncomeTax.GetTaxAdj(EnumIncomeTaxItemGroup.Cmp_Provided_car, (int)EnumIncomeTaxItemGroup.Cmp_Provided_car, _employee.ID);
if (ds != null && ds.Tables.Count > 0)
{
foreach (DataRow dr in ds.Tables[0].Rows)
{
taxItem = IncomeTax.Get(_currentYearTax, _employee.ID,
EnumIncomeTaxItemGroup.Cmp_Provided_car,
(int)EnumIncomeTaxItemGroup.Cmp_Provided_car);
if (taxItem == null) taxItem = this.Add(EnumIncomeTaxItemGroup.Cmp_Provided_car,
(int)EnumIncomeTaxItemGroup.Cmp_Provided_car, "Company provided car", 0, 0, EnumIncomeTaxSide.Inc_SalaryIncome);
taxItem.ThisMonthAmount = Convert.ToDouble(dr[6].ToString());
taxItem.ProjectedAmount = 0;
}
}
continue;
}
//if (item.StartDate > fromDate) fromDate = item.StartDate;
//if (item.EndDate > toDate) toDate = item.EndDate;
#region Calculate Car calculation
if (item.HeadID == EnumIncomeTaxHead.Car)
{
taxItem = IncomeTax.Get(_currentYearTax, _employee.ID,
EnumIncomeTaxItemGroup.Cmp_Provided_car,
(int)EnumIncomeTaxItemGroup.Cmp_Provided_car);
if (taxItem == null) taxItem = this.Add(EnumIncomeTaxItemGroup.Cmp_Provided_car,
(int)EnumIncomeTaxItemGroup.Cmp_Provided_car, "Company provided car", 0, 0, EnumIncomeTaxSide.Inc_SalaryIncome);
if (_salary == null)
tempAmount = basicSalaryItem.ThisMonthAmount;
else
{
SalaryMonthlyDetail detail = _salary.GetDetail(EnumSalaryGroup.Gross, EnumSalaryItemCode.Basic_Salary, (int)EnumSalaryItemCode.Basic_Salary);
if (detail == null) continue;
tempAmount = detail.ChangedAmount;
#region basic salary arrear effect
foreach (EmployeeGradeSalary gse in _salary.ArrearGradeSalaries)
{
if (gse.TillDate > item.StartDate)
{
if (item.StartDate > gse.EffectDate)
{
tempAmount = tempAmount + gse.BasicSalary *
GlobalFunctions.GetFraction(item.StartDate, (DateTime)gse.TillDate);
}
else
{
// SalaryMonthlyDetail detail = _salary.GetDetail(EnumSalaryGroup.Gross, EnumSalaryItemCode.Basic_Salary, (int)EnumSalaryItemCode.Basic_Salary);
SalaryMonthlyDetail arreardetail = _salary.GetDetail(EnumSalaryGroup.Arrear, EnumSalaryItemCode.Basic_Salary, (int)EnumSalaryItemCode.Basic_Salary);
if (arreardetail != null)
{
tempAmount = tempAmount + arreardetail.ChangedAmount;
}
}
}
}
double nTemp = tempAmount;
foreach (EmployeeGradeSalary gse in _salary.ArrearPaidGradeSalaries)
{
if (gse.TillDate > item.StartDate)
{
if (item.StartDate > gse.EffectDate)
tempAmount = tempAmount - gse.BasicSalary *
GlobalFunctions.GetFraction(item.StartDate, (DateTime)gse.TillDate);
else
tempAmount = tempAmount - gse.BasicSalary *
GlobalFunctions.GetFraction(gse.EffectDate, (DateTime)gse.TillDate);
}
}
if (tempAmount<0)
tempAmount = nTemp;
#endregion basic salary arrear effect
}
// need to fractionate if from date is not first date of month
TimeSpan ts = toDate - fromDate;
int nDaysInMonth = DateTime.DaysInMonth(fromDate.Year, fromDate.Month);
int nDays = ts.Days + 1;
if (nDays < nDaysInMonth)
{
tempAmount = (tempAmount / nDaysInMonth) * nDays;
}
taxItem.ThisMonthAmount = GlobalFunctions.Round(tempAmount * carparcent);
if (item.EndDate > _taxParameter.FiscalyearDateTo) toDate = _taxParameter.FiscalyearDateTo;
if (_employee.EndOfContractDate != null && _employee.EndOfContractDate < toDate)
toDate = Convert.ToDateTime(_employee.EndOfContractDate);
if (_projectedMonth == 0) tempAmount = basicSalaryItem.ProjectedAmount;
else tempAmount = basicSalaryItem.ProjectedAmount / _projectedMonth;
double nFrac = 1;
if (nDays < nDaysInMonth)
{
//nFrac = (double)nDays / (double)nDaysInMonth;
//taxItem.ProjectedAmount = (tempAmount * Math.Round(nFrac, 2) * carparcent) + (basicSalaryItem.ThisMonthAmount * (_projectedMonth - 1));
taxItem.ProjectedAmount = 0;
}
else
taxItem.ProjectedAmount = (tempAmount * Math.Round(nFrac, 2) * carparcent) * _projectedMonth;
//if (toDate == GlobalFunctions.LastDateOfMonth(toDate))
//{
// taxItem.ProjectedAmount = (tempAmount * (Global.DateFunctions.DateDiff("m", GlobalFunctions.LastDateOfMonth(month).AddDays(1), toDate) + 1) * carparcent);
//}
//else
//{
// // need to fractionate last month
// taxItem.ProjectedAmount = (tempAmount * GlobalFunctions.GetFraction(GlobalFunctions.LastDateOfMonth(month).AddDays(1), toDate)) * carparcent;
//}
DataSet ds = IncomeTax.GetTaxAdj(EnumIncomeTaxItemGroup.Cmp_Provided_car, (int)EnumIncomeTaxItemGroup.Cmp_Provided_car, _employee.ID);
if (ds != null && ds.Tables.Count > 0)
{
foreach (DataRow dr in ds.Tables[0].Rows)
{
taxItem.ThisMonthAmount = Convert.ToDouble(dr[6].ToString());
}
}
if (taxItem.TotalAmount < 60000)
taxItem.ProjectedAmount = 60000 - (taxItem.PreviousAmount + taxItem.ThisMonthAmount);
//taxItem.ProjectedAmount = 0;
if (taxItem.TotalAmount > 0)
{
IncomeTax CvExption = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Exemption_Conveyance_Allowance, (int)EnumIncomeTaxItemGroup.Exemption_Conveyance_Allowance);
if (CvExption !=null && CvExption.TotalAmount > 0)
{
CvExption.PreviousAmount = 0;
CvExption.ThisMonthAmount = 0;
CvExption.ProjectedAmount = 0;
}
}
}
#endregion Calculate Car calculation
#region Calculate House rent calculation
if (item.HeadID == EnumIncomeTaxHead.House)
{
taxItem = IncomeTax.Get(_currentYearTax, _employee.ID,
EnumIncomeTaxItemGroup.Cmp_Provided_House,
(int)EnumIncomeTaxItemGroup.Cmp_Provided_House);
if (taxItem == null) taxItem = this.Add(EnumIncomeTaxItemGroup.Cmp_Provided_House,
(int)EnumIncomeTaxItemGroup.Cmp_Provided_House, "Company provided House", 0, 0, EnumIncomeTaxSide.Inc_SalaryIncome);
if (item.HouseRent == 0)
{
if (_salary == null)
tempAmount = basicSalaryItem.ThisMonthAmount;
else
{
SalaryMonthlyDetail detail = _salary.GetDetail(EnumSalaryGroup.Gross, EnumSalaryItemCode.Basic_Salary, (int)EnumSalaryItemCode.Basic_Salary);
if (detail == null) continue;
tempAmount = detail.ChangedAmount;
#region basic salary arrear effect
foreach (EmployeeGradeSalary gse in _salary.ArrearGradeSalaries)
{
if (gse.TillDate > item.StartDate)
{
if (item.StartDate > gse.EffectDate)
tempAmount = tempAmount + gse.BasicSalary *
GlobalFunctions.GetFraction(item.StartDate, (DateTime)gse.TillDate);
else
{
SalaryMonthlyDetail arreardetail = _salary.GetDetail(EnumSalaryGroup.Arrear, EnumSalaryItemCode.Basic_Salary, (int)EnumSalaryItemCode.Basic_Salary);
if (arreardetail != null)
{
tempAmount = tempAmount + arreardetail.ChangedAmount;
}
}
}
}
foreach (EmployeeGradeSalary gse in _salary.ArrearPaidGradeSalaries)
{
if (gse.TillDate > item.StartDate)
{
if (item.StartDate > gse.EffectDate)
tempAmount = tempAmount - gse.BasicSalary *
GlobalFunctions.GetFraction(item.StartDate, (DateTime)gse.TillDate);
else
tempAmount = tempAmount - gse.BasicSalary *
GlobalFunctions.GetFraction(gse.EffectDate, (DateTime)gse.TillDate);
}
}
#endregion basic salary arrear effect
}
taxItem.ThisMonthAmount = GlobalFunctions.Round(tempAmount * hrPercent);
}
else
taxItem.ThisMonthAmount = GlobalFunctions.Round(GlobalFunctions.GetFraction(fromDate, toDate) * item.HouseRent);
//if (item.EndDate <= toDate) continue;
//toDate = item.EndDate;
if (item.EndDate >= _taxParameter.FiscalyearDateTo) toDate = _taxParameter.FiscalyearDateTo;
if (item.HouseRent == 0)
{
if (_projectedMonth == 0)
tempAmount = basicSalaryItem.ProjectedAmount;
else tempAmount = basicSalaryItem.ProjectedAmount / _projectedMonth;
if (toDate == GlobalFunctions.LastDateOfMonth(toDate))
taxItem.ProjectedAmount = (tempAmount * (Global.DateFunctions.DateDiff("m", GlobalFunctions.LastDateOfMonth(month).AddDays(1), toDate) + 1) * hrPercent);
else
taxItem.ProjectedAmount = (tempAmount * GlobalFunctions.GetFraction(GlobalFunctions.LastDateOfMonth(month).AddDays(1), toDate)) * hrPercent;
taxItem.ProjectedAmount = GlobalFunctions.Round(taxItem.ProjectedAmount);
}
else
{
taxItem.ProjectedAmount = GlobalFunctions.GetFraction(
GlobalFunctions.LastDateOfMonth(month).AddDays(1), toDate) * item.HouseRent;
taxItem.ProjectedAmount = GlobalFunctions.Round(taxItem.ProjectedAmount);
}
taxItem.Side = EnumIncomeTaxSide.Inc_SalaryIncome;
}
#endregion Calculate Car calculation
}
}
catch (ServiceException ex)
{
throw new ServiceException(ex.Message);
}
catch (Exception ex)
{
throw new ServiceException(ex.Message);
}
}
private double GetTotalSalary()
{
double TotGross;
double TotExemp;
TotGross = 0; TotExemp = 0;
foreach (IncomeTax item in _currentYearTax)
{
if (item.Side == EnumIncomeTaxSide.Dec_SalaryIncome)
TotExemp = TotExemp + item.TotalAmount;
else if (item.Side == EnumIncomeTaxSide.Inc_SalaryIncome)
TotGross = TotGross + item.TotalAmount;
}
return TotGross - TotExemp;
}
protected double GetAnnualIncome()
{
double TotIncome = 0;
foreach (IncomeTax item in _currentYearTax)
{
if (item.Side == EnumIncomeTaxSide.Inc_AnnualIncome)
TotIncome = TotIncome + item.TotalAmount;
else if (item.Side == EnumIncomeTaxSide.Dec_AnnualIncome)
TotIncome = TotIncome - item.TotalAmount;
}
TotIncome = this.GetTotalSalary() + TotIncome;
return TotIncome;
}
protected void CalculateTotalIncome()
{
IncomeTax salaryIncome = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Annual_Salary_Income,
(int)EnumIncomeTaxItemGroup.Annual_Salary_Income);
if (salaryIncome == null) salaryIncome = this.Add(EnumIncomeTaxItemGroup.Annual_Salary_Income,
(int)EnumIncomeTaxItemGroup.Annual_Salary_Income, string.Empty, 0, 0, EnumIncomeTaxSide.Tax_fixed_Item);
salaryIncome.TotalAmount = 0;
salaryIncome.PreviousAmount = 0;
salaryIncome.ThisMonthAmount = 0;
salaryIncome.ProjectedAmount = 0;
foreach (IncomeTax item in _currentYearTax)
{
if (item.Side == EnumIncomeTaxSide.Inc_SalaryIncome)
{
salaryIncome.PreviousAmount = salaryIncome.PreviousAmount + item.PreviousAmount;
salaryIncome.ThisMonthAmount = salaryIncome.ThisMonthAmount + item.ThisMonthAmount;
salaryIncome.ProjectedAmount = salaryIncome.ProjectedAmount + item.ProjectedAmount;
salaryIncome.TotalAmount = salaryIncome.TotalAmount + item.TotalAmount;
}
else if (item.Side == EnumIncomeTaxSide.Dec_SalaryIncome)
{
salaryIncome.PreviousAmount = salaryIncome.PreviousAmount - item.PreviousAmount;
salaryIncome.ThisMonthAmount = salaryIncome.ThisMonthAmount - item.ThisMonthAmount;
salaryIncome.ProjectedAmount = salaryIncome.ProjectedAmount - item.ProjectedAmount;
salaryIncome.TotalAmount = salaryIncome.TotalAmount - item.TotalAmount;
}
}
salaryIncome.PreviousAmount = GlobalFunctions.Round(salaryIncome.PreviousAmount);
salaryIncome.ThisMonthAmount = GlobalFunctions.Round(salaryIncome.ThisMonthAmount);
salaryIncome.ProjectedAmount = GlobalFunctions.Round(salaryIncome.ProjectedAmount);
IncomeTax annualIncome = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Annual_Income,
(int)EnumIncomeTaxItemGroup.Annual_Income);
if (annualIncome == null) annualIncome = this.Add(EnumIncomeTaxItemGroup.Annual_Income,
(int)EnumIncomeTaxItemGroup.Annual_Income, string.Empty, 0, 0, EnumIncomeTaxSide.Tax_fixed_Item);
annualIncome.TotalAmount = 0;
annualIncome.PreviousAmount = 0;
annualIncome.ThisMonthAmount = 0;
annualIncome.ProjectedAmount = 0;
foreach (IncomeTax item in _currentYearTax)
{
if (item.Side == EnumIncomeTaxSide.Inc_AnnualIncome)
{
annualIncome.PreviousAmount = annualIncome.PreviousAmount + item.PreviousAmount;
annualIncome.ThisMonthAmount = annualIncome.ThisMonthAmount + item.ThisMonthAmount;
annualIncome.ProjectedAmount = annualIncome.ProjectedAmount + item.ProjectedAmount;
annualIncome.TotalAmount = annualIncome.TotalAmount + item.TotalAmount;
}
else if (item.Side == EnumIncomeTaxSide.Dec_AnnualIncome)
{
annualIncome.PreviousAmount = annualIncome.PreviousAmount - item.PreviousAmount;
annualIncome.ThisMonthAmount = annualIncome.ThisMonthAmount - item.ThisMonthAmount;
annualIncome.ProjectedAmount = annualIncome.ProjectedAmount - item.ProjectedAmount;
annualIncome.TotalAmount = annualIncome.TotalAmount - item.TotalAmount;
}
}
annualIncome.PreviousAmount = annualIncome.PreviousAmount + salaryIncome.PreviousAmount;
annualIncome.ThisMonthAmount = annualIncome.ThisMonthAmount + salaryIncome.ThisMonthAmount;
annualIncome.ProjectedAmount = annualIncome.ProjectedAmount + salaryIncome.ProjectedAmount;
annualIncome.TotalAmount = annualIncome.TotalAmount + salaryIncome.TotalAmount;
annualIncome.PreviousAmount = GlobalFunctions.Round(annualIncome.PreviousAmount);
annualIncome.ThisMonthAmount = GlobalFunctions.Round(annualIncome.ThisMonthAmount);
annualIncome.ProjectedAmount = GlobalFunctions.Round(annualIncome.ProjectedAmount);
}
private double GetTaxRebate()
{
double TotIncome = 0;
foreach (IncomeTax item in _currentYearTax)
{
if (item.ItemGroup == EnumIncomeTaxItemGroup.Tax_Gross_Rebate ||
item.ItemGroup == EnumIncomeTaxItemGroup.Tax_Gross_Refund ||
item.ItemGroup == EnumIncomeTaxItemGroup.Tax_Gross_OtherRebate ||
item.ItemGroup == EnumIncomeTaxItemGroup.Tax_Gross_OtherAddable)
{
if (item.Side == EnumIncomeTaxSide.Inc_GrossTax)
TotIncome = TotIncome + item.TotalAmount;
else if (item.Side == EnumIncomeTaxSide.Dec_GrossTax)
TotIncome = TotIncome - item.TotalAmount;
}
}
return TotIncome;
}
/// <summary>
/// follwing function equal the net tax payable and tax deducted amount. Adjusted amount stores in Tax refund item.
/// </summary>
protected void CalculateYearlyRefund()
{
IncomeTax oNetTaxPayable = IncomeTax.Get(this.CurrentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Net_Payable, (int)EnumIncomeTaxItemGroup.Net_Payable);
IncomeTax oTaxDeducted = IncomeTax.Get(this.CurrentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Tax_Deducted, (int)EnumIncomeTaxItemGroup.Tax_Deducted);
if (oNetTaxPayable == null) oNetTaxPayable = this.Add(EnumIncomeTaxItemGroup.Net_Payable,
(int)EnumIncomeTaxItemGroup.Net_Payable, string.Empty, 0, 0, EnumIncomeTaxSide.Tax_fixed_Item);
if (oTaxDeducted == null) oTaxDeducted = this.Add(EnumIncomeTaxItemGroup.Tax_Deducted,
(int)EnumIncomeTaxItemGroup.Tax_Deducted, string.Empty, 0, 0, EnumIncomeTaxSide.Tax_fixed_Item);
if ((oNetTaxPayable.TotalAmount - oTaxDeducted.TotalAmount) != 0)
{
IncomeTax TaxRefund = IncomeTax.Get(_currentYearTax, _employee.ID,
EnumIncomeTaxItemGroup.Tax_Refund_On_Current_Year, (int)EnumIncomeTaxItemGroup.Tax_Refund_On_Current_Year);
if (TaxRefund == null) TaxRefund = this.Add(EnumIncomeTaxItemGroup.Tax_Refund_On_Current_Year,
(int)EnumIncomeTaxItemGroup.Tax_Refund_On_Current_Year, string.Empty, 0, 0, EnumIncomeTaxSide.Tax_fixed_Item);
TaxRefund.ThisMonthAmount = 0;
TaxRefund.PreviousAmount = 0;
TaxRefund.ProjectedAmount = 0;
TaxRefund.TotalAmount = 0;
TaxRefund.ProjectedAmount = GlobalFunctions.Round(oNetTaxPayable.TotalAmount - oTaxDeducted.TotalAmount);
TaxRefund.TotalAmount = TaxRefund.ProjectedAmount;
// set equal to Net_Taxable_income to Tax_deducted_current_year amount
// oTaxDeducted.TotalAmount = oNetTaxPayable.TotalAmount;
}
}
private double GetTaxonTaxAmount(double onAmount)
{
this.CalculateTotalIncome();
IncomeTax IncomeWithCar = IncomeTax.Get(_currentYearTax, _employee.ID,
EnumIncomeTaxItemGroup.Annual_Salary_Income,
(int)EnumIncomeTaxItemGroup.Annual_Salary_Income);
double dif = 0;
double onlyCarTax = this.GetTaxConciderInvestment(IncomeWithCar.TotalAmount - onAmount); ;
double taxwithCar = this.GetTaxConciderInvestment(IncomeWithCar.TotalAmount);
dif = taxwithCar - onlyCarTax;
double addedIncome = dif + taxwithCar;
double prvTax = taxwithCar;
while (dif < 0)
{
dif = this.GetTaxConciderInvestment(addedIncome);
dif = dif - prvTax;
prvTax = addedIncome;
if (dif > 0) addedIncome = addedIncome + dif;
}
dif = addedIncome - taxwithCar;
return dif;
}
protected double GetTaxonTaxNetPayable()
{
this.CalculateTotalIncome();
this.CalculateInvestment();
this.CalculateNetPayable();
IncomeTax annualIncome = IncomeTax.Get(_currentYearTax, _employee.ID,
EnumIncomeTaxItemGroup.Net_Payable,
(int)EnumIncomeTaxItemGroup.Net_Payable);
double IncomeWithoutNetpayable = annualIncome.TotalAmount;
IncomeTax taxOnTax = IncomeTax.Get(_currentYearTax, _employee.ID,
EnumIncomeTaxItemGroup.Tax_on_Tax_Net_Payable,
(int)EnumIncomeTaxItemGroup.Tax_on_Tax_Net_Payable);
if (taxOnTax == null) taxOnTax = this.Add(EnumIncomeTaxItemGroup.Tax_on_Tax_Net_Payable,
(int)EnumIncomeTaxItemGroup.Tax_on_Tax_Net_Payable, string.Empty, IncomeWithoutNetpayable, 0, EnumIncomeTaxSide.Inc_SalaryIncome);
else
{
taxOnTax.PreviousAmount = 0;
taxOnTax.ThisMonthAmount = IncomeWithoutNetpayable;
}
this.CalculateTotalIncome();
this.CalculateInvestment();
this.CalculateNetPayable();
double dif = 0;
double onlyCarTax = this.GetTaxConciderInvestment(IncomeWithoutNetpayable); ;
double taxwithCar = this.GetTaxConciderInvestment(annualIncome.TotalAmount);
dif = taxwithCar - onlyCarTax;
double addedIncome = dif + taxwithCar;
double prvTax = taxwithCar;
while (dif < 0)
{
dif = this.GetTaxConciderInvestment(addedIncome);
if (dif == 0) break;
dif = dif - prvTax;
prvTax = addedIncome;
if (dif > 0) addedIncome = addedIncome + dif;
}
dif = addedIncome - taxwithCar;
taxOnTax.ThisMonthAmount = taxOnTax.ThisMonthAmount + dif;
return dif;
}
private double GetTaxConciderInvestment(double income)
{
double taxamount = this.GetTaxAmount(income);
if (_employee.ForeignExPat == true) return taxamount;
bool binvestmenton = ConfigurationManager.GetBoolValue("incometax", "investmentwithoutpf", EnumConfigurationType.Logic);
double investmentCanBeShown = ((taxamount * _taxParameter.MaxInvestPercent) / 100);
if (investmentCanBeShown > _taxParameter.MaxInvAmount) investmentCanBeShown = _taxParameter.MaxInvAmount;
double investAmount = investmentCanBeShown;
_isActualInvestment = false;
if (_taxParameter.InvestmentActiveMonth == null) _isActualInvestment = false;
else
{
DateTime investmonth = new DateTime(_taxParameter.FiscalyearDatefrom.Year, ((DateTime)_taxParameter.InvestmentActiveMonth).Month, 1);
investmonth = GlobalFunctions.LastDateOfMonth(investmonth);
if (investmonth <= SystemInformation.CurrentSysInfo.NextPayProcessDate)
_isActualInvestment = true;
}
if (_isActualInvestment == true)
{
IncomeTax ActualInvestment = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Investment_Actual,
(int)EnumIncomeTaxItemGroup.Investment_Actual);
investAmount = ActualInvestment.ThisMonthAmount;
}
if (investAmount > investmentCanBeShown)
investAmount = investmentCanBeShown;
double taxCredit = 0;
taxCredit = (investAmount * _taxParameter.MaxInvExempPercent) / 100;
//if (income <= 1500000)
// taxCredit = investAmount * .15;
//else taxCredit = investAmount * .10;
taxamount = taxamount - taxCredit;
return taxamount;
}
protected void CalculateNetPayable()
{
IncomeTax GrossTax = IncomeTax.Get(_currentYearTax, _employee.ID,
EnumIncomeTaxItemGroup.Gross_Tax, (int)EnumIncomeTaxItemGroup.Gross_Tax);
if (GrossTax == null)
{
this.CalculateGrossTax();
GrossTax = IncomeTax.Get(_currentYearTax, _employee.ID,
EnumIncomeTaxItemGroup.Gross_Tax, (int)EnumIncomeTaxItemGroup.Gross_Tax);
// this.Add(GrossTax);
}
this.CalculateGrossTax();
IncomeTax netPayable = IncomeTax.Get(_currentYearTax, _employee.ID,
EnumIncomeTaxItemGroup.Net_Payable, (int)EnumIncomeTaxItemGroup.Net_Payable);
if (netPayable == null) netPayable = this.Add(EnumIncomeTaxItemGroup.Net_Payable,
(int)EnumIncomeTaxItemGroup.Net_Payable, string.Empty, 0, 0, EnumIncomeTaxSide.Tax_fixed_Item);
netPayable.TotalAmount = 0;
netPayable.PreviousAmount = 0;
netPayable.ThisMonthAmount = 0;
netPayable.ProjectedAmount = 0;
if (GrossTax.TotalAmount > 0)
{
IncomeTax InvestItem = IncomeTax.Get(_currentYearTax, _employee.ID,
EnumIncomeTaxItemGroup.Tax_Credit_On_Investment, (int)EnumIncomeTaxItemGroup.Tax_Credit_On_Investment);
if (InvestItem == null) this.CalculateInvestment();
netPayable.ProjectedAmount = GrossTax.TotalAmount - InvestItem.TotalAmount;
if (netPayable.ProjectedAmount < _taxParameter.MinTaxAmount)
netPayable.ProjectedAmount = _taxParameter.MinTaxAmount;
}
IncomeTax rebet = IncomeTax.Get(_currentYearTax, _employee.ID,
EnumIncomeTaxItemGroup.Tax_Gross_OtherRebate, 1);
double nAIT = 0;
if (rebet != null)
nAIT = rebet.TotalAmount;
netPayable.ProjectedAmount = netPayable.ProjectedAmount + this.GetTaxRebate() - nAIT;
netPayable.ProjectedAmount = GlobalFunctions.Round(netPayable.ProjectedAmount);
netPayable.TotalAmount = GlobalFunctions.Round(netPayable.ProjectedAmount); ;
}
protected void CalculateGrossTax()
{
IncomeTax GrossTax = IncomeTax.Get(_currentYearTax, _employee.ID,
EnumIncomeTaxItemGroup.Gross_Tax, (int)EnumIncomeTaxItemGroup.Gross_Tax);
if (GrossTax == null) GrossTax = this.Add(EnumIncomeTaxItemGroup.Gross_Tax,
(int)EnumIncomeTaxItemGroup.Gross_Tax, string.Empty, 0, 0, EnumIncomeTaxSide.Tax_fixed_Item);
double annualIncome = this.GetAnnualIncome();
double yearlyTax = this.GetTaxAmount(annualIncome);
GrossTax.TotalAmount = 0;
GrossTax.PreviousAmount = 0;
GrossTax.ThisMonthAmount = 0;
GrossTax.ProjectedAmount = GlobalFunctions.Round(yearlyTax);
GrossTax.TotalAmount = GlobalFunctions.Round(yearlyTax);
}
protected double CalculateDecutedAmount()
{
double nAmount = 0;
double nTaxAmount = 0;
IncomeTax TaxDeductitem = IncomeTax.Get(_currentYearTax, _employee.ID,
EnumIncomeTaxItemGroup.Tax_Deducted, (int)EnumIncomeTaxItemGroup.Tax_Deducted);
if (TaxDeductitem != null)
{
nAmount = TaxDeductitem.ThisMonthAmount;
TaxDeductitem.ThisMonthAmount = 0;
}
this.CalculateThisMonth();
TaxDeductitem = IncomeTax.Get(_currentYearTax, _employee.ID,
EnumIncomeTaxItemGroup.Tax_Deducted, (int)EnumIncomeTaxItemGroup.Tax_Deducted);
if (TaxDeductitem != null)
{
nTaxAmount = TaxDeductitem.ThisMonthAmount - nAmount;
}
return nTaxAmount;
}
protected void UndoDecutedAmount(double nAmount)
{
IncomeTax TaxDeductitem = IncomeTax.Get(_currentYearTax, _employee.ID,
EnumIncomeTaxItemGroup.Tax_Deducted, (int)EnumIncomeTaxItemGroup.Tax_Deducted);
if (TaxDeductitem != null)
TaxDeductitem.ThisMonthAmount = TaxDeductitem.ThisMonthAmount - nAmount;
//this.CalculateThisMonth();
}
protected double CalculateOnceOfInvestmentAmt()
{
if (_employee.ForeignExPat == true) return 0;
bool binvestmenton = ConfigurationManager.GetBoolValue("incometax", "investmentwithoutpf", EnumConfigurationType.Logic);
IncomeTax AnnItem = null;
//if (binvestmenton == true)
// AnnItem = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Annual_Salary_Income,
// (int)EnumIncomeTaxItemGroup.Annual_Salary_Income);
//else
AnnItem = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Annual_Income,
(int)EnumIncomeTaxItemGroup.Annual_Income);
double totalIncome = AnnItem.TotalAmount - _onceoffAmount;
double investmentCanBeShown = ((totalIncome * _taxParameter.MaxInvestPercent) / 100);
if (investmentCanBeShown > _taxParameter.MaxInvAmount) investmentCanBeShown = _taxParameter.MaxInvAmount;
double investAmount = investmentCanBeShown;
_isActualInvestment = false;
if (_taxParameter.InvestmentActiveMonth == null) _isActualInvestment = false;
else
{
DateTime investmonth = new DateTime(_taxParameter.FiscalyearDatefrom.Year, ((DateTime)_taxParameter.InvestmentActiveMonth).Month, 1);
investmonth = GlobalFunctions.LastDateOfMonth(investmonth);
if (investmonth <= SystemInformation.CurrentSysInfo.NextPayProcessDate)
_isActualInvestment = true;
}
if (_isActualInvestment == true)
{
IncomeTax ActualInvestment = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Investment_Actual,
(int)EnumIncomeTaxItemGroup.Investment_Actual);
investAmount = ActualInvestment.ThisMonthAmount;
}
if (investAmount > investmentCanBeShown)
investAmount = investmentCanBeShown;
double taxCredit = 0;
taxCredit = (investAmount * _taxParameter.MaxInvExempPercent) / 100;
double nTempRebate = (investAmount * _taxParameter.MaxInvExempPercent) / 100;
if (nTempRebate > (totalIncome * .03))
nTempRebate = totalIncome * .03;
if (nTempRebate > 1000000)
nTempRebate = 1000000;
//if (AnnItem.TotalAmount <= 1000000)
// taxCredit = investAmount * .15;
//if (AnnItem.TotalAmount > 1000000 && AnnItem.TotalAmount <= 3000000)
// taxCredit = (investAmount > 250000) ? (250000 * .15) + (investAmount - 250000) * .12 : investAmount * .15;
//if (AnnItem.TotalAmount > 3000000)
//{
// taxCredit = (investAmount > 250000) ? (250000 * .15) : investAmount * .15;
// investAmount = investAmount - 250000;
// if (investAmount > 0)
// taxCredit = taxCredit + ((investAmount > 500000) ? (500000 * .12) + (investAmount - 500000) * .10 : investAmount * .12);
//}
return (taxCredit);
//if (_employee.ForeignExPat == true) return 0;
//bool binvestmenton = ConfigurationManager.GetBoolValue("incometax", "investmentwithoutpf", EnumConfigurationType.Logic);
//IncomeTax AnnItem = null;
//if (binvestmenton == true)
// AnnItem = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Annual_Salary_Income,
// (int)EnumIncomeTaxItemGroup.Annual_Salary_Income);
//else
// AnnItem = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Annual_Income,
// (int)EnumIncomeTaxItemGroup.Annual_Income);
//double totalIncome = AnnItem.TotalAmount - _onceoffAmount;
//double investmentCanBeShown = ((totalIncome * _taxParameter.MaxInvestPercent) / 100);
//if (investmentCanBeShown > _taxParameter.MaxInvAmount) investmentCanBeShown = _taxParameter.MaxInvAmount;
//double investAmount = investmentCanBeShown;
//_isActualInvestment = false;
//if (_taxParameter.InvestmentActiveMonth == null) _isActualInvestment = false;
//else
//{
// DateTime investmonth = new DateTime(_taxParameter.FiscalyearDatefrom.Year, ((DateTime)_taxParameter.InvestmentActiveMonth).Month, 1);
// investmonth = GlobalFunctions.LastDateOfMonth(investmonth);
// if (investmonth <= SystemInformation.CurrentSysInfo.NextPayProcessDate)
// _isActualInvestment = true;
//}
//if (_isActualInvestment == true)
//{
// IncomeTax ActualInvestment = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Investment_Actual,
// (int)EnumIncomeTaxItemGroup.Investment_Actual);
// investAmount = ActualInvestment.ThisMonthAmount;
//}
//if (investAmount > investmentCanBeShown)
// investAmount = investmentCanBeShown;
//double taxCredit = 0;
//taxCredit = (investAmount * _taxParameter.MaxInvExempPercent) / 100;
//if (AnnItem.TotalAmount <= 1000000)
// taxCredit = investAmount * .15;
//if (AnnItem.TotalAmount > 1000000 && AnnItem.TotalAmount <= 3000000)
// taxCredit = (investAmount > 250000) ? (250000 * .15) + (investAmount - 250000) * .12 : investAmount * .15;
//if (AnnItem.TotalAmount > 3000000)
//{
// taxCredit = (investAmount > 250000) ? (250000 * .15) : investAmount * .15;
// investAmount = investAmount - 250000;
// if (investAmount > 0)
// taxCredit = taxCredit + ((investAmount > 500000) ? (500000 * .12) + (investAmount - 500000) * .10 : investAmount * .12);
//}
//IncomeTax InvestmentItem = IncomeTax.Get(_currentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Tax_Credit_On_Investment,
// (int)EnumIncomeTaxItemGroup.Tax_Credit_On_Investment);
//return (InvestmentItem.TotalAmount - taxCredit);
}
protected void CalculateThisMonth()
{
IncomeTax TaxDeductitem = IncomeTax.Get(_currentYearTax, _employee.ID,
EnumIncomeTaxItemGroup.Tax_Deducted, (int)EnumIncomeTaxItemGroup.Tax_Deducted);
if (TaxDeductitem == null) TaxDeductitem = this.Add(EnumIncomeTaxItemGroup.Tax_Deducted,
(int)EnumIncomeTaxItemGroup.Tax_Deducted, string.Empty, 0, 0, EnumIncomeTaxSide.Tax_fixed_Item);
this.CalculateGrossTax();
this.CalculateNetPayable();
double onceOffTax = 0;
double netPayable = IncomeTax.Get(this._currentYearTax, _employee.ID,
EnumIncomeTaxItemGroup.Net_Payable, (int)EnumIncomeTaxItemGroup.Net_Payable).TotalAmount;
double annualIncome = this.GetAnnualIncome();
double grossTax = IncomeTax.Get(this._currentYearTax, _employee.ID,
EnumIncomeTaxItemGroup.Gross_Tax, (int)EnumIncomeTaxItemGroup.Gross_Tax).TotalAmount;
if (_employee.Status == EnumEmployeeStatus.Discontinued)
TaxDeductitem.ThisMonthAmount = netPayable - TaxDeductitem.TotalAmount;
else
{
if (_projectedMonth < 0)
throw new ServiceException("Projected month can't be less then Zero.");
if (_onceoffAmount > 0 && netPayable > _taxParameter.MinTaxAmount)
{
onceOffTax = this.GetTaxAmount(annualIncome - _onceoffAmount);
double invAmount = CalculateOnceOfInvestmentAmt();
onceOffTax = onceOffTax - invAmount;
onceOffTax = onceOffTax + this.GetTaxRebate();
if (_taxParameter.MinTaxAmount > onceOffTax)
onceOffTax = _taxParameter.MinTaxAmount;
double ntp = netPayable - onceOffTax;
if (ntp < 0) ntp = 0;
#region Commented by ashek
double restofMonthTax = onceOffTax - TaxDeductitem.TotalAmount; // Tax to be paid rest of the year;
if (restofMonthTax < 0)
{
restofMonthTax = 0;
ntp = ntp / _projectedMonth;
}
TaxDeductitem.ThisMonthAmount = ntp + (restofMonthTax / (_projectedMonth + 1));
#endregion
//TaxDeductitem.ThisMonthAmount = ntp;
//onceOffTax = this.GetTaxAmount(annualIncome - _onceoffAmount);
//onceOffTax = onceOffTax - CalculateOnceOfInvestmentAmt();
//onceOffTax = onceOffTax + this.GetTaxRebate();
//if (_taxParameter.MinTaxAmount > onceOffTax)
// onceOffTax = _taxParameter.MinTaxAmount;
//double ntp = netPayable - onceOffTax;
//if (ntp <= 0) ntp = 0;
//onceOffTax = onceOffTax - TaxDeductitem.TotalAmount; // Tax to be paid rest of the year;
//TaxDeductitem.ThisMonthAmount = ntp + (onceOffTax / (_projectedMonth + 1));
}
else TaxDeductitem.ThisMonthAmount = ((netPayable - TaxDeductitem.TotalAmount) / (_projectedMonth + 1));
if (TaxDeductitem.TotalAmount > netPayable)
TaxDeductitem.ThisMonthAmount = netPayable - TaxDeductitem.PreviousAmount;// (netPayable - TaxDeductitem.PreviousAmount) / _projectedMonth;
}
if (TaxDeductitem.ThisMonthAmount < 0) TaxDeductitem.ThisMonthAmount = 0;
//if (_employee.GradeID.Integer == 24 || _employee.GradeID.Integer == 25)
//{
// TaxDeductitem.ThisMonthAmount = 0;
//}
//else
//{
TaxDeductitem.ThisMonthAmount = GlobalFunctions.Round(TaxDeductitem.ThisMonthAmount);
//}
TaxDeductitem.ProjectedAmount = GlobalFunctions.Round(TaxDeductitem.ProjectedAmount);
if (_salary != null && (_salary.GradeID.Integer == 25 || _salary.GradeID.Integer == 24))
{
SalaryMonthlyDetail dtl = _salary.Details.Find(delegate (SalaryMonthlyDetail detail) { return (detail.ItemCode == EnumSalaryItemCode.Basic_Salary && detail.itemGroupCode == EnumSalaryGroup.Gross); });
if (dtl != null)
{
dtl.CalculatedAmount = dtl.CalculatedAmount + TaxDeductitem.ThisMonthAmount;
dtl.ChangedAmount = dtl.CalculatedAmount;
}
}
//IncomeTax TaxDeductitem = IncomeTax.Get(_currentYearTax, _employee.ID,
// EnumIncomeTaxItemGroup.Tax_Deducted, (int)EnumIncomeTaxItemGroup.Tax_Deducted);
//if (TaxDeductitem == null) TaxDeductitem = this.Add(EnumIncomeTaxItemGroup.Tax_Deducted,
// (int)EnumIncomeTaxItemGroup.Tax_Deducted, string.Empty, 0, 0, EnumIncomeTaxSide.Tax_fixed_Item);
//this.CalculateGrossTax();
//this.CalculateNetPayable();
//double onceOffTax = 0;
//double netPayable = IncomeTax.Get(this._currentYearTax, _employee.ID,
// EnumIncomeTaxItemGroup.Net_Payable, (int)EnumIncomeTaxItemGroup.Net_Payable).TotalAmount;
//double annualIncome = this.GetAnnualIncome();
//double grossTax = IncomeTax.Get(this._currentYearTax, _employee.ID,
// EnumIncomeTaxItemGroup.Gross_Tax, (int)EnumIncomeTaxItemGroup.Gross_Tax).TotalAmount;
//if (_onceoffAmount > 0)
//{
// onceOffTax = grossTax - this.GetTaxAmount(annualIncome - _onceoffAmount);
// onceOffTax = onceOffTax - CalculateOnceOfInvestmentAmt();
// if (onceOffTax < 0) onceOffTax = 0;
//}
//if (_employee.Status == EnumEmployeeStatus.Discontinued)
// TaxDeductitem.ThisMonthAmount = netPayable - TaxDeductitem.TotalAmount;
//else
//{
// if (_projectedMonth < 0)
// throw new ServiceException("Projected month can't be less then Zero.");
// TaxDeductitem.ThisMonthAmount = onceOffTax + (((netPayable - onceOffTax) - TaxDeductitem.TotalAmount) / (_projectedMonth + 1));
// if (TaxDeductitem.TotalAmount > netPayable)
// TaxDeductitem.ThisMonthAmount = netPayable - TaxDeductitem.PreviousAmount;
//}
//if (TaxDeductitem.ThisMonthAmount < 0)
//{
// TaxDeductitem.ThisMonthAmount = GlobalFunctions.Round(0);
//}
//else
//{
// TaxDeductitem.ThisMonthAmount = GlobalFunctions.Round(TaxDeductitem.ThisMonthAmount);
//}
//TaxDeductitem.ProjectedAmount = GlobalFunctions.Round(TaxDeductitem.ProjectedAmount);
}
protected double GetTaxAmount(double TaxableIncome)
{
try
{
double taxAmount = 0;
ObjectsTemplate<TaxParameterSlab> parameterSlabs = TaxParameter.CalculateTaxOnSlab(_taxParameter, _employee, TaxableIncome);
taxAmount = TaxParameterSlab.GetTotalTaxAmount(parameterSlabs);
return taxAmount;
}
catch
{
return 0;
}
}
protected void UpdateRawItems(List<TaxRawItem> rawItems, EnumSide nSide)
{
foreach (TaxRawItem item in rawItems)
{
if (item.Amount == 0) continue;
IncomeTax taxItem = null;
switch (item.ItemType)
{
case enumIncomeTaxItemType.Basic_Salary:
taxItem = GetTaxItem(EnumTaxMergeType.NONE, (int)EnumIncomeTaxItemGroup.Basic_Salary, item.Description);
break;
case enumIncomeTaxItemType.Allowance:
taxItem = GetTaxItem(EnumTaxMergeType.Allowance, item.ItemId, item.Description);
break;
case enumIncomeTaxItemType.Deduction:
taxItem = GetTaxItem(EnumTaxMergeType.Allowance, item.ItemId, item.Description);
break;
case enumIncomeTaxItemType.OT:
taxItem = GetTaxItem(EnumTaxMergeType.OT, item.ItemId, item.Description);
break;
case enumIncomeTaxItemType.Bonus:
taxItem = GetTaxItem(EnumTaxMergeType.Bonus, item.ItemId, item.Description);
break;
case enumIncomeTaxItemType.FinalSettlement:
taxItem = GetTaxItem(EnumTaxMergeType.Settlement, item.ItemId, item.Description);
break;
case enumIncomeTaxItemType.Other:
taxItem = GetTaxItem(EnumTaxMergeType.Other, item.ItemId, item.Description);
break;
case enumIncomeTaxItemType.OPI:
//taxItem = GetTaxItem(EnumTaxMergeType.Bonus, item.ItemId, item.Description);
//taxItem.ThisMonthAmount = GlobalFunctions.Round(item.Amount);
break;
case enumIncomeTaxItemType.AdjustItem:
taxItem = GetTaxItem(EnumTaxMergeType.TaxAdjustItem, item.ItemId, item.Description);
break;
case enumIncomeTaxItemType.Earned_Leave:
taxItem = GetTaxItem(EnumTaxMergeType.Allowance, item.ItemId, item.Description);
break;
default:
break;
}
if (taxItem != null)
{
//taxItem.ThisMonthAmount = (nSide == EnumSide.Deduct) ? -GlobalFunctions.Round(item.Amount) : GlobalFunctions.Round(item.Amount);
taxItem.ThisMonthAmount = taxItem.ThisMonthAmount + item.Amount;
if (taxItem != null) taxItem.Side = EnumIncomeTaxSide.Inc_SalaryIncome;
this.Add(taxItem);
}
}
}
protected void UpdateRawItems2(List<TaxRawItem> rawItems, EnumSide nSide,int itemID)
{
foreach (TaxRawItem item in rawItems)
{
if (item.Amount == 0) continue;
IncomeTax taxItem = null;
switch (item.ItemType)
{
case enumIncomeTaxItemType.Basic_Salary:
taxItem = GetTaxItem(EnumTaxMergeType.NONE, (int)EnumIncomeTaxItemGroup.Basic_Salary, item.Description);
break;
case enumIncomeTaxItemType.Allowance:
taxItem = GetTaxItem(EnumTaxMergeType.Allowance, item.ItemId, item.Description);
break;
case enumIncomeTaxItemType.Deduction:
taxItem = GetTaxItem(EnumTaxMergeType.Allowance, item.ItemId, item.Description);
break;
case enumIncomeTaxItemType.OT:
taxItem = GetTaxItem(EnumTaxMergeType.OT, item.ItemId, item.Description);
break;
case enumIncomeTaxItemType.Bonus:
taxItem = GetTaxItem(EnumTaxMergeType.Bonus, itemID, item.Description);
break;
case enumIncomeTaxItemType.FinalSettlement:
taxItem = GetTaxItem(EnumTaxMergeType.Settlement, item.ItemId, item.Description);
break;
break;
case enumIncomeTaxItemType.OPI:
//taxItem = GetTaxItem(EnumTaxMergeType.Bonus, item.ItemId, item.Description);
//taxItem.ThisMonthAmount = GlobalFunctions.Round(item.Amount);
break;
case enumIncomeTaxItemType.AdjustItem:
taxItem = GetTaxItem(EnumTaxMergeType.TaxAdjustItem, item.ItemId, item.Description);
break;
case enumIncomeTaxItemType.Earned_Leave:
taxItem = GetTaxItem(EnumTaxMergeType.NONE, (int)EnumIncomeTaxItemGroup.Earned_Leave, item.Description);
break;
default:
break;
}
if (taxItem != null)
{
taxItem.ThisMonthAmount = (nSide == EnumSide.Deduct) ? -GlobalFunctions.Round(item.Amount) : GlobalFunctions.Round(item.Amount);
if (taxItem != null) taxItem.Side = EnumIncomeTaxSide.Inc_SalaryIncome;
this.Add(taxItem);
}
}
}
}
public interface ISalaryTax
{
SalaryMonthly Salary { set; get; }
ObjectsTemplate<IncomeTax> Calculate();
}
public interface IBonusTax
{
BonusProcess.BonusProcessDetail Bonus { set; get; }
ObjectsTemplate<IncomeTax> Calculate();
}
public interface ITaxCalculator
{
}
[Serializable]
public class TaxCalculator :AbstractTaxCalculator
{
public TaxCalculator()
{
}
public override ObjectsTemplate<ADParameter> AdParameters
{
set { _adParameters = value; }
}
public override SalaryMonthly Salary
{
set { _salary = value; }
}
public override Employee Employee
{
set
{
if (_taxParameter == null) throw new ServiceException("Taxparameter must set before Employee");
_taxSlabs = Payroll.BO.TaxParameter.GetEmployeeSlab(
_taxParameter, value);
_employee = value;
}
}
public override TaxParameter TaxParameter
{
set
{
_taxParameter = value;
}
}
public ObjectsTemplate<IncomeTax> SalaryTax()
{
string smessage = "";
try
{
_isActualInvestment = true;
this._onceoffAmount = 0;
smessage = "InitiazedNextMonth";
this.InitializeForNextMonth();
smessage = "CalcualteprojectMonth";
this.CalcualteprojectMonth();
smessage = "IncludePayslipItems";
this.IncludePayslipItems();
smessage = "Calculate OT";
this.CalculateOT();
smessage = "CmpProvidedHouseAndTransport";
this.CmpProvidedHouseAndTransport(SystemInformation.CurrentSysInfo.NextPayProcessDate);
smessage = "CalculateBonusProjection";
this.CalculateBonusProjection();
smessage = "CalculateCPF";
this.CalculateCPF();
if (_salary != null && (_salary.GradeID.Integer == 25 || _salary.GradeID.Integer == 24))
{
smessage = "Tax On Tax";
this.GetTaxonTaxNetPayable();
}
smessage = "CalculateExamtion";
this.CalculateExamtion();
smessage = "CalculateTotalIncome";
this.CalculateTotalIncome();
smessage = "CalculateInvestment";
this.CalculateInvestment();
smessage = "CalculateGrossTax";
this.CalculateGrossTax();
smessage = "CalculateNetPayable";
this.CalculateNetPayable();
smessage = "CalculateThisMonth";
this.CalculateThisMonth();
smessage = "End";
return this.CurrentYearTax;
}
catch (ServiceException ex)
{
throw new ServiceException(ex.Message + "###" + smessage);
}
catch (Exception ex)
{
throw new ServiceException(ex.Message + "###" + smessage);
}
}
public ObjectsTemplate<IncomeTax> CalculateBonus(List<TaxRawItem> rawItems, ref double ntaxAmount)
{
try
{
double nTempAmount = 0;
bool bStartMonth = false;
_isActualInvestment = true;
this._onceoffAmount = rawItems.Sum(x => x.Amount);
IncomeTax oIncomeTax = new IncomeTax();
EnumIncomeTaxDataFrom datafrom = oIncomeTax.GetEnumForSalaryIT(_employee.ID);
//if (datafrom == EnumIncomeTaxDataFrom.SalaryITTempData)
//{
// throw new ServiceException("Current month salary is processed and not yet finalized. Tax calculation "
// + " is not allowed middle of this process. You have to Undo or finalize the salary to calculate tax.");
//}
this.CurrentYearTax = new ObjectsTemplate<IncomeTax>();
this.CurrentYearTax = IncomeTax.Get(_employee.ID, EnumIncomeTaxDataFrom.ProcessTempData);
if (SystemInformation.CurrentSysInfo.NextPayProcessDate.Month == 7) // if month is july and salary not yet processed then, clear all tax data
{
bStartMonth = true;
this.CalcualteprojectMonth();
this.CalculateOnlyProjection();
}
this.UpdateRawItems(rawItems, EnumSide.Add);
this.CalculateExamtion();
this.CalculateBonusProjection();
this.CalculateCPF();
this.CalculateTotalIncome();
this.CalculateInvestment();
this.CalculateGrossTax();
double totalAmount = 0;
IncomeTax netPayable = IncomeTax.Get(this.CurrentYearTax, _employee.ID,
EnumIncomeTaxItemGroup.Net_Payable, (int)EnumIncomeTaxItemGroup.Net_Payable);
if (netPayable != null)
nTempAmount = netPayable.TotalAmount;
ntaxAmount = 0;
this.CalculateNetPayable();
//if (_ApplicableBonusParams != null)
//{s
// BonusParameter oparam = _ApplicableBonusParams.FirstOrDefault(x => x.BonusID.Integer == rawItems[0].ItemId);
// if (oparam != null && oparam.IsFestival == true) // isFestival mean bonus is projected for tax. So no need to deduct tax in bonus process
// return this.CurrentYearTax;
//}
ntaxAmount = nTempAmount;
netPayable = IncomeTax.Get(this.CurrentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Net_Payable, (int)EnumIncomeTaxItemGroup.Net_Payable);
if (netPayable != null)
if (totalAmount > 0)
ntaxAmount = netPayable.TotalAmount - totalAmount;
else
ntaxAmount = (-totalAmount - netPayable.TotalAmount) > 0 ? 0 : netPayable.TotalAmount;
double grossTax = IncomeTax.Get(this.CurrentYearTax, _employee.ID,
EnumIncomeTaxItemGroup.Gross_Tax, (int)EnumIncomeTaxItemGroup.Gross_Tax).TotalAmount;
_onceoffAmount = 0;
if (_onceoffAmount > 0)
{
double annualIncome = this.GetAnnualIncome();
ntaxAmount = grossTax - this.GetTaxAmount(annualIncome - _onceoffAmount);
// ntaxAmount = ntaxAmount- CalculateOnceOfInvestmentAmt();
if (ntaxAmount < 0) ntaxAmount = 0;
}
IncomeTax TaxDeductitem = IncomeTax.Get(this.CurrentYearTax, _employee.ID,
EnumIncomeTaxItemGroup.Tax_Deducted, (int)EnumIncomeTaxItemGroup.Tax_Deducted);
if (TaxDeductitem == null) TaxDeductitem = this.Add(EnumIncomeTaxItemGroup.Tax_Deducted,
(int)EnumIncomeTaxItemGroup.Tax_Deducted, string.Empty, 0, 0, EnumIncomeTaxSide.Tax_fixed_Item);
// if (_employee.GradeID.Integer == 25)
ntaxAmount = 0;
TaxDeductitem.ThisMonthAmount = TaxDeductitem.ThisMonthAmount + ntaxAmount;
return this.CurrentYearTax;
}
catch (ServiceException ex)
{
throw new ServiceException(ex.Message);
}
catch (Exception ex)
{
throw new ServiceException(ex.Message);
}
}
public ObjectsTemplate<IncomeTax> UndoBonus(List<TaxRawItem> rawItems, double taxAmount, int nItemID)
{
try
{
_isActualInvestment = true;
this._onceoffAmount = 0;
IncomeTax oIncomeTax = new IncomeTax();
EnumIncomeTaxDataFrom datafrom = oIncomeTax.GetEnumForSalaryIT(_employee.ID);
if (datafrom == EnumIncomeTaxDataFrom.SalaryITTempData)
{
throw new ServiceException("Current month salary is processed and not yet finalized. Tax calculation "
+ " is not allowed middle of this process. You have to Undo or finalize the salary to calculate tax.");
}
this.CurrentYearTax = new ObjectsTemplate<IncomeTax>();
this.CurrentYearTax = IncomeTax.Get(_employee.ID, EnumIncomeTaxDataFrom.ProcessTempData);
this.UpdateRawItems2(rawItems, EnumSide.Deduct,nItemID);
this.CalculateBonusProjection();
if(nItemID==1)
{
IncomeTax pfItem = IncomeTax.Get(this.CurrentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Bonus, (int)EnumIncomeTaxItemGroup.Bonus);
pfItem.ProjectedAmount *= 2;
}
this.CalculateTotalIncome();
this.CalculateInvestment();
this.CalculateGrossTax();
this.CalculateNetPayable();
this.UndoDecutedAmount(taxAmount);
return this.CurrentYearTax;
}
catch (ServiceException ex)
{
throw new ServiceException(ex.Message);
}
catch (Exception ex)
{
throw new ServiceException(ex.Message);
}
}
/// <summary>
///
/// </summary>
/// <param name="rawItems"></param>
/// <returns></returns>
public double Calculate(List<TaxRawItem> rawItems)
{
try
{
_isActualInvestment = true;
this._onceoffAmount = 0;
IncomeTax oIncomeTax = new IncomeTax();
EnumIncomeTaxDataFrom datafrom = oIncomeTax.GetEnumForSalaryIT(_employee.ID);
this.CurrentYearTax = new ObjectsTemplate<IncomeTax>();
this.CurrentYearTax = IncomeTax.Get(_employee.ID, datafrom);
this.CalcualteprojectMonth();
this.UpdateRawItems(rawItems, EnumSide.Add);
this.CmpProvidedHouseAndTransport(SystemInformation.CurrentSysInfo.NextPayProcessDate);
this.CalculateExamtion();
this.CalculateBonusProjection();
this.CalculateCPF();
this.CalculateTotalIncome();
this.CalculateInvestment();
this.CalculateGrossTax();
double totalAmount = 0;
IncomeTax netPayable = IncomeTax.Get(this.CurrentYearTax, _employee.ID,
EnumIncomeTaxItemGroup.Net_Payable, (int)EnumIncomeTaxItemGroup.Net_Payable);
if (netPayable != null)
totalAmount = netPayable.TotalAmount;
this.CalculateNetPayable();
netPayable = IncomeTax.Get(this.CurrentYearTax, _employee.ID,
EnumIncomeTaxItemGroup.Net_Payable, (int)EnumIncomeTaxItemGroup.Net_Payable);
if (netPayable != null)
totalAmount = netPayable.TotalAmount - totalAmount;
// if the amount is equal to yearly netpayable, the amount should be dsitributed next of the projected month
if (totalAmount == netPayable.TotalAmount && netPayable.TotalAmount == _taxParameter.MinTaxAmount && _projectedMonth > 0)
totalAmount = totalAmount / _projectedMonth;
return totalAmount;
}
catch (ServiceException ex)
{
throw new ServiceException(ex.Message);
}
catch (Exception ex)
{
throw new ServiceException(ex.Message);
}
}
//End OPI Calculation
/// <summary>
///
/// </summary>
/// <param name="rawItem"></param>
/// <param name="taxAmount"></param>
/// <returns></returns>
public ObjectsTemplate<IncomeTax> Calculate(List<TaxRawItem> rawItems, ref double ntaxAmount)
{
try
{
_isActualInvestment = true;
this._onceoffAmount = rawItems[0].Amount;
IncomeTax oIncomeTax = new IncomeTax();
EnumIncomeTaxDataFrom datafrom = oIncomeTax.GetEnumForSalaryIT(_employee.ID);
if (datafrom == EnumIncomeTaxDataFrom.SalaryITTempData)
{
throw new ServiceException("Current month salary is processed and not yet finalized. Tax calculation "
+ " is not allowed middle of this process. You have to Undo or finalize the salary to calculate tax.");
}
this.CurrentYearTax = new ObjectsTemplate<IncomeTax>();
this.CurrentYearTax = IncomeTax.Get(_employee.ID, EnumIncomeTaxDataFrom.ProcessTempData);
this.CalcualteprojectMonth();
this.UpdateRawItems(rawItems, EnumSide.Add);
this.CmpProvidedHouseAndTransport(SystemInformation.CurrentSysInfo.NextPayProcessDate);
this.CalculateExamtion();
this.CalculateBonusProjection();
this.CalculateCPF();
this.CalculateTotalIncome();
this.CalculateInvestment();
this.CalculateGrossTax();
this.CalculateNetPayable();
ntaxAmount = this.CalculateDecutedAmount();
return this.CurrentYearTax;
}
catch (ServiceException ex)
{
throw new ServiceException(ex.Message);
}
catch (Exception ex)
{
throw new ServiceException(ex.Message);
}
}
/// <summary>
///
/// </summary>
/// <param name="rawItem"></param>
/// <param name="taxAmount"></param>
/// <returns></returns>
public ObjectsTemplate<IncomeTax> CalculateSettlementTax(List<TaxRawItem> rawItems, ref double ntaxAmount, bool isNew)
{
try
{
_isActualInvestment = true;
this._onceoffAmount = 0;
IncomeTax oIncomeTax = new IncomeTax();
EnumIncomeTaxDataFrom datafrom = oIncomeTax.GetEnumForSalaryIT(_employee.ID);
if (datafrom == EnumIncomeTaxDataFrom.SalaryITTempData)
{
throw new ServiceException("Current month salary is processed and not yet finalized. Tax calculation "
+ " is not allowed middle of this process. You have to Undo or finalize the salary to calculate tax.");
}
this.CurrentYearTax = new ObjectsTemplate<IncomeTax>();
this.CurrentYearTax = IncomeTax.Get(_employee.ID, EnumIncomeTaxDataFrom.ProcessTempData);
this._projectedMonth = 0;
foreach (IncomeTax item in this.CurrentYearTax)
{
if (isNew == true) item.PreviousAmount = item.PreviousAmount + item.ThisMonthAmount;
item.ThisMonthAmount = 0;
item.ProjectedAmount = 0;
}
this.UpdateRawItems(rawItems, EnumSide.Add);
this.CmpProvidedHouseAndTransport(_employee.DiscontinueDate);
this.CalculateExamtion();
this.CalculateTotalIncome();
this.CalculateInvestment();
this.CalculateGrossTax();
this.CalculateNetPayable();
ntaxAmount = this.CalculateDecutedAmount();
return this.CurrentYearTax;
}
catch (ServiceException ex)
{
throw new ServiceException(ex.Message);
}
catch (Exception ex)
{
throw new ServiceException(ex.Message);
}
}
/// <summary>
/// function will return total year tax,
/// </summary>
/// <param name="rawItems"></param>
/// <param name="ntaxAmount"></param>
/// <returns></returns>
public ObjectsTemplate<IncomeTax> CalculateYearlyTax(List<TaxRawItem> rawItems, ref double ntaxAmount)
{
try
{
this.CurrentYearTax = new ObjectsTemplate<IncomeTax>();
_isActualInvestment = false;
_projectedMonth = 0;
this._onceoffAmount = 0;
this.UpdateRawItems(rawItems, EnumSide.Add);
this.CmpProvidedHouseAndTransport(SystemInformation.CurrentSysInfo.NextPayProcessDate);
this.CalculateExamtion();
this.CalculateBonusProjection();
this.CalculateCPF();
this.CalculateTotalIncome();
this.CalculateInvestment();
this.CalculateGrossTax();
this.CalculateNetPayable();
this.CalculateThisMonth();
ntaxAmount = IncomeTax.GetAmount(this.CurrentYearTax, _employee.ID, EnumIncomeTaxItemGroup.Tax_Deducted);
return this.CurrentYearTax;
}
catch (ServiceException ex)
{
throw new ServiceException(ex.Message);
}
catch (Exception ex)
{
throw new ServiceException(ex.Message);
}
}
public ObjectsTemplate<IncomeTax> UndoCalculate(List<TaxRawItem> rawItems, double taxAmount)
{
try
{
_isActualInvestment = true;
this._onceoffAmount = 0;
IncomeTax oIncomeTax = new IncomeTax();
EnumIncomeTaxDataFrom datafrom = oIncomeTax.GetEnumForSalaryIT(_employee.ID);
if (datafrom == EnumIncomeTaxDataFrom.SalaryITTempData)
{
throw new ServiceException("Current month salary is processed and not yet finalized. Tax calculation "
+ " is not allowed middle of this process. You have to Undo or finalize the salary to calculate tax.");
}
this.CurrentYearTax = new ObjectsTemplate<IncomeTax>();
this.CurrentYearTax = IncomeTax.Get(_employee.ID, EnumIncomeTaxDataFrom.ProcessTempData);
this.CalcualteprojectMonth();
//foreach (IncomeTax item in this.CurrentYearTax)
// item.ProjectedAmount = 0;
this.UpdateRawItems(rawItems, EnumSide.Deduct);
this.CmpProvidedHouseAndTransport(SystemInformation.CurrentSysInfo.NextPayProcessDate);
this.CalculateExamtion();
this.CalculateBonusProjection();
this.CalculateCPF();
this.CalculateTotalIncome();
this.CalculateInvestment();
this.CalculateGrossTax();
this.CalculateNetPayable();
this.UndoDecutedAmount(taxAmount);
return this.CurrentYearTax;
}
catch (ServiceException ex)
{
throw new ServiceException(ex.Message);
}
catch (Exception ex)
{
throw new ServiceException(ex.Message);
}
}
/// <summary>
///
/// </summary>
/// <param name="naxParameterID"></param>
public ObjectsTemplate<IncomeTax> DoTaxYearEnd(ID naxParameterID)
{
ObjectsTemplate<IncomeTax> empTaxCertificates = new ObjectsTemplate<IncomeTax>();
try
{
// if IncomeTax.get() function not return employee order-by wise data, rest of the function will not culculate properly.
ObjectsTemplate<IncomeTax> oTaxYearly = IncomeTax.Get(EnumIncomeTaxDataFrom.ProcessTempData);
ID nCurrEmployeeid = null;
if (oTaxYearly.Count > 0) nCurrEmployeeid = oTaxYearly[0].EmployeeID;
_taxParameter = TaxParameter.Get(naxParameterID);
while (true)
{
_employee = Employee.Get(nCurrEmployeeid);
this.CurrentYearTax = IncomeTax.Get(oTaxYearly, nCurrEmployeeid);
// Initialize the current data.
//foreach (IncomeTax item in this.CurrentYearTax)
//{
// item.DataTo = EnumIncomeTaxDataFrom.ProcessedData;
// item.TotalAmount = item.PreviousAmount + item.ProjectedAmount + item.ThisMonthAmount;
// item.TaxParameterID = _taxParameter.ID;
// item.PreviousAmount = 0;
// item.ThisMonthAmount = 0;
// item.ProjectedAmount = 0;
// oTaxYearly.Remove(item); // Remove from collection
//}
_isActualInvestment = true;
this._onceoffAmount = 0;
this.CalculateExamtion();
this.CalculateTotalIncome();
this.CalculateInvestment();
this.CalculateGrossTax();
this.CalculateNetPayable();
this.CalculateYearlyRefund();
foreach (IncomeTax item in this.CurrentYearTax)
{
item.TaxParameterID = naxParameterID;
empTaxCertificates.Add(item);
oTaxYearly.Remove(item);
}
if (oTaxYearly.Count > 0) nCurrEmployeeid = oTaxYearly[0].EmployeeID;
else break;
}
}
catch (Exception ex)
{
throw new ServiceException(ex.Message);
}
return empTaxCertificates;
}
public ObjectsTemplate<IncomeTax> DoTaxYearEndReProcess(ID nTaxParamterID, bool isMaximumInvestment)
{
ObjectsTemplate<IncomeTax> empTaxCertificates = new ObjectsTemplate<IncomeTax>();
try
{
// if IncomeTax.get() function not return employee order-by wise data, rest of the function will not culculate properly.
ObjectsTemplate<IncomeTax> oTaxYearly = IncomeTax.GetPrvYear(nTaxParamterID);
if (SystemInformation.CurrentSysInfo.TaxParamID == nTaxParamterID)
oTaxYearly = IncomeTax.GetByYear(nTaxParamterID, EnumIncomeTaxDataFrom.ProcessTempData);
else
oTaxYearly = IncomeTax.GetPrvYear(nTaxParamterID);
ID nCurrEmployeeid = null;
if (oTaxYearly.Count > 0) nCurrEmployeeid = oTaxYearly[0].EmployeeID;
_taxParameter = TaxParameter.Get(nTaxParamterID);
while (true)
{
_employee = Employee.Get(nCurrEmployeeid);
this.CurrentYearTax = IncomeTax.Get(oTaxYearly, nCurrEmployeeid);
// Initialize the current data.
foreach (IncomeTax item in this.CurrentYearTax)
{
oTaxYearly.Remove(item); // Remove from collection
}
_isActualInvestment = !isMaximumInvestment;
//this.CalculateExamtionPrev();
this.CalculateTotalIncome();
this.CalculateInvestment();
this.CalculateGrossTax();
this.CalculateNetPayable();
this.CalculateYearlyRefund();
foreach (IncomeTax item in this.CurrentYearTax)
{
item.EmployeeID = _employee.ID;
item.TaxParameterID = nTaxParamterID;
empTaxCertificates.Add(item);
}
if (oTaxYearly.Count > 0) nCurrEmployeeid = oTaxYearly[0].EmployeeID;
else break;
}
}
catch (Exception ex)
{
throw new ServiceException(ex.Message);
}
return empTaxCertificates;
}
public ObjectsTemplate<IncomeTax> DoTaxYearEndReProcess(ID nTaxParamterID, bool isMaximumInvestment, Employee employee, ObjectsTemplate<IncomeTax> oTaxYearly45656)
{
ObjectsTemplate<IncomeTax> empTaxCertificates = new ObjectsTemplate<IncomeTax>();
try
{
_employee = employee;
// if IncomeTax.get() function not return employee order-by wise data, rest of the function will not culculate properly.
ObjectsTemplate<IncomeTax> oTaxYearly = IncomeTax.GetPrvYear(nTaxParamterID,_employee.ID);
//if (SystemInformation.CurrentSysInfo.TaxParamID == nTaxParamterID)
// oTaxYearly = IncomeTax.GetByYear(nTaxParamterID, EnumIncomeTaxDataFrom.ProcessTempData);
//else
// oTaxYearly = IncomeTax.GetPrvYear(nTaxParamterID);
ID nCurrEmployeeid = null;
//if (oTaxYearly.Count > 0)
nCurrEmployeeid = _employee.ID;
_taxParameter = TaxParameter.Get(nTaxParamterID);
//while (true)
//{
//_employee = Employee.Get(nEmployeeID);
this.CurrentYearTax = IncomeTax.Get(oTaxYearly, nCurrEmployeeid);
// Initialize the current data.
foreach (IncomeTax item in this.CurrentYearTax)
{
oTaxYearly.Remove(item); // Remove from collection
}
_isActualInvestment = !isMaximumInvestment;
//this.CalculateExamtionPrev();
this.CalculateTotalIncome();
this.CalculateInvestment();
this.CalculateGrossTax();
this.CalculateNetPayable();
this.CalculateYearlyRefund();
foreach (IncomeTax item in this.CurrentYearTax)
{
item.EmployeeID = _employee.ID;
item.TaxParameterID = nTaxParamterID;
empTaxCertificates.Add(item);
}
//if (oTaxYearly.Count > 0) nCurrEmployeeid = oTaxYearly[0].EmployeeID;
//else break;
//}
}
catch (Exception ex)
{
throw new ServiceException(ex.Message);
}
return empTaxCertificates;
}
}
public class TaxProcess
{
public void CalculateTax()
{
}
#region ISalaryTax Members
public void Calculate()
{
}
#endregion
}
}