Subversion Repositories SmartDukaan

Rev

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

Rev 32155 Rev 32165
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
}