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