Subversion Repositories SmartDukaan

Rev

Rev 34035 | Blame | Compare with Previous | Last modification | View Log | RSS feed

package com.spice.profitmandi.service.inventory;

import com.spice.profitmandi.common.model.ItemIdQuantity;
import com.spice.profitmandi.dao.entity.inventory.PartnerAgeingModel;
import com.spice.profitmandi.dao.repository.fofo.ActivatedImeiRepository;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.persistence.TypedQuery;
import java.util.*;
import java.util.stream.Collectors;


@Component
public class AgeingServiceImpl implements AgeingService {

    @Autowired
    ActivatedImeiRepository activatedImeiRepository;
    @Autowired
    private SessionFactory sessionFactory;
    private static final Logger LOGGER = LogManager.getLogger(AgeingServiceImpl.class);

    @Override
    public Map<String, AgeingModel> getAllAgeingForSecondary() {
        Session session = sessionFactory.getCurrentSession();
        final TypedQuery<AgeingModel> typedQuerySimilar = session.createNamedQuery("BrandAgeingLimit.imeisToSecondaryAlert", AgeingModel.class);
        List<AgeingModel> ageingModels = typedQuerySimilar.getResultList();
        return ageingModels.stream().collect(Collectors.toMap(x -> x.getSerialNumber(), x -> x, (u, v) -> u.getInvoiceDate().isBefore(v.getInvoiceDate()) ? u : v));
    }

    @Override
    public Map<String, AgeingModel> getAllAgeingForWarehouseBilling(int vendorWarehouseId, List<Integer> itemIds) {
        Session session = sessionFactory.getCurrentSession();
        final TypedQuery<AgeingModel> typedQuerySimilar = session.createNamedQuery("BrandAgeingLimit.imeisToSecondaryForWarehouseBilling", AgeingModel.class);
        typedQuerySimilar.setParameter("itemIds", itemIds);
        typedQuerySimilar.setParameter("vendorWarehouseId", vendorWarehouseId);
        List<AgeingModel> ageingModels = typedQuerySimilar.getResultList();
        return ageingModels.stream().collect(Collectors.toMap(x -> x.getSerialNumber(), x -> x, (u, v) -> u.getInvoiceDate().isBefore(v.getInvoiceDate()) ? u : v));
    }

    @Override
    public Map<Integer, Map<Integer, List<AgeingModel>>> getAgeingForWarehouseBilling(int vendorWarehouseId, List<ItemIdQuantity> itemIdQuantityList) {
        Map<String, AgeingModel> serialNumberAgeingModelMap = this.getAllAgeingForWarehouseBilling(vendorWarehouseId, itemIdQuantityList.stream().map(ItemIdQuantity::getItemId).collect(Collectors.toList()));

        Map<Integer, Map<Integer, List<AgeingModel>>> itemAgeingDaysModelMap = serialNumberAgeingModelMap.values().stream()
                .collect(Collectors.groupingBy(AgeingModel::getItemId,
                        Collectors.groupingBy(AgeingModel::getExceedDays, () -> new TreeMap<>(Comparator.reverseOrder()), Collectors.toList())));


        if (!itemAgeingDaysModelMap.isEmpty()) {
            for (ItemIdQuantity itemIdQuantity : itemIdQuantityList) {
                Map<Integer, List<AgeingModel>> daysImeisMap = itemAgeingDaysModelMap.get(itemIdQuantity.getItemId());
                int quantity = itemIdQuantity.getQuantity();
                int count = 0;

                Iterator<Map.Entry<Integer, List<AgeingModel>>> iter = daysImeisMap.entrySet().iterator();
                while (iter.hasNext()) {
                    Map.Entry<Integer, List<AgeingModel>> entry = iter.next();
                    if (count >= quantity) {
                        LOGGER.info("Removing iterator - {}, {}", count, quantity);
                        iter.remove();
                    }
                    count += entry.getValue().size();
                }
            }

        }
        return itemAgeingDaysModelMap;
    }


    @Override
    public List<PartnerAgeingModel> getAllAgeingForTertiary() {
        Session session = sessionFactory.getCurrentSession();
        final TypedQuery<PartnerAgeingModel> imeisToTertiaryQuery = session.createNamedQuery("BrandAgeingLimit.imeisToTertiaryAlert", PartnerAgeingModel.class);
        return imeisToTertiaryQuery.getResultList();
    }

    @Override
    public List<PartnerAgeingModel> filterAgedInventory(Set<Integer> inventoryItemIds) {
        Session session = sessionFactory.getCurrentSession();
        final TypedQuery<PartnerAgeingModel> imeisToTertiaryQuery = session.createNamedQuery("BrandAgeingLimit.getByInventoryItemIds", PartnerAgeingModel.class);
        imeisToTertiaryQuery.setParameter("inventoryItemIds", inventoryItemIds);
        return imeisToTertiaryQuery.getResultList();

    }

    @Override
    public List<CatalogAgingModel> getCatalogsAgingByWarehouse(Set<Integer> catalogItemIds, int warehouseId) {
        Session session = sessionFactory.getCurrentSession();
        final TypedQuery<CatalogAgingModel> catalogAgingModelTypedQuery = session.createNamedQuery("CatalogAgingByWarehouse", CatalogAgingModel.class);
        catalogAgingModelTypedQuery.setParameter("catalogItemIds", catalogItemIds);
        catalogAgingModelTypedQuery.setParameter("warehouseId", warehouseId);
        return catalogAgingModelTypedQuery.getResultList();

    }
}