| Line 522... |
Line 522... |
| 522 |
List<SchemeSummaryModel> schemeSummaryModels = catalogSummaryModelListEntry.getValue().stream().filter(x -> x != null).collect(Collectors.toList());
|
522 |
List<SchemeSummaryModel> schemeSummaryModels = catalogSummaryModelListEntry.getValue().stream().filter(x -> x != null).collect(Collectors.toList());
|
| 523 |
schemeSummaryModels.stream().filter(x -> x != null && x.getSchemeType().equals(SchemeType.IN)).forEach(x -> x.setProcess(true));
|
523 |
schemeSummaryModels.stream().filter(x -> x != null && x.getSchemeType().equals(SchemeType.IN)).forEach(x -> x.setProcess(true));
|
| 524 |
if (schemeSummaryModels.stream().filter(x -> x.isProcess()).count() == 0) continue;
|
524 |
if (schemeSummaryModels.stream().filter(x -> x.isProcess()).count() == 0) continue;
|
| 525 |
List<InventoryItem> modelInventoryItems = catalogInventoryItemMap.get(catalogSummaryModel.getCatalogId());
|
525 |
List<InventoryItem> modelInventoryItems = catalogInventoryItemMap.get(catalogSummaryModel.getCatalogId());
|
| 526 |
for (InventoryItem inventoryItem : modelInventoryItems) {
|
526 |
for (InventoryItem inventoryItem : modelInventoryItems) {
|
| 527 |
float inventoryItemCashback = this.createSchemeInOut(schemeSummaryModels, inventoryItem, partnerType);
|
527 |
float inventoryItemCashback = this.createSchemeInOut(schemeSummaryModels, inventoryItem);
|
| 528 |
if (inventoryItemCashback > 0) {
|
528 |
if (inventoryItemCashback > 0) {
|
| 529 |
itemsCount++;
|
529 |
itemsCount++;
|
| 530 |
totalCashback += inventoryItemCashback;
|
530 |
totalCashback += inventoryItemCashback;
|
| 531 |
}
|
531 |
}
|
| 532 |
}
|
532 |
}
|
| Line 581... |
Line 581... |
| 581 |
}
|
581 |
}
|
| 582 |
return amount;
|
582 |
return amount;
|
| 583 |
}
|
583 |
}
|
| 584 |
|
584 |
|
| 585 |
//Only in and activation margins are allowed to be rolled out more than twice
|
585 |
//Only in and activation margins are allowed to be rolled out more than twice
|
| 586 |
private float createSchemeInOut(List<SchemeSummaryModel> schemeSummaryModels, InventoryItem inventoryItem, PartnerType partnerType) throws ProfitMandiBusinessException {
|
586 |
private float createSchemeInOut(List<SchemeSummaryModel> schemeSummaryModels, InventoryItem inventoryItem) throws ProfitMandiBusinessException {
|
| 587 |
|
587 |
|
| 588 |
InventoryPayoutModel inventoryPayoutModel = priceCircularService.getPayouts(inventoryItem);
|
588 |
InventoryPayoutModel inventoryPayoutModel = priceCircularService.getPayouts(inventoryItem);
|
| 589 |
//Get all schemes
|
589 |
//Get all schemes
|
| 590 |
List<SchemeSummaryModel> inventoryPayoutModelToProcess = schemeSummaryModels.stream().filter(x -> x.isProcess()).collect(Collectors.toList());
|
590 |
List<SchemeSummaryModel> inventoryPayoutModelToProcess = schemeSummaryModels.stream().filter(x -> x.isProcess()).collect(Collectors.toList());
|
| 591 |
|
591 |
|
| 592 |
List<SchemeInOut> sios = inventoryPayoutModel.getSchemePayouts();
|
592 |
List<SchemeInOut> paidSios = inventoryPayoutModel.getPaidSios();
|
| - |
|
593 |
List<SchemeInOut> pendingSios = inventoryPayoutModel.getPendingSios();
|
| 593 |
Map<SchemeType, List<SchemeInOut>> paidSchemeTypesMap = inventoryPayoutModel.getSchemePayouts().stream().collect(Collectors.groupingBy(x -> x.getScheme().getType()));
|
594 |
Map<SchemeType, List<SchemeInOut>> paidSchemeTypesMap = inventoryPayoutModel.getPaidSios().stream().collect(Collectors.groupingBy(x -> x.getScheme().getType()));
|
| 594 |
Map<Integer, SchemeInOut> paidSchemesMap = sios.stream().collect(Collectors.toMap(x -> x.getSchemeId(), x -> x));
|
595 |
Map<Integer, SchemeInOut> paidSchemesMap = paidSios.stream().collect(Collectors.toMap(x -> x.getSchemeId(), x -> x));
|
| - |
|
596 |
Map<Integer, SchemeInOut> pendingSchemesMap = pendingSios.stream().collect(Collectors.toMap(x -> x.getSchemeId(), x -> x));
|
| 595 |
Map<SchemeType, Float> schemeTypeCancelledAmountMap = new HashMap<>();
|
597 |
Map<SchemeType, Float> schemeTypeCancelledAmountMap = new HashMap<>();
|
| 596 |
|
598 |
|
| 597 |
double percentageToPay = 0d;
|
599 |
double percentageToPay = 0d;
|
| 598 |
double fixedToPay = 0d;
|
600 |
double fixedToPay = 0d;
|
| 599 |
Map<SchemeSummaryModel, AmountModel> payoutSchemeSummaryModelMap = new HashMap<>();
|
601 |
Map<SchemeSummaryModel, AmountModel> payoutSchemeSummaryModelMap = new HashMap<>();
|
| 600 |
for (SchemeSummaryModel schemeSummaryModelToProcess : inventoryPayoutModelToProcess) {
|
602 |
for (SchemeSummaryModel schemeSummaryModelToProcess : inventoryPayoutModelToProcess) {
|
| 601 |
if (paidSchemesMap.containsKey(schemeSummaryModelToProcess.getSchemeId())) continue;
|
603 |
if (paidSchemesMap.containsKey(schemeSummaryModelToProcess.getSchemeId()) || pendingSchemesMap.containsKey(schemeSummaryModelToProcess.getSchemeId())) continue;
|
| 602 |
//If different type but on higher side provide the higher margin
|
604 |
//If different type but on higher side provide the higher margin
|
| 603 |
if (Arrays.asList(SchemeType.ACTIVATION, SchemeType.SPECIAL_SUPPORT).contains(schemeSummaryModelToProcess.getSchemeType())) {
|
605 |
if (Arrays.asList(SchemeType.ACTIVATION, SchemeType.SPECIAL_SUPPORT).contains(schemeSummaryModelToProcess.getSchemeType())) {
|
| - |
|
606 |
Scheme scheme = schemeRepository.selectById(schemeSummaryModelToProcess.getSchemeId());
|
| - |
|
607 |
//Create only if the activation if the activation date is not known
|
| - |
|
608 |
ActivatedImei activatedImei = activatedImeiRepository.selectBySerialNumber(inventoryItem.getSerialNumber());
|
| - |
|
609 |
if(activatedImei == null || activatedImei.getActivationTimestamp()==null) {
|
| 604 |
SchemeInOut sio = new SchemeInOut();
|
610 |
SchemeInOut sio = new SchemeInOut();
|
| 605 |
sio.setAmount(0);
|
611 |
sio.setAmount(0);
|
| 606 |
sio.setInventoryItemId(inventoryItem.getId());
|
612 |
sio.setInventoryItemId(inventoryItem.getId());
|
| 607 |
sio.setSchemeId(schemeSummaryModelToProcess.getSchemeId());
|
613 |
sio.setSchemeId(schemeSummaryModelToProcess.getSchemeId());
|
| 608 |
sio.setStatusDescription("Activation pending for IMEI#" + inventoryItem.getSerialNumber());
|
614 |
sio.setStatusDescription("Activation pending for IMEI#" + inventoryItem.getSerialNumber());
|
| 609 |
sio.setStatus(SchemePayoutStatus.PENDING);
|
615 |
sio.setStatus(SchemePayoutStatus.PENDING);
|
| 610 |
schemeInOutRepository.persist(sio);
|
616 |
schemeInOutRepository.persist(sio);
|
| - |
|
617 |
}
|
| 611 |
} else if (!SchemeType.IN.equals(schemeSummaryModelToProcess.getSchemeType())) {
|
618 |
} else if (!SchemeType.IN.equals(schemeSummaryModelToProcess.getSchemeType())) {
|
| 612 |
//We have got non repeating scheme type
|
619 |
//We have got non repeating scheme type
|
| 613 |
if (paidSchemeTypesMap.containsKey(schemeSummaryModelToProcess.getSchemeType())) {
|
620 |
if (paidSchemeTypesMap.containsKey(schemeSummaryModelToProcess.getSchemeType())) {
|
| 614 |
SchemeInOut sio = paidSchemeTypesMap.get(schemeSummaryModelToProcess.getSchemeType()).get(0);
|
621 |
SchemeInOut sio = paidSchemeTypesMap.get(schemeSummaryModelToProcess.getSchemeType()).get(0);
|
| 615 |
Scheme paidScheme = sio.getScheme();
|
622 |
Scheme paidScheme = sio.getScheme();
|
| Line 767... |
Line 774... |
| 767 |
schemeSummaryModels.stream().filter(x -> allOutSchemeTypes.contains(x.getSchemeType())).forEach(x -> x.setProcess(true));
|
774 |
schemeSummaryModels.stream().filter(x -> allOutSchemeTypes.contains(x.getSchemeType())).forEach(x -> x.setProcess(true));
|
| 768 |
if (schemeSummaryModels.stream().filter(x -> x.isProcess()).count() == 0) continue;
|
775 |
if (schemeSummaryModels.stream().filter(x -> x.isProcess()).count() == 0) continue;
|
| 769 |
|
776 |
|
| 770 |
List<InventoryItem> modelInventoryItems = catalogInventoryItemMap.get(catalogSummaryModel.getCatalogId());
|
777 |
List<InventoryItem> modelInventoryItems = catalogInventoryItemMap.get(catalogSummaryModel.getCatalogId());
|
| 771 |
for (InventoryItem inventoryItem : modelInventoryItems) {
|
778 |
for (InventoryItem inventoryItem : modelInventoryItems) {
|
| 772 |
float inventoryItemCashback = this.createSchemeInOut(schemeSummaryModels, inventoryItem, partnerType);
|
779 |
float inventoryItemCashback = this.createSchemeInOut(schemeSummaryModels, inventoryItem);
|
| 773 |
if (inventoryItemCashback > 0) {
|
780 |
if (inventoryItemCashback > 0) {
|
| 774 |
count++;
|
781 |
count++;
|
| 775 |
totalCashback += inventoryItemCashback;
|
782 |
totalCashback += inventoryItemCashback;
|
| 776 |
}
|
783 |
}
|
| 777 |
}
|
784 |
}
|
| Line 803... |
Line 810... |
| 803 |
float totalMargin = this.selectPercentageScheme(partnerType, onDate, catalogId, false, 0, 0).stream().collect(Collectors.summingDouble(x -> x.getAmount())).floatValue();
|
810 |
float totalMargin = this.selectPercentageScheme(partnerType, onDate, catalogId, false, 0, 0).stream().collect(Collectors.summingDouble(x -> x.getAmount())).floatValue();
|
| 804 |
float amountToCredit = supportAmount * (1 - (totalMargin / (100 + taxRate)));
|
811 |
float amountToCredit = supportAmount * (1 - (totalMargin / (100 + taxRate)));
|
| 805 |
return amountToCredit;
|
812 |
return amountToCredit;
|
| 806 |
}
|
813 |
}
|
| 807 |
|
814 |
|
| 808 |
private void processSpecialSupport(FofoOrder fofoOrder, List<Scheme> supportSchemes, InventoryItem
|
- |
|
| 809 |
inventoryItem, PartnerType partnerType, LocalDateTime saleDate) throws ProfitMandiBusinessException {
|
- |
|
| 810 |
int catalogId = inventoryItem.getItem().getCatalogItemId();
|
- |
|
| 811 |
float totalMargin = this.selectPercentageScheme(partnerType, saleDate.toLocalDate(), catalogId, false, 0, 0).stream().collect(Collectors.summingDouble(x -> x.getAmount())).floatValue();
|
- |
|
| 812 |
LOGGER.info("total percentage margin - {}", totalMargin);
|
- |
|
| 813 |
for (Scheme scheme : supportSchemes) {
|
- |
|
| 814 |
float amountToCredit = scheme.getAmount() * (1 - (totalMargin / 100));
|
- |
|
| 815 |
List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByScheme(scheme.getId(), inventoryItem.getId());
|
- |
|
| 816 |
SchemeInOut schemeInOut = schemeInOuts.stream().filter(x -> x.getRolledBackTimestamp() == null).findFirst().orElse(null);
|
- |
|
| 817 |
if (schemeInOut == null) {
|
- |
|
| 818 |
schemeInOut = new SchemeInOut();
|
- |
|
| 819 |
schemeInOut.setInventoryItemId(inventoryItem.getId());
|
- |
|
| 820 |
schemeInOut.setSchemeId(scheme.getId());
|
- |
|
| 821 |
schemeInOut.setInventoryItemId(inventoryItem.getId());
|
- |
|
| 822 |
schemeInOut.setCreateTimestamp(LocalDateTime.now());
|
- |
|
| 823 |
if (SchemeType.SELLOUT.equals(scheme.getType())) {
|
- |
|
| 824 |
schemeInOut.setStatus(SchemePayoutStatus.CREDITED);
|
- |
|
| 825 |
schemeInOut.setCreditTimestamp(LocalDateTime.now());
|
- |
|
| 826 |
schemeInOut.setStatusDescription("Modelwise sellout support credited");
|
- |
|
| 827 |
walletService.addAmountToWallet(inventoryItem.getFofoId(), fofoOrder.getId(), WalletReferenceType.SPECIAL_SUPPORT,
|
- |
|
| 828 |
"Modelwise sellout support credited for Imei - " + inventoryItem.getSerialNumber(), amountToCredit,
|
- |
|
| 829 |
fofoOrder.getCreateTimestamp());
|
- |
|
| 830 |
} else {
|
- |
|
| 831 |
schemeInOut.setStatusDescription("Special support, Activation pending for IMEI#" + inventoryItem.getSerialNumber());
|
- |
|
| 832 |
schemeInOut.setStatus(SchemePayoutStatus.PENDING);
|
- |
|
| 833 |
}
|
- |
|
| 834 |
schemeInOut.setAmount(amountToCredit);
|
- |
|
| 835 |
schemeInOutRepository.persist(schemeInOut);
|
- |
|
| 836 |
|
- |
|
| 837 |
} else if (Double.valueOf(schemeInOut.getAmount()).intValue() != Double.valueOf(amountToCredit).intValue()) {
|
- |
|
| 838 |
SchemeInOut schemeInOutNew = new SchemeInOut();
|
- |
|
| 839 |
schemeInOutNew.setInventoryItemId(inventoryItem.getId());
|
- |
|
| 840 |
schemeInOutNew.setSchemeId(scheme.getId());
|
- |
|
| 841 |
schemeInOutNew.setCreateTimestamp(LocalDateTime.now());
|
- |
|
| 842 |
schemeInOutNew.setAmount(amountToCredit);
|
- |
|
| 843 |
if (schemeInOut.getStatus().equals(SchemePayoutStatus.PENDING)) {
|
- |
|
| 844 |
schemeInOutNew.setStatus(SchemePayoutStatus.PENDING);
|
- |
|
| 845 |
schemeInOutNew.setStatusDescription("Special support, Activation pending for IMEI#" + inventoryItem.getSerialNumber());
|
- |
|
| 846 |
schemeInOutRepository.persist(schemeInOutNew);
|
- |
|
| 847 |
} else if (schemeInOut.getStatus().equals(SchemePayoutStatus.CREDITED)) {
|
- |
|
| 848 |
schemeInOutNew.setStatus(SchemePayoutStatus.CREDITED);
|
- |
|
| 849 |
schemeInOutNew.setCreditTimestamp(LocalDateTime.now());
|
- |
|
| 850 |
schemeInOutNew.setStatusDescription("Special support credited");
|
- |
|
| 851 |
schemeInOutRepository.persist(schemeInOutNew);
|
- |
|
| 852 |
walletService.addAmountToWallet(inventoryItem.getFofoId(), fofoOrder.getId(), WalletReferenceType.SPECIAL_SUPPORT,
|
- |
|
| 853 |
"Special support adjusted against overall margin gains for Imei - " + inventoryItem.getSerialNumber(), amountToCredit - schemeInOut.getAmount(),
|
- |
|
| 854 |
fofoOrder.getCreateTimestamp());
|
- |
|
| 855 |
|
- |
|
| 856 |
}
|
- |
|
| 857 |
schemeInOut.setStatus(SchemePayoutStatus.REJECTED);
|
- |
|
| 858 |
schemeInOut.setStatusDescription("Failed!!, New Margin Entry added");
|
- |
|
| 859 |
schemeInOut.setRolledBackTimestamp(LocalDateTime.now());
|
- |
|
| 860 |
}
|
- |
|
| 861 |
|
- |
|
| 862 |
}
|
- |
|
| 863 |
|
- |
|
| 864 |
}
|
- |
|
| 865 |
|
- |
|
| 866 |
@Override
|
815 |
@Override
|
| 867 |
public void rollbackSchemes(List<Integer> inventoryItemIds, int rollbackReference, String rollbackReason)
|
816 |
public void rollbackSchemes(List<Integer> inventoryItemIds, int rollbackReference, String rollbackReason)
|
| 868 |
throws Exception {
|
817 |
throws Exception {
|
| 869 |
Set<Integer> inventoryItemIdSet = new HashSet<>(inventoryItemIds);
|
818 |
Set<Integer> inventoryItemIdSet = new HashSet<>(inventoryItemIds);
|
| 870 |
float amountToRollback = 0;
|
819 |
float amountToRollback = 0;
|
| Line 1073... |
Line 1022... |
| 1073 |
userWalletHistoryList = userWalletHistoryRepository.selectAllByreferenceIdandreferenceType(reversalReference, walletReferenceType);
|
1022 |
userWalletHistoryList = userWalletHistoryRepository.selectAllByreferenceIdandreferenceType(reversalReference, walletReferenceType);
|
| 1074 |
}
|
1023 |
}
|
| 1075 |
if (userWalletHistoryList.size() > 0) {
|
1024 |
if (userWalletHistoryList.size() > 0) {
|
| 1076 |
int maxDeductible = userWalletHistoryList.stream().collect(Collectors.summingInt(x -> x.getAmount()));
|
1025 |
int maxDeductible = userWalletHistoryList.stream().collect(Collectors.summingInt(x -> x.getAmount()));
|
| 1077 |
if (maxDeductible > 0) {
|
1026 |
if (maxDeductible > 0) {
|
| 1078 |
LOGGER.info("----------> maxDeductible {}, amountToRollback {}, reversalReference {}, walletReferenceType {} ",maxDeductible, amountToRollback, reversalReference, walletReferenceType);
|
1027 |
LOGGER.info("----------> maxDeductible {}, amountToRollback {}, reversalReference {}, walletReferenceType {} ", maxDeductible, amountToRollback, reversalReference, walletReferenceType);
|
| 1079 |
walletService.rollbackAmountFromWallet(fofoId, Math.min(maxDeductible, amountToRollback), reversalReference, walletReferenceType,
|
1028 |
walletService.rollbackAmountFromWallet(fofoId, Math.min(maxDeductible, amountToRollback), reversalReference, walletReferenceType,
|
| 1080 |
reversalReason, LocalDateTime.now());
|
1029 |
reversalReason, LocalDateTime.now());
|
| 1081 |
}
|
1030 |
}
|
| 1082 |
|
1031 |
|
| 1083 |
}
|
1032 |
}
|
| Line 1284... |
Line 1233... |
| 1284 |
LOGGER.info("Serial Number - {}, Scheme IDs - {}", schemesImeisModel.getImei(), schemeIds);
|
1233 |
LOGGER.info("Serial Number - {}, Scheme IDs - {}", schemesImeisModel.getImei(), schemeIds);
|
| 1285 |
InventoryItem inventoryItem = inventoryItemRepository.selectById(schemesImeisModel.getInventoryItemId());
|
1234 |
InventoryItem inventoryItem = inventoryItemRepository.selectById(schemesImeisModel.getInventoryItemId());
|
| 1286 |
List<Scheme> schemes = schemeRepository.selectBySchemeIds(schemeIds);
|
1235 |
List<Scheme> schemes = schemeRepository.selectBySchemeIds(schemeIds);
|
| 1287 |
List<Scheme> supportSchemes = schemes.stream().filter(x -> Arrays.asList(SchemeType.SPECIAL_SUPPORT, SchemeType.ACTIVATION).contains(x.getType())).collect(Collectors.toList());
|
1236 |
List<Scheme> supportSchemes = schemes.stream().filter(x -> Arrays.asList(SchemeType.SPECIAL_SUPPORT, SchemeType.ACTIVATION).contains(x.getType())).collect(Collectors.toList());
|
| 1288 |
if (supportSchemes.size() > 0) {
|
1237 |
if (supportSchemes.size() > 0) {
|
| 1289 |
FofoOrder fofoOrder = validOrdersMap.get(schemesImeisModel.getOrderId());
|
1238 |
List<SchemeSummaryModel> schemeSummaryModels = new ArrayList<>();
|
| - |
|
1239 |
for (Scheme scheme : supportSchemes) {
|
| 1290 |
PartnerType partnerType = partnerTypeChangeService.getTypeOnMonth(fofoOrder.getFofoId(),
|
1240 |
List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByScheme(scheme.getId(), inventoryItem.getId());
|
| - |
|
1241 |
if(schemeInOuts.stream().filter(x->Arrays.asList(SchemePayoutStatus.CREDITED, SchemePayoutStatus.PENDING).contains(x.getStatus())).count() > 0) {
|
| - |
|
1242 |
continue;
|
| - |
|
1243 |
}
|
| - |
|
1244 |
SchemeInOut sio = new SchemeInOut();
|
| - |
|
1245 |
sio.setAmount(0);
|
| 1291 |
YearMonth.from(fofoOrder.getCreateTimestamp()));
|
1246 |
sio.setInventoryItemId(inventoryItem.getId());
|
| - |
|
1247 |
sio.setSchemeId(scheme.getId());
|
| 1292 |
this.processSpecialSupport(fofoOrder, supportSchemes, inventoryItem, partnerType, fofoOrder.getCreateTimestamp());
|
1248 |
sio.setStatusDescription("Activation pending for IMEI#" + inventoryItem.getSerialNumber());
|
| - |
|
1249 |
sio.setStatus(SchemePayoutStatus.PENDING);
|
| - |
|
1250 |
schemeInOutRepository.persist(sio);
|
| - |
|
1251 |
}
|
| 1293 |
}
|
1252 |
}
|
| 1294 |
}
|
1253 |
}
|
| 1295 |
}
|
1254 |
}
|
| 1296 |
}
|
1255 |
}
|