Skip to content

Instantly share code, notes, and snippets.

@WSAyan
Created November 22, 2020 17:22
Show Gist options
  • Save WSAyan/1b25401c65a6353a7a1b58caa17902e9 to your computer and use it in GitHub Desktop.
Save WSAyan/1b25401c65a6353a7a1b58caa17902e9 to your computer and use it in GitHub Desktop.
NBR tax calculation for year 2017-18.
public class TaxCalculationCore {
public static final String GENDER_MALE = "_male";
public static final String GENDER_FEMALE = "_female";
private static final int BASIC_PERCENTAGE = 60;
private static final int HOUSE_RENT_PERCENTAGE = 30;
private static final int CONVEYANCE_ALLOWANCE_PERCENTAGE = 4;
private static final int MEDICAL_ALLOWANCE_PERCENTAGE = 6;
private static final int HOUSE_RENT_DEDUCTABLE = 25000;
private static final int CONVEYANCE_ALLOWANCE_DEDUCTABLE = 2500;
private static final int MEDICAL_ALLOWANCE_DEDUCTABLE = 10000;
private static final int TAX_CREDIT_RANGE_FIRST = 1000000;
private static final int TAX_CREDIT_RANGE_SECOND = 3000000;
private static final int TAX_CREDIT_PERCENTAGE_FIRST = 15;
private static final int TAX_CREDIT_PERCENTAGE_SECOND = 12;
private static final int TAX_CREDIT_PERCENTAGE_THIRD = 10;
private static final int TAX_RANGE_FIRST = 250000;
private static final int TAX_RANGE_FIRST_FEMALE = 300000;
private static final int TAX_RANGE_SECOND = 400000;
private static final int TAX_RANGE_THIRD = 500000;
private static final int TAX_RANGE_FOURTH = 600000;
private static final int TAX_RANGE_FIFTH = 3000000;
private static final int TAX_RANGE_FIRST_PERCENTAGE = 0;
private static final int TAX_RANGE_SECOND_PERCENTAGE = 10;
private static final int TAX_RANGE_THIRD_PERCENTAGE = 15;
private static final int TAX_RANGE_FOURTH_PERCENTAGE = 20;
private static final int TAX_RANGE_FIFTH_PERCENTAGE = 25;
private static final int TAX_RANGE_SIXTH_PERCENTAGE = 30;
private static final int ALLOWABLE_INVESTMENT_PERCENTAGE = 25;
private static final int ALLOWABLE_INVESTMENT_LIMIT = 15000000;
public int calculateTaxByDefaultGross(String gender, int gross, int totalExtraBenefits,
int totalAllowableInvestments) {
int taxableIncome = calculateTaxableIncome(gross, totalExtraBenefits);
int taxCredit = calculateTaxCredit(gender, taxableIncome, totalAllowableInvestments);
int taxLiablity = calculateTax(taxableIncome, gender);
return taxLiablity - taxCredit;
}
private int calculateTaxCredit(String gender, int taxableIncome, int totalAllowableInvestments) {
if (totalAllowableInvestments > ALLOWABLE_INVESTMENT_LIMIT) {
totalAllowableInvestments = ALLOWABLE_INVESTMENT_LIMIT;
}
int allowablePercentage = (int) (((float) totalAllowableInvestments / (float) taxableIncome) * 100);
if (allowablePercentage > ALLOWABLE_INVESTMENT_PERCENTAGE) {
allowablePercentage = ALLOWABLE_INVESTMENT_PERCENTAGE;
}
int eligibleAllowableInvestment = taxableIncome * allowablePercentage / 100;
int taxCredit = 0;
if (taxableIncome < TAX_CREDIT_RANGE_FIRST) {
taxCredit = eligibleAllowableInvestment * TAX_CREDIT_PERCENTAGE_FIRST / 100;
} else if (taxableIncome > TAX_CREDIT_RANGE_FIRST && eligibleAllowableInvestment <= TAX_CREDIT_RANGE_SECOND) {
taxCredit = (TAX_RANGE_FIRST * TAX_CREDIT_PERCENTAGE_FIRST / 100)
+ ((eligibleAllowableInvestment - TAX_RANGE_FIRST) * TAX_CREDIT_PERCENTAGE_SECOND / 100);
} else if (taxableIncome > TAX_CREDIT_RANGE_SECOND) {
taxCredit = (TAX_RANGE_FIRST * TAX_CREDIT_PERCENTAGE_FIRST / 100)
+ ((eligibleAllowableInvestment - TAX_RANGE_FIRST) * TAX_CREDIT_PERCENTAGE_SECOND / 100)
+ ((eligibleAllowableInvestment - TAX_RANGE_FIRST - TAX_RANGE_THIRD) * TAX_RANGE_THIRD / 100);
}
return taxCredit;
}
private int calculateTaxableIncome(int gross, int totalExtraBenefits) {
int basic = generateBasic(gross, BASIC_PERCENTAGE);
int houseRent = generateHouseRent(gross, HOUSE_RENT_PERCENTAGE);
int conveyanceAllowance = generateConveyanceAllowance(gross, CONVEYANCE_ALLOWANCE_PERCENTAGE);
int medicalAllowance = generateMedicalAllowance(gross, MEDICAL_ALLOWANCE_PERCENTAGE);
houseRent = deductHouseRentTax(houseRent, basic);
conveyanceAllowance = deductConveyanceAllowanceTax(conveyanceAllowance, basic);
medicalAllowance = deductMedicalAllowanceTax(medicalAllowance, basic);
return (basic + houseRent + conveyanceAllowance + medicalAllowance) * 12 + totalExtraBenefits;
}
private int deductHouseRentTax(int houseRent, int basic) {
if (houseRent < HOUSE_RENT_DEDUCTABLE || houseRent < basic / 2)
return 0;
return houseRent - HOUSE_RENT_DEDUCTABLE;
}
private int deductConveyanceAllowanceTax(int conveyanceAllowance, int basic) {
if (conveyanceAllowance < CONVEYANCE_ALLOWANCE_DEDUCTABLE)
return 0;
return conveyanceAllowance - CONVEYANCE_ALLOWANCE_DEDUCTABLE;
}
private int deductMedicalAllowanceTax(int medicalAllowance, int basic) {
if (medicalAllowance < MEDICAL_ALLOWANCE_DEDUCTABLE || medicalAllowance < basic / 10)
return 0;
return medicalAllowance - MEDICAL_ALLOWANCE_DEDUCTABLE;
}
private int generateBasic(int gross, int percentage) {
return (percentage * gross) / 100;
}
private int generateHouseRent(int gross, int percentage) {
return (percentage * gross) / 100;
}
private int generateConveyanceAllowance(int gross, int percentage) {
return (percentage * gross) / 100;
}
private int generateMedicalAllowance(int gross, int percentage) {
return (percentage * gross) / 100;
}
private int calculateTax(int taxableIncome, String gender) {
int calcTax = 0;
int taxable = 0;
int genderBasedFirstRange = TAX_RANGE_FIRST;
switch (gender) {
case GENDER_MALE:
genderBasedFirstRange = TAX_RANGE_FIRST;
break;
case GENDER_FEMALE:
genderBasedFirstRange = TAX_RANGE_FIRST_FEMALE;
break;
}
if (taxableIncome < genderBasedFirstRange) return 0;
taxable = taxableIncome - genderBasedFirstRange;
if (taxable > TAX_RANGE_SECOND) {
calcTax += TAX_RANGE_SECOND * TAX_RANGE_SECOND_PERCENTAGE / 100;
} else if (taxable > 0) {
calcTax += taxable * TAX_RANGE_SECOND_PERCENTAGE / 100;
return calcTax;
}
taxable = taxable - TAX_RANGE_SECOND;
if (taxable > TAX_RANGE_THIRD) {
calcTax += TAX_RANGE_THIRD * TAX_RANGE_THIRD_PERCENTAGE / 100;
} else if (taxable > 0) {
calcTax += taxable * TAX_RANGE_THIRD_PERCENTAGE / 100;
return calcTax;
}
taxable = taxable - TAX_RANGE_THIRD;
if (taxable > TAX_RANGE_FOURTH) {
calcTax += TAX_RANGE_FOURTH * TAX_RANGE_FOURTH_PERCENTAGE / 100;
} else if (taxable > 0) {
calcTax += taxable * TAX_RANGE_FOURTH_PERCENTAGE / 100;
return calcTax;
}
taxable = taxable - TAX_RANGE_FOURTH;
if (taxable > TAX_RANGE_FIFTH) {
calcTax += TAX_RANGE_FIFTH * TAX_RANGE_FIFTH_PERCENTAGE / 100;
} else if (taxable > 0) {
calcTax += taxable * TAX_RANGE_FIFTH_PERCENTAGE / 100;
return calcTax;
}
taxable = taxable - TAX_RANGE_FIFTH;
if (taxable > 0) {
calcTax += taxable * TAX_RANGE_SIXTH_PERCENTAGE / 100;
return calcTax;
}
return calcTax;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment