/*
* 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.models.tender;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.validation.Valid;
import org.egov.commons.EgwStatus;
import org.egov.infra.persistence.entity.component.Money;
import org.egov.infra.persistence.validator.annotation.DateFormat;
import org.egov.infra.persistence.validator.annotation.Required;
import org.egov.infra.utils.DateUtils;
import org.egov.infra.validation.exception.ValidationError;
import org.egov.pims.model.PersonalInformation;
import org.egov.works.abstractestimate.entity.Activity;
import org.egov.works.models.workflow.WorkFlow;
public class TenderResponse extends WorkFlow {
private static final long serialVersionUID = -6047271184417257561L;
public enum TenderResponseStatus {
CREATED, APPROVED, REJECTED, CANCELLED
}
public enum Actions {
SAVE, SUBMIT_FOR_APPROVAL, REJECT, CANCEL, approval;
@Override
public String toString() {
return name().toLowerCase();
}
}
@Valid
private TenderEstimate tenderEstimate;
// @Required(message="tenderResponse.percQuotedRate.null")
private double percQuotedRate;
// @Required(message="tenderResponse.percNegotiatedRate.null")
private double percNegotiatedAmountRate;
@Required(message = "tenderResponse.negotiationDate.null")
@DateFormat(message = "invalid.fieldvalue.negotiationDate")
private Date negotiationDate;
private String negotiationNumber;
private String narration;
private String status;
private double totalAmount;
private Collection<EstimateLineItemsForWP> activitiesForWorkorder;
private double workOrderAmount;
@Valid
private List<TenderResponseActivity> tenderResponseActivities = new LinkedList<TenderResponseActivity>();
@Valid
private List<TenderResponseContractors> tenderResponseContractors = new LinkedList<TenderResponseContractors>();
// added by prashanth on jan 9th 2010
// @Required(message = "tenderResponse.negotiationPreparedBy.null")
private PersonalInformation negotiationPreparedBy;
private Integer approverUserId;
private Long documentNumber;
private EgwStatus egwStatus;
private String formattedTotalAmount;
private double tenderNegotiatedValue;
private Date approvedDate;
private List<String> tenderNegotiationsActions = new ArrayList<String>();
private List<WorksPackageDetails> worksPackageDetails = new LinkedList<WorksPackageDetails>();
private Set<OfflineStatus> offlineStatuses = new HashSet<OfflineStatus>();
public PersonalInformation getNegotiationPreparedBy() {
return negotiationPreparedBy;
}
public void setNegotiationPreparedBy(final PersonalInformation negotiationPreparedBy) {
this.negotiationPreparedBy = negotiationPreparedBy;
}
public TenderEstimate getTenderEstimate() {
return tenderEstimate;
}
public void setTenderEstimate(final TenderEstimate tenderEstimate) {
this.tenderEstimate = tenderEstimate;
}
public double getPercQuotedRate() {
return percQuotedRate;
}
public String getFormattedPercQuotedRate() {
final NumberFormat nf = NumberFormat.getInstance();
nf.setMaximumFractionDigits(10);
return nf.format(percQuotedRate);
}
public String getFormattedPercNegotiatedAmountRate() {
final NumberFormat nf = NumberFormat.getInstance();
nf.setMaximumFractionDigits(10);
return nf.format(percNegotiatedAmountRate);
}
public void setPercQuotedRate(final double percQuotedRate) {
this.percQuotedRate = percQuotedRate;
}
public double getPercNegotiatedAmountRate() {
return percNegotiatedAmountRate;
}
public void setPercNegotiatedAmountRate(final double percNegotiatedAmountRate) {
this.percNegotiatedAmountRate = percNegotiatedAmountRate;
}
public Date getNegotiationDate() {
return negotiationDate;
}
public void setNegotiationDate(final Date negotiationDate) {
this.negotiationDate = negotiationDate;
}
public List<TenderResponseActivity> getTenderResponseActivities() {
return tenderResponseActivities;
}
public void setTenderResponseActivities(final List<TenderResponseActivity> tenderResponseActivities) {
this.tenderResponseActivities = tenderResponseActivities;
}
public void addTenderResponseActivity(final TenderResponseActivity tenderResponseActivity) {
tenderResponseActivities.add(tenderResponseActivity);
}
public String getNegotiationNumber() {
return negotiationNumber;
}
public void setNegotiationNumber(final String negotiationNumber) {
this.negotiationNumber = negotiationNumber;
}
public double getTotalAmount() {
return totalAmount;
}
public List<ValidationError> validate() {
final List<ValidationError> validationErrors = new ArrayList<ValidationError>();
if (!tenderResponseContractors.isEmpty()
&& (tenderResponseContractors.get(0) != null
&& tenderResponseContractors.get(0).getContractor() != null
&& tenderResponseContractors.get(0).getContractor().getId() == null
|| tenderResponseContractors.get(0).getContractor().getId() == 0 || tenderResponseContractors
.get(0).getContractor().getId() == -1))
validationErrors.add(new ValidationError("contractor", "tenderResponse.contractor.null"));
else if (tenderResponseContractors == null)
validationErrors.add(new ValidationError("contractor", "tenderResponse.contractor.null"));
return validationErrors;
}
@Override
public String getStateDetails() {
return "Tender Negotiation : " + getNegotiationNumber();
}
/**
* @return the narration
*/
public String getNarration() {
return narration;
}
/**
* @param narration the narration to set
*/
public void setNarration(final String narration) {
this.narration = narration;
}
public Integer getApproverUserId() {
return approverUserId;
}
public void setApproverUserId(final Integer approverUserId) {
this.approverUserId = approverUserId;
}
public Long getDocumentNumber() {
return documentNumber;
}
public void setDocumentNumber(final Long documentNumber) {
this.documentNumber = documentNumber;
}
public String getStatus() {
return status;
}
public void setStatus(final String status) {
this.status = status;
}
public void setTotalAmount(final double totalAmount) {
this.totalAmount = totalAmount;
}
public Collection<EstimateLineItemsForWP> getActivitiesForWorkorder() {
return activitiesForWorkorder;
}
public void setActivitiesForWorkorder(final Collection<EstimateLineItemsForWP> activitiesForWorkorder) {
this.activitiesForWorkorder = activitiesForWorkorder;
}
public double getWorkOrderAmount() {
return workOrderAmount;
}
public void setWorkOrderAmount(final double workOrderAmount) {
this.workOrderAmount = workOrderAmount;
}
public List<String> getTenderNegotiationsActions() {
return tenderNegotiationsActions;
}
public void setTenderNegotiationsActions(final List<String> tenderNegotiationsActions) {
this.tenderNegotiationsActions = tenderNegotiationsActions;
}
public List<TenderResponseContractors> getTenderResponseContractors() {
return tenderResponseContractors;
}
public void setTenderResponseContractors(final List<TenderResponseContractors> tenderResponseContractors) {
this.tenderResponseContractors = tenderResponseContractors;
}
public void addTenderResponseContractors(final TenderResponseContractors tenderResponseContractors) {
this.tenderResponseContractors.add(tenderResponseContractors);
}
public Money getTotalNegotiatedQuantity() {
Money totalNegotiatedQuantity;
double qty = 0;
for (final TenderResponseActivity tra : tenderResponseActivities)
qty += tra.getNegotiatedQuantity();
totalNegotiatedQuantity = new Money(qty);
return totalNegotiatedQuantity;
}
public Collection<EstimateLineItemsForTR> getNegotiationDetails() {
final Map<Long, EstimateLineItemsForTR> resultMap = new HashMap<Long, EstimateLineItemsForTR>();
for (final TenderResponseActivity tra : getTenderResponseActivities()) {
final EstimateLineItemsForTR estlineItem = new EstimateLineItemsForTR();
if (tra.getActivity().getSchedule() != null)
if (resultMap.containsKey(tra.getActivity().getSchedule().getId())) {
final EstimateLineItemsForTR preEstlineItem = resultMap
.get(tra.getActivity().getSchedule().getId());
preEstlineItem.setQuantity(tra.getActivity().getQuantity() + preEstlineItem.getQuantity());
if (DateUtils.compareDates(tra.getActivity().getAbstractEstimate().getEstimateDate(),
preEstlineItem.getEstimateDate())) {
preEstlineItem.setRate(tra.getActivity().getSORCurrentRate().getValue());
preEstlineItem.setAmt(preEstlineItem.getQuantity() * tra.getActivity().getRate());
preEstlineItem.setActivity(tra.getActivity());
if (tra.getActivity().getSchedule()
.hasValidMarketRateFor(tra.getActivity().getAbstractEstimate().getEstimateDate()))
preEstlineItem.setMarketRate(preEstlineItem.getQuantity()
* tra.getActivity().getSORCurrentMarketRate().getValue());
else
preEstlineItem.setMarketRate(tra.getActivity().getAmount().getValue());
}
preEstlineItem.setTenderResponseQuotes(tra.getTenderResponseQuotes());
preEstlineItem.setNegotiatedRate(tra.getNegotiatedRate());
resultMap.put(tra.getActivity().getSchedule().getId(), preEstlineItem);
} else {
addEstLineItem(tra.getActivity(), estlineItem);
estlineItem.setNegotiatedRate(tra.getNegotiatedRate());
estlineItem.setTenderResponseQuotes(tra.getTenderResponseQuotes());
resultMap.put(tra.getActivity().getSchedule().getId(), estlineItem);
}
if (tra.getActivity().getNonSor() != null) {
addEstLineItem(tra.getActivity(), estlineItem);
estlineItem.setNegotiatedRate(tra.getNegotiatedRate());
estlineItem.setTenderResponseQuotes(tra.getTenderResponseQuotes());
resultMap.put(tra.getActivity().getNonSor().getId(), estlineItem);
}
}
return getEstLineItemsWithSrlNo(resultMap.values());
}
public List<WorksPackageDetails> getWorksPackageDetails() {
return worksPackageDetails;
}
public void setWorksPackageDetails(final List<WorksPackageDetails> worksPackageDetails) {
this.worksPackageDetails = worksPackageDetails;
}
private void addEstLineItem(final Activity act, final EstimateLineItemsForTR estlineItem) {
if (act.getSchedule() == null) {
estlineItem.setCode("");
estlineItem.setSummary("");
estlineItem.setDescription(act.getNonSor().getDescription());
estlineItem.setRate(act.getRate());
estlineItem.setMarketRate(act.getAmount().getValue());
} else {
estlineItem.setCode(act.getSchedule().getCode());
estlineItem.setDescription(act.getSchedule().getDescription());
estlineItem.setRate(act.getSORCurrentRate().getValue());
if (act.getSchedule().hasValidMarketRateFor(act.getAbstractEstimate().getEstimateDate()))
estlineItem.setMarketRate(act.getQuantity() * act.getSORCurrentMarketRate().getValue());
else
estlineItem.setMarketRate(act.getAmount().getValue());
estlineItem.setSummary(act.getSchedule().getSummary());
}
estlineItem.setActivity(act);
estlineItem.setAmt(act.getQuantity() * act.getRate());
estlineItem.setEstimateDate(act.getAbstractEstimate().getEstimateDate());
estlineItem.setQuantity(act.getQuantity());
estlineItem.setUom(act.getUom().getUom());
estlineItem.setConversionFactor(act.getConversionFactor());
}
private Collection<EstimateLineItemsForTR> getEstLineItemsWithSrlNo(final Collection<EstimateLineItemsForTR> actList) {
int i = 1;
final Collection<EstimateLineItemsForTR> latestEstLineItemList = new ArrayList<EstimateLineItemsForTR>();
for (final EstimateLineItemsForTR act : actList) {
act.setSrlNo(i);
latestEstLineItemList.add(act);
i++;
}
return latestEstLineItemList;
}
public Set<OfflineStatus> getOfflineStatuses() {
return offlineStatuses;
}
public void setOfflineStatuses(final Set<OfflineStatus> offlineStatuses) {
this.offlineStatuses = offlineStatuses;
}
public EgwStatus getEgwStatus() {
return egwStatus;
}
public void setEgwStatus(final EgwStatus egwStatus) {
this.egwStatus = egwStatus;
}
public String getFormattedTotalAmount() {
return formattedTotalAmount;
}
public void setFormattedTotalAmount(final String formattedTotalAmount) {
this.formattedTotalAmount = formattedTotalAmount;
}
public double getTenderNegotiatedValue() {
return tenderNegotiatedValue;
}
public void setTenderNegotiatedValue(final double tenderNegotiatedValue) {
this.tenderNegotiatedValue = tenderNegotiatedValue;
}
public Date getApprovedDate() {
return approvedDate;
}
public void setApprovedDate(final Date approvedDate) {
this.approvedDate = approvedDate;
}
}