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;
    }
}