Subversion Repositories SmartDukaan

Rev

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

Rev 34254 Rev 34317
Line 16... Line 16...
16
import com.spice.profitmandi.dao.entity.transaction.PriceDrop;
16
import com.spice.profitmandi.dao.entity.transaction.PriceDrop;
17
import com.spice.profitmandi.dao.entity.transaction.UserWallet;
17
import com.spice.profitmandi.dao.entity.transaction.UserWallet;
18
import com.spice.profitmandi.dao.entity.transaction.UserWalletHistory;
18
import com.spice.profitmandi.dao.entity.transaction.UserWalletHistory;
19
import com.spice.profitmandi.dao.enumuration.catalog.AmountType;
19
import com.spice.profitmandi.dao.enumuration.catalog.AmountType;
20
import com.spice.profitmandi.dao.enumuration.catalog.SchemeType;
20
import com.spice.profitmandi.dao.enumuration.catalog.SchemeType;
-
 
21
import com.spice.profitmandi.dao.enumuration.catalog.StockTransactionType;
21
import com.spice.profitmandi.dao.enumuration.fofo.ScanType;
22
import com.spice.profitmandi.dao.enumuration.fofo.ScanType;
22
import com.spice.profitmandi.dao.enumuration.transaction.SchemePayoutStatus;
23
import com.spice.profitmandi.dao.enumuration.transaction.SchemePayoutStatus;
23
import com.spice.profitmandi.dao.model.AmountModel;
24
import com.spice.profitmandi.dao.model.AmountModel;
24
import com.spice.profitmandi.dao.model.CreateSchemeRequest;
25
import com.spice.profitmandi.dao.model.CreateSchemeRequest;
25
import com.spice.profitmandi.dao.model.DateRangeModel;
-
 
26
import com.spice.profitmandi.dao.repository.catalog.*;
26
import com.spice.profitmandi.dao.repository.catalog.*;
27
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
27
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
28
import com.spice.profitmandi.dao.repository.dtr.RetailerRepository;
28
import com.spice.profitmandi.dao.repository.dtr.RetailerRepository;
29
import com.spice.profitmandi.dao.repository.fofo.*;
29
import com.spice.profitmandi.dao.repository.fofo.*;
30
import com.spice.profitmandi.dao.repository.transaction.PriceDropRepository;
30
import com.spice.profitmandi.dao.repository.transaction.PriceDropRepository;
Line 91... Line 91...
91
//                    "864562072802477", "864562072801651", "864562072801917", "864288066786274", "864562070789478", "864562070785930", "864562070788330", "864179066116929", "864470060972569", "867492065820095",
91
//                    "864562072802477", "864562072801651", "864562072801917", "864288066786274", "864562070789478", "864562070785930", "864562070788330", "864179066116929", "864470060972569", "867492065820095",
92
//                    "867940069618279", "863718065007331", "863718065001417", "860948069657616", "860948069562733", "860948069563939", "860948068569838", "860948068569598", "860948067443092", "860948067442912",
92
//                    "867940069618279", "863718065007331", "863718065001417", "860948069657616", "860948069562733", "860948069563939", "860948068569838", "860948068569598", "860948067443092", "860948067442912",
93
//                    "860948067442573", "860948069561750", "860948069561479", "860948069561974", "860948069562550", "860948069560679", "860948069560190", "860948069562691", "860948069735859"
93
//                    "860948067442573", "860948069561750", "860948069561479", "860948069561974", "860948069562550", "860948069560679", "860948069560190", "860948069562691", "860948069735859"
94
//    );
94
//    );
95
 
95
 
96
    private static final List<SchemeType> ACTIVATION_SCHEME_TYPES = Arrays.asList(SchemeType.ACTIVATION, SchemeType.SPECIAL_SUPPORT, SchemeType.SELLOUT);
96
    private static final List<SchemeType> ACTIVATION_SCHEME_TYPES = Arrays.asList(SchemeType.SPECIAL_SUPPORT, SchemeType.SELLOUT);
97
 
97
 
98
    @Autowired
98
    @Autowired
99
    SchemeBlockedImeiRepository schemeBlockedImeiRepository;
99
    SchemeBlockedImeiRepository schemeBlockedImeiRepository;
100
    @Autowired
100
    @Autowired
101
    StateGstRateRepository stateGstRateRepository;
101
    StateGstRateRepository stateGstRateRepository;
Line 169... Line 169...
169
        schemeRepository.persist(scheme);
169
        schemeRepository.persist(scheme);
170
        for (int catalogId : createSchemeRequest.getCatalogIds()) {
170
        for (int catalogId : createSchemeRequest.getCatalogIds()) {
171
            SchemeItem schemeItem = new SchemeItem();
171
            SchemeItem schemeItem = new SchemeItem();
172
            schemeItem.setSchemeId(scheme.getId());
172
            schemeItem.setSchemeId(scheme.getId());
173
            schemeItem.setCatalogId(catalogId);
173
            schemeItem.setCatalogId(catalogId);
-
 
174
            schemeItem.setStartDate(createSchemeRequest.getStartDate());
-
 
175
            schemeItem.setEndDate(createSchemeRequest.getEndDate());
174
            schemeItemRepository.persist(schemeItem);
176
            schemeItemRepository.persist(schemeItem);
175
        }
177
        }
176
 
178
 
177
        for (int regionId : createSchemeRequest.getRegionIds()) {
179
        for (int regionId : createSchemeRequest.getRegionIds()) {
178
            SchemeRegion schemeRegion = new SchemeRegion();
180
            SchemeRegion schemeRegion = new SchemeRegion();
Line 432... Line 434...
432
    @Autowired
434
    @Autowired
433
    OfferPayoutRepository offerPayoutRepository;
435
    OfferPayoutRepository offerPayoutRepository;
434
    @Autowired
436
    @Autowired
435
    AgeingService ageingService;
437
    AgeingService ageingService;
436
 
438
 
437
 
-
 
438
    public void processSchemeIn(int purchaseId, int retailerId) throws ProfitMandiBusinessException {
439
    public void processSchemeIn(int purchaseId, int retailerId) throws ProfitMandiBusinessException {
439
        LOGGER.info("Processing scheme in  for purchaseId - {}", purchaseId);
440
        LOGGER.info("Processing scheme in  for purchaseId - {}", purchaseId);
440
        Purchase purchase = purchaseRepository.selectByIdAndFofoId(purchaseId, retailerId);
441
        Purchase purchase = purchaseRepository.selectByIdAndFofoId(purchaseId, retailerId);
441
        List<InventoryItem> inventoryItems = inventoryItemRepository.selectByPurchaseId(purchaseId);
-
 
442
        processSchemeIn(purchase, inventoryItems);
-
 
443
 
-
 
444
    }
-
 
445
 
-
 
446
    private void processSchemeIn(Purchase purchase, List<InventoryItem> inventoryItems) throws ProfitMandiBusinessException {
-
 
447
        if (inventoryItems.stream().filter(x -> x.getPurchaseId() != purchase.getId()).collect(Collectors.toList()).size() > 0) {
-
 
448
            throw new ProfitMandiBusinessException("", "Invalid purchase id for inventory item", "SCHM_1009");
-
 
449
        }
-
 
450
        PartnerType partnerType = partnerTypeChangeService.getTypeOnMonth(purchase.getFofoId(),
442
        PartnerType partnerType = partnerTypeChangeService.getTypeOnMonth(retailerId,
451
                YearMonth.from(purchase.getCreateTimestamp()));
443
                YearMonth.from(purchase.getCreateTimestamp()));
-
 
444
        List<InventoryItem> inventoryItems = inventoryItemRepository.selectByPurchaseId(purchaseId);
452
        //Remove imeis from blocked imeis list
445
        //Remove imeis from blocked imeis list
453
        List<String> blocked_imeis = this.getBlockedImeis();
446
        List<String> blockedImeis = this.getBlockedImeis();
454
        inventoryItems = inventoryItems.stream().filter(inventoryItem -> !blocked_imeis.contains(inventoryItem.getSerialNumber())).collect(Collectors.toList());
447
        inventoryItems = inventoryItems.stream().filter(inventoryItem -> !blockedImeis.contains(inventoryItem.getSerialNumber())).collect(Collectors.toList());
455
        if (inventoryItems.size() == 0) return;
448
        if (inventoryItems.size() == 0) return;
456
 
449
 
457
        Set<Integer> itemIds = inventoryItems.stream().map(x -> x.getItemId()).collect(Collectors.toSet());
450
        Set<Integer> itemIds = inventoryItems.stream().map(x -> x.getItemId()).collect(Collectors.toSet());
458
        Map<Integer, Item> itemsMap = itemRepository.selectByIds(itemIds).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
451
        Map<Integer, Item> itemsMap = itemRepository.selectByIds(itemIds).stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
459
        inventoryItems.stream().forEach(x -> x.setItem(itemsMap.get(x.getItemId())));
452
        inventoryItems.stream().forEach(x -> x.setItem(itemsMap.get(x.getItemId())));
460
 
453
 
461
 
454
 
462
        LocalDateTime billingDate = purchaseService.getBillingDateOfPurchase(purchase.getId());
455
        LocalDateTime billingDate = purchaseService.getBillingDateOfPurchase(purchaseId);
463
        Set<Integer> itemIdsSet = tagListingRepository.selectByItemIdsAndTagIds(itemIds, tagIds).stream()
456
        Set<Integer> itemIdsSet = tagListingRepository.selectByItemIdsAndTagIds(itemIds, tagIds).stream()
464
                .filter(x -> x.getEolDate() == null || x.getEolDate().isAfter(billingDate)).map(x -> x.getItemId())
457
                .filter(x -> x.getEolDate() == null || x.getEolDate().isAfter(billingDate)).map(x -> x.getItemId())
465
                .collect(Collectors.toSet());
458
                .collect(Collectors.toSet());
466
        // Only consider inventory items that were not returned and not eol
459
        // Only consider inventory items that were not returned and not eol
467
        inventoryItems = inventoryItems.stream().filter(x -> itemIdsSet.contains(x.getItemId()))
460
        inventoryItems = inventoryItems.stream().filter(x -> itemIdsSet.contains(x.getItemId()))
Line 469... Line 462...
469
                .filter(x -> !x.getLastScanType().equals(ScanType.PURCHASE_RET)).collect(Collectors.toList());
462
                .filter(x -> !x.getLastScanType().equals(ScanType.PURCHASE_RET)).collect(Collectors.toList());
470
 
463
 
471
        if (inventoryItems.size() == 0) return;
464
        if (inventoryItems.size() == 0) return;
472
 
465
 
473
        Map<Integer, List<InventoryItem>> catalogInventoryItemMap = inventoryItems.stream().collect(Collectors.groupingBy(x -> x.getItem().getCatalogItemId()));
466
        Map<Integer, List<InventoryItem>> catalogInventoryItemMap = inventoryItems.stream().collect(Collectors.groupingBy(x -> x.getItem().getCatalogItemId()));
474
        Map<CatalogSummaryModel, List<SchemeSummaryModel>> catalogSchemeSummaryMap = tagListingRepository.getModelSchemesByCatalogIdsAndType(purchase.getFofoId(),
467
        Map<CatalogSummaryModel, List<SchemeSummaryModel>> catalogSchemeSummaryMap = tagListingRepository.getModelSchemesByCatalogIdsAndType(retailerId,
475
                partnerType, new ArrayList<>(catalogInventoryItemMap.keySet()), billingDate);
468
                partnerType, new ArrayList<>(catalogInventoryItemMap.keySet()), billingDate);
476
 
469
 
477
 
470
 
478
        int itemsCount = 0;
471
        int itemsCount = 0;
479
        float totalCashback = 0;
472
        float totalCashback = 0;
480
        for (Map.Entry<CatalogSummaryModel, List<SchemeSummaryModel>> catalogSummaryModelListEntry : catalogSchemeSummaryMap.entrySet()) {
473
        for (Map.Entry<CatalogSummaryModel, List<SchemeSummaryModel>> catalogSummaryModelListEntry : catalogSchemeSummaryMap.entrySet()) {
481
            CatalogSummaryModel catalogSummaryModel = catalogSummaryModelListEntry.getKey();
474
            CatalogSummaryModel catalogSummaryModel = catalogSummaryModelListEntry.getKey();
482
            List<SchemeSummaryModel> schemeSummaryModels = catalogSummaryModelListEntry.getValue().stream().filter(x -> x != null).collect(Collectors.toList());
475
            List<SchemeSummaryModel> schemeSummaryModels = catalogSummaryModelListEntry.getValue().stream().filter(x -> x != null).collect(Collectors.toList());
483
            schemeSummaryModels.stream().filter(x -> x != null && x.getSchemeType().equals(SchemeType.IN)).forEach(x -> x.setProcess(true));
476
            schemeSummaryModels.stream().filter(x -> x != null && x.getSchemeType().getTransactionType().equals(StockTransactionType.IN)).forEach(x -> x.setProcess(true));
484
            if (schemeSummaryModels.stream().filter(x -> x.isProcess()).count() == 0) continue;
477
            if (schemeSummaryModels.stream().filter(x -> x.isProcess()).count() == 0) continue;
485
            List<InventoryItem> modelInventoryItems = catalogInventoryItemMap.get(catalogSummaryModel.getCatalogId());
478
            List<InventoryItem> modelInventoryItems = catalogInventoryItemMap.get(catalogSummaryModel.getCatalogId());
486
            for (InventoryItem inventoryItem : modelInventoryItems) {
479
            for (InventoryItem inventoryItem : modelInventoryItems) {
487
                float inventoryItemCashback = this.createSchemeInOut(schemeSummaryModels, inventoryItem);
480
                float inventoryItemCashback = this.createSchemeInOut(schemeSummaryModels, inventoryItem);
488
                if (inventoryItemCashback > 0) {
481
                if (inventoryItemCashback > 0) {
Line 491... Line 484...
491
                }
484
                }
492
            }
485
            }
493
        }
486
        }
494
 
487
 
495
 
488
 
496
        LOGGER.info("Items count for purchase id {} is {}", purchase.getId(), itemsCount);
489
        LOGGER.info("Items count for purchase id {} is {}", purchaseId, itemsCount);
497
        if (itemsCount > 0) {
490
        if (itemsCount > 0) {
498
            walletService.addAmountToWallet(
491
            walletService.addAmountToWallet(
499
                    purchase.getFofoId(), purchase.getId(), WalletReferenceType.SCHEME_IN, "Added for SCHEME IN against invoice "
492
                    retailerId, purchaseId, WalletReferenceType.SCHEME_IN, "Added for SCHEME IN against invoice "
500
                            + purchase.getPurchaseReference() + " (total " + itemsCount + " pcs)",
493
                            + purchase.getPurchaseReference() + " (total " + itemsCount + " pcs)",
501
                    totalCashback, purchase.getCreateTimestamp());
494
                    totalCashback, purchase.getCreateTimestamp());
502
            LOGGER.info("Added Rs.{} for SCHEME IN against invoice {} total pcs({}) {}", totalCashback,
495
            LOGGER.info("Added Rs.{} for SCHEME IN against invoice {} total pcs({}) {}", totalCashback,
503
                    purchase.getPurchaseReference(), itemsCount);
496
                    purchase.getPurchaseReference(), itemsCount);
504
        }
497
        }
-
 
498
 
505
    }
499
    }
506
 
500
 
507
 
501
 
508
    // We are maintaining price drop after grn
502
    // We are maintaining price drop after grn
509
    private float getAmount(InventoryItem inventoryItem, Scheme scheme) throws ProfitMandiBusinessException {
503
    private float getAmount(InventoryItem inventoryItem, Scheme scheme) throws ProfitMandiBusinessException {
Line 514... Line 508...
514
        float dpForCalc = 0;
508
        float dpForCalc = 0;
515
        float taxableSellingPrice = 0;
509
        float taxableSellingPrice = 0;
516
 
510
 
517
        //float totalTaxRate = stateGstRateRepository.getTotalTaxRate(inventoryItem.getItemId());
511
        //float totalTaxRate = stateGstRateRepository.getTotalTaxRate(inventoryItem.getItemId());
518
        if (scheme.getAmountType().equals(AmountType.PERCENTAGE)) {
512
        if (scheme.getAmountType().equals(AmountType.PERCENTAGE)) {
519
            if (scheme.getType().equals(SchemeType.IN)) {
513
            if (scheme.getType().getTransactionType().equals(StockTransactionType.IN)) {
520
                dpForCalc = inventoryItem.getUnitPrice() - inventoryItem.getPriceDropAmount();
514
                dpForCalc = inventoryItem.getUnitPrice() - inventoryItem.getPriceDropAmount();
521
            } else {
515
            } else {
522
                try {
516
                try {
523
                    dpForCalc = Math.min(inventoryItem.getUnitPrice() - inventoryItem.getPriceDropAmount(),
517
                    dpForCalc = Math.min(inventoryItem.getUnitPrice() - inventoryItem.getPriceDropAmount(),
524
                            tagListingRepository.selectByItemId(inventoryItem.getItemId()).getSellingPrice());
518
                            tagListingRepository.selectByItemId(inventoryItem.getItemId()).getSellingPrice());
Line 533... Line 527...
533
            amount = dpForCalc * scheme.getAmount() / 100;
527
            amount = dpForCalc * scheme.getAmount() / 100;
534
            System.out.println(String.format("%d\t%s\t%d\t%d\t%s\t%s\t%s\t%s\t%f\t%f\t%f\t%f", inventoryItem.getId(),
528
            System.out.println(String.format("%d\t%s\t%d\t%d\t%s\t%s\t%s\t%s\t%f\t%f\t%f\t%f", inventoryItem.getId(),
535
                    inventoryItem.getSerialNumber(), inventoryItem.getItemId(), scheme.getId(), scheme.getName(),
529
                    inventoryItem.getSerialNumber(), inventoryItem.getItemId(), scheme.getId(), scheme.getName(),
536
                    scheme.getType(), scheme.getAmountType(), scheme.getPartnerType(), dpForCalc, taxableSellingPrice,
530
                    scheme.getType(), scheme.getAmountType(), scheme.getPartnerType(), dpForCalc, taxableSellingPrice,
537
                    scheme.getAmount(), amount));
531
                    scheme.getAmount(), amount));
538
        } else if (scheme.getType().equals(SchemeType.IN)) {
532
        } else if (scheme.getType().getTransactionType().equals(StockTransactionType.IN)) {
539
            amount = scheme.getAmount();
533
            amount = scheme.getAmount();
540
        }
534
        }
541
        return amount;
535
        return amount;
542
    }
536
    }
543
 
537
 
544
    //Only in and activation margins are allowed to be rolled out more than twice
538
    //Only in and activation margins are allowed to be rolled out more than twice
545
    private float createSchemeInOut(List<SchemeSummaryModel> schemeSummaryModels, InventoryItem inventoryItem) throws ProfitMandiBusinessException {
539
    private float createSchemeInOut(List<SchemeSummaryModel> schemeSummaryModels, InventoryItem inventoryItem) throws ProfitMandiBusinessException {
546
        LOGGER.info("schemeSummaryModels - {}", schemeSummaryModels);
540
        LOGGER.info("schemeSummaryModels - {}", schemeSummaryModels);
547
        InventoryPayoutModel inventoryPayoutModel = priceCircularService.getPayouts(inventoryItem);
541
        InventoryPayoutModel inventoryPayoutModel = priceCircularService.getPayouts(inventoryItem);
548
 
-
 
549
        LOGGER.info("inventoryPayoutModel - {}", inventoryPayoutModel);
-
 
550
 
-
 
551
        //Get all schemes
542
        //Get all schemes
552
        List<SchemeSummaryModel> inventoryPayoutModelToProcess = schemeSummaryModels.stream().filter(x -> x.isProcess()).collect(Collectors.toList());
543
        List<SchemeSummaryModel> inventoryPayoutModelToProcess = schemeSummaryModels.stream().filter(x -> x.isProcess()).collect(Collectors.toList());
553
 
544
 
554
        List<SchemeInOut> paidSios = inventoryPayoutModel.getPaidSios();
545
        List<SchemeInOut> paidSios = inventoryPayoutModel.getPaidSios();
555
        List<SchemeInOut> pendingSios = inventoryPayoutModel.getPendingSios();
546
        List<SchemeInOut> pendingSios = inventoryPayoutModel.getPendingSios();
Line 563... Line 554...
563
        Map<SchemeSummaryModel, AmountModel> payoutSchemeSummaryModelMap = new HashMap<>();
554
        Map<SchemeSummaryModel, AmountModel> payoutSchemeSummaryModelMap = new HashMap<>();
564
        for (SchemeSummaryModel schemeSummaryModelToProcess : inventoryPayoutModelToProcess) {
555
        for (SchemeSummaryModel schemeSummaryModelToProcess : inventoryPayoutModelToProcess) {
565
            if (paidSchemesMap.containsKey(schemeSummaryModelToProcess.getSchemeId()) || pendingSchemesMap.containsKey(schemeSummaryModelToProcess.getSchemeId()))
556
            if (paidSchemesMap.containsKey(schemeSummaryModelToProcess.getSchemeId()) || pendingSchemesMap.containsKey(schemeSummaryModelToProcess.getSchemeId()))
566
                continue;
557
                continue;
567
            //If different type but on higher side provide the higher margin
558
            //If different type but on higher side provide the higher margin
568
            if (Arrays.asList(SchemeType.ACTIVATION, SchemeType.SPECIAL_SUPPORT).contains(schemeSummaryModelToProcess.getSchemeType())) {
559
            if (Arrays.asList(SchemeType.SPECIAL_SUPPORT).contains(schemeSummaryModelToProcess.getSchemeType())) {
569
                Scheme scheme = schemeRepository.selectById(schemeSummaryModelToProcess.getSchemeId());
560
                Scheme scheme = schemeRepository.selectById(schemeSummaryModelToProcess.getSchemeId());
570
                //Create only if the activation if the activation date is not known
561
                //Create only if the activation if the activation date is not known
571
                ActivatedImei activatedImei = activatedImeiRepository.selectBySerialNumber(inventoryItem.getSerialNumber());
562
                ActivatedImei activatedImei = activatedImeiRepository.selectBySerialNumber(inventoryItem.getSerialNumber());
572
                if (activatedImei == null || activatedImei.getActivationTimestamp() == null) {
563
                if (activatedImei == null || activatedImei.getActivationTimestamp() == null) {
573
                    SchemeInOut sio = new SchemeInOut();
564
                    SchemeInOut sio = new SchemeInOut();
Line 576... Line 567...
576
                    sio.setSchemeId(schemeSummaryModelToProcess.getSchemeId());
567
                    sio.setSchemeId(schemeSummaryModelToProcess.getSchemeId());
577
                    sio.setStatusDescription("Activation pending for IMEI#" + inventoryItem.getSerialNumber());
568
                    sio.setStatusDescription("Activation pending for IMEI#" + inventoryItem.getSerialNumber());
578
                    sio.setStatus(SchemePayoutStatus.PENDING);
569
                    sio.setStatus(SchemePayoutStatus.PENDING);
579
                    schemeInOutRepository.persist(sio);
570
                    schemeInOutRepository.persist(sio);
580
                }
571
                }
581
            } else if (!SchemeType.IN.equals(schemeSummaryModelToProcess.getSchemeType())) {
572
            } else if (!StockTransactionType.IN.equals(schemeSummaryModelToProcess.getSchemeType().getTransactionType())) {
582
                //We have got non repeating scheme type
573
                //We have got non repeating scheme type
583
                if (paidSchemeTypesMap.containsKey(schemeSummaryModelToProcess.getSchemeType())) {
574
                if (paidSchemeTypesMap.containsKey(schemeSummaryModelToProcess.getSchemeType())) {
584
                    SchemeInOut sio = paidSchemeTypesMap.get(schemeSummaryModelToProcess.getSchemeType()).get(0);
575
                    SchemeInOut sio = paidSchemeTypesMap.get(schemeSummaryModelToProcess.getSchemeType()).get(0);
585
                    Scheme paidScheme = sio.getScheme();
576
                    Scheme paidScheme = sio.getScheme();
586
                    //Don't entertain if amount types do not match for same type
577
                    //Don't entertain if amount types do not match for same type
Line 625... Line 616...
625
                    sio.setSchemeId(schemeSummaryModel.getSchemeId());
616
                    sio.setSchemeId(schemeSummaryModel.getSchemeId());
626
                    sio.setInventoryItemId(inventoryItem.getId());
617
                    sio.setInventoryItemId(inventoryItem.getId());
627
                    sio.setStatus(SchemePayoutStatus.CREDITED);
618
                    sio.setStatus(SchemePayoutStatus.CREDITED);
628
                    sio.setCreditTimestamp(LocalDateTime.now());
619
                    sio.setCreditTimestamp(LocalDateTime.now());
629
                    sio.setAmount((float) (fixedRollout * amountModel.getAmount() / fixedToPay) + schemeTypeCancelledAmountMap.getOrDefault(schemeSummaryModel.getSchemeType(), 0f));
620
                    sio.setAmount((float) (fixedRollout * amountModel.getAmount() / fixedToPay) + schemeTypeCancelledAmountMap.getOrDefault(schemeSummaryModel.getSchemeType(), 0f));
630
                    if (schemeSummaryModel.getSchemeType().equals(SchemeType.IN))
621
                    if (schemeSummaryModel.getSchemeType().getTransactionType().equals(StockTransactionType.IN))
631
                        sio.setStatusDescription("Credited for GRN of IMEI-" + inventoryItem.getSerialNumber());
622
                        sio.setStatusDescription("Credited for GRN of IMEI-" + inventoryItem.getSerialNumber());
632
                    else
623
                    else
633
                        sio.setStatusDescription("Credited for Sale of IMEI-" + inventoryItem.getSerialNumber());
624
                        sio.setStatusDescription("Credited for Sale of IMEI-" + inventoryItem.getSerialNumber());
634
                    schemeInOutRepository.persist(sio);
625
                    schemeInOutRepository.persist(sio);
635
                }
626
                }
Line 651... Line 642...
651
                    sio.setSchemeId(schemeSummaryModel.getSchemeId());
642
                    sio.setSchemeId(schemeSummaryModel.getSchemeId());
652
                    sio.setStatus(SchemePayoutStatus.CREDITED);
643
                    sio.setStatus(SchemePayoutStatus.CREDITED);
653
                    sio.setCreditTimestamp(LocalDateTime.now());
644
                    sio.setCreditTimestamp(LocalDateTime.now());
654
                    sio.setAmount((float) (percentageRollout * amountModel.getAmount() / percentageToPay) +
645
                    sio.setAmount((float) (percentageRollout * amountModel.getAmount() / percentageToPay) +
655
                            schemeTypeCancelledAmountMap.getOrDefault(schemeSummaryModel.getSchemeType(), 0f));
646
                            schemeTypeCancelledAmountMap.getOrDefault(schemeSummaryModel.getSchemeType(), 0f));
656
                    if (schemeSummaryModel.getSchemeType().equals(SchemeType.IN))
647
                    if (schemeSummaryModel.getSchemeType().getTransactionType().equals(StockTransactionType.IN))
657
                        sio.setStatusDescription("Credited for GRN of IMEI-" + inventoryItem.getSerialNumber());
648
                        sio.setStatusDescription("Credited for GRN of IMEI-" + inventoryItem.getSerialNumber());
658
                    else
649
                    else
659
                        sio.setStatusDescription("Credited for Sale of IMEI-" + inventoryItem.getSerialNumber());
650
                        sio.setStatusDescription("Credited for Sale of IMEI-" + inventoryItem.getSerialNumber());
660
                    schemeInOutRepository.persist(sio);
651
                    schemeInOutRepository.persist(sio);
661
                }
652
                }
Line 740... Line 731...
740
 
731
 
741
            Map<Integer, List<InventoryItem>> catalogInventoryItemMap = inventoryItems.stream().collect(Collectors.groupingBy(x -> x.getItem().getCatalogItemId()));
732
            Map<Integer, List<InventoryItem>> catalogInventoryItemMap = inventoryItems.stream().collect(Collectors.groupingBy(x -> x.getItem().getCatalogItemId()));
742
            Map<CatalogSummaryModel, List<SchemeSummaryModel>> catalogSchemeSummaryMap = tagListingRepository.getModelSchemesByCatalogIdsAndType(retailerId,
733
            Map<CatalogSummaryModel, List<SchemeSummaryModel>> catalogSchemeSummaryMap = tagListingRepository.getModelSchemesByCatalogIdsAndType(retailerId,
743
                    partnerType, new ArrayList<>(catalogInventoryItemMap.keySet()), fofoOrder.getCreateTimestamp());
734
                    partnerType, new ArrayList<>(catalogInventoryItemMap.keySet()), fofoOrder.getCreateTimestamp());
744
 
735
 
-
 
736
            LOGGER.info("catalogSchemeSummaryMap - {}", catalogSchemeSummaryMap);
-
 
737
 
745
 
738
 
746
            int count = 0;
739
            int count = 0;
747
            for (Map.Entry<CatalogSummaryModel, List<SchemeSummaryModel>> catalogSummaryModelListEntry : catalogSchemeSummaryMap.entrySet()) {
740
            for (Map.Entry<CatalogSummaryModel, List<SchemeSummaryModel>> catalogSummaryModelListEntry : catalogSchemeSummaryMap.entrySet()) {
748
                CatalogSummaryModel catalogSummaryModel = catalogSummaryModelListEntry.getKey();
741
                CatalogSummaryModel catalogSummaryModel = catalogSummaryModelListEntry.getKey();
749
                List<SchemeSummaryModel> schemeSummaryModels = catalogSummaryModelListEntry.getValue().stream().filter(x -> x != null).collect(Collectors.toList());
742
                List<SchemeSummaryModel> schemeSummaryModels = catalogSummaryModelListEntry.getValue().stream().filter(x -> x != null).collect(Collectors.toList());
750
                List<SchemeType> allOutSchemeTypes = new ArrayList<>();
-
 
751
                allOutSchemeTypes.addAll(Arrays.asList(SchemeType.ACTIVATION, SchemeType.INVESTMENT, SchemeType.SPECIAL_SUPPORT, SchemeType.SELLOUT));
-
 
752
                allOutSchemeTypes.addAll(OUT_SCHEME_TYPES);
-
 
-
 
743
 
753
                schemeSummaryModels.stream().filter(x -> allOutSchemeTypes.contains(x.getSchemeType())).forEach(x -> x.setProcess(true));
744
                schemeSummaryModels.stream().filter(x -> x.getSchemeType().getTransactionType().equals(StockTransactionType.OUT)).forEach(x -> x.setProcess(true));
754
                if (schemeSummaryModels.stream().filter(x -> x.isProcess()).count() == 0) continue;
745
                if (schemeSummaryModels.stream().filter(x -> x.isProcess()).count() == 0) continue;
755
 
746
 
756
                List<InventoryItem> modelInventoryItems = catalogInventoryItemMap.get(catalogSummaryModel.getCatalogId());
747
                List<InventoryItem> modelInventoryItems = catalogInventoryItemMap.get(catalogSummaryModel.getCatalogId());
757
                for (InventoryItem inventoryItem : modelInventoryItems) {
748
                for (InventoryItem inventoryItem : modelInventoryItems) {
758
                    float inventoryItemCashback = this.createSchemeInOut(schemeSummaryModels, inventoryItem);
749
                    float inventoryItemCashback = this.createSchemeInOut(schemeSummaryModels, inventoryItem);
Line 811... Line 802...
811
            int inventoryItemId = schemeInOut.getInventoryItemId();
802
            int inventoryItemId = schemeInOut.getInventoryItemId();
812
            if (schemeInOut.getRolledBackTimestamp() == null) {
803
            if (schemeInOut.getRolledBackTimestamp() == null) {
813
                schemeInOut.setRolledBackTimestamp(LocalDateTime.now());
804
                schemeInOut.setRolledBackTimestamp(LocalDateTime.now());
814
                if (schemeInOut.getStatus() == null || schemeInOut.getStatus().equals(SchemePayoutStatus.CREDITED)) {
805
                if (schemeInOut.getStatus() == null || schemeInOut.getStatus().equals(SchemePayoutStatus.CREDITED)) {
815
                    Scheme scheme = schemesMap.get(schemeInOut.getSchemeId());
806
                    Scheme scheme = schemesMap.get(schemeInOut.getSchemeId());
816
                    if (scheme.getType().equals(SchemeType.IN)) {
807
                    if (scheme.getType().getTransactionType().equals(StockTransactionType.IN)) {
817
                        schemePayoutMap = inSchemesMap;
808
                        schemePayoutMap = inSchemesMap;
818
                    } else {
809
                    } else {
819
                        schemePayoutMap = outSchemesMap;
810
                        schemePayoutMap = outSchemesMap;
820
                    }
811
                    }
821
                    if (!schemePayoutMap.containsKey(inventoryItemId)) {
812
                    if (!schemePayoutMap.containsKey(inventoryItemId)) {
Line 905... Line 896...
905
                InventoryItem ii = inventoryItemsMap.get(schemeInOut.getInventoryItemId());
896
                InventoryItem ii = inventoryItemsMap.get(schemeInOut.getInventoryItemId());
906
                Scheme scheme = schemesMap.get(schemeInOut.getSchemeId());
897
                Scheme scheme = schemesMap.get(schemeInOut.getSchemeId());
907
                if (scheme.getAmountType().equals(AmountType.FIXED)) {
898
                if (scheme.getAmountType().equals(AmountType.FIXED)) {
908
                    continue;
899
                    continue;
909
                }
900
                }
910
                if (scheme.getType().equals(SchemeType.IN) && schemeInOut.getRolledBackTimestamp() == null) {
901
                if (scheme.getType().getTransactionType().equals(StockTransactionType.IN) && schemeInOut.getRolledBackTimestamp() == null) {
911
                    schemeInOut.setRolledBackTimestamp(LocalDateTime.now());
902
                    schemeInOut.setRolledBackTimestamp(LocalDateTime.now());
912
                    schemeInOut.setStatus(SchemePayoutStatus.REJECTED);
903
                    schemeInOut.setStatus(SchemePayoutStatus.REJECTED);
913
                    schemeInOut.setStatusDescription("Margin reversed due to price drop");
904
                    schemeInOut.setStatusDescription("Margin reversed due to price drop");
914
                    // IF not credited then dont consider any credit/debit for that sio entry
905
                    // IF not credited then dont consider any credit/debit for that sio entry
915
                    if (schemeInOut.getCreditTimestamp() != null) {
906
                    if (schemeInOut.getCreditTimestamp() != null) {
Line 977... Line 968...
977
                }
968
                }
978
            }
969
            }
979
        }
970
        }
980
 
971
 
981
        int fofoId = inventoryItems.get(0).getFofoId();
972
        int fofoId = inventoryItems.get(0).getFofoId();
-
 
973
        WalletReferenceType walletReferenceType = WalletReferenceType.ACTIVATION_SCHEME;
-
 
974
 
982
        WalletReferenceType walletReferenceType = schemeTypes.containsAll(SchemeService.OUT_SCHEME_TYPES) ? WalletReferenceType.SCHEME_OUT
975
                /*schemeTypes.containsAll(SchemeService.OUT_SCHEME_TYPES) ? WalletReferenceType.SCHEME_OUT
983
                : schemeTypes.contains(SchemeType.ACTIVATION) ? WalletReferenceType.ACTIVATION_SCHEME
976
                : schemeTypes.contains(SchemeType.ACTIVATION) ? WalletReferenceType.ACTIVATION_SCHEME
984
                : schemeTypes.contains(SchemeType.SPECIAL_SUPPORT) ? WalletReferenceType.SPECIAL_SUPPORT
977
                : schemeTypes.contains(SchemeType.SPECIAL_SUPPORT) ? WalletReferenceType.SPECIAL_SUPPORT
985
                : schemeTypes.contains(SchemeType.INVESTMENT) ? WalletReferenceType.SCHEME_OUT : null;
978
                : schemeTypes.contains(SchemeType.INVESTMENT) ? WalletReferenceType.SCHEME_OUT : null;*/
986
        List<UserWalletHistory> userWalletHistoryList = null;
979
        List<UserWalletHistory> userWalletHistoryList = null;
987
        if (amountToRollback > 0 && walletReferenceType != null) {
980
        if (amountToRollback > 0 && walletReferenceType != null) {
988
            // Mark appropriate reference of rollback investment margin
981
            // Mark appropriate reference of rollback investment margin
989
            if (schemeTypes.contains(SchemeType.INVESTMENT) && schemeTypeMap.containsKey(SchemeType.INVESTMENT)) {
982
            if (schemeTypes.contains(SchemeType.INVESTMENT) && schemeTypeMap.containsKey(SchemeType.INVESTMENT)) {
990
                LocalDateTime creditTime = schemeTypeMap.get(SchemeType.INVESTMENT).getCreditTimestamp();
983
                LocalDateTime creditTime = schemeTypeMap.get(SchemeType.INVESTMENT).getCreditTimestamp();
Line 1046... Line 1039...
1046
        for (Map.Entry<CatalogSummaryModel, List<SchemeSummaryModel>> catalogSummaryModelListEntry : catalogModelMap.entrySet()) {
1039
        for (Map.Entry<CatalogSummaryModel, List<SchemeSummaryModel>> catalogSummaryModelListEntry : catalogModelMap.entrySet()) {
1047
            int catalogItemId = catalogSummaryModelListEntry.getKey().getCatalogId();
1040
            int catalogItemId = catalogSummaryModelListEntry.getKey().getCatalogId();
1048
            List<SchemeSummaryModel> schemeSummaryModels = catalogSummaryModelListEntry.getValue();
1041
            List<SchemeSummaryModel> schemeSummaryModels = catalogSummaryModelListEntry.getValue();
1049
 
1042
 
1050
            float totalCashback = schemeSummaryModels.stream()
1043
            float totalCashback = schemeSummaryModels.stream()
1051
                    .filter(x -> Arrays.asList(SchemeType.ACTIVATION, SchemeType.SPECIAL_SUPPORT, SchemeType.SELLOUT).contains(x.getSchemeType())
1044
                    .filter(x -> Arrays.asList(SchemeType.SPECIAL_SUPPORT, SchemeType.SELLOUT).contains(x.getSchemeType())
1052
                            && x.getAmountType().equals(AmountType.FIXED))
1045
                            && x.getAmountType().equals(AmountType.FIXED))
1053
                    .collect(Collectors.summingDouble(x -> x.getAmount())).floatValue();
1046
                    .collect(Collectors.summingDouble(x -> x.getAmount())).floatValue();
1054
            catalogCashbackMap.put(catalogItemId, totalCashback);
1047
            catalogCashbackMap.put(catalogItemId, totalCashback);
1055
        }
1048
        }
1056
        return catalogCashbackMap;
1049
        return catalogCashbackMap;
Line 1075... Line 1068...
1075
 
1068
 
1076
    @Override
1069
    @Override
1077
    public void processSchemeIn(List<InventoryItem> inventoryItems) throws ProfitMandiBusinessException {
1070
    public void processSchemeIn(List<InventoryItem> inventoryItems) throws ProfitMandiBusinessException {
1078
        Map<Integer, List<InventoryItem>> purchaseIdInventoryItemsMap = inventoryItems.stream().collect(Collectors.groupingBy(x -> x.getPurchaseId()));
1071
        Map<Integer, List<InventoryItem>> purchaseIdInventoryItemsMap = inventoryItems.stream().collect(Collectors.groupingBy(x -> x.getPurchaseId()));
1079
        for (Map.Entry<Integer, List<InventoryItem>> purchaseIdInventoryItemEntry : purchaseIdInventoryItemsMap.entrySet()) {
1072
        for (Map.Entry<Integer, List<InventoryItem>> purchaseIdInventoryItemEntry : purchaseIdInventoryItemsMap.entrySet()) {
1080
            Purchase purchase = purchaseRepository.selectById(purchaseIdInventoryItemEntry.getKey());
1073
            int retailerId = purchaseIdInventoryItemEntry.getValue().get(0).getFofoId();
1081
            this.processSchemeIn(purchase, purchaseIdInventoryItemEntry.getValue());
1074
            this.processSchemeIn(purchaseIdInventoryItemEntry.getKey(), retailerId);
1082
        }
1075
        }
1083
    }
1076
    }
1084
 
1077
 
1085
    @Autowired
1078
    @Autowired
1086
    FofoStoreRepository fofoStoreRepository;
1079
    FofoStoreRepository fofoStoreRepository;
Line 1157... Line 1150...
1157
        Set<Integer> inventoryIds = new HashSet<>();
1150
        Set<Integer> inventoryIds = new HashSet<>();
1158
        for (SchemeInOut pendingPayout : pendingPayouts) {
1151
        for (SchemeInOut pendingPayout : pendingPayouts) {
1159
            schemeIds.add(pendingPayout.getSchemeId());
1152
            schemeIds.add(pendingPayout.getSchemeId());
1160
        }
1153
        }
1161
        Map<Integer, Scheme> schemesMap = schemeRepository.selectBySchemeIds(schemeIds, 0, 0).stream()
1154
        Map<Integer, Scheme> schemesMap = schemeRepository.selectBySchemeIds(schemeIds, 0, 0).stream()
1162
                .filter(x -> x.getType().equals(SchemeType.ACTIVATION) || x.getType().equals(SchemeType.SPECIAL_SUPPORT))
1155
                .filter(x -> x.getType().equals(SchemeType.SPECIAL_SUPPORT))
1163
                .collect(Collectors.toMap(x -> x.getId(), x -> x));
1156
                .collect(Collectors.toMap(x -> x.getId(), x -> x));
1164
        pendingPayouts = pendingPayouts.stream().filter(x -> schemesMap.get(x.getSchemeId()) != null)
1157
        pendingPayouts = pendingPayouts.stream().filter(x -> schemesMap.get(x.getSchemeId()) != null)
1165
                .collect(Collectors.toList());
1158
                .collect(Collectors.toList());
1166
 
1159
 
1167
        for (SchemeInOut pendingPayout : pendingPayouts) {
1160
        for (SchemeInOut pendingPayout : pendingPayouts) {
Line 1198... Line 1191...
1198
                AmountModel amountModel = new AmountModel();
1191
                AmountModel amountModel = new AmountModel();
1199
                amountModel.setAmount(scheme.getAmount());
1192
                amountModel.setAmount(scheme.getAmount());
1200
                amountModel.setAmountType(scheme.getAmountType());
1193
                amountModel.setAmountType(scheme.getAmountType());
1201
                double amountToRollout = inventoryPayoutModel.getRolloutAmount(amountModel);
1194
                double amountToRollout = inventoryPayoutModel.getRolloutAmount(amountModel);
1202
                pendingPayout.setAmount((float) amountToRollout);
1195
                pendingPayout.setAmount((float) amountToRollout);
1203
                if (scheme.getType().equals(SchemeType.ACTIVATION)) {
-
 
1204
                    walletService.addAmountToWallet(fofoId, orderId, WalletReferenceType.ACTIVATION_SCHEME,
-
 
1205
                            "Activation margin for " + ii.getItem().getItemDescriptionNoColor() + ", Imei - " + serialNumber, (float) amountToRollout,
-
 
1206
                            fofoOrder.getCreateTimestamp());
-
 
1207
                    pendingPayout.setStatusDescription("Activation margin credited, activated on " + FormattingUtils.formatDate(activatedImei.getActivationTimestamp()));
-
 
1208
                } else {
-
 
1209
                    walletService.addAmountToWallet(fofoId, orderId, WalletReferenceType.SPECIAL_SUPPORT,
1196
                walletService.addAmountToWallet(fofoId, orderId, WalletReferenceType.SPECIAL_SUPPORT,
1210
                            "Special Support for " + ii.getItem().getItemDescriptionNoColor() + ", Imei - " + serialNumber, (float) amountToRollout,
1197
                        "Special Support for " + ii.getItem().getItemDescriptionNoColor() + ", Imei - " + serialNumber, (float) amountToRollout,
1211
                            fofoOrder.getCreateTimestamp());
1198
                        fofoOrder.getCreateTimestamp());
1212
                    pendingPayout.setStatusDescription("Special support credited, activated on " + FormattingUtils.formatDate(activatedImei.getActivationTimestamp()));
1199
                pendingPayout.setStatusDescription("Special support credited, activated on " + FormattingUtils.formatDate(activatedImei.getActivationTimestamp()));
1213
                }
-
 
-
 
1200
 
1214
                pendingPayout.setCreditTimestamp(LocalDateTime.now());
1201
                pendingPayout.setCreditTimestamp(LocalDateTime.now());
1215
                pendingPayout.setStatus(SchemePayoutStatus.CREDITED);
1202
                pendingPayout.setStatus(SchemePayoutStatus.CREDITED);
1216
            } else {
1203
            } else {
1217
                pendingPayout.setStatus(SchemePayoutStatus.REJECTED);
1204
                pendingPayout.setStatus(SchemePayoutStatus.REJECTED);
1218
                pendingPayout.setRolledBackTimestamp(LocalDateTime.now());
1205
                pendingPayout.setRolledBackTimestamp(LocalDateTime.now());
Line 1235... Line 1222...
1235
            SchemesImeisModel schemesImeisModel = imeiListEntry.getValue().get(0);
1222
            SchemesImeisModel schemesImeisModel = imeiListEntry.getValue().get(0);
1236
            List<Integer> schemeIds = imeiListEntry.getValue().stream().map(x -> x.getSchemeId()).collect(Collectors.toList());
1223
            List<Integer> schemeIds = imeiListEntry.getValue().stream().map(x -> x.getSchemeId()).collect(Collectors.toList());
1237
            LOGGER.info("Serial Number  - {}, Scheme IDs - {}", schemesImeisModel.getImei(), schemeIds);
1224
            LOGGER.info("Serial Number  - {}, Scheme IDs - {}", schemesImeisModel.getImei(), schemeIds);
1238
            InventoryItem inventoryItem = inventoryItemRepository.selectById(schemesImeisModel.getInventoryItemId());
1225
            InventoryItem inventoryItem = inventoryItemRepository.selectById(schemesImeisModel.getInventoryItemId());
1239
            List<Scheme> schemes = schemeRepository.selectBySchemeIds(schemeIds);
1226
            List<Scheme> schemes = schemeRepository.selectBySchemeIds(schemeIds);
1240
            List<Scheme> supportSchemes = schemes.stream().filter(x -> Arrays.asList(SchemeType.SPECIAL_SUPPORT, SchemeType.ACTIVATION).contains(x.getType())).collect(Collectors.toList());
1227
            List<Scheme> supportSchemes = schemes.stream().filter(x -> Arrays.asList(SchemeType.SPECIAL_SUPPORT).contains(x.getType())).collect(Collectors.toList());
1241
            if (supportSchemes.size() > 0) {
1228
            if (supportSchemes.size() > 0) {
1242
                for (Scheme scheme : supportSchemes) {
1229
                for (Scheme scheme : supportSchemes) {
1243
                    List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByScheme(scheme.getId(), inventoryItem.getId());
1230
                    List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByScheme(scheme.getId(), inventoryItem.getId());
1244
                    if (schemeInOuts.stream().filter(x -> Arrays.asList(SchemePayoutStatus.CREDITED, SchemePayoutStatus.PENDING).contains(x.getStatus())).count() > 0) {
1231
                    if (schemeInOuts.stream().filter(x -> Arrays.asList(SchemePayoutStatus.CREDITED, SchemePayoutStatus.PENDING).contains(x.getStatus())).count() > 0) {
1245
                        continue;
1232
                        continue;