/** * @param property Property Object * @param applicableTaxes List of Applicable Taxes * @param occupationDate Minimum Occupancy Date among all the units * @return */ @Override public HashMap<Installment, TaxCalculationInfo> calculatePropertyTax( final Property property, final Date occupationDate) { Boundary propertyZone = null; BigDecimal totalNetArv = BigDecimal.ZERO; BoundaryCategory boundaryCategory = null; // TODO move method prepareApplicableTaxes to tax calculator final List<String> applicableTaxes = prepareApplicableTaxes(property); final List<Installment> taxInstallments = getInstallmentListByStartDate(occupationDate); propertyZone = property.getBasicProperty().getPropertyID().getZone(); for (final Installment installment : taxInstallments) { totalTaxPayable = BigDecimal.ZERO; final APTaxCalculationInfo taxCalculationInfo = addPropertyInfo(property); if (betweenOrBefore(occupationDate, installment.getFromDate(), installment.getToDate())) { if (property .getPropertyDetail() .getPropertyTypeMaster() .getCode() .equals(OWNERSHIP_TYPE_VAC_LAND)) { final APUnitTaxCalculationInfo unitTaxCalculationInfo = calculateVacantLandTax(property, occupationDate); totalNetArv = totalNetArv.add(unitTaxCalculationInfo.getNetARV()); taxCalculationInfo.addUnitTaxCalculationInfo(unitTaxCalculationInfo); calculateApplicableTaxes( applicableTaxes, unitTaxCalculationInfo, installment, property.getPropertyDetail().getPropertyTypeMaster().getCode()); totalTaxPayable = totalTaxPayable.add(unitTaxCalculationInfo.getTotalTaxPayable()); } else for (final Floor floorIF : property.getPropertyDetail().getFloorDetails()) if (floorIF != null) { // TODO think about, these beans to be client // specific boundaryCategory = getBoundaryCategory( propertyZone, installment, floorIF.getPropertyUsage().getId(), occupationDate); final APUnitTaxCalculationInfo unitTaxCalculationInfo = prepareUnitCalcInfo(property, floorIF, boundaryCategory); totalNetArv = totalNetArv.add(unitTaxCalculationInfo.getNetARV()); calculateApplicableTaxes( applicableTaxes, unitTaxCalculationInfo, installment, property.getPropertyDetail().getPropertyTypeMaster().getCode()); totalTaxPayable = totalTaxPayable.add(unitTaxCalculationInfo.getTotalTaxPayable()); taxCalculationInfo.addUnitTaxCalculationInfo(unitTaxCalculationInfo); } taxCalculationInfo.setTotalNetARV(totalNetArv); taxCalculationInfo.setTotalTaxPayable(totalTaxPayable); taxCalculationInfo.setTaxCalculationInfoXML(generateTaxCalculationXML(taxCalculationInfo)); taxCalculationMap.put(installment, taxCalculationInfo); } } return taxCalculationMap; }
public APUnitTaxCalculationInfo calculateApplicableTaxes( final List<String> applicableTaxes, final APUnitTaxCalculationInfo unitTaxCalculationInfo, final Installment installment, final String propTypeCode) { BigDecimal totalTaxPayable = BigDecimal.ZERO; EgDemandReasonDetails reasonDetail = null; APMiscellaneousTax miscellaneousTax = null; final BigDecimal alv = unitTaxCalculationInfo.getNetARV(); BigDecimal generalTax = BigDecimal.ZERO; BigDecimal educationTax = BigDecimal.ZERO; BigDecimal calculatedTax = BigDecimal.ZERO; LOGGER.debug("calculateApplicableTaxes - ALV: " + alv); LOGGER.debug("calculateApplicableTaxes - applicableTaxes: " + applicableTaxes); for (final String applicableTax : applicableTaxes) { if (applicableTax.equals(DEMANDRSN_CODE_GENERAL_TAX) || applicableTax.equals(DEMANDRSN_CODE_VACANT_TAX)) { reasonDetail = getDemandReasonDetails(applicableTax, alv, installment).get(0); calculatedTax = alv.multiply(reasonDetail.getPercentage().divide(new BigDecimal("100"))) .setScale(0, BigDecimal.ROUND_HALF_UP); generalTax = calculatedTax; } if (applicableTax.equals(DEMANDRSN_CODE_EDUCATIONAL_CESS)) { reasonDetail = getDemandReasonDetails(applicableTax, generalTax, installment).get(0); calculatedTax = generalTax .multiply(reasonDetail.getPercentage().divide(new BigDecimal("100"))) .setScale(0, BigDecimal.ROUND_HALF_UP); educationTax = calculatedTax; } if (applicableTax.equals(DEMANDRSN_CODE_LIBRARY_CESS)) { reasonDetail = getDemandReasonDetails(applicableTax, generalTax.add(educationTax), installment).get(0); calculatedTax = generalTax .add(educationTax) .multiply(reasonDetail.getPercentage().divide(new BigDecimal("100"))) .setScale(0, BigDecimal.ROUND_HALF_UP); } if (applicableTax.equals(DEMANDRSN_CODE_GENERAL_TAX) || applicableTax.equals(DEMANDRSN_CODE_EDUCATIONAL_CESS) || applicableTax.equals(DEMANDRSN_CODE_LIBRARY_CESS)) { if (propTypeCode.equals(PropertyTaxConstants.OWNERSHIP_TYPE_CENTRAL_GOVT_335)) calculatedTax = calculatedTax.multiply(new BigDecimal(0.335)); if (propTypeCode.equals(PropertyTaxConstants.OWNERSHIP_TYPE_CENTRAL_GOVT_50)) calculatedTax = calculatedTax.multiply(new BigDecimal(0.5)); if (propTypeCode.equals(PropertyTaxConstants.OWNERSHIP_TYPE_CENTRAL_GOVT_70)) calculatedTax = calculatedTax.multiply(new BigDecimal(0.7)); } calculatedTax = roundOffToNearestEven(calculatedTax); miscellaneousTax = new APMiscellaneousTax(); miscellaneousTax.setTaxName(applicableTax); miscellaneousTax.setTotalCalculatedTax(calculatedTax); totalTaxPayable = totalTaxPayable.add(calculatedTax); unitTaxCalculationInfo.addMiscellaneousTaxes(miscellaneousTax); } unitTaxCalculationInfo.setTotalTaxPayable(totalTaxPayable); return unitTaxCalculationInfo; }