CommercialCreditNoteRepositoryImpl.java
package com.tradecloud.repository.impl;
import com.tradecloud.domain.document.CommercialCreditNote;
import com.tradecloud.domain.document.Document;
import com.tradecloud.domain.document.invoice.ActualConsignment;
import com.tradecloud.domain.document.invoice.ActualOrder;
import com.tradecloud.domain.document.invoice.ServiceProviderInvoice;
import com.tradecloud.domain.model.ordermanagement.Consignment;
import com.tradecloud.domain.shipment.Shipment;
import com.tradecloud.domain.supplier.OrganisationalUnitSupplier;
import com.tradecloud.dto.base.ReferenceValueDto;
import com.tradecloud.dto.invoice.SupplyPaymentSearch;
import com.tradecloud.repository.CommercialCreditNoteRepository;
import org.hibernate.transform.Transformers;
import org.hibernate.type.StandardBasicTypes;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
/**
* Default implementation of the {@literal CommercialCreditNoteRepository} interface.
*/
@Repository(value = "commercialCreditNoteRepository")
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
public class CommercialCreditNoteRepositoryImpl extends CostsInvoiceRepositoryImpl<CommercialCreditNote> implements CommercialCreditNoteRepository {
private static final long serialVersionUID = 1L;
@Override
public List<CommercialCreditNote> findAllByReference(String reference) {
return findAllByReference("commercialCreditNote.byReference", reference);
}
@Override
public List<CommercialCreditNote> findByReferenceAndSupplier(String reference, OrganisationalUnitSupplier supplier) {
List<CommercialCreditNote> list = (List<CommercialCreditNote>) findByNamedQueryAndNamedParam("commercialCreditNote.byReferenceAndSupplier",
new String[] { "reference", "supplier" }, new Object[] {reference, supplier });
return list;
}
@Override
public CommercialCreditNote findByIdWithPlannedSettlements(long id) {
// List<CommercialCreditNote> commercialCreditNotes = findByNamedQueryAndNamedParam("commercialCreditNote.byIdWithPlannedSettlementsLoaded",
// "id", id);
// if (!commercialCreditNotes.isEmpty()) {
// return commercialCreditNotes.get(0);
// }
return null;
}
@Override
public List<CommercialCreditNote> findByServiceProviderInvoice(ServiceProviderInvoice serviceProviderInvoice) {
return (List<CommercialCreditNote>) findByNamedQueryAndNamedParam("commercialCreditNote.byShipment", "id",
serviceProviderInvoice.getShipment().getId());
}
@Override
public List<ReferenceValueDto> getLineItemInvoiceQuantityTotals(Shipment shipment) {
@SuppressWarnings("unchecked")
List<ReferenceValueDto> results = getCurrentSession()
.createSQLQuery(
"select ali.code as reference, sum(ali.invoicequantity) as value from actuallineitem ali, actualorder alo, "
+ "actualconsignment ac, costsinvoice inv, commercialCreditNote ci where ali.actualorder_id = alo.id "
+ "and alo.actualconsignment_id = ac.id and ac.costsinvoice_id = inv.id and ci.id = inv.id "
+ "and inv.shipment_id = :shipmentId group by ali.code order by ali.code")
.addScalar("reference", StandardBasicTypes.STRING).addScalar("value", StandardBasicTypes.BIG_DECIMAL)
.setParameter("shipmentId", shipment.getId()).setResultTransformer(Transformers.aliasToBean(ReferenceValueDto.class)).list();
return results;
}
@Override
public BigDecimal getTotalAmountPaidOnCommercialCreditNote(CommercialCreditNote invoice) {
//PS not applicable to CreditNote
// Object uniqueResult =
// getCurrentSession().createCriteria(CommercialCreditNote.class, "ci").createAlias("plannedSettlements", "ps")
// .createAlias("ps.payments", "payment").add(Restrictions.eq("ci.id", invoice.getId()))
// .setProjection(Projections.projectionList().add(Projections.sum("payment.amount"))).uniqueResult();
//
// if (uniqueResult == null) {
// return BigDecimal.ZERO.setScale(4);
// }
// return (BigDecimal) uniqueResult;
return BigDecimal.ZERO;
}
@Override
public boolean readyForPayment(long commercialCreditNoteId) {
int count =
((Long) getCurrentSession()
.createQuery(
"select count(*) from CommercialCreditNote where state in ('AWAITING_TREASURY_RATES', 'SIGNED_OFF', 'COMPLETE') "
+ "and id = :commercialCreditNoteId").setParameter("commercialCreditNoteId", commercialCreditNoteId).iterate().next())
.intValue();
return count == 1;
}
@Override
public List<ActualOrder> findActualOrdersByInvoice(CommercialCreditNote invoice) {
List<ActualOrder> actualOrders = new ArrayList<ActualOrder>();
for (ActualConsignment ac : invoice.getActualConsignments()) {
actualOrders.addAll(ac.getActualOrderList());
}
return actualOrders;
}
/**
* for reporting only.
* @param search
* @return
*/
@Override
public long supplyPaymentReportCount(SupplyPaymentSearch search) {
return 0;
}
/**
* for reporting only.
* @param search
* @return
*/
@Override
public List<Document> supplyPaymentReportSearch(SupplyPaymentSearch search) {
return null;
}
@Override
public BigDecimal getConsignmentInvoicedValue(Shipment shipment, Consignment consignment) {
return null;
}
}