Subversion Repositories SmartDukaan

Rev

Rev 32072 | Rev 32540 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 32072 Rev 32345
Line 746... Line 746...
746
                }
746
                }
747
 
747
 
748
                offerRowModel.setTotalSale(totalSale);
748
                offerRowModel.setTotalSale(totalSale);
749
                offerRowModel.setEligibleSale(eligibleSale);
749
                offerRowModel.setEligibleSale(eligibleSale);
750
                float eligiblePayoutValue = 0;
750
                float eligiblePayoutValue = 0;
751
                double finalPayout = 0;
751
                double finalPayout;
752
                for (PayoutSlab payoutSlab : itemCriteriaPayout.getPayoutSlabs()) {
752
                for (PayoutSlab payoutSlab : itemCriteriaPayout.getPayoutSlabs()) {
753
                    if (payoutSlab.getOnwardsAmount() <= eligibleSale) {
753
                    if (payoutSlab.getOnwardsAmount() <= eligibleSale) {
754
                        LOGGER.info("Eligible Sale {}", eligibleSale);
754
                        LOGGER.info("Eligible Sale {}", eligibleSale);
755
                        offerRowModel.setPayoutTargetAchieved(payoutSlab.getOnwardsAmount());
755
                        offerRowModel.setPayoutTargetAchieved(payoutSlab.getOnwardsAmount());
756
                        eligiblePayoutValue = payoutSlab.getPayoutAmount();
756
                        eligiblePayoutValue = payoutSlab.getPayoutAmount();
Line 858... Line 858...
858
    @Override
858
    @Override
859
    public void processSellin(CreateOfferRequest createOfferRequest) throws Exception {
859
    public void processSellin(CreateOfferRequest createOfferRequest) throws Exception {
860
 
860
 
861
        //List<OfferRowModel> offerRowModels = new ArrayList<>();
861
        //List<OfferRowModel> offerRowModels = new ArrayList<>();
862
        List<OfferPayout> offerPayouts = offerPayoutRepository.selectAllByOfferId(createOfferRequest.getId());
862
        List<OfferPayout> offerPayouts = offerPayoutRepository.selectAllByOfferId(createOfferRequest.getId());
-
 
863
        Map<String, Double> serialNumberPaid = offerPayouts.stream().filter(x -> x.getRejectTimestamp() == null).collect(Collectors.groupingBy(x -> x.getSerialNumber(), Collectors.summingDouble(x -> x.getSlabAmount())));
-
 
864
 
-
 
865
        List<ItemCriteriaPayout> itemCriteriaPayouts = createOfferRequest.getTargetSlabs().get(0).getItemCriteriaPayouts();
-
 
866
        Map<Integer, ItemCriteriaPayout> itemCriteriaPayoutMap = itemCriteriaPayouts.stream().collect(Collectors.toMap(x -> x.getItemCriteria().getId(), x -> x));
-
 
867
        Map<Integer, Map<Integer, Double>> fixedSlabCriteriaPartnerMap = offerPayouts.stream().filter(x -> itemCriteriaPayoutMap.get((int) x.getCriteriaId()).getAmountType().equals(AmountType.SLAB_FIXED))
-
 
868
                .collect(Collectors.groupingBy(x -> (int) x.getCriteriaId(), Collectors.groupingBy(x -> (int) x.getFofoId(), Collectors.summingDouble(x -> x.getSlabAmount()))));
863
        Set<Long> fofoIds = offerPayouts.stream().map(x -> x.getFofoId()).collect(Collectors.toSet());
869
        Set<Long> fofoIds = offerPayouts.stream().map(x -> x.getFofoId()).collect(Collectors.toSet());
864
 
870
 
865
        Map<Integer, Map<Integer, List<Order>>> criteriaOrdersMap = offerRepository.getPartnerWiseSellin(createOfferRequest, true);
871
        Map<Integer, Map<Integer, List<Order>>> criteriaOrdersMap = offerRepository.getPartnerWiseSellin(createOfferRequest, true);
866
 
872
 
-
 
873
 
867
        Map<Integer, List<Order>> userBaseCriteriaOrdersMap = null;
874
        Map<Integer, List<Order>> userBaseCriteriaOrdersMap = null;
868
        if (criteriaOrdersMap.get(0) != null && criteriaOrdersMap.get(0).size() > 0) {
875
        if (criteriaOrdersMap.get(0) != null && criteriaOrdersMap.get(0).size() > 0) {
869
            userBaseCriteriaOrdersMap = criteriaOrdersMap.get(0).entrySet().stream()
876
            userBaseCriteriaOrdersMap = criteriaOrdersMap.get(0).entrySet().stream()
870
                    .filter(x -> !fofoIds.contains(x.getKey())).collect(Collectors.toMap(x -> x.getKey(), x -> x.getValue()));
877
                    .filter(x -> !fofoIds.contains(x.getKey())).collect(Collectors.toMap(x -> x.getKey(), x -> x.getValue()));
871
        }
878
        }
872
 
879
 
-
 
880
 
873
        Map<Integer, Integer> userBaseQtyMap = null;
881
        Map<Integer, Integer> userBaseQtyMap = null;
874
        Map<Integer, Integer> userBaseValueMap = null;
882
        Map<Integer, Integer> userBaseValueMap = null;
875
        if (userBaseCriteriaOrdersMap != null) {
883
        if (userBaseCriteriaOrdersMap != null) {
876
            userBaseQtyMap = new HashMap<>();
884
            userBaseQtyMap = new HashMap<>();
877
            userBaseValueMap = new HashMap<>();
885
            userBaseValueMap = new HashMap<>();
Line 897... Line 905...
897
                    .filter(x -> !fofoIds.contains(x.getKey())).collect(Collectors.toMap(x -> x.getKey(), x -> x.getValue()));
905
                    .filter(x -> !fofoIds.contains(x.getKey())).collect(Collectors.toMap(x -> x.getKey(), x -> x.getValue()));
898
            for (Map.Entry<Integer, List<Order>> orderEntry : ordersMap.entrySet()) {
906
            for (Map.Entry<Integer, List<Order>> orderEntry : ordersMap.entrySet()) {
899
                int fofoId = orderEntry.getKey();
907
                int fofoId = orderEntry.getKey();
900
                //CustomRetailer retailer = retailerService.getAllFofoRetailers().get(fofoId);
908
                //CustomRetailer retailer = retailerService.getAllFofoRetailers().get(fofoId);
901
                List<Order> orders = orderEntry.getValue();
909
                List<Order> orders = orderEntry.getValue();
902
                Set<String> returnedSerialNumbers = orders.stream().filter(x -> x.getSerialNumber() != null).flatMap(x -> x.getReturnedImeis().stream()).collect(Collectors.toSet());
910
                //Set<String> returnedSerialNumbers = orders.stream().filter(x -> x.getSerialNumber() != null).flatMap(x -> x.getReturnedImeis().stream()).collect(Collectors.toSet());
903
                int totalQty = orders.stream().collect(Collectors.summingInt(x -> (x.getLineItem().getQuantity() - x.getLineItem().getReturnQty())));
911
                int totalQty = orders.stream().collect(Collectors.summingInt(x -> (x.getLineItem().getQuantity() - x.getLineItem().getReturnQty())));
904
                int totalValue = orders.stream().collect(Collectors.summingInt(x -> Math.round(x.getLineItem().
912
                int totalValue = orders.stream().collect(Collectors.summingInt(x -> Math.round(x.getLineItem().
905
                        getUnitPrice() * (x.getLineItem().getQuantity() - x.getLineItem().getReturnQty()))));
913
                        getUnitPrice() * (x.getLineItem().getQuantity() - x.getLineItem().getReturnQty()))));
906
                int totalBaseQty = totalQty;
914
                int totalBaseQty = totalQty;
907
                int totalBaseValue = totalValue;
915
                int totalBaseValue = totalValue;
Line 928... Line 936...
928
                if (currentSlab == null) continue;
936
                if (currentSlab == null) continue;
929
                //Need to remove hardcoding on tax
937
                //Need to remove hardcoding on tax
930
                List<Integer> orderIds = orders.stream().map(x -> x.getId()).collect(Collectors.toList());
938
                List<Integer> orderIds = orders.stream().map(x -> x.getId()).collect(Collectors.toList());
931
                Map<Integer, LineItem> lineItemMap = orders.stream().collect(Collectors.toMap(x -> x.getLineItem().getId(), x -> x.getLineItem()));
939
                Map<Integer, LineItem> lineItemMap = orders.stream().collect(Collectors.toMap(x -> x.getLineItem().getId(), x -> x.getLineItem()));
932
                List<WarehouseScan> warehouseScans = warehouseScanRepository.selectAllByOrderIds(orderIds);
940
                List<WarehouseScan> warehouseScans = warehouseScanRepository.selectAllByOrderIds(orderIds);
933
                List<Integer> inventoryItemIds = warehouseScans.stream().collect(Collectors.groupingBy(x -> x.getInventoryItemId())).entrySet()
941
                List<Integer> warehouseInventoryItemIds = warehouseScans.stream().collect(Collectors.groupingBy(x -> x.getInventoryItemId())).entrySet()
934
                        .stream().filter(x -> x.getValue().size() == 1).map(x -> x.getKey()).collect(Collectors.toList());
942
                        .stream().filter(x -> x.getValue().size() == 1).map(x -> x.getKey()).collect(Collectors.toList());
935
                Set<String> serialNumbers;
943
                Set<String> serialNumbers;
936
                LOGGER.info("inventoryItemIds {}", inventoryItemIds);
944
                LOGGER.info("warehouseInventoryItemIds {}", warehouseInventoryItemIds);
937
                if (inventoryItemIds.size() > 0) {
945
                if (warehouseInventoryItemIds.size() > 0) {
938
                    List<WarehouseInventoryItem> warehouseInventoryItems = warehouseInventoryItemRepository.selectAllByIds(inventoryItemIds);
946
                    List<WarehouseInventoryItem> warehouseInventoryItems = warehouseInventoryItemRepository.selectAllByIds(warehouseInventoryItemIds);
939
                    serialNumbers = warehouseInventoryItems.stream().map(x -> x.getSerialNumber()).collect(Collectors.toSet());
947
                    serialNumbers = warehouseInventoryItems.stream().map(x -> x.getSerialNumber()).collect(Collectors.toSet());
940
                } else {
948
                } else {
941
                    serialNumbers = new HashSet<>();
949
                    serialNumbers = new HashSet<>();
942
                }
950
                }
943
                LOGGER.info("SerialNumbers {}", serialNumbers);
951
                LOGGER.info("SerialNumbers {}", serialNumbers);
Line 949... Line 957...
949
 
957
 
950
                serialNumberMap = serialNumberMap.entrySet().stream().filter(x -> serialNumbers.contains(x.getKey())).collect(Collectors.toMap(x -> x.getKey(), x -> x.getValue()));
958
                serialNumberMap = serialNumberMap.entrySet().stream().filter(x -> serialNumbers.contains(x.getKey())).collect(Collectors.toMap(x -> x.getKey(), x -> x.getValue()));
951
 
959
 
952
                Map<String, InventoryItem> serialNumberInventoryItemMap = this.getInventoryItemMap(fofoId, serialNumberMap);
960
                Map<String, InventoryItem> serialNumberInventoryItemMap = this.getInventoryItemMap(fofoId, serialNumberMap);
953
                //Continue if all imeis havent been grned
961
                //Continue if all imeis havent been grned
954
                if(serialNumberInventoryItemMap.size() < serialNumberCountMap.size()) continue;
962
                if (serialNumberInventoryItemMap.size() < serialNumberCountMap.size()) continue;
955
 
963
 
956
                LOGGER.info("serialNumberMap {}", serialNumberMap);
964
                LOGGER.info("serialNumberMap {}", serialNumberMap);
-
 
965
 
-
 
966
                float eligiblePayoutValue = currentSlab.getPayoutAmount();
957
                double amount = 0;
967
                double finalPayout;
958
                int lineItemsValue = serialNumberMap.values().stream().collect(Collectors.summingInt(x -> x.getUnitPrice().intValue()));
968
                if (AmountType.PERCENTAGE.equals(itemCriteriaPayout.getAmountType())) {
959
                LOGGER.info("lineItemsValue - {}, totalValue - {}", lineItemsValue, totalValue);
969
                    finalPayout = (eligiblePayoutValue * purchasedValue) / 100;
960
                for (Map.Entry<String, LineItem> entry : serialNumberMap.entrySet()) {
970
                } else if (AmountType.FIXED.equals(itemCriteriaPayout.getAmountType())) {
-
 
971
                    finalPayout = eligiblePayoutValue * purchasedValue;
-
 
972
                } else {
-
 
973
                    Map<Integer, Double> fofoCriteriaMap = fixedSlabCriteriaPartnerMap.get(criteriaId);
961
                    LOGGER.info("Serial no - {}", entry.getKey());
974
                    LOGGER.info("fofoCriteriaMap {}", fofoCriteriaMap);
962
                    LineItem lineItem = entry.getValue();
975
                    finalPayout = eligiblePayoutValue;
-
 
976
                    if (fofoCriteriaMap != null) {
963
                    if (AmountType.SLAB_FIXED.equals(itemCriteriaPayout.getAmountType())) {
977
                        if (fofoCriteriaMap.containsKey(fofoId)) {
964
                        float totalAmount = currentSlab.getPayoutAmount();
978
                            double totalPayout = fofoCriteriaMap.get(fofoId);
965
                        amount = Math.round((totalAmount / totalValue) * lineItem.getUnitPrice());
979
                            finalPayout = eligiblePayoutValue - totalPayout;
966
                        LOGGER.info("Serial no - {}, unitPrice - {}, amount - {}", entry.getKey(), lineItem.getUnitPrice(), amount);
980
                            if (Math.abs(finalPayout) < Utils.DOUBLE_EPSILON) {
967
                    } else {
981
                                finalPayout = 0;
968
                        //per unit amount
982
                            }
969
                        amount = currentSlab.getPayoutAmount();
983
                        }
970
                    }
984
                    }
-
 
985
                }
-
 
986
 
-
 
987
                LOGGER.info("Or - {}", finalPayout);
-
 
988
 
-
 
989
                if (finalPayout > 0) {
-
 
990
                    double totalRolloutAmount = 0;
-
 
991
                    int totalDpValue = serialNumberInventoryItemMap.entrySet().stream().mapToInt(x -> (int) x.getValue().getUnitPrice()).sum();
-
 
992
                    for (Map.Entry<String, InventoryItem> serialNumberInventoryItemEntry : serialNumberInventoryItemMap.entrySet()) {
-
 
993
                        double amount = 0;
-
 
994
                        LOGGER.info("Total DP Value {}", totalDpValue);
-
 
995
                        if (AmountType.SLAB_FIXED.equals(itemCriteriaPayout.getAmountType())) {
-
 
996
                            amount = (eligiblePayoutValue * serialNumberInventoryItemEntry.getValue().getUnitPrice()) / totalDpValue;
-
 
997
                            LOGGER.info("Amount - {}", amount);
-
 
998
                            //Fixed slab should be treated as fixed after payout
-
 
999
                        } else {
-
 
1000
                            amount = eligiblePayoutValue;
-
 
1001
                            //Fixed slab has already taken care of that amount;
-
 
1002
                            if (serialNumberPaid.containsKey(serialNumberInventoryItemEntry.getKey())) {
-
 
1003
                                amount = amount - serialNumberPaid.get(serialNumberInventoryItemEntry.getKey());
-
 
1004
                            }
-
 
1005
                        }
-
 
1006
                        LOGGER.info("Amount - {}", amount);
-
 
1007
                        //ignore reasonably small
-
 
1008
                        if (amount < Utils.DOUBLE_EPSILON) continue;
971
                    AmountModel amountModel = new AmountModel();
1009
                        AmountModel amountModel = new AmountModel();
972
                    amountModel.setAmountType(itemCriteriaPayout.getAmountType());
1010
                        amountModel.setAmountType(itemCriteriaPayout.getAmountType());
973
                    amountModel.setAmount(amount);
1011
                        amountModel.setAmount(amount);
974
                    amountModel.setDiscount(createOfferRequest.isDiscount());
1012
                        amountModel.setDiscount(createOfferRequest.isDiscount());
975
                    InventoryPayoutModel inventoryPayoutModel = priceCircularService.getPayouts(serialNumberInventoryItemMap.get(entry.getKey()));
1013
                        InventoryPayoutModel inventoryPayoutModel = priceCircularService.getPayouts(serialNumberInventoryItemEntry.getValue());
976
                    double rolloutAmount = inventoryPayoutModel.getRolloutAmount(amountModel);
1014
                        double rolloutAmount = inventoryPayoutModel.getRolloutAmount(amountModel);
977
                    if (fofoIds.contains(Long.valueOf(fofoId))) continue;
1015
                        totalRolloutAmount += rolloutAmount;
978
                    OfferPayout offerPayout = new OfferPayout(fofoId, createOfferRequest.getId(), criteriaId, currentSlab.getPayoutAmount(), entry.getKey(), rolloutAmount, SchemePayoutStatus.CREDITED, createOfferRequest.getDescription(), LocalDateTime.now());
1016
 
979
                    //offerPayout.setLineItemId();
1017
                        OfferPayout offerPayout = new OfferPayout(fofoId, createOfferRequest.getId(), criteriaId, amount, serialNumberInventoryItemEntry.getKey(), rolloutAmount, SchemePayoutStatus.CREDITED, createOfferRequest.getDescription(), LocalDateTime.now());
980
                    offerPayoutRepository.persist(offerPayout);
1018
                        offerPayoutRepository.persist(offerPayout);
981
                    offerPayoutsNew.add(offerPayout);
1019
                    }
-
 
1020
                    walletService.addAmountToWallet((int) fofoId, createOfferRequest.getId(), WalletReferenceType.ADDITIONAL_SCHEME, createOfferRequest.getDescription(), (float) totalRolloutAmount, LocalDateTime.now());
982
                }
1021
                }
983
            }
1022
            }
984
        }
1023
        }
985
        Map<Long, Double> offerPayoutMap = offerPayoutsNew.stream().collect(Collectors.groupingBy(x -> x.getFofoId(), Collectors.summingDouble(x -> x.getAmount())));
-
 
986
        for (Map.Entry<Long, Double> offerPayoutEntry : offerPayoutMap.entrySet()) {
-
 
987
            long fofoId = offerPayoutEntry.getKey();
-
 
988
            double amountToCredit = offerPayoutEntry.getValue();
-
 
989
            walletService.addAmountToWallet((int) fofoId, createOfferRequest.getId(), WalletReferenceType.ADDITIONAL_SCHEME, createOfferRequest.getDescription(), (float) amountToCredit, LocalDateTime.now());
-
 
990
        }
-
 
991
        Offer offer = offerRepository.selectById(createOfferRequest.getId());
1024
        Offer offer = offerRepository.selectById(createOfferRequest.getId());
992
        offer.setProcessedTimestamp(LocalDateTime.now());
1025
        offer.setProcessedTimestamp(LocalDateTime.now());
993
    }
1026
    }
994
 
1027
 
995
    private Map<String, InventoryItem> getInventoryItemMap(int fofoId, Map<String, LineItem> serialNumberMap) {
1028
    private Map<String, InventoryItem> getInventoryItemMap(int fofoId, Map<String, LineItem> serialNumberMap) {
996
        List<InventoryItem> inventoryItems = inventoryItemRepository.selectBySerialNumbers(serialNumberMap.keySet());
1029
        List<InventoryItem> inventoryItems = inventoryItemRepository.selectBySerialNumbers(serialNumberMap.keySet());
997
        inventoryItems = inventoryItems.stream().filter(x->x.getFofoId()== fofoId).collect(Collectors.toList());
1030
        inventoryItems = inventoryItems.stream().filter(x -> x.getFofoId() == fofoId).collect(Collectors.toList());
998
        Map<String,InventoryItem> inventoryItemMap = inventoryItems.stream().collect(Collectors.toMap(x->x.getSerialNumber(), x->x, (u,v)->v.getCreateTimestamp().isAfter(u.getCreateTimestamp()) ? v : u));
1031
        Map<String, InventoryItem> inventoryItemMap = inventoryItems.stream().collect(Collectors.toMap(x -> x.getSerialNumber(), x -> x, (u, v) -> v.getCreateTimestamp().isAfter(u.getCreateTimestamp()) ? v : u));
999
        return inventoryItemMap;
1032
        return inventoryItemMap;
1000
    }
1033
    }
1001
}
1034
}