/* * 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.tender; 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.pdf.PdfPCell; import com.lowagie.text.pdf.PdfPTable; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.egov.commons.EgwStatus; import org.egov.infra.exception.ApplicationException; import org.egov.infra.exception.ApplicationRuntimeException; import org.egov.infra.workflow.entity.StateHistory; import org.egov.infstr.services.PersistenceService; import org.egov.pims.model.PersonalInformation; import org.egov.pims.service.EmployeeServiceOld; import org.egov.works.abstractestimate.entity.AbstractEstimate; import org.egov.works.abstractestimate.entity.Activity; import org.egov.works.models.masters.Contractor; import org.egov.works.models.masters.MarketRate; import org.egov.works.models.tender.EstimateLineItemsForWP; import org.egov.works.models.tender.TenderResponse; import org.egov.works.models.tender.TenderResponseActivity; import org.egov.works.models.tender.TenderResponseContractors; import org.egov.works.models.tender.TenderResponseQuotes; import org.egov.works.models.tender.WorksPackage; import org.egov.works.services.WorksService; 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.text.DecimalFormat; import java.text.NumberFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; public class TenderNegotiationPDFGenerator extends AbstractPDFGenerator { private static final Logger LOGGER = Logger.getLogger(TenderNegotiationPDFGenerator.class); @Autowired @Qualifier("persistenceService") private PersistenceService persistenceService; @Autowired private EmployeeServiceOld employeeService; private final TenderResponse tenderResponse; public static final String TENDER_PDF_ERROR = "tenderresponse.pdf.error"; private final String cityName; private double totalAmt = 0.0; private double totalBefNegAmt = 0.0; private double totalAftNegAmt = 0.0; private double totalMarketRateAmt = 0.0; private final NumberFormat formatter = new DecimalFormat("#0.00"); private final SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy", Locale.US); private final Map<String, String> pdfLabel; public static final String TENDERNEGOTIATION_AMOUNT = "tenderNegotiationpdf.amount"; public static final String TENDERNEGOTIATION_RATE = "tenderNegotiationpdf.rate"; private String worksPackgeReq = "no"; private WorksPackage worksPackage; private static final String YES = "yes"; public static final String POSITIVE_SIGN = "(+)"; public static final String NEGATIVE_SIGN = "(-)"; private String percTenderType = ""; private NumberFormat nf = null; private WorksService worksService; public TenderNegotiationPDFGenerator(final TenderResponse tenderResponse, final String cityName, final OutputStream out, final Map<String, String> pdfLabel) { super(out, "landscape"); this.pdfLabel = pdfLabel; this.tenderResponse = tenderResponse; this.cityName = cityName; } public void generatePDF() { nf = NumberFormat.getInstance(); nf.setMaximumFractionDigits(10); final List<String> tenderTypeList = worksService.getTendertypeList(); if (tenderTypeList != null && !tenderTypeList.isEmpty()) percTenderType = tenderTypeList.get(0); final String headerText = pdfLabel.get("tenderNegotiationpdf.header"); try { final Paragraph headerTextPara = new Paragraph(new Chunk(headerText, new Font(Font.UNDEFINED, LARGE_FONT, Font.BOLD))); headerTextPara.setAlignment(Element.ALIGN_CENTER); document.add(headerTextPara); document.add(makePara(cityName, Element.ALIGN_RIGHT)); if (tenderResponse != null && tenderResponse.getTenderEstimate() != null && tenderResponse.getTenderEstimate().getWorksPackage() != null) { worksPackgeReq = YES; worksPackage = tenderResponse.getTenderEstimate().getWorksPackage(); } String deptName = ""; if (YES.equalsIgnoreCase(worksPackgeReq)) { deptName = tenderResponse.getTenderEstimate().getWorksPackage().getDepartment().getName(); document.add(makePara(deptName, Element.ALIGN_RIGHT)); if (getWardList(worksPackage) != null) document.add(makePara( pdfLabel.get("tenderNegotiationpdf.ward") + "/" + pdfLabel.get("tenderNegotiationpdf.zone") + getWardList(worksPackage), Element.ALIGN_LEFT)); } else { if (tenderResponse != null && tenderResponse.getTenderEstimate() != null && tenderResponse.getTenderEstimate().getAbstractEstimate().getExecutingDepartment() != null && tenderResponse.getTenderEstimate().getAbstractEstimate().getExecutingDepartment().getName() != null) deptName = tenderResponse.getTenderEstimate().getAbstractEstimate().getExecutingDepartment() .getName(); document.add(makePara(deptName, Element.ALIGN_RIGHT)); if (tenderResponse != null && tenderResponse.getTenderEstimate() != null && tenderResponse.getTenderEstimate().getAbstractEstimate().getWard().getParent() != null && tenderResponse.getTenderEstimate().getAbstractEstimate().getWard() != null) document.add(makePara( pdfLabel.get("tenderNegotiationpdf.ward") + "/" + pdfLabel.get("tenderNegotiationpdf.zone") + tenderResponse.getTenderEstimate().getAbstractEstimate().getWard().getName() + "/" + tenderResponse.getTenderEstimate().getAbstractEstimate().getWard().getParent() .getName(), Element.ALIGN_LEFT)); } if (YES.equalsIgnoreCase(worksPackgeReq)) document.add(makePara(pdfLabel.get("tenderNegotiationpdf.nameofwork") + tenderResponse.getTenderEstimate().getWorksPackage().getName(), Element.ALIGN_LEFT)); else if (tenderResponse != null && tenderResponse.getTenderEstimate() != null) document.add(makePara(pdfLabel.get("tenderNegotiationpdf.nameofwork") + tenderResponse.getTenderEstimate().getAbstractEstimate().getName(), Element.ALIGN_LEFT)); if (tenderResponse != null && tenderResponse.getTenderEstimate() != null && tenderResponse.getTenderEstimate().getTenderHeader() != null && tenderResponse.getTenderEstimate().getTenderHeader().getTenderNo() != null) document.add(makePara(pdfLabel.get("tenderNumber") + tenderResponse.getTenderEstimate().getTenderHeader().getTenderNo(), Element.ALIGN_LEFT)); if (tenderResponse != null && tenderResponse.getTenderEstimate() != null && tenderResponse.getTenderEstimate().getWorksPackage() != null) document.add(makePara(pdfLabel.get("tenderFileNo") + tenderResponse.getTenderEstimate().getWorksPackage().getTenderFileNumber(), Element.ALIGN_LEFT)); document.add(spacer()); String tenderDate = ""; if (tenderResponse != null && tenderResponse.getTenderEstimate() != null && tenderResponse.getTenderEstimate().getTenderHeader() != null && tenderResponse.getTenderEstimate().getTenderHeader().getTenderDate() != null) tenderDate = sdf.format(tenderResponse.getTenderEstimate().getTenderHeader().getTenderDate()); document.add(makePara(pdfLabel.get("tenderNegotiationpdf.tenderdate") + tenderDate, Element.ALIGN_RIGHT)); document.add(spacer()); PdfPTable contractorTable = null; if (tenderResponse != null) { contractorTable = createContractorTable(tenderResponse); document.add(contractorTable); } document.add(spacer()); if (tenderResponse != null && tenderResponse.getTenderEstimate().getTenderType().equalsIgnoreCase(percTenderType)) { PdfPTable negotiationTable = null; negotiationTable = createNegotiationTable(tenderResponse, tenderResponse.getTenderResponseContractors() .get(0).getContractor()); document.add(negotiationTable); document.add(spacer()); if (negotiationTable != null && negotiationTable.getRows().size() > 8) document.newPage(); } else if (tenderResponse != null && !tenderResponse.getTenderEstimate().getTenderType().equalsIgnoreCase(percTenderType)) createNegotiationTableForContractors(tenderResponse); if (tenderResponse != null && tenderResponse.getNegotiationPreparedBy() != null && tenderResponse.getNegotiationPreparedBy().getEmployeeName() != null) document.add(makePara(pdfLabel.get("tenderNegotiationpdf.preparedby") + " " + tenderResponse.getNegotiationPreparedBy().getEmployeeName())); document.add(spacer()); document.add(spacer()); document.add(makePara(pdfLabel.get("tenderNegotiationpdf.checkedby"))); document.newPage(); PdfPTable approvaldetailsTable = null; if (tenderResponse != null) approvaldetailsTable = createApprovalDetailsTable(tenderResponse); if (approvaldetailsTable != null && approvaldetailsTable.getRows().size() != 1) { document.add(makePara(pdfLabel.get("tenderNegotiationpdf.approvaldetails"))); document.add(spacer()); document.add(approvaldetailsTable); } document.close(); } catch (final DocumentException e) { throw new ApplicationRuntimeException(TENDER_PDF_ERROR, e); } catch (final ApplicationException ex) { throw new ApplicationRuntimeException(TENDER_PDF_ERROR, ex); } } private PdfPTable createApprovalDetailsTable(final TenderResponse tenderResponse) throws DocumentException { try { final PdfPTable approvaldetailsTable = new PdfPTable(5); approvaldetailsTable.setWidthPercentage(100); approvaldetailsTable.setWidths(new float[] { 1f, 1f, 2f, 1.5f, 2f }); addRow(approvaldetailsTable, true, makePara(pdfLabel.get("tenderNegotiationpdf.aprvalstep")), centerPara(pdfLabel.get("tenderNegotiationpdf.name")), centerPara(pdfLabel.get("tenderNegotiationpdf.designation")), centerPara(pdfLabel.get("tenderNegotiationpdf.aprvdon")), centerPara(pdfLabel.get("tenderNegotiationpdf.remarks"))); List<StateHistory> history = null; if (tenderResponse.getCurrentState() != null && tenderResponse.getCurrentState().getHistory() != null) history = tenderResponse.getStateHistory(); if (history != null) { Collections.reverse(history); StateHistory previous = null; for (final StateHistory ad : history) { if (!ad.getValue().equals("NEW") && !ad.getValue().equals("APPROVAL_PENDING") && !ad.getValue().equals("END") && previous != null) { final EgwStatus status = (EgwStatus) getPersistenceService().find( "from EgwStatus where code=?", ad.getValue()); final PersonalInformation emp = employeeService.getEmpForPositionAndDate(ad.getCreatedDate(), Integer.parseInt(previous.getOwnerPosition().getId().toString())); addRow(approvaldetailsTable, true, makePara(status.getDescription()), makePara(emp.getEmployeeName()), makePara(previous.getOwnerPosition().getDeptDesig() .getDesignation().getName()), makePara(getDateInFormat(ad .getCreatedDate().toString())), rightPara(ad.getComments())); } previous = ad; } } return approvaldetailsTable; } catch (final Exception e) { throw new DocumentException("Exception occured while getting approval details " + e); } } /** * create negotiation table main table * * @param tenderResponse * @return * @throws DocumentException * @throws ApplicationException */ private PdfPTable createNegotiationTable(final TenderResponse tenderResponse, final Contractor contractor) throws DocumentException, ApplicationException { final PdfPTable negotiationTable = new PdfPTable(13); negotiationTable.setWidthPercentage(100); negotiationTable.setWidths(new float[] { 0.5f, 1f, 3.6f, 1.5f, 1.1f, 0.9f, 1.5f, 1.7f, 1.7f, 1.7f, 1.7f, 1.7f, 1.7f }); try { negotiationTable.getDefaultCell().setPadding(5); negotiationTable.getDefaultCell().setBorderWidth(1); negotiationTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER); negotiationTable.addCell(pdfLabel.get("tenderNegotiationpdf.slno")); negotiationTable.addCell(pdfLabel.get("tenderNegotiationpdf.scheduleno")); negotiationTable.addCell(pdfLabel.get("tenderNegotiationpdf.descofwork")); negotiationTable.addCell(pdfLabel.get("tenderNegotiationpdf.quantity")); /** * start creating tables for Estimate, before negotion, after negotiation and marketRate */ final PdfPTable estimateTable = createAsPerEstimateTable(tenderResponse); estimateTable.setWidths(new float[] { 0.45f, 0.37f, 0.62f }); final PdfPCell estimateCell = new PdfPCell(estimateTable); estimateCell.setColspan(3); negotiationTable.addCell(estimateCell); final PdfPTable beforeNegotiationTable = createBeforeNegotiationTable(tenderResponse); final PdfPCell beforeNegotiationCell = new PdfPCell(beforeNegotiationTable); beforeNegotiationCell.setColspan(2); negotiationTable.addCell(beforeNegotiationCell); final PdfPTable afterNegotiationTable = createAfterNegotiationTable(tenderResponse); final PdfPCell afterNegotiationCell = new PdfPCell(afterNegotiationTable); afterNegotiationCell.setColspan(2); negotiationTable.addCell(afterNegotiationCell); final PdfPTable marketRateTable = createMarketRateTable(tenderResponse); final PdfPCell marketRateCell = new PdfPCell(marketRateTable); marketRateCell.setColspan(2); negotiationTable.addCell(marketRateCell); /** * end creating tables for before negotion, after negotiation and marketRate */ if (YES.equalsIgnoreCase(worksPackgeReq)) createNegotiationTableDataForWp(tenderResponse, negotiationTable, contractor); else createNegotiationTableData(tenderResponse, negotiationTable, contractor); createNegotiationTableFooter(negotiationTable); addRowFooter(negotiationTable); addTotalQuotedFooter(negotiationTable); addFinalRow(negotiationTable, tenderResponse); } catch (final DocumentException e) { throw new ApplicationRuntimeException(TENDER_PDF_ERROR, e); } catch (final ApplicationException ex) { throw new ApplicationRuntimeException(TENDER_PDF_ERROR, ex); } return negotiationTable; } /** * view workpackage pdf */ public void createNegotiationTableDataForWp(final TenderResponse tenderResponse, final PdfPTable negotiationTable, final Contractor contractor) throws DocumentException, ApplicationException { Date asOnDate = null; if (tenderResponse.getNegotiationDate() != null) asOnDate = tenderResponse.getNegotiationDate(); int i = 0; final Map<String, Integer> exceptionaSorMap = worksService.getExceptionSOR(); totalBefNegAmt = 0; totalAmt = 0; totalAftNegAmt = 0; totalMarketRateAmt = 0; for (final TenderResponseActivity tenderResponseActivity : tenderResponse.getTenderResponseActivities()) { String schNo = ""; String description = ""; Double quantity = 0.0; double rate = 0.0; // double uomFactor=0.0; String per = ""; double befNegRate = 0.0; double befNegAmount = 0.0; double aftNegRate = 0.0; double aftNegAmount = 0.0; MarketRate marketRateObj = null; double marketRate = 0.0; double marketRateAmount = 0.0; double uomFactor = 1; if (tenderResponseActivity != null) { if (tenderResponseActivity.getActivity() != null && tenderResponseActivity.getActivity().getSchedule() != null && tenderResponseActivity.getActivity().getSchedule().getCode() != null && exceptionaSorMap.containsKey(tenderResponseActivity.getActivity().getUom().getUom())) uomFactor = exceptionaSorMap.get(tenderResponseActivity.getActivity().getUom().getUom()); final Map<String, Object> rateQtyMap = processLatestRateAndQtyForLineItem( worksPackage.getActivitiesForEstimate(), tenderResponseActivity.getActivity()); if (rateQtyMap != null && !rateQtyMap.isEmpty()) { negotiationTable.addCell(makePara(++i)); schNo = (String) rateQtyMap.get("sorcode"); negotiationTable.addCell(centerPara(schNo)); negotiationTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_LEFT); description = (String) rateQtyMap.get("desc"); negotiationTable.addCell(makePara(description, Element.ALIGN_LEFT)); negotiationTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER); quantity = (Double) rateQtyMap.get("qty"); negotiationTable.addCell(centerPara(formatter.format(quantity))); negotiationTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT); rate = (Double) rateQtyMap.get("rate"); negotiationTable.addCell(rightPara(formatter.format(rate))); negotiationTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER); per = (String) rateQtyMap.get("per"); negotiationTable.addCell(centerPara(per)); negotiationTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT); final double amount = (Double) rateQtyMap.get("amt"); negotiationTable.addCell(rightPara(formatter.format(amount))); totalAmt = totalAmt + amount; } if (rateQtyMap.get("slno") != null) { /** * before negotiation */ negotiationTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT); for (final TenderResponseQuotes tenderResponseQuotes : tenderResponseActivity .getTenderResponseQuotes()) if (tenderResponseQuotes.getContractor().getId() == contractor.getId()) { if (tenderResponseQuotes.getQuotedRate() != 0.0) befNegRate = tenderResponseQuotes.getQuotedRate(); negotiationTable.addCell(rightPara(formatter.format(befNegRate))); befNegAmount = quantity * befNegRate / uomFactor; totalBefNegAmt = totalBefNegAmt + befNegAmount; negotiationTable.addCell(rightPara(formatter.format(befNegAmount))); } if (tenderResponseActivity.getNegotiatedRate() != 0.0) aftNegRate = tenderResponseActivity.getNegotiatedRate(); // double // negotiatedQty=tenderResponseActivity.getNegotiatedQuantity(); negotiationTable.addCell(rightPara(formatter.format(aftNegRate))); aftNegAmount = quantity * aftNegRate / uomFactor; totalAftNegAmt = totalAftNegAmt + aftNegAmount; negotiationTable.addCell(rightPara(formatter.format(aftNegAmount))); if (tenderResponseActivity.getActivity() != null && tenderResponseActivity.getActivity().getSchedule() != null && asOnDate != null && tenderResponseActivity.getActivity().getSchedule().hasValidMarketRateFor(asOnDate)) { marketRateObj = tenderResponseActivity.getActivity().getSchedule().getMarketRateOn(asOnDate); marketRate = marketRateObj.getMarketRate().getValue(); marketRateAmount = quantity * marketRate / uomFactor; } if (tenderResponseActivity.getActivity() != null && tenderResponseActivity.getActivity().getSchedule() != null && asOnDate != null && !tenderResponseActivity.getActivity().getSchedule().hasValidMarketRateFor(asOnDate)) { marketRate = tenderResponseActivity.getActivity().getRate(); marketRateAmount = quantity * marketRate; } if (tenderResponseActivity.getActivity() != null && tenderResponseActivity.getActivity().getNonSor() != null) { marketRate = tenderResponseActivity.getActivity().getRate(); final double marketQty = tenderResponseActivity.getActivity().getQuantity(); marketRateAmount = marketQty * marketRate; } negotiationTable.addCell(rightPara(formatter.format(marketRate))); totalMarketRateAmt = totalMarketRateAmt + marketRateAmount; negotiationTable.addCell(rightPara(formatter.format(marketRateAmount))); } } } } /** * view estimate pdf */ public void createNegotiationTableData(final TenderResponse tenderResponse, final PdfPTable negotiationTable, final Contractor contractor) throws DocumentException, ApplicationException { Date asOnDate = null; if (tenderResponse.getNegotiationDate() != null) asOnDate = tenderResponse.getNegotiationDate(); int i = 0; final Map<String, Integer> exceptionaSorMap = worksService.getExceptionSOR(); for (final TenderResponseActivity tenderResponseActivity : tenderResponse.getTenderResponseActivities()) { String schNo = ""; String description = ""; Double quantity = 0.0; double rate = 0.0; // double uomFactor=0.0; String per = ""; double befNegRate = 0.0; double befNegAmount = 0.0; double aftNegRate = 0.0; double aftNegAmount = 0.0; MarketRate marketRateObj = null; double marketRate = 0.0; double marketRateAmount = 0.0; negotiationTable.addCell(makePara(++i)); double uomFactor = 1; if (tenderResponseActivity != null) { if (tenderResponseActivity.getActivity() != null && tenderResponseActivity.getActivity().getSchedule() != null && tenderResponseActivity.getActivity().getSchedule().getCode() != null && exceptionaSorMap.containsKey(tenderResponseActivity.getActivity().getUom().getUom())) uomFactor = exceptionaSorMap.get(tenderResponseActivity.getActivity().getUom().getUom()); if (tenderResponseActivity.getActivity() != null && tenderResponseActivity.getActivity().getSchedule() != null && tenderResponseActivity.getActivity().getSchedule().getCode() != null) schNo = tenderResponseActivity.getActivity().getSchedule().getCode(); negotiationTable.addCell(centerPara(schNo)); negotiationTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_LEFT); if (tenderResponseActivity.getActivity() != null && tenderResponseActivity.getActivity().getSchedule() != null && tenderResponseActivity.getActivity().getSchedule().getDescription() != null) description = tenderResponseActivity.getActivity().getSchedule().getDescription(); if (tenderResponseActivity.getActivity() != null && tenderResponseActivity.getActivity() != null && tenderResponseActivity.getActivity().getNonSor() != null && tenderResponseActivity.getActivity().getNonSor().getDescription() != null) description = tenderResponseActivity.getActivity().getNonSor().getDescription(); negotiationTable.addCell(makePara(description, Element.ALIGN_LEFT)); negotiationTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER); if (tenderResponseActivity.getActivity() != null && tenderResponseActivity.getActivity().getQuantity() != 0) quantity = tenderResponseActivity.getActivity().getQuantity(); negotiationTable.addCell(centerPara(quantity)); negotiationTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT); if (tenderResponseActivity.getActivity() != null && tenderResponseActivity.getActivity().getSchedule() != null && tenderResponseActivity.getActivity().getRate() != 0 && tenderResponseActivity.getActivity().getSORCurrentRate() != null) rate = tenderResponseActivity.getActivity().getSORCurrentRate().getValue(); if (tenderResponseActivity.getActivity() != null && tenderResponseActivity.getActivity().getNonSor() != null && tenderResponseActivity.getActivity().getRate() != 0) rate = tenderResponseActivity.getActivity().getRate(); negotiationTable.addCell(rightPara(formatter.format(rate))); negotiationTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER); if (tenderResponseActivity.getActivity().getSchedule() != null && tenderResponseActivity.getActivity().getSchedule().getUom() != null && tenderResponseActivity.getActivity().getSchedule().getUom().getUom() != null) per = tenderResponseActivity.getActivity().getSchedule().getUom().getUom(); if (tenderResponseActivity.getActivity().getNonSor() != null && tenderResponseActivity.getActivity().getNonSor().getUom() != null && tenderResponseActivity.getActivity().getNonSor().getUom().getUom() != null) per = tenderResponseActivity.getActivity().getNonSor().getUom().getUom(); negotiationTable.addCell(centerPara(per)); final double amount = quantity * rate / uomFactor; totalAmt = totalAmt + amount; negotiationTable.addCell(rightPara(formatter.format(amount))); /** before negotiation */ negotiationTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT); for (final TenderResponseQuotes tenderResponseQuotes : tenderResponseActivity.getTenderResponseQuotes()) if (tenderResponseQuotes.getContractor().getId() == contractor.getId()) { if (tenderResponseQuotes.getQuotedRate() != 0.0) befNegRate = tenderResponseQuotes.getQuotedRate(); final double quotedQty = tenderResponseQuotes.getQuotedQuantity(); negotiationTable.addCell(rightPara(formatter.format(befNegRate))); befNegAmount = quotedQty * befNegRate / uomFactor; totalBefNegAmt = totalBefNegAmt + befNegAmount; negotiationTable.addCell(rightPara(formatter.format(befNegAmount))); } if (tenderResponseActivity.getNegotiatedRate() != 0.0) aftNegRate = tenderResponseActivity.getNegotiatedRate(); final double negotiatedQty = tenderResponseActivity.getNegotiatedQuantity(); negotiationTable.addCell(rightPara(formatter.format(aftNegRate))); aftNegAmount = negotiatedQty * aftNegRate / uomFactor; totalAftNegAmt = totalAftNegAmt + aftNegAmount; negotiationTable.addCell(rightPara(formatter.format(aftNegAmount))); if (tenderResponseActivity.getActivity() != null && tenderResponseActivity.getActivity().getSchedule() != null && asOnDate != null && tenderResponseActivity.getActivity().getSchedule().hasValidMarketRateFor(asOnDate)) { marketRateObj = tenderResponseActivity.getActivity().getSchedule().getMarketRateOn(asOnDate); marketRate = marketRateObj.getMarketRate().getValue(); marketRateAmount = quantity * marketRate / uomFactor; } else if (tenderResponseActivity.getActivity() != null && tenderResponseActivity.getActivity().getSchedule() != null) { marketRate = tenderResponseActivity.getActivity().getSORCurrentRate().getValue(); final double marketQty = tenderResponseActivity.getActivity().getQuantity(); marketRateAmount = marketQty * marketRate / uomFactor; } else if (tenderResponseActivity.getActivity() != null && tenderResponseActivity.getActivity().getNonSor() != null) { marketRate = tenderResponseActivity.getActivity().getRate(); final double marketQty = tenderResponseActivity.getActivity().getQuantity(); marketRateAmount = marketQty * marketRate; } negotiationTable.addCell(rightPara(formatter.format(marketRate))); totalMarketRateAmt = totalMarketRateAmt + marketRateAmount; negotiationTable.addCell(rightPara(formatter.format(marketRateAmount))); } } } public void createNegotiationTableFooter(final PdfPTable negotiationTable) throws DocumentException, ApplicationException { negotiationTable.addCell(" "); negotiationTable.addCell(" "); final PdfPTable tenderTotalTable = createTenderTotalTable(); final PdfPCell tenderTotalTableCell = new PdfPCell(tenderTotalTable); tenderTotalTableCell.setColspan(3); negotiationTable.addCell(tenderTotalTableCell); negotiationTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT); negotiationTable.addCell(" "); negotiationTable.addCell(rightPara(formatter.format(totalAmt))); negotiationTable.addCell(" "); negotiationTable.addCell(rightPara(formatter.format(totalBefNegAmt))); negotiationTable.addCell(" "); negotiationTable.addCell(rightPara(formatter.format(totalAftNegAmt))); negotiationTable.addCell(" "); negotiationTable.addCell(rightPara(formatter.format(totalMarketRateAmt))); } // second row for footer public void addRowFooter(final PdfPTable negotiationTable) throws DocumentException, ApplicationException { negotiationTable.addCell(" "); negotiationTable.addCell(" "); final PdfPTable tenderPercentageTable = createTenderPercentageTable(); final PdfPCell tenderPercentageTableCell = new PdfPCell(tenderPercentageTable); tenderPercentageTableCell.setColspan(5); negotiationTable.addCell(tenderPercentageTableCell); negotiationTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT); final PdfPTable befTenderNegFormulaTable = createBefTenderNegFormulaTable(); final PdfPCell befTenderNegFormulaTableCell = new PdfPCell(befTenderNegFormulaTable); befTenderNegFormulaTableCell.setColspan(2); negotiationTable.addCell(befTenderNegFormulaTableCell); final PdfPTable aftTenderNegFormulaTable = createAftTenderNegFormulaTable(); final PdfPCell aftTenderNegFormulaTableCell = new PdfPCell(aftTenderNegFormulaTable); aftTenderNegFormulaTableCell.setColspan(2); negotiationTable.addCell(aftTenderNegFormulaTableCell); final PdfPTable marketTenderNegFormulaTable = createMarketTenderNegFormulaTable(); final PdfPCell marketTenderNegFormulaTableCell = new PdfPCell(marketTenderNegFormulaTable); marketTenderNegFormulaTableCell.setColspan(2); negotiationTable.addCell(marketTenderNegFormulaTableCell); } // adding total quoted value footer public void addTotalQuotedFooter(final PdfPTable negotiationTable) throws DocumentException, ApplicationException { negotiationTable.addCell(" "); negotiationTable.addCell(" "); final PdfPTable tenderQuotedTable = createTotalQuotedValueTable(); final PdfPCell tenderQuotedTableCell = new PdfPCell(tenderQuotedTable); tenderQuotedTableCell.setColspan(5); negotiationTable.addCell(tenderQuotedTableCell); negotiationTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT); final PdfPTable befTenderNegQuotedTable = createBefTenderNegQuotedTable(); final PdfPCell befTenderNegQuotedTableCell = new PdfPCell(befTenderNegQuotedTable); befTenderNegQuotedTableCell.setColspan(2); negotiationTable.addCell(befTenderNegQuotedTableCell); final PdfPTable aftTenderNegQuotedTable = createAftTenderNegQuotedTable(); final PdfPCell aftTenderNegQuotedTableCell = new PdfPCell(aftTenderNegQuotedTable); aftTenderNegQuotedTableCell.setColspan(2); negotiationTable.addCell(aftTenderNegQuotedTableCell); final PdfPTable marketTenderNegTable = createMarketTenderNegTable(); final PdfPCell marketTenderNegTableCell = new PdfPCell(marketTenderNegTable); marketTenderNegTableCell.setColspan(2); negotiationTable.addCell(marketTenderNegTableCell); } // start for second footer row public PdfPTable createTenderPercentageTable() { final PdfPTable tenderPercentageTable = new PdfPTable(5); tenderPercentageTable.getDefaultCell().setBorderWidth(1); tenderPercentageTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_LEFT); tenderPercentageTable.getDefaultCell().setColspan(5); tenderPercentageTable.addCell(pdfLabel.get("tenderNegotiationpdf.percentage")); return tenderPercentageTable; } // start for second footer row public PdfPTable createTotalQuotedValueTable() { final PdfPTable tenderQuotedTable = new PdfPTable(5); tenderQuotedTable.getDefaultCell().setBorderWidth(1); tenderQuotedTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_LEFT); tenderQuotedTable.getDefaultCell().setColspan(5); tenderQuotedTable.addCell(pdfLabel.get("tenderNegotiationpdf.quoted.total")); return tenderQuotedTable; } public PdfPTable createBefTenderNegFormulaTable() { final double totTenderBefNegPer = tenderResponse.getPercQuotedRate(); final PdfPTable befTenderNegFormulaTable = new PdfPTable(2); befTenderNegFormulaTable.getDefaultCell().setBorderWidth(1); befTenderNegFormulaTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT); befTenderNegFormulaTable.getDefaultCell().setColspan(2); String formated_perc = null; if (tenderResponse.getTenderEstimate().getTenderType().equalsIgnoreCase(percTenderType)) formated_perc = nf.format(totTenderBefNegPer); else formated_perc = formatter.format(Math.abs(totTenderBefNegPer)); befTenderNegFormulaTable.addCell(makePara((totTenderBefNegPer > 0 ? POSITIVE_SIGN : NEGATIVE_SIGN) + formated_perc + "%")); return befTenderNegFormulaTable; } public PdfPTable createBefTenderNegQuotedTable() { final double totTenderBefNegPer = tenderResponse.getPercQuotedRate(); final PdfPTable befTenderNegQuotedTable = new PdfPTable(2); befTenderNegQuotedTable.getDefaultCell().setBorderWidth(1); befTenderNegQuotedTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT); befTenderNegQuotedTable.getDefaultCell().setColspan(2); String perc_amt = null; if (tenderResponse.getTenderEstimate().getTenderType().equalsIgnoreCase(percTenderType)) { if (totTenderBefNegPer > 0) perc_amt = formatter.format(totalBefNegAmt + totalBefNegAmt * (Math.abs(totTenderBefNegPer) / 100)); else perc_amt = formatter.format(totalBefNegAmt - totalBefNegAmt * (Math.abs(totTenderBefNegPer) / 100)); } else perc_amt = formatter.format(Math.abs(totalBefNegAmt)); befTenderNegQuotedTable.addCell(makePara(perc_amt)); return befTenderNegQuotedTable; } public PdfPTable createAftTenderNegFormulaTable() { final double totTenderAftNegPer = tenderResponse.getPercNegotiatedAmountRate(); final PdfPTable aftTenderNegFormulaTable = new PdfPTable(2); aftTenderNegFormulaTable.getDefaultCell().setBorderWidth(1); aftTenderNegFormulaTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT); aftTenderNegFormulaTable.getDefaultCell().setColspan(2); String formated_perc = null; if (tenderResponse.getTenderEstimate().getTenderType().equalsIgnoreCase(percTenderType)) formated_perc = nf.format(totTenderAftNegPer); else formated_perc = formatter.format(Math.abs(totTenderAftNegPer)); aftTenderNegFormulaTable.addCell(makePara((totTenderAftNegPer > 0 ? POSITIVE_SIGN : NEGATIVE_SIGN) + formated_perc + "%")); return aftTenderNegFormulaTable; } public PdfPTable createAftTenderNegQuotedTable() { final double totTenderAftNegPer = tenderResponse.getPercNegotiatedAmountRate(); final PdfPTable aftTenderNegQuotedTable = new PdfPTable(2); aftTenderNegQuotedTable.getDefaultCell().setBorderWidth(1); aftTenderNegQuotedTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT); aftTenderNegQuotedTable.getDefaultCell().setColspan(2); String perc_amt = null; if (tenderResponse.getTenderEstimate().getTenderType().equalsIgnoreCase(percTenderType)) { if (totTenderAftNegPer > 0) perc_amt = formatter.format(totalAftNegAmt + totalAftNegAmt * (Math.abs(totTenderAftNegPer) / 100)); else perc_amt = formatter.format(totalAftNegAmt - totalAftNegAmt * (Math.abs(totTenderAftNegPer) / 100)); } else perc_amt = formatter.format(Math.abs(totalAftNegAmt)); aftTenderNegQuotedTable.addCell(makePara(perc_amt)); return aftTenderNegQuotedTable; } public PdfPTable createMarketTenderNegFormulaTable() { // double // totTenderNegMarketPer=calculatPercentage(totalAftNegAmt,totalMarketRateAmt,2); final double totTenderNegMarketPer = calculateMarketRate(); final PdfPTable marketTenderNegFormulaTable = new PdfPTable(2); marketTenderNegFormulaTable.getDefaultCell().setBorderWidth(1); marketTenderNegFormulaTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT); marketTenderNegFormulaTable.getDefaultCell().setColspan(2); String formated_perc = null; formated_perc = nf.format(totTenderNegMarketPer); marketTenderNegFormulaTable.addCell(makePara((totTenderNegMarketPer > 0 ? POSITIVE_SIGN : NEGATIVE_SIGN) + formated_perc + "%")); return marketTenderNegFormulaTable; } public PdfPTable createMarketTenderNegTable() { final double totTenderNegMarketPer = calculateMarketRate(); final PdfPTable marketTenderNegQuotedTable = new PdfPTable(2); marketTenderNegQuotedTable.getDefaultCell().setBorderWidth(1); marketTenderNegQuotedTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT); marketTenderNegQuotedTable.getDefaultCell().setColspan(2); String perc_amt = null; if (totTenderNegMarketPer >= 0) perc_amt = formatter.format(totalMarketRateAmt + totalMarketRateAmt * (Math.abs(totTenderNegMarketPer) / 100)); else perc_amt = formatter.format(totalMarketRateAmt - totalMarketRateAmt * (Math.abs(totTenderNegMarketPer) / 100)); marketTenderNegQuotedTable.addCell(makePara(perc_amt)); return marketTenderNegQuotedTable; } private double calculateMarketRate() { double percentage = 0.0; final double totTenderAftNegPer = tenderResponse.getPercNegotiatedAmountRate(); try { percentage = (totalAmt * (1 + totTenderAftNegPer / 100) - totalMarketRateAmt) / totalMarketRateAmt * 100; } catch (final Exception e) { percentage = 0.00; LOGGER.info("Exception while calculating totTenderNegMarketPer" + e); } return percentage; } public double calculatPercentage(final double amt1, final double am2, final int type) { double percentage = 0.0; try { if (type == 1) percentage = (amt1 - am2) / amt1 * 100; else if (type == 2) percentage = (amt1 - am2) / am2 * 100; if (Double.isInfinite(percentage)) percentage = 0.00; } catch (final Exception e) { percentage = 0.00; LOGGER.info("Exception while calculating totTenderNegMarketPer" + e); } return Math.abs(percentage); } // ends second footer row public void addFinalRow(final PdfPTable negotiationTable, final TenderResponse tenderResponse) throws DocumentException, ApplicationException { final PdfPTable tenderNarrationTable = createTenderNarrationTable(tenderResponse); final PdfPCell tenderNarrationTableCell = new PdfPCell(tenderNarrationTable); tenderNarrationTableCell.setColspan(13); negotiationTable.addCell(tenderNarrationTableCell); } /** * start final row for narration * * @param tenderResponse * @return */ public PdfPTable createTenderNarrationTable(final TenderResponse tenderResponse) { final PdfPTable tenderNarrationTable = new PdfPTable(13); tenderNarrationTable.getDefaultCell().setBorderWidth(1); tenderNarrationTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_LEFT); tenderNarrationTable.getDefaultCell().setColspan(13); tenderNarrationTable.addCell("\t" + (tenderResponse.getNarration() == null ? "" : tenderResponse.getNarration())); return tenderNarrationTable; } /** start for first footer row */ public PdfPTable createTenderTotalTable() { final PdfPTable tenderTotalTable = new PdfPTable(3); tenderTotalTable.getDefaultCell().setBorderWidth(1); tenderTotalTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER); tenderTotalTable.getDefaultCell().setColspan(3); tenderTotalTable.addCell(pdfLabel.get("tenderNegotiationpdf.tendertotal")); return tenderTotalTable; } public PdfPTable createAsPerEstimateTable(final TenderResponse tenderResponse) throws DocumentException, ApplicationException { final PdfPTable estimateTable = new PdfPTable(3); estimateTable.getDefaultCell().setBorderWidth(1); estimateTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER); estimateTable.getDefaultCell().setColspan(3); estimateTable.addCell(pdfLabel.get("tenderNegotiationpdf.asPerEstimate")); estimateTable.getDefaultCell().setColspan(1); estimateTable.addCell(pdfLabel.get(TENDERNEGOTIATION_RATE)); estimateTable.addCell(pdfLabel.get("tenderNegotiationpdf.Per")); estimateTable.addCell(pdfLabel.get(TENDERNEGOTIATION_AMOUNT)); return estimateTable; } /** creating tables for before negotion */ public PdfPTable createBeforeNegotiationTable(final TenderResponse tenderResponse) throws DocumentException, ApplicationException { final PdfPTable beforeNegotiationTable = new PdfPTable(2); beforeNegotiationTable.getDefaultCell().setBorderWidth(1); beforeNegotiationTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER); beforeNegotiationTable.getDefaultCell().setColspan(2); beforeNegotiationTable.addCell(pdfLabel.get("tenderNegotiationpdf.asPerTender")); beforeNegotiationTable.getDefaultCell().setColspan(1); beforeNegotiationTable.addCell(pdfLabel.get(TENDERNEGOTIATION_RATE)); beforeNegotiationTable.addCell(pdfLabel.get(TENDERNEGOTIATION_AMOUNT)); return beforeNegotiationTable; } // creating marketRate table public PdfPTable createAfterNegotiationTable(final TenderResponse tenderResponse) throws DocumentException, ApplicationException { final PdfPTable afterNegotiationTable = new PdfPTable(2); afterNegotiationTable.getDefaultCell().setBorderWidth(1); afterNegotiationTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER); afterNegotiationTable.getDefaultCell().setColspan(2); String negDate = ""; if (tenderResponse != null && tenderResponse.getNegotiationDate() != null) negDate = sdf.format(tenderResponse.getNegotiationDate()); afterNegotiationTable.addCell(pdfLabel.get("tenderNegotiationpdf.aftneg") + negDate); afterNegotiationTable.getDefaultCell().setColspan(1); afterNegotiationTable.addCell(pdfLabel.get(TENDERNEGOTIATION_RATE)); afterNegotiationTable.addCell(pdfLabel.get(TENDERNEGOTIATION_AMOUNT)); return afterNegotiationTable; } // creating tables for after negotiation public PdfPTable createMarketRateTable(final TenderResponse tenderResponse) throws DocumentException, ApplicationException { String asOnDate = ""; if (tenderResponse != null && tenderResponse.getNegotiationDate() != null) asOnDate = sdf.format(tenderResponse.getNegotiationDate()); final PdfPTable marketRateTable = new PdfPTable(2); marketRateTable.getDefaultCell().setBorderWidth(1); marketRateTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER); marketRateTable.getDefaultCell().setColspan(2); marketRateTable.addCell(pdfLabel.get("tenderNegotiationpdf.marketratedate") + asOnDate); marketRateTable.getDefaultCell().setColspan(1); marketRateTable.addCell(pdfLabel.get(TENDERNEGOTIATION_RATE)); marketRateTable.addCell(pdfLabel.get(TENDERNEGOTIATION_AMOUNT)); return marketRateTable; } private String getDateInFormat(final String date) throws DocumentException { String dateInFormat = null; try { dateInFormat = new SimpleDateFormat("dd-MMM-yyyy", Locale.US).format(new SimpleDateFormat("yyyy-MM-dd", Locale.US).parse(date)); } catch (final Exception e) { throw new DocumentException("Exception occured while parsing date := " + e); } return dateInFormat; } // 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 Map<String, Object> processLatestRateAndQtyForLineItem( final Collection<EstimateLineItemsForWP> estimateLinItems, final Activity act) { final Map<String, Object> rateQtyMap = new HashMap<String, Object>(); for (final EstimateLineItemsForWP lineItem : estimateLinItems) if (lineItem.getActivity() != null && lineItem.getActivity().getId() != null && lineItem.getActivity().getId().longValue() == act.getId().longValue()) { rateQtyMap.put("slno", lineItem.getSrlNo()); rateQtyMap.put("desc", lineItem.getDescription()); rateQtyMap.put("sorcode", lineItem.getCode()); rateQtyMap.put("qty", lineItem.getQuantity()); rateQtyMap.put("rate", lineItem.getRate()); rateQtyMap.put("per", lineItem.getUom()); rateQtyMap.put("amt", lineItem.getAmt()); } return rateQtyMap; } public String getWardList(final WorksPackage wp) { final Map<String, String> resultMap = new HashMap<String, String>(); final List<String> wardnameList = new ArrayList<String>(); for (final AbstractEstimate ae : wp.getAllEstimates()) if (ae.getWard() != null && ae.getWard().getParent() != null && ae.getWard().getParent().getName() != null && !resultMap.containsKey(ae.getWard().getName())) { wardnameList.add(ae.getWard().getName() + "/" + ae.getWard().getParent().getName()); resultMap.put(ae.getWard().getName(), ae.getWard().getParent().getName()); } return StringUtils.join(wardnameList.toArray(), ","); } public String getWorksPackgeReq() { return worksPackgeReq; } public void setWorksPackgeReq(final String worksPackgeReq) { this.worksPackgeReq = worksPackgeReq; } public WorksService getWorksService() { return worksService; } public void setWorksService(final WorksService worksService) { this.worksService = worksService; } /** * create contractor table * * @param tenderResponse * @return * @throws DocumentException * @throws ApplicationException */ private PdfPTable createContractorTable(final TenderResponse tenderResponse) throws DocumentException, ApplicationException { final PdfPTable contractorTable = new PdfPTable(3); contractorTable.setWidthPercentage(100); contractorTable.setWidths(new float[] { 1.6f, 3.6f, 6.6f }); try { contractorTable.getDefaultCell().setPadding(5); contractorTable.getDefaultCell().setBorderWidth(1); contractorTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER); contractorTable.addCell(pdfLabel.get("tenderNegotiationpdf.contractorcode")); contractorTable.addCell(pdfLabel.get("tenderNegotiationpdf.contractorname")); contractorTable.addCell(pdfLabel.get("tenderNegotiationpdf.contractoraddress")); for (final TenderResponseContractors tenderResponseContractors : tenderResponse .getTenderResponseContractors()) { contractorTable.addCell(centerPara(tenderResponseContractors.getContractor().getCode())); contractorTable.addCell(centerPara(tenderResponseContractors.getContractor().getName())); contractorTable .addCell(centerPara(tenderResponseContractors.getContractor().getCorrespondenceAddress())); } } catch (final Exception e) { LOGGER.info("Exception while creating contractor table" + e); } return contractorTable; } /** * create negotiation table for every contractor * * @param tenderResponse * @return void * @throws DocumentException * @throws ApplicationException */ private void createNegotiationTableForContractors(final TenderResponse tenderResponse) throws DocumentException, ApplicationException { PdfPTable negotiationTable = null; int count = 0; for (final TenderResponseContractors tenderResponseContractors : tenderResponse.getTenderResponseContractors()) { document.add(makePara(pdfLabel.get("tenderNegotiationpdf.contractorname") + " - " + tenderResponseContractors.getContractor().getName() + "(" + tenderResponseContractors.getContractor().getCode() + " ) ", Element.ALIGN_LEFT)); document.add(spacer()); negotiationTable = createNegotiationTable(tenderResponse, tenderResponseContractors.getContractor()); document.add(negotiationTable); count++; if (!(tenderResponse.getTenderResponseContractors().size() == count)) document.newPage(); else document.add(spacer()); } } public String getPercTenderType() { return percTenderType; } public void setPercTenderType(final String percTenderType) { this.percTenderType = percTenderType; } }