/* * eGov suite of products aim to improve the internal efficiency,transparency, * accountability and the service delivery of the government organizations. * * Copyright (C) <2015> eGovernments Foundation * * The updated version of eGov suite of products as by eGovernments Foundation * is available at http://www.egovernments.org * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/ or * http://www.gnu.org/licenses/gpl.html . * * In addition to the terms of the GPL license to be adhered to in using this * program, the following additional terms are to be complied with: * * 1) All versions of this program, verbatim or modified must carry this * Legal Notice. * * 2) Any misrepresentation of the origin of the material is prohibited. It * is required that all modified versions of this material be marked in * reasonable ways as different from the original version. * * 3) This license does not grant any rights to any user of the program * with regards to rights under trademark law for use of the trade names * or trademarks of eGovernments Foundation. * * In case of any queries, you can reach eGovernments Foundation at contact@egovernments.org. */ package org.egov.works.web.actions.contractorBill; import com.lowagie.text.Chunk; import com.lowagie.text.DocumentException; import com.lowagie.text.Element; import com.lowagie.text.Font; import com.lowagie.text.Paragraph; import com.lowagie.text.Phrase; import com.lowagie.text.pdf.PdfPCell; import com.lowagie.text.pdf.PdfPTable; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.egov.commons.CChartOfAccounts; import org.egov.commons.dao.ChartOfAccountsHibernateDAO; import org.egov.infra.exception.ApplicationException; import org.egov.infra.exception.ApplicationRuntimeException; import org.egov.infra.utils.NumberToWord; import org.egov.infra.workflow.entity.StateHistory; import org.egov.infstr.services.PersistenceService; import org.egov.model.bills.EgBilldetails; import org.egov.pims.commons.DeptDesig; import org.egov.pims.model.PersonalInformation; import org.egov.pims.service.EmployeeServiceOld; import org.egov.works.contractorbill.entity.ContractorBillRegister; import org.egov.works.models.contractorBill.AssetForBill; import org.egov.works.models.contractorBill.DeductionTypeForBill; import org.egov.works.models.contractorBill.StatutoryDeductionsForBill; import org.egov.works.models.measurementbook.MBForCancelledBill; import org.egov.works.models.measurementbook.MBHeader; import org.egov.works.services.ContractorBillService; import org.egov.works.services.WorksService; import org.egov.works.services.contractoradvance.ContractorAdvanceService; import org.egov.works.utils.AbstractPDFGenerator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import java.io.OutputStream; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Locale; import java.util.Map; public class ContractorBillPDFGenerator extends AbstractPDFGenerator { private static final Logger logger = Logger.getLogger(ContractorBillPDFGenerator.class); @Autowired @Qualifier("persistenceService") private PersistenceService persistenceService; @Autowired private EmployeeServiceOld employeeService; private final Map<String, String> pdfLabel; private final ContractorBillRegister egBillRegister; private final MBHeader mbHeader; private String deptName = ""; private String contactorName = ""; private String contractorAddress = ""; private String billNumber = ""; private String billGenNumber = ""; private String billDate = ""; private String billType = ""; private String workDescription = ""; private String workcommencedOn = ""; private String workCompletedOn = ""; private String estimateNumber = ""; private String projectCode = ""; public static final String newLine = "\n"; private Long workOrderId; @Autowired private ChartOfAccountsHibernateDAO chartOfAccountsHibernateDAO; private final List<MBHeader> mbHeaderList = new ArrayList<MBHeader>(); private final SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy", Locale.US); private boolean flag = false; public static final String CONTRACTOR_PDF_ERROR = "egBillRegister.pdf.error"; private final ContractorBillService contractorBillService; public static final String blankSpace = " "; public static final String blankSpace8 = " "; public static final String blankSpace15 = " "; public static final String blankSpace20 = " "; public static final String tab2 = "\t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t\t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t"; public static final String dateLabel = "contractorbill.pdf.date"; private List<StatutoryDeductionsForBill> sortedStatutorySortedList; private List<DeductionTypeForBill> sortedStandardDeductionList; private List<EgBilldetails> customDeductionList; private List<AssetForBill> assetForBillList; private WorksService worksService; private BigDecimal advanceAdjustment = new BigDecimal(0); private List<BigDecimal> glcodeIdList; private static final String WORKS_NETPAYABLE_CODE = "WORKS_NETPAYABLE_CODE"; private BigDecimal netPayableAmount = BigDecimal.ZERO; private ContractorAdvanceService contractorAdvanceService; public ContractorBillPDFGenerator(final ContractorBillRegister egBillRegister, final MBHeader mbHeader, final OutputStream out, final Map<String, String> pdfLabel, final ContractorBillService contractorBillService) { super(out, "landscape"); this.pdfLabel = pdfLabel; this.egBillRegister = egBillRegister; this.mbHeader = mbHeader; this.contractorBillService = contractorBillService; } public void generatePDF() throws ApplicationException { logger.debug("FA1---inside generate pdf "); generateDisplayData(mbHeader, egBillRegister); try { // start header Part final PdfPTable contractorBillMainTable = new PdfPTable(11); contractorBillMainTable.setWidthPercentage(100); // contractorBillMainTable.setWidths(new float[] {2f,2f,2f,2f,2f,2f,2f,2f,2f,2f}); contractorBillMainTable.setWidths(new float[] { 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f, 1.5f }); contractorBillMainTable.getDefaultCell().setPadding(4); contractorBillMainTable.getDefaultCell().setBorderWidth(1); createHeaderRow(contractorBillMainTable); createDetailsRows(contractorBillMainTable); document.add(contractorBillMainTable); document.add(spacer()); // ---approval details for workflow final PdfPTable approvaldetailsTable = createApprovalDetailsTable(egBillRegister); if (approvaldetailsTable.getRows().size() != 1) { document.add(makePara("Approval Details")); document.add(spacer()); document.add(approvaldetailsTable); document.add(spacer()); } if (contractorBillMainTable != null && contractorBillMainTable.getRows().size() > 11) document.newPage(); createFooter(); // create certificate page document.newPage(); createCertificate(); document.close(); } catch (final DocumentException e) { throw new ApplicationRuntimeException(CONTRACTOR_PDF_ERROR, e); } catch (final ApplicationException ex) { throw new ApplicationRuntimeException(CONTRACTOR_PDF_ERROR, ex); } } protected void createCertificate() throws DocumentException { final Paragraph headerTextPara = new Paragraph(new Chunk(pdfLabel.get("contractorbill.pdf.contractorbill"), new Font(Font.TIMES_ROMAN, Font.DEFAULTSIZE, Font.BOLD))); headerTextPara.setAlignment(Element.ALIGN_CENTER); document.add(headerTextPara); final Paragraph certificateheaderTextPara = new Paragraph( new Chunk(pdfLabel.get("contractorbill.pdf.certificate"), new Font(Font.COURIER, LARGE_FONT, Font.BOLD))); certificateheaderTextPara.setAlignment(Element.ALIGN_CENTER); document.add(certificateheaderTextPara); document.add(spacer()); document.add(spacer()); document.add(makePara(pdfLabel.get("contractorbill.pdf.certificatecontent1"))); document.add(spacer()); document.add(spacer()); document.add(rightPara(pdfLabel.get("contractorbill.pdf.juniorengineer") + "\t \t\t \t \t \t\t \t\t \t \t \t \t")); document.add(spacer()); document.add(rightPara(pdfLabel.get(dateLabel) + "\t \t \t \t\t \t\t \t \t \t \t\t \t\t \t \t \t \t\t \t\t" + "\t \t\t \t\t \t \t \t \t\t \t\t\t\t \t\t \t\t")); document.add(spacer()); document.add(makePara(pdfLabel.get("contractorbill.pdf.certificatecontent2"))); document.add(spacer()); document.add(spacer()); document.add(rightPara(pdfLabel.get("contractorbill.pdf.exeasstengineer") + "\t \t")); document.add(spacer()); document.add(rightPara(pdfLabel.get(dateLabel) + "\t \t \t \t\t \t\t \t \t \t \t\t \t\t \t \t \t \t\t \t\t" + "\t \t \t \t\t \t\t \t \t \t \t\t \t\t \t \t \t \t\t \t\t\t \t \t\t\t \t\t \t \t \t \t\t \t\t \t \t \t \t\t \t\t \t \t \t \t\t \t\t")); document.add(spacer()); document.add(makePara(pdfLabel.get("contractorbill.pdf.certificatecontent3"))); document.add(spacer()); document.add(makePara(pdfLabel.get("contractorbill.pdf.certificatecontent4"))); document.add(spacer()); document.add(makePara(pdfLabel.get("contractorbill.pdf.certificatecontent5"))); document.add(spacer()); document.add(spacer()); document.add(makePara(pdfLabel.get("contractorbill.pdf.certificatecontent6"))); document.add(spacer()); document.add(spacer()); document.add(makePara(pdfLabel.get("contractorbill.pdf.juniorengineer") + "\t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t " + tab2 + tab2 + "\t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t\t \t \t \t \t \t \t \t \t \t \t" + pdfLabel.get("contractorbill.pdf.exeasstengineer"))); document.add(spacer()); document.add( makePara(pdfLabel.get(dateLabel) + "\t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t" + tab2 + tab2 + "\t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t\t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t" + "\t \t \t \t \t \t \t \t " + pdfLabel.get(dateLabel))); } protected void createFooter() throws DocumentException { document.add(makePara( "Received( Rs---------------) Rupees-------------------------------------------------------------------------------------------\n" + "only as a final payment in settlement of all demands in( Vernacular)---------------------------------------------------\n" + "Witness:- 1.\n" + " 2.")); logger.debug("FC---inside generate pdf add document"); } // 1---header part of code protected void createHeaderRow(final PdfPTable contractorBillMainTable) throws DocumentException, ApplicationException { final PdfPTable contractorBillLeftHeader = createContractorBillHeader(pdfLabel.get("contractorbill.pdf.leftheader"), 0); contractorBillLeftHeader.getDefaultCell().setBorderWidth(0); final PdfPCell contractorBillLeftHeaderCell = new PdfPCell(contractorBillLeftHeader); contractorBillLeftHeaderCell.setBorderWidth(0); contractorBillLeftHeaderCell.setColspan(4); contractorBillMainTable.addCell(contractorBillLeftHeaderCell); final PdfPTable contractorBillMainHeader = createContractorBillHeader(pdfLabel.get("contractorbill.pdf.mainheader"), 1); contractorBillMainHeader.getDefaultCell().setBorderWidth(0); final PdfPCell contractorBillMainHeaderCell = new PdfPCell(contractorBillMainHeader); contractorBillMainHeaderCell.setBorderWidth(0); contractorBillMainHeaderCell.setColspan(3); contractorBillMainTable.addCell(contractorBillMainHeaderCell); final PdfPTable contractorBillRightHeader = createContractorBillHeader(pdfLabel.get("contractorbill.pdf.rightheader"), 2); contractorBillMainHeader.getDefaultCell().setBorderWidth(0); final PdfPCell contractorBillRightHeaderCell = new PdfPCell(contractorBillRightHeader); contractorBillRightHeaderCell.setBorderWidth(0); contractorBillRightHeaderCell.setColspan(4); contractorBillMainTable.addCell(contractorBillRightHeaderCell); } protected PdfPTable createContractorBillHeader(final String title, final int i) throws DocumentException, ApplicationException { final PdfPTable contractorBillHeaderTable = new PdfPTable(3); contractorBillHeaderTable.getDefaultCell().setBorderWidth(0); if (i == 0) { contractorBillHeaderTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_LEFT); contractorBillHeaderTable.getDefaultCell().setColspan(4); contractorBillHeaderTable.addCell(title); } else if (i == 1) { contractorBillHeaderTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER); final Phrase headerTextPara = new Phrase(title, new Font(Font.UNDEFINED, LARGE_FONT, Font.BOLD)); contractorBillHeaderTable.getDefaultCell().setColspan(3); contractorBillHeaderTable.addCell(headerTextPara); } else if (i == 2) { contractorBillHeaderTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT); contractorBillHeaderTable.getDefaultCell().setColspan(4); contractorBillHeaderTable.addCell(title + " " + deptName); } return contractorBillHeaderTable; } // def creatreDetailsRow(contractorBillMainTable) protected void createDetailsRows(final PdfPTable contractorBillMainTable) throws DocumentException, ApplicationException { createContractorRow(contractorBillMainTable); createWorkDescRow(contractorBillMainTable); createDetailsForWorkOrder(contractorBillMainTable); // project code row createWorkValueLabel(contractorBillMainTable); // value of work done row createWorkValueData(contractorBillMainTable); createDeductionTypeLabel(contractorBillMainTable); // deductions label row createDeductionTypeData(contractorBillMainTable); // deductions data row createNetPayable(contractorBillMainTable); } // row7 createDeductionTypeLabel protected void createDeductionTypeLabel(final PdfPTable contractorBillMainTable) throws DocumentException, ApplicationException { contractorBillMainTable.getDefaultCell().setBorderWidth(1); final PdfPTable deductionTypeTable = createDeductionTypeLabelTable(contractorBillMainTable); deductionTypeTable.getDefaultCell().setBorderWidth(1); final PdfPCell deductionTypeCell = new PdfPCell(deductionTypeTable); deductionTypeCell.setColspan(11); contractorBillMainTable.addCell(deductionTypeCell); } protected PdfPTable createDeductionTypeLabelTable(final PdfPTable contractorBillMainTable) throws DocumentException, ApplicationException { final PdfPTable deductionTypeLabel = new PdfPTable(11); deductionTypeLabel.getDefaultCell().setBorderWidth(1); deductionTypeLabel.getDefaultCell().setColspan(7); deductionTypeLabel.addCell(makePara(pdfLabel.get("contractorbill.pdf.deductions"))); deductionTypeLabel.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER); deductionTypeLabel.getDefaultCell().setColspan(1); deductionTypeLabel.addCell(""); deductionTypeLabel.addCell(""); deductionTypeLabel.addCell(""); deductionTypeLabel.addCell(""); return deductionTypeLabel; } // row8 createDeductionTypeData protected void createDeductionTypeData(final PdfPTable contractorBillMainTable) throws DocumentException, ApplicationException { contractorBillMainTable.getDefaultCell().setBorderWidth(1); final PdfPTable createDeductionTypeDataTable = createDeductionTypeDataTable(contractorBillMainTable); createDeductionTypeDataTable.getDefaultCell().setBorderWidth(1); final PdfPCell createWorkValueDataCell = new PdfPCell(createDeductionTypeDataTable); createWorkValueDataCell.setColspan(11); contractorBillMainTable.addCell(createWorkValueDataCell); } protected PdfPTable createDeductionTypeDataTable(final PdfPTable contractorBillMainTable) throws DocumentException, ApplicationException { final PdfPTable createcreateDeductionTypeDataTable = new PdfPTable(11); createcreateDeductionTypeDataTable.getDefaultCell().setBorderWidth(1); // statutory if (!sortedStatutorySortedList.isEmpty()) for (final StatutoryDeductionsForBill egBillPayeedetail : sortedStatutorySortedList) { // get tot amt for dedcution for all bill for workorder till bill date final BigDecimal totStatutoryAmt = getTotStatoryAmountForDeduction(egBillPayeedetail); final String resultTotStatuAmt = getIntDecimalParts(totStatutoryAmt); final String[] resultTotStatuAry = resultTotStatuAmt.split(":"); createcreateDeductionTypeDataTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_LEFT); final String resultAmt = getIntDecimalParts(egBillPayeedetail.getEgBillPayeeDtls().getCreditAmount()); final String[] resultAry = resultAmt.split(":"); createcreateDeductionTypeDataTable.getDefaultCell().setColspan(7); createcreateDeductionTypeDataTable.addCell(egBillPayeedetail.getEgBillPayeeDtls().getRecovery().getType()); createcreateDeductionTypeDataTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT); createcreateDeductionTypeDataTable.getDefaultCell().setColspan(1); createcreateDeductionTypeDataTable.addCell(resultTotStatuAry[0]);// Rs. amt all bill for workorder till billdate createcreateDeductionTypeDataTable.addCell(resultTotStatuAry[1]);// Pa, amt all bill for workorder till billdate createcreateDeductionTypeDataTable.addCell(resultAry[0]); // Rs. amt for this deduction specific to bill createcreateDeductionTypeDataTable.addCell(resultAry[1]);// pa. amt for this deduction specific to bill } final String type = "advanceAjustment"; if ("advanceAjustment".equalsIgnoreCase(type)) { final BigDecimal totAmt = getTotAmountForAdvanceAdjustment(); final String resultTotAmt = getIntDecimalParts(totAmt); final String[] resultTotAry = resultTotAmt.split(":"); createcreateDeductionTypeDataTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_LEFT); final String resultAmt = getIntDecimalParts(advanceAdjustment); final String[] resultAry = resultAmt.split(":"); createcreateDeductionTypeDataTable.getDefaultCell().setColspan(7); createcreateDeductionTypeDataTable.addCell("Advance adjustment "); createcreateDeductionTypeDataTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT); createcreateDeductionTypeDataTable.getDefaultCell().setColspan(1); createcreateDeductionTypeDataTable.addCell(resultTotAry[0]); createcreateDeductionTypeDataTable.addCell(resultTotAry[1]); createcreateDeductionTypeDataTable.addCell(resultAry[0]); // Rs. amt for this deduction specific to bill createcreateDeductionTypeDataTable.addCell(resultAry[1]);// pa. amt for this deduction specific to bill } // standard deduction if (!sortedStandardDeductionList.isEmpty()) for (final DeductionTypeForBill deductionTypeForBill : sortedStandardDeductionList) { final BigDecimal totStandardAmt = getTotStandardAmountForDeduction(deductionTypeForBill); final String resultTotStandardAmt = getIntDecimalParts(totStandardAmt); final String[] resultTotStandardAry = resultTotStandardAmt.split(":"); createcreateDeductionTypeDataTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_LEFT); final String resultAmt = getIntDecimalParts(deductionTypeForBill.getCreditamount()); final String[] resultAry = resultAmt.split(":"); createcreateDeductionTypeDataTable.getDefaultCell().setColspan(7); createcreateDeductionTypeDataTable.addCell(deductionTypeForBill.getDeductionType()); createcreateDeductionTypeDataTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT); createcreateDeductionTypeDataTable.getDefaultCell().setColspan(1); createcreateDeductionTypeDataTable.addCell(resultTotStandardAry[0]);// Rs. amt all bill for workorder till // billdate createcreateDeductionTypeDataTable.addCell(resultTotStandardAry[1]);// Pa, amt all bill for workorder till // billdate createcreateDeductionTypeDataTable.addCell(resultAry[0]); // Rs. amt for this deduction for this bill createcreateDeductionTypeDataTable.addCell(resultAry[1]);// Pa. amt for this deduction for this bill } if (!customDeductionList.isEmpty()) for (final EgBilldetails egBilldetails : customDeductionList) { final BigDecimal totCustomAmt = getTotStandardAmountForDeduction(egBilldetails); final String resultTotCustomAmt = getIntDecimalParts(totCustomAmt); final String[] resultTotCustomAry = resultTotCustomAmt.split(":"); createcreateDeductionTypeDataTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_LEFT); final String resultAmt = getIntDecimalParts(egBilldetails.getCreditamount()); final String[] resultAry = resultAmt.split(":"); createcreateDeductionTypeDataTable.getDefaultCell().setColspan(7); createcreateDeductionTypeDataTable.addCell( chartOfAccountsHibernateDAO.findById(Long.valueOf(egBilldetails.getGlcodeid().toString()), false) .getName()); createcreateDeductionTypeDataTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT); createcreateDeductionTypeDataTable.getDefaultCell().setColspan(1); createcreateDeductionTypeDataTable.addCell(resultTotCustomAry[0]);// Rs. amt all bill for workorder till billdate createcreateDeductionTypeDataTable.addCell(resultTotCustomAry[1]);// Pa, amt all bill for workorder till billdate createcreateDeductionTypeDataTable.addCell(resultAry[0]); // amt for this deduction specific to bill createcreateDeductionTypeDataTable.addCell(resultAry[1]); } return createcreateDeductionTypeDataTable; } // row 9th protected void createNetPayable(final PdfPTable contractorBillMainTable) throws DocumentException, ApplicationException { contractorBillMainTable.getDefaultCell().setBorderWidth(1); final PdfPTable createNetPayableTable = createNetPayableTable(contractorBillMainTable); createNetPayableTable.getDefaultCell().setBorderWidth(1); final PdfPCell createNetPayableCell = new PdfPCell(createNetPayableTable); createNetPayableCell.setColspan(11); contractorBillMainTable.addCell(createNetPayableCell); } protected PdfPTable createNetPayableTable(final PdfPTable contractorBillMainTable) throws DocumentException, ApplicationException { final String resultAmt = getIntDecimalParts(netPayableAmount); final String[] resultAry = resultAmt.split(":"); final PdfPTable createNetPayableData = new PdfPTable(11); createNetPayableData.getDefaultCell().setBorderWidth(1); createNetPayableData.getDefaultCell().setColspan(9); createNetPayableData.getDefaultCell().setHorizontalAlignment(Element.ALIGN_LEFT); createNetPayableData .addCell(makePara(pdfLabel.get("contractorbill.pdf.netamount") + ":\t" + getNetPayAmtInWords(), Font.UNDERLINE)); createNetPayableData.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT); createNetPayableData.getDefaultCell().setColspan(1); createNetPayableData.addCell(resultAry[0]); createNetPayableData.addCell(resultAry[1]); return createNetPayableData; } // row6 createWorkValueData protected void createWorkValueData(final PdfPTable contractorBillMainTable) throws DocumentException, ApplicationException { contractorBillMainTable.getDefaultCell().setBorderWidth(1); final PdfPTable createWorkValueDataTable = createWorkValueDataTable(contractorBillMainTable); createWorkValueDataTable.getDefaultCell().setBorderWidth(1); final PdfPCell createWorkValueDataCell = new PdfPCell(createWorkValueDataTable); createWorkValueDataCell.setColspan(11); contractorBillMainTable.addCell(createWorkValueDataCell); } protected PdfPTable createWorkValueDataTable(final PdfPTable contractorBillMainTable) throws DocumentException, ApplicationException { final PdfPTable createWorkValueData = new PdfPTable(11); createWorkValueData.getDefaultCell().setBorderWidth(1); createWorkValueData.getDefaultCell().setColspan(7); createWorkValueData.addCell(makePara(pdfLabel.get("contractorbill.pdf.valueofworkdone"))); createWorkValueData.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT); createWorkValueData.getDefaultCell().setColspan(1); final BigDecimal totalBillAmtUptBill = contractorBillService.getTotalValueWoForUptoBillDate(egBillRegister.getBilldate(), workOrderId, mbHeader.getWorkOrderEstimate().getId()); if (totalBillAmtUptBill.compareTo(BigDecimal.ZERO) > 0) { final String totalBillAmt = toCurrency(totalBillAmtUptBill.doubleValue()); try { createWorkValueData.addCell(rightPara(blankSpace + totalBillAmt.substring(0, totalBillAmt.indexOf('.')))); createWorkValueData.addCell( centerPara(blankSpace + totalBillAmt.substring(totalBillAmt.indexOf('.') + 1, totalBillAmt.length()))); } catch (final StringIndexOutOfBoundsException e) { logger.error("----totalBillAmt has no fractional part----" + e.getMessage()); createWorkValueData.addCell(centerPara(blankSpace + totalBillAmt)); createWorkValueData.addCell("00"); } } else { createWorkValueData.addCell(" "); createWorkValueData.addCell(" "); } BigDecimal billAmount = BigDecimal.ZERO; if (egBillRegister.getBillamount() != null) billAmount = egBillRegister.getBillamount(); if (billAmount.compareTo(BigDecimal.ZERO) > 0) { final String billAmt = toCurrency(billAmount.doubleValue()); try { createWorkValueData.addCell(centerPara(blankSpace + billAmt.substring(0, billAmt.indexOf('.')))); createWorkValueData .addCell(centerPara(blankSpace + billAmt.substring(billAmt.indexOf('.') + 1, billAmt.length()))); } catch (final StringIndexOutOfBoundsException e) { logger.error("---billAmt has no fractional part---" + e.getMessage()); createWorkValueData.addCell(centerPara(blankSpace + billAmt)); createWorkValueData.addCell(""); } } else { createWorkValueData.addCell(" "); createWorkValueData.addCell(" "); } return createWorkValueData; } // row5 createWorkValueLabe protected void createWorkValueLabel(final PdfPTable contractorBillMainTable) throws DocumentException, ApplicationException { contractorBillMainTable.getDefaultCell().setBorderWidth(1); final PdfPTable WorkValueLabelTable = createWorkValueLabelTable(contractorBillMainTable); WorkValueLabelTable.getDefaultCell().setBorderWidth(1); final PdfPCell WorkValueLabelCell = new PdfPCell(WorkValueLabelTable); WorkValueLabelCell.setColspan(11); contractorBillMainTable.addCell(WorkValueLabelCell); } protected PdfPTable createWorkValueLabelTable(final PdfPTable contractorBillMainTable) throws DocumentException, ApplicationException { final PdfPTable createWorkValueLabel = new PdfPTable(11); createWorkValueLabel.getDefaultCell().setBorderWidth(1); createWorkValueLabel.getDefaultCell().setColspan(7); createWorkValueLabel.addCell(" "); createWorkValueLabel.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER); createWorkValueLabel.getDefaultCell().setColspan(2); createWorkValueLabel.addCell(centerPara(pdfLabel.get("contractorbill.pdf.todate") + "\n" + " Rs. P.")); createWorkValueLabel.addCell(centerPara(pdfLabel.get("contractorbill.pdf.lastbill") + "\n" + " Rs. P.")); return createWorkValueLabel; } // row3 and row4 ---createDetailForWorkOrder protected void createDetailsForWorkOrder(final PdfPTable contractorBillMainTable) throws DocumentException, ApplicationException { createDetailsForWorkOrderLabel(contractorBillMainTable); createDetailsForWorkOrderData(contractorBillMainTable); } // row3 protected void createDetailsForWorkOrderLabel(final PdfPTable contractorBillMainTable) throws DocumentException, ApplicationException { contractorBillMainTable.getDefaultCell().setBorderWidth(1); final PdfPTable detailsForWorkOrderTable = createDetailsForWorkOrderLabelTable(contractorBillMainTable); detailsForWorkOrderTable.getDefaultCell().setBorderWidth(1); final PdfPCell detailsForWorkOrderCell = new PdfPCell(detailsForWorkOrderTable); detailsForWorkOrderCell.setColspan(11); contractorBillMainTable.addCell(detailsForWorkOrderCell); } // row4 ---createDetailsForWorkOrderData protected void createDetailsForWorkOrderData(final PdfPTable contractorBillMainTable) throws DocumentException, ApplicationException { contractorBillMainTable.getDefaultCell().setBorderWidth(1); contractorBillMainTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_LEFT); if (!mbHeaderList.isEmpty()) { int listLen = 0; final int mbLen = mbHeaderList.size(); int assetLen = 0; if (flag && assetForBillList.size() > mbHeaderList.size()) listLen = assetForBillList.size(); else listLen = mbHeaderList.size(); if (flag) assetLen = assetForBillList.size(); for (int i = 0; i < listLen; i++) { contractorBillMainTable.getDefaultCell().setColspan(2); if (i == 0) contractorBillMainTable.addCell(centerPara(projectCode)); else contractorBillMainTable.addCell(""); if (flag && i < assetLen) contractorBillMainTable.addCell( assetForBillList.get(i).getAsset().getCode() + "-" + assetForBillList.get(i).getAsset().getName()); else contractorBillMainTable.addCell(""); contractorBillMainTable.getDefaultCell().setColspan(1); if (i < mbLen) { String mbRefNo = ""; String mbFrmPgNo = ""; String mbToPgNo = ""; if (mbHeaderList.get(i).getMbRefNo() != null) mbRefNo = mbHeaderList.get(i).getMbRefNo(); if (mbHeaderList.get(i).getFromPageNo() != null) mbFrmPgNo = mbHeaderList.get(i).getFromPageNo().toString(); if (mbHeaderList.get(i).getToPageNo() != null) mbToPgNo = mbHeaderList.get(i).getToPageNo().toString(); contractorBillMainTable.addCell(centerPara(" " + mbRefNo)); contractorBillMainTable.addCell(centerPara(blankSpace + mbFrmPgNo)); contractorBillMainTable.addCell(centerPara(blankSpace + mbToPgNo)); } else { contractorBillMainTable.addCell(centerPara(blankSpace)); contractorBillMainTable.addCell(centerPara(blankSpace)); contractorBillMainTable.addCell(centerPara(blankSpace)); } contractorBillMainTable.getDefaultCell().setColspan(4); if (i == 0) contractorBillMainTable.addCell(makePara( pdfLabel.get("contractorbill.pdf.estimateamt") + toCurrency( mbHeader.getWorkOrderEstimate().getEstimate().getWorkValueIncludingTaxes().getValue()), Element.ALIGN_LEFT)); else contractorBillMainTable.addCell(""); } } } // row3 def---createDetailForWorkOrder protected PdfPTable createDetailsForWorkOrderLabelTable(final PdfPTable contractorBillMainTable) throws DocumentException, ApplicationException { final PdfPTable detailsForWorkOrderLabel = new PdfPTable(11); detailsForWorkOrderLabel.getDefaultCell().setBorderWidth(1); detailsForWorkOrderLabel.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER); detailsForWorkOrderLabel.getDefaultCell().setColspan(2); detailsForWorkOrderLabel.addCell(pdfLabel.get("contractorbill.pdf.projectcode")); detailsForWorkOrderLabel.addCell(pdfLabel.get("contractorbill.pdf.assetcode")); detailsForWorkOrderLabel.getDefaultCell().setColspan(1); detailsForWorkOrderLabel.addCell(pdfLabel.get("contractorbill.pdf.Mbno")); detailsForWorkOrderLabel.getDefaultCell().setColspan(2); detailsForWorkOrderLabel.getDefaultCell().setHorizontalAlignment(Element.ALIGN_LEFT); // detailsForWorkOrderLabel.addCell("\t\t\t\t\t"+pdfLabel.get("contractorbill.pdf.pages")+newLine+pdfLabel.get("contractorbill.pdf.from")+"\t\t\t\t\t"+pdfLabel.get("contractorbill.pdf.to")); // detailsForWorkOrderLabel.addCell("\t \t \t\t \t \t \t \t \t \t \t \t \t \t \t // "+pdfLabel.get("contractorbill.pdf.pages")+"\n \t \t \t \t\t \t \t \t"+pdfLabel.get("contractorbill.pdf.from")+"\t \t // \t \t \t \t \t \t \t \t \t"+pdfLabel.get("contractorbill.pdf.to")); detailsForWorkOrderLabel.addCell(blankSpace15 + pdfLabel.get("contractorbill.pdf.pages") + "\n" + blankSpace8 + pdfLabel.get("contractorbill.pdf.from") + blankSpace8 + pdfLabel.get("contractorbill.pdf.to")); detailsForWorkOrderLabel.getDefaultCell().setHorizontalAlignment(Element.ALIGN_LEFT); detailsForWorkOrderLabel.getDefaultCell().setColspan(4); detailsForWorkOrderLabel.addCell(pdfLabel.get("contractorbill.pdf.estimateno") + " " + estimateNumber); return detailsForWorkOrderLabel; } // row2 --- workorder row protected void createWorkDescRow(final PdfPTable contractorBillMainTable) throws DocumentException, ApplicationException { contractorBillMainTable.getDefaultCell().setBorderWidth(1); final PdfPTable workDescTable = createWorkDescTable(contractorBillMainTable); workDescTable.getDefaultCell().setBorderWidth(1); final PdfPCell workDescCell = new PdfPCell(workDescTable); workDescCell.setColspan(11); contractorBillMainTable.addCell(workDescCell); } protected PdfPTable createWorkDescTable(final PdfPTable contractorBillMainTable) throws DocumentException, ApplicationException { final PdfPTable workDescTable = new PdfPTable(11); workDescTable.getDefaultCell().setBorderWidth(1); workDescTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_LEFT); workDescTable.getDefaultCell().setColspan(7); workDescTable.addCell(pdfLabel.get("contractorbill.pdf.workdescription") + newLine + workDescription + newLine); workDescTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_LEFT); workDescTable.getDefaultCell().setColspan(4); workDescTable.addCell(pdfLabel.get("contractorbill.pdf.workcommencedon") + workcommencedOn + newLine + pdfLabel.get("contractorbill.pdf.workcompleteon") + workCompletedOn + newLine); return workDescTable; } // row1 --- createContractorRow protected void createContractorRow(final PdfPTable contractorBillMainTable) throws DocumentException, ApplicationException { contractorBillMainTable.getDefaultCell().setBorderWidth(1); final PdfPTable contractorTable = createContractorTable(contractorBillMainTable); contractorTable.getDefaultCell().setBorderWidth(1); final PdfPCell contractorCell = new PdfPCell(contractorTable); contractorCell.setColspan(11); contractorBillMainTable.addCell(contractorCell); } protected PdfPTable createContractorTable(final PdfPTable contractorBillMainTable) throws DocumentException, ApplicationException { final PdfPTable contractorTable = new PdfPTable(11); contractorTable.getDefaultCell().setBorderWidth(1); contractorTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_LEFT); contractorTable.getDefaultCell().setColspan(7); contractorTable.addCell(pdfLabel.get("contractorbill.pdf.contractoraddress") + newLine + contactorName + newLine + contractorAddress + newLine); contractorTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_LEFT); contractorTable.getDefaultCell().setColspan(4); contractorTable.addCell(pdfLabel.get("contractorbill.pdf.billno") + billGenNumber + newLine + pdfLabel.get("contractorbill.pdf.dateofbill") + billDate + newLine + pdfLabel.get("contractorbill.pdf.typeofbill") + billType + newLine); return contractorTable; } // display data generation block protected void generateDisplayData(final MBHeader mbHeader, final ContractorBillRegister egBillRegister) throws ApplicationException { assetForBillList = contractorBillService.getAssetForBill(egBillRegister.getId()); if (!assetForBillList.isEmpty()) flag = true; List<String> requiredStatutoryList = null; requiredStatutoryList = contractorBillService.getSortedDeductionsFromConfig("StatutoryDeductionKey"); final List<StatutoryDeductionsForBill> currentStatutoryList = contractorBillService .getStatutoryListForBill(egBillRegister.getId()); sortedStatutorySortedList = contractorBillService.getStatutoryDeductionSortedOrder(requiredStatutoryList, currentStatutoryList); advanceAdjustment = contractorBillService.getAdvanceAdjustmentAmountForBill(egBillRegister.getId(), mbHeader.getWorkOrderEstimate().getId()); // standard deduction final List<String> requiredStandardList = contractorBillService.getSortedDeductionsFromConfig("StandardDeductionKey"); getStandardDeductionList(egBillRegister.getId(), requiredStandardList); getCustomDeductionList(egBillRegister); if (mbHeader != null) { deptName = mbHeader.getWorkOrderEstimate().getEstimate().getUserDepartment().getName(); contactorName = mbHeader.getWorkOrder().getContractor().getName(); contractorAddress = mbHeader.getWorkOrder().getContractor().getCorrespondenceAddress() == null ? "" : mbHeader.getWorkOrder().getContractor().getCorrespondenceAddress(); workDescription = mbHeader.getWorkOrderEstimate().getEstimate().getDescription(); workcommencedOn = sdf.format(mbHeader.getWorkOrder().getCreatedDate()); workOrderId = mbHeader.getWorkOrder().getId(); if (egBillRegister.getBillstatus().equals("CANCELLED")) { for (final MBForCancelledBill mbCancelBillObj : contractorBillService .getMbListForCancelBill(egBillRegister.getId())) if (!mbHeaderList.contains(mbCancelBillObj.getMbHeader())) mbHeaderList.add(mbCancelBillObj.getMbHeader()); } else for (final MBHeader mbObj : contractorBillService.getMbListForBillAndWorkordrId(workOrderId, egBillRegister.getId())) if (!mbHeaderList.contains(mbObj)) mbHeaderList.add(mbObj); estimateNumber = mbHeader.getWorkOrderEstimate().getEstimate().getEstimateNumber(); if (mbHeader.getWorkOrder() != null && mbHeader.getWorkOrderEstimate().getEstimate() != null && mbHeader.getWorkOrderEstimate().getEstimate().getProjectCode() != null && mbHeader.getWorkOrderEstimate().getEstimate().getProjectCode().getCode() != null) projectCode = mbHeader.getWorkOrderEstimate().getEstimate().getProjectCode().getCode(); } if (egBillRegister.getBillnumber() != null) billGenNumber = egBillRegister.getBillnumber(); // partbillNo if (egBillRegister.getBillnumber() != null && egBillRegister.getBillSequenceNumber() != null) billNumber = egBillRegister.getBillSequenceNumber().toString(); if (egBillRegister.getBilldate() != null) billDate = sdf.format(egBillRegister.getBilldate()); if (egBillRegister.getBilltype() != null) if ("Running".equalsIgnoreCase(billType)) billType = billNumber + "-" + egBillRegister.getBilltype(); else billType = egBillRegister.getBilltype(); if (egBillRegister.getBilldate() != null) billDate = sdf.format(egBillRegister.getBilldate()); if ("Final Bill".equalsIgnoreCase(egBillRegister.getBilltype())) { if (mbHeader != null && mbHeader.getWorkOrderEstimate() != null && mbHeader.getWorkOrderEstimate().getWorkCompletionDate() != null) workCompletedOn = sdf.format(mbHeader.getWorkOrderEstimate().getWorkCompletionDate()); } else workCompletedOn = "in progress"; } // for statutory deduction public void getStandardDeductionList(final Long billId, final List<String> requiredStandardList) { final List<DeductionTypeForBill> currentStandardDeductionList = contractorBillService.getStandardDeductionForBill(billId); sortedStandardDeductionList = contractorBillService.getStandardDeductionSortedOrder(requiredStandardList, currentStandardDeductionList); } public void getCustomDeductionList(final ContractorBillRegister egBillRegister) throws ApplicationException { customDeductionList = new ArrayList<EgBilldetails>(); glcodeIdList = new ArrayList<BigDecimal>(); getStatutoryDeductionGlcode(); getStandardDeductionGlcode(); String advanceAdjstglCodeId = ""; final CChartOfAccounts advanceCOA = contractorAdvanceService .getContractorAdvanceAccountcodeForWOE(mbHeader.getWorkOrderEstimate().getId()); if (advanceCOA != null) advanceAdjstglCodeId = advanceCOA.getId().toString(); getGlCodeForNetPayable(); if (StringUtils.isNotBlank(advanceAdjstglCodeId)) glcodeIdList.add(new BigDecimal(advanceAdjstglCodeId)); customDeductionList = contractorBillService.getCustomDeductionListforglcodes(glcodeIdList, egBillRegister.getId()); } public void getStatutoryDeductionGlcode() { if (!sortedStatutorySortedList.isEmpty()) for (final StatutoryDeductionsForBill bpd : sortedStatutorySortedList) if (bpd != null && bpd.getEgBillPayeeDtls().getRecovery() != null && bpd.getEgBillPayeeDtls().getRecovery().getId() != null && bpd.getEgBillPayeeDtls().getRecovery().getChartofaccounts() != null && bpd.getEgBillPayeeDtls().getRecovery().getChartofaccounts().getId() != null) glcodeIdList.add(new BigDecimal(bpd.getEgBillPayeeDtls().getRecovery().getChartofaccounts().getId())); } public void getStandardDeductionGlcode() { if (!sortedStandardDeductionList.isEmpty()) for (final DeductionTypeForBill deductionTypeForBill : sortedStandardDeductionList) if (deductionTypeForBill.getCoa() != null && deductionTypeForBill.getCoa().getId() != null) glcodeIdList.add(new BigDecimal(deductionTypeForBill.getCoa().getId())); } public void getGlCodeForNetPayable() throws NumberFormatException, ApplicationException { final List<CChartOfAccounts> coaPayableList = chartOfAccountsHibernateDAO .getAccountCodeByPurpose(Integer.valueOf(worksService.getWorksConfigValue(WORKS_NETPAYABLE_CODE))); // if(!coaPayableList.isEmpty()){ if (coaPayableList != null) for (final CChartOfAccounts coa : coaPayableList) if (coa.getId() != null) { // netPayableAmount=contractorBillService.getNetPayableAmountForGlCodeId(coa.getId(),egBillRegister.getId()); netPayableAmount = contractorBillService.getNetPayableAmountForGlCodeId(egBillRegister.getId()); glcodeIdList.add(new BigDecimal(coa.getId())); } } protected String getIntDecimalParts(final BigDecimal totalAmount) { String result = ""; String totalAmt = ""; if (totalAmount == null) totalAmt = "0:00"; else { totalAmt = toCurrency(totalAmount.doubleValue()); String intPart = "0"; String decimalPart = "0"; try { intPart = totalAmt.substring(0, totalAmt.indexOf('.')); decimalPart = totalAmt.substring(totalAmt.indexOf('.') + 1, totalAmt.length()); result = intPart + ":" + decimalPart; } catch (final StringIndexOutOfBoundsException e) { logger.error("---totalAmt has no fractional part---" + e.getMessage()); result = totalAmt + ":" + "00"; } } return result; } public String getNetPayAmtInWords() { String netPayAmtStr = ""; try { netPayAmtStr = NumberToWord.convertToWord(toCurrency(netPayableAmount.doubleValue())); } catch (final Exception e) { logger.debug("error -----" + e); netPayAmtStr = ""; } return netPayAmtStr; } private PdfPTable createApprovalDetailsTable(final ContractorBillRegister egBillRegister) throws DocumentException { try { final PdfPTable approvaldetailsTable = new PdfPTable(5); approvaldetailsTable.setWidthPercentage(100); approvaldetailsTable.setWidths(new float[] { 2f, 1f, 1f, 1.5f, 2f }); addRow(approvaldetailsTable, true, makePara("Approval Step"), centerPara("Name"), centerPara("Designation"), centerPara("Approved on"), centerPara("Remarks")); List<StateHistory> history = null; if (egBillRegister != null && egBillRegister.getCurrentState() != null && egBillRegister.getCurrentState().getHistory() != null) history = egBillRegister.getStateHistory(); if (history != null) { Collections.reverse(history); for (final StateHistory ad : history) displayHistory(ad, approvaldetailsTable); } return approvaldetailsTable; } catch (final Exception e) { throw new ApplicationRuntimeException("Exception occured while getting approval details " + e); } } public void displayHistory(final StateHistory ad, final PdfPTable approvaldetailsTable) throws Exception { if (!ad.getValue().equals("NEW") && !ad.getValue().equals("END")) { String nextAction = ""; if (ad.getNextAction() != null) nextAction = ad.getNextAction(); // EgwStatus status =(EgwStatus) getPersistenceService().find("from EgwStatus where code=?",ad.getValue()); String state = ad.getValue(); if (!nextAction.equalsIgnoreCase("")) state = ad.getValue() + " - " + nextAction; Long positionId = null; String desgName = null; DeptDesig deptdesig = null; // if(ad.getPrevious()==null){ positionId = ad.getOwnerPosition().getId(); deptdesig = ad.getOwnerPosition().getDeptDesig(); desgName = deptdesig.getDesignation().getName(); /* * } else{ positionId =ad.getPrevious().getOwner().getId(); deptdesig= ad.getPrevious().getOwner().getDeptDesigId(); * desgName = deptdesig.getDesigId().getDesignationName(); } */ final PersonalInformation emp = employeeService.getEmpForPositionAndDate(ad.getCreatedDate(), Integer.parseInt(positionId.toString())); addRow(approvaldetailsTable, true, makePara(state), makePara(emp.getEmployeeName()), makePara(desgName), makePara(getDateInFormat(ad.getCreatedDate().toString())), rightPara(ad.getComments())); } } private String getDateInFormat(final String date) throws DocumentException { String dateInFormat = null; try { dateInFormat = new SimpleDateFormat("dd-MMM-yyyy", Locale.ENGLISH) .format(new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH).parse(date)); } catch (final Exception e) { throw new ApplicationRuntimeException("Exception occured while parsing date := " + date + e); } return dateInFormat; } // calculate total amt for each deduction for a workorder upto bill date public BigDecimal getTotAmountForAdvanceAdjustment() { BigDecimal totalDeductionAmt = BigDecimal.ZERO; totalDeductionAmt = contractorBillService.getTotAmtForAdvanceAdjustment(egBillRegister.getBilldate(), workOrderId, mbHeader.getWorkOrderEstimate().getId()); return totalDeductionAmt; } public BigDecimal getTotStatoryAmountForDeduction(final StatutoryDeductionsForBill egBillPayeedetail) { BigDecimal totalStatoryAmount = BigDecimal.ZERO; totalStatoryAmount = contractorBillService.getTotAmtForStatutory(egBillRegister.getBilldate(), workOrderId, egBillPayeedetail, mbHeader.getWorkOrderEstimate().getId()); return totalStatoryAmount; } public BigDecimal getTotStandardAmountForDeduction(final DeductionTypeForBill deductionTypeForBill) { BigDecimal totStandardAmt = BigDecimal.ZERO; totStandardAmt = contractorBillService.getTotAmtForStandard(egBillRegister.getBilldate(), workOrderId, deductionTypeForBill, mbHeader.getWorkOrderEstimate().getId()); return totStandardAmt; } public BigDecimal getTotStandardAmountForDeduction(final EgBilldetails egBilldetails) { BigDecimal totCustomAmt = BigDecimal.ZERO; totCustomAmt = contractorBillService.getTotAmtForCustom(egBillRegister.getBilldate(), workOrderId, egBilldetails, mbHeader.getWorkOrderEstimate().getId()); return totCustomAmt; } // setter and getter public PersistenceService getPersistenceService() { return persistenceService; } public void setPersistenceService(final PersistenceService persistenceService) { this.persistenceService = persistenceService; } public EmployeeServiceOld getEmployeeService() { return employeeService; } public void setEmployeeService(final EmployeeServiceOld employeeService) { this.employeeService = employeeService; } public void setWorksService(final WorksService worksService) { this.worksService = worksService; } public void setContractorAdvanceService( final ContractorAdvanceService contractorAdvanceService) { this.contractorAdvanceService = contractorAdvanceService; } }