Subversion Repositories SmartDukaan

Rev

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

Rev 30261 Rev 30454
Line 19... Line 19...
19
import com.spice.profitmandi.dao.enumuration.fofo.ScanType;
19
import com.spice.profitmandi.dao.enumuration.fofo.ScanType;
20
import com.spice.profitmandi.dao.enumuration.transaction.SchemePayoutStatus;
20
import com.spice.profitmandi.dao.enumuration.transaction.SchemePayoutStatus;
21
import com.spice.profitmandi.dao.model.CreateSchemeRequest;
21
import com.spice.profitmandi.dao.model.CreateSchemeRequest;
22
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
22
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
23
import com.spice.profitmandi.dao.repository.catalog.SchemeRepository;
23
import com.spice.profitmandi.dao.repository.catalog.SchemeRepository;
-
 
24
import com.spice.profitmandi.dao.repository.catalog.StateGstRateRepository;
24
import com.spice.profitmandi.dao.repository.catalog.TagListingRepository;
25
import com.spice.profitmandi.dao.repository.catalog.TagListingRepository;
25
import com.spice.profitmandi.dao.repository.dtr.RetailerRepository;
26
import com.spice.profitmandi.dao.repository.dtr.RetailerRepository;
26
import com.spice.profitmandi.dao.repository.fofo.*;
27
import com.spice.profitmandi.dao.repository.fofo.*;
27
import com.spice.profitmandi.dao.repository.transaction.PriceDropRepository;
28
import com.spice.profitmandi.dao.repository.transaction.PriceDropRepository;
28
import com.spice.profitmandi.service.NotificationService;
29
import com.spice.profitmandi.service.NotificationService;
Line 164... Line 165...
164
			throw new ProfitMandiBusinessException(ProfitMandiConstants.END_DATE, createSchemeRequest.getEndDate(),
165
			throw new ProfitMandiBusinessException(ProfitMandiConstants.END_DATE, createSchemeRequest.getEndDate(),
165
					"SCHM_VE_1004");
166
					"SCHM_VE_1004");
166
		}
167
		}
167
	}
168
	}
168
 
169
 
169
	private Scheme toScheme(int creatorId, CreateSchemeRequest createSchemeRequest) {
-
 
170
		Scheme scheme = new Scheme();
170
	@Autowired
171
		scheme.setName(createSchemeRequest.getName());
171
	StateGstRateRepository stateGstRateRepository;
172
		scheme.setDescription(createSchemeRequest.getDescription());
-
 
173
		scheme.setType(createSchemeRequest.getType());
-
 
174
		scheme.setAmountType(createSchemeRequest.getAmountType());
-
 
175
		scheme.setAmount(createSchemeRequest.getAmount());
-
 
176
		scheme.setPartnerType(createSchemeRequest.getPartnerType());
-
 
177
		scheme.setStartDateTime(createSchemeRequest.getStartDate());
-
 
178
		scheme.setEndDateTime(createSchemeRequest.getEndDate());
-
 
179
		scheme.setCreatedBy(creatorId);
-
 
180
		scheme.setCashback(createSchemeRequest.isCashback());
-
 
181
		return scheme;
-
 
182
	}
-
 
183
 
172
 
184
 
173
 
185
	private void validateItemIds(CreateSchemeRequest createSchemeRequest) throws ProfitMandiBusinessException {
174
	private void validateItemIds(CreateSchemeRequest createSchemeRequest) throws ProfitMandiBusinessException {
186
		if (createSchemeRequest.getCatalogIds() == null || createSchemeRequest.getCatalogIds().isEmpty()) {
175
		if (createSchemeRequest.getCatalogIds() == null || createSchemeRequest.getCatalogIds().isEmpty()) {
187
			throw new ProfitMandiBusinessException(ProfitMandiConstants.ITEM_ID, createSchemeRequest.getCatalogIds(),
176
			throw new ProfitMandiBusinessException(ProfitMandiConstants.ITEM_ID, createSchemeRequest.getCatalogIds(),
Line 458... Line 447...
458
			purchase.setCashback(purchase.getCashback() + totalCashback);
447
			purchase.setCashback(purchase.getCashback() + totalCashback);
459
			purchaseRepository.persist(purchase);
448
			purchaseRepository.persist(purchase);
460
		}
449
		}
461
	}
450
	}
462
 
451
 
-
 
452
	private Scheme toScheme(int creatorId, CreateSchemeRequest createSchemeRequest) {
-
 
453
		Scheme scheme = new Scheme();
-
 
454
		scheme.setName(createSchemeRequest.getName());
-
 
455
		scheme.setDescription(createSchemeRequest.getDescription());
-
 
456
		scheme.setType(createSchemeRequest.getType());
-
 
457
		scheme.setAmountType(createSchemeRequest.getAmountType());
-
 
458
		scheme.setAmount(createSchemeRequest.getAmount());
-
 
459
		scheme.setPartnerType(createSchemeRequest.getPartnerType());
-
 
460
		scheme.setStartDateTime(createSchemeRequest.getStartDate());
-
 
461
		scheme.setEndDateTime(createSchemeRequest.getEndDate());
-
 
462
		scheme.setCreatedBy(creatorId);
-
 
463
		scheme.setCashback(createSchemeRequest.isCashback());
-
 
464
		scheme.setBasePlusGstCalc(createSchemeRequest.isBasePluseGstCalc());
-
 
465
		return scheme;
-
 
466
	}
-
 
467
 
463
	//Only in and activation margins are allowed to be rolled out more than twice
468
	//Only in and activation margins are allowed to be rolled out more than twice
464
	private float createSchemeInOut(Scheme scheme, InventoryItem inventoryItem) {
469
	private float createSchemeInOut(Scheme scheme, InventoryItem inventoryItem) throws ProfitMandiBusinessException {
465
		LOGGER.info("Scheme === {}", scheme);
470
		LOGGER.info("Scheme === {}", scheme);
466
		if ((scheme.getId() == 411 || scheme.getId() == 612) && inventoryItem.getCreateTimestamp().isAfter(LocalDate.of(2021, 12, 1).atStartOfDay())) {
471
		if ((scheme.getId() == 411 || scheme.getId() == 612) && inventoryItem.getCreateTimestamp().isAfter(LocalDate.of(2021, 12, 1).atStartOfDay())) {
467
			return 0;
472
			return 0;
468
		}
473
		}
469
		List<SchemeInOut> sios = schemeInOutRepository.selectAllByType(scheme.getType(), inventoryItem.getId());
474
		List<SchemeInOut> sios = schemeInOutRepository.selectAllByType(scheme.getType(), inventoryItem.getId());
Line 524... Line 529...
524
		}
529
		}
525
		return actualCredit;
530
		return actualCredit;
526
	}
531
	}
527
 
532
 
528
	// We are maintaining price drop after grn
533
	// We are maintaining price drop after grn
529
	private float getAmount(InventoryItem inventoryItem, Scheme scheme) {
534
	private float getAmount(InventoryItem inventoryItem, Scheme scheme) throws ProfitMandiBusinessException {
530
		float amount = 0;
535
		float amount = 0;
531
		float dpForCalc = 0;
536
		float dpForCalc = 0;
532
		float taxableSellingPrice = 0;
537
		float taxableSellingPrice = 0;
533
		// float totalTaxRate = inventoryItem.getIgstRate() +
-
 
534
		// inventoryItem.getSgstRate() + inventoryItem.getCgstRate();
-
 
535
		// Hardcoding it to 18%
-
 
536
		float totalTaxRate = 18f;
-
 
-
 
538
 
537
		// float totalTaxRate = inventoryItem.getIgstRate() +
539
		float totalTaxRate = stateGstRateRepository.getTotalTaxRate(inventoryItem.getItemId());
538
		// inventoryItem.getSgstRate() + inventoryItem.getCgstRate();
-
 
539
		if (scheme.getAmountType() == AmountType.PERCENTAGE) {
540
		if (scheme.getAmountType() == AmountType.PERCENTAGE) {
540
			if (scheme.getType().equals(SchemeType.IN)) {
541
			if (scheme.getType().equals(SchemeType.IN)) {
541
				dpForCalc = inventoryItem.getUnitPrice() - inventoryItem.getPriceDropAmount();
542
				dpForCalc = inventoryItem.getUnitPrice() - inventoryItem.getPriceDropAmount();
542
			} else {
543
			} else {
543
				try {
544
				try {
Line 554... Line 555...
554
					inventoryItem.getSerialNumber(), inventoryItem.getItemId(), scheme.getId(), scheme.getName(),
555
					inventoryItem.getSerialNumber(), inventoryItem.getItemId(), scheme.getId(), scheme.getName(),
555
					scheme.getType(), scheme.getAmountType(), scheme.getPartnerType(), dpForCalc, taxableSellingPrice,
556
					scheme.getType(), scheme.getAmountType(), scheme.getPartnerType(), dpForCalc, taxableSellingPrice,
556
					scheme.getAmount(), amount));
557
					scheme.getAmount(), amount));
557
		} else {
558
		} else {
558
			amount = scheme.getAmount();
559
			amount = scheme.getAmount();
-
 
560
			if (scheme.isBasePlusGstCalc()) {
-
 
561
				amount = this.getReversalAmount(scheme, inventoryItem);
-
 
562
			}
559
			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%d\t%f", inventoryItem.getId(),
563
			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%d\t%f", inventoryItem.getId(),
560
					inventoryItem.getSerialNumber(), inventoryItem.getItemId(), scheme.getId(), scheme.getName(),
564
					inventoryItem.getSerialNumber(), inventoryItem.getItemId(), scheme.getId(), scheme.getName(),
561
					scheme.getType(), scheme.getAmountType(), scheme.getPartnerType(), dpForCalc, taxableSellingPrice,
565
					scheme.getType(), scheme.getAmountType(), scheme.getPartnerType(), dpForCalc, taxableSellingPrice,
562
					0, amount));
566
					0, amount));
563
		}
567
		}
564
 
568
 
565
		return amount;
569
		return amount;
566
	}
570
	}
567
 
571
 
-
 
572
	//Specifically for SchemeReversal
-
 
573
	private float getReversalAmount(Scheme scheme, InventoryItem inventoryItem) {
-
 
574
		float amount = scheme.getAmount();
-
 
575
		if (scheme.isBasePlusGstCalc()) {
-
 
576
			amount = (float) (amount / 1.18);
-
 
577
		}
-
 
578
		List<SchemeInOut> sios = schemeInOutRepository.selectAll(inventoryItem.getId());
-
 
579
		sios = sios.stream().filter(x -> x.getRolledBackTimestamp() == null).collect(Collectors.toList());
-
 
580
		List<Integer> schemeIds = sios.stream().map(x -> x.getSchemeId()).collect(Collectors.toList());
-
 
581
		List<Scheme> schemes = schemeRepository.selectBySchemeIds(schemeIds);
-
 
582
		float totalPaidPercentage = schemes.stream().filter(x -> x.getAmountType().equals(AmountType.PERCENTAGE)).map(x -> x.getAmount()).collect(Collectors.summingDouble(x -> x)).floatValue();
-
 
583
		return totalPaidPercentage;
-
 
584
	}
-
 
585
 
568
	@Override
586
	@Override
569
	public void processSchemeOut(int fofoOrderId, int retailerId) throws ProfitMandiBusinessException {
587
	public float processSchemeOut(int fofoOrderId, int retailerId) throws ProfitMandiBusinessException {
-
 
588
		float totalCashback = 0;
570
		FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndOrderId(retailerId, fofoOrderId);
589
		FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndOrderId(retailerId, fofoOrderId);
571
		// Process only if order is not cancelled
590
		// Process only if order is not cancelled
572
		if (fofoOrder.getCancelledTimestamp() == null) {
591
		if (fofoOrder.getCancelledTimestamp() == null) {
573
			// PartnerType partnerType = partnerTypeChangeService.getTypeOnDate(retailerId,
592
			// PartnerType partnerType = partnerTypeChangeService.getTypeOnDate(retailerId,
574
			// fofoOrder.getCreateTimestamp().toLocalDate());
593
			// fofoOrder.getCreateTimestamp().toLocalDate());
Line 581... Line 600...
581
					.collect(Collectors.toSet());
600
					.collect(Collectors.toSet());
582
			Set<InventoryItem> inventoryItems = inventoryItemRepository.selectByIds(inventoryItemIds).stream()
601
			Set<InventoryItem> inventoryItems = inventoryItemRepository.selectByIds(inventoryItemIds).stream()
583
					.filter(x -> x.getSerialNumber() != null && !x.getSerialNumber().equals(""))
602
					.filter(x -> x.getSerialNumber() != null && !x.getSerialNumber().equals(""))
584
					.collect(Collectors.toSet());
603
					.collect(Collectors.toSet());
585
			if (inventoryItems.size() == 0) {
604
			if (inventoryItems.size() == 0) {
586
				return;
605
				return 0;
587
			}
606
			}
588
			Set<Integer> itemIds = inventoryItems.stream().map(x -> x.getItemId()).collect(Collectors.toSet());
607
			Set<Integer> itemIds = inventoryItems.stream().map(x -> x.getItemId()).collect(Collectors.toSet());
589
 
608
 
590
			// Remove Items that are eol now.
609
			// Remove Items that are eol now.
591
			Set<Integer> itemIdsSet = tagListingRepository.selectByItemIdsAndTagIds(itemIds, tagIds).stream()
610
			Set<Integer> itemIdsSet = tagListingRepository.selectByItemIdsAndTagIds(itemIds, tagIds).stream()
Line 594... Line 613...
594
			// Only consider inventory items that were not returned
613
			// Only consider inventory items that were not returned
595
			inventoryItems = inventoryItems.stream().filter(x -> itemIdsSet.contains(x.getItemId()))
614
			inventoryItems = inventoryItems.stream().filter(x -> itemIdsSet.contains(x.getItemId()))
596
					.collect(Collectors.toSet());
615
					.collect(Collectors.toSet());
597
 
616
 
598
			if (inventoryItems.size() == 0) {
617
			if (inventoryItems.size() == 0) {
599
				return;
618
				return 0;
600
			}
619
			}
601
 
620
 
602
			float totalCashback = 0;
-
 
603
			int count = 0;
621
			int count = 0;
604
 
622
 
605
			List<SchemeType> allOutSchemeTypes = new ArrayList<>();
623
			List<SchemeType> allOutSchemeTypes = new ArrayList<>();
606
			allOutSchemeTypes.addAll(Arrays.asList(SchemeType.ACTIVATION, SchemeType.INVESTMENT));
624
			allOutSchemeTypes.addAll(Arrays.asList(SchemeType.ACTIVATION, SchemeType.INVESTMENT));
607
			allOutSchemeTypes.addAll(OUT_SCHEME_TYPES);
625
			allOutSchemeTypes.addAll(OUT_SCHEME_TYPES);
608
 
-
 
-
 
626
			allOutSchemeTypes.add(SchemeType.SPECIAL_SUPPORT);
609
			List<Scheme> allActiveSchemes = schemeRepository.selectActiveAll(allOutSchemeTypes, partnerType,
627
			List<Scheme> allActiveSchemes = schemeRepository.selectActiveAll(allOutSchemeTypes, partnerType,
610
					fofoOrder.getCreateTimestamp(), false);
628
					fofoOrder.getCreateTimestamp(), false);
611
 
629
 
612
			for (InventoryItem inventoryItem : inventoryItems) {
630
			for (InventoryItem inventoryItem : inventoryItems) {
613
				float itemCashback = 0;
631
				float itemCashback = 0;
614
				Set<Integer> schemeIds = new HashSet<>(
632
				Set<Integer> schemeIds = new HashSet<>(
615
						schemeItemRepository.selectSchemeIdByCatalogId(inventoryItem.getItem().getCatalogItemId()));
633
						schemeItemRepository.selectSchemeIdByCatalogId(inventoryItem.getItem().getCatalogItemId()));
616
				List<Scheme> itemActiveSchemes = allActiveSchemes.stream().filter(x -> schemeIds.contains(x.getId()))
634
				List<Scheme> itemActiveSchemes = allActiveSchemes.stream().filter(x -> schemeIds.contains(x.getId()))
617
						.collect(Collectors.toList());
635
						.collect(Collectors.toList());
-
 
636
				List<Scheme> supportSchemes = itemActiveSchemes.stream().filter(x -> x.getType().equals(SchemeType.SPECIAL_SUPPORT)).collect(Collectors.toList());
-
 
637
				itemActiveSchemes = itemActiveSchemes.stream().filter(x -> !x.getType().equals(SchemeType.SPECIAL_SUPPORT)).collect(Collectors.toList());
618
				for (Scheme scheme : itemActiveSchemes) {
638
				for (Scheme scheme : itemActiveSchemes) {
619
					LOGGER.info("Scheme ==== {}", scheme);
639
					LOGGER.info("Scheme ==== {}", scheme);
620
					itemCashback += this.createSchemeInOut(scheme, inventoryItem);
640
					itemCashback += this.createSchemeInOut(scheme, inventoryItem);
621
				}
641
				}
-
 
642
				if (supportSchemes.size() > 0) {
-
 
643
					this.processSpecialSupport(fofoOrder, supportSchemes, inventoryItem, partnerType, fofoOrder.getCreateTimestamp());
-
 
644
				}
622
				LOGGER.info("itemCashback ==== {}", itemCashback);
645
				LOGGER.info("itemCashback ==== {}", itemCashback);
623
				if (itemCashback > 0) {
646
				if (itemCashback > 0) {
624
					count++;
647
					count++;
625
					totalCashback += itemCashback;
648
					totalCashback += itemCashback;
626
				}
649
				}
Line 628... Line 651...
628
			if (count > 0) {
651
			if (count > 0) {
629
				walletService.addAmountToWallet(
652
				walletService.addAmountToWallet(
630
						retailerId, fofoOrderId, WalletReferenceType.SCHEME_OUT, "Sales margin for invoice number "
653
						retailerId, fofoOrderId, WalletReferenceType.SCHEME_OUT, "Sales margin for invoice number "
631
								+ fofoOrder.getInvoiceNumber() + ". Total " + count + " pc(s)",
654
								+ fofoOrder.getInvoiceNumber() + ". Total " + count + " pc(s)",
632
						totalCashback, fofoOrder.getCreateTimestamp());
655
						totalCashback, fofoOrder.getCreateTimestamp());
633
				fofoOrder.setCashback(totalCashback);
656
				fofoOrder.setCashback(totalCashback + fofoOrder.getCashback());
-
 
657
			}
-
 
658
		}
-
 
659
		return totalCashback;
-
 
660
	}
-
 
661
 
-
 
662
	private void processSpecialSupport(FofoOrder fofoOrder, List<Scheme> supportSchemes, InventoryItem inventoryItem, PartnerType partnerType, LocalDateTime saleDate) throws ProfitMandiBusinessException {
-
 
663
		int catalogId = inventoryItem.getItem().getCatalogItemId();
-
 
664
		float totalMargin = this.selectPercentageScheme(partnerType, saleDate.toLocalDate(), catalogId, false, 0, 0).stream().collect(Collectors.summingDouble(x -> x.getAmount())).floatValue();
-
 
665
		LOGGER.info("total percentage margin - {}", totalMargin);
-
 
666
		float totalTaxRate = 0;
-
 
667
		for (Scheme scheme : supportSchemes) {
-
 
668
			if (scheme.isBasePlusGstCalc()) {
-
 
669
				totalTaxRate = stateGstRateRepository.getTotalTaxRate(inventoryItem.getItemId());
-
 
670
			}
-
 
671
			float amountToCredit = scheme.getAmount() * (1 - totalMargin / (100 + totalTaxRate));
-
 
672
			List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByScheme(scheme.getId(), inventoryItem.getId());
-
 
673
			SchemeInOut schemeInOut = schemeInOuts.stream().filter(x -> x.getRolledBackTimestamp() == null).findFirst().orElse(null);
-
 
674
			if (schemeInOut == null) {
-
 
675
				schemeInOut = new SchemeInOut();
-
 
676
				schemeInOut.setSchemeId(scheme.getId());
-
 
677
				schemeInOut.setInventoryItemId(inventoryItem.getId());
-
 
678
				schemeInOut.setCreateTimestamp(LocalDateTime.now());
-
 
679
				schemeInOut.setAmount(amountToCredit);
-
 
680
				schemeInOut.setStatus(SchemePayoutStatus.PENDING);
-
 
681
				schemeInOut.setStatusDescription("Special support, Activation pending for IMEI#" + inventoryItem.getSerialNumber());
-
 
682
				schemeInOutRepository.persist(schemeInOut);
-
 
683
			} else if (Double.valueOf(schemeInOut.getAmount()).intValue() != Double.valueOf(amountToCredit).intValue()) {
-
 
684
				schemeInOut.setStatus(SchemePayoutStatus.REJECTED);
-
 
685
				schemeInOut.setStatusDescription("Special support changed due to update in total margin");
-
 
686
				schemeInOut.setRolledBackTimestamp(LocalDateTime.now());
-
 
687
 
-
 
688
				SchemeInOut schemeInOutNew = new SchemeInOut();
-
 
689
				schemeInOutNew.setInventoryItemId(inventoryItem.getId());
-
 
690
				schemeInOutNew.setSchemeId(scheme.getId());
-
 
691
				schemeInOutNew.setCreateTimestamp(LocalDateTime.now());
-
 
692
				schemeInOutNew.setAmount(amountToCredit);
-
 
693
				if (schemeInOut.getStatus().equals(SchemePayoutStatus.CREDITED)) {
-
 
694
					schemeInOutNew.setStatus(SchemePayoutStatus.PENDING);
-
 
695
					schemeInOutNew.setStatusDescription("Special support, Activation pending for IMEI#" + inventoryItem.getSerialNumber());
-
 
696
					schemeInOutRepository.persist(schemeInOutNew);
-
 
697
				} else {
-
 
698
					schemeInOutNew.setStatus(SchemePayoutStatus.CREDITED);
-
 
699
					schemeInOutNew.setStatusDescription("Special support credited");
-
 
700
					schemeInOutRepository.persist(schemeInOutNew);
-
 
701
					walletService.addAmountToWallet(inventoryItem.getFofoId(), fofoOrder.getId(), WalletReferenceType.SPECIAL_SUPPORT,
-
 
702
							"Special support adjusted against overall margin gains for Imei - " + inventoryItem.getSerialNumber(), amountToCredit - schemeInOut.getAmount(),
-
 
703
							fofoOrder.getCreateTimestamp());
-
 
704
 
-
 
705
				}
634
			}
706
			}
-
 
707
 
635
		}
708
		}
-
 
709
 
636
	}
710
	}
637
 
711
 
638
	@Override
712
	@Override
639
	public void rollbackSchemes(List<Integer> inventoryItemIds, int rollbackReference, String rollbackReason)
713
	public void rollbackSchemes(List<Integer> inventoryItemIds, int rollbackReference, String rollbackReason)
640
			throws Exception {
714
			throws Exception {
Line 806... Line 880...
806
		}
880
		}
807
		int fofoId = inventoryItems.get(0).getFofoId();
881
		int fofoId = inventoryItems.get(0).getFofoId();
808
		WalletReferenceType walletReferenceType = schemeTypes.containsAll(SchemeService.OUT_SCHEME_TYPES)
882
		WalletReferenceType walletReferenceType = schemeTypes.containsAll(SchemeService.OUT_SCHEME_TYPES)
809
				? WalletReferenceType.SCHEME_OUT
883
				? WalletReferenceType.SCHEME_OUT
810
				: (schemeTypes.contains(SchemeType.ACTIVATION) ? WalletReferenceType.ACTIVATION_SCHEME
884
				: (schemeTypes.contains(SchemeType.ACTIVATION) ? WalletReferenceType.ACTIVATION_SCHEME
811
				: WalletReferenceType.INVESTMENT_PAYOUT);
885
				: (schemeTypes.contains(SchemeType.SPECIAL_SUPPORT)) ? WalletReferenceType.SPECIAL_SUPPORT : WalletReferenceType.INVESTMENT_PAYOUT);
812
		if (amountToRollback > 0) {
886
		if (amountToRollback > 0) {
813
			// Mark appropriate reference of rollback investment margin
887
			// Mark appropriate reference of rollback investment margin
814
			if (schemeTypes.contains(SchemeType.INVESTMENT)) {
888
			if (schemeTypes.contains(SchemeType.INVESTMENT)) {
815
				reversalReference = Integer
889
				reversalReference = Integer
816
						.parseInt(FormattingUtils.getYearMonth(schemeTypeMap.get(SchemeType.INVESTMENT).getCreditTimestamp().minusMonths(1)));
890
						.parseInt(FormattingUtils.getYearMonth(schemeTypeMap.get(SchemeType.INVESTMENT).getCreditTimestamp().minusMonths(1)));
Line 866... Line 940...
866
		itemCashbackMap.remove(30213);
940
		itemCashbackMap.remove(30213);
867
		itemCashbackMap.remove(30756);
941
		itemCashbackMap.remove(30756);
868
		return itemCashbackMap;
942
		return itemCashbackMap;
869
	}
943
	}
870
 
944
 
871
	/*
-
 
872
	 * @Override public void updateSchmesForModel(int catalogId) throws
-
 
873
	 * ProfitMandiBusinessException { List<Item> items =
-
 
874
	 * itemRepository.selectAllByCatalogItemId(catalogId); Map<Integer, Scheme>
-
 
875
	 * schemes = schemeRepository .selectAllByItemIds(items.stream().map(x ->
-
 
876
	 * x.getId()).collect(Collectors.toList()));
-
 
877
	 *
-
 
878
	 * }
-
 
879
	 */
-
 
880
 
945
 
881
	@Override
946
	@Override
882
	public List<Scheme> selectSchemeByPartnerType(PartnerType partnerType, LocalDate onDate, int catalogId,
947
	public List<Scheme> selectSchemeByPartnerType(PartnerType partnerType, LocalDate onDate, int catalogId,
883
												  boolean isAdmin, int offset, int limit) throws ProfitMandiBusinessException {
948
												  boolean isAdmin, int offset, int limit) throws ProfitMandiBusinessException {
884
		Session session = sessionFactory.getCurrentSession();
949
		Session session = sessionFactory.getCurrentSession();
Line 909... Line 974...
909
		if (!isAdmin) {
974
		if (!isAdmin) {
910
			andPredicates.add(cb.isNotNull(scheme.get("activeTimestamp")));
975
			andPredicates.add(cb.isNotNull(scheme.get("activeTimestamp")));
911
		}
976
		}
912
		query.where(cb.and(andPredicates.toArray(new Predicate[0])));
977
		query.where(cb.and(andPredicates.toArray(new Predicate[0])));
913
		query.orderBy(cb.desc(cb.function("isnull", Boolean.class, scheme.get("expireTimestamp"))));
978
		query.orderBy(cb.desc(cb.function("isnull", Boolean.class, scheme.get("expireTimestamp"))));
-
 
979
		if (limit == 0) {
-
 
980
			return session.createQuery(query).setFirstResult(offset).getResultList();
914
 
981
		}
915
		return session.createQuery(query).setFirstResult(offset).setMaxResults(limit).getResultList();
982
		return session.createQuery(query).setFirstResult(offset).setMaxResults(limit).getResultList();
916
 
983
 
917
	}
984
	}
918
 
985
 
919
	@Override
986
	@Override
-
 
987
	public List<Scheme> selectPercentageScheme(PartnerType partnerType, LocalDate onDate, int catalogId,
-
 
988
											   boolean isAdmin, int offset, int limit) throws ProfitMandiBusinessException {
-
 
989
		List<Scheme> schemes = this.selectSchemeByPartnerType(partnerType, onDate, catalogId, isAdmin, offset, limit);
-
 
990
		return schemes.stream().filter(x -> x.getAmountType().equals(AmountType.PERCENTAGE)).collect(Collectors.toList());
-
 
991
	}
-
 
992
 
-
 
993
	@Override
920
	public void processActivation() throws ProfitMandiBusinessException {
994
	public void processActivation() throws ProfitMandiBusinessException {
921
		List<SchemeInOut> pendingPayouts = schemeInOutRepository.selectAllPending();
995
		List<SchemeInOut> pendingPayouts = schemeInOutRepository.selectAllPending();
922
		List<Integer> schemeIds = new ArrayList<>();
996
		List<Integer> schemeIds = new ArrayList<>();
923
		Set<Integer> inventoryIds = new HashSet<>();
997
		Set<Integer> inventoryIds = new HashSet<>();
924
		for (SchemeInOut pendingPayout : pendingPayouts) {
998
		for (SchemeInOut pendingPayout : pendingPayouts) {
925
			schemeIds.add(pendingPayout.getSchemeId());
999
			schemeIds.add(pendingPayout.getSchemeId());
926
		}
1000
		}
927
		Map<Integer, Scheme> schemesMap = schemeRepository.selectBySchemeIds(schemeIds, 0, 0).stream()
1001
		Map<Integer, Scheme> schemesMap = schemeRepository.selectBySchemeIds(schemeIds, 0, 0).stream()
928
				.filter(x -> x.getType().equals(SchemeType.ACTIVATION))
1002
				.filter(x -> x.getType().equals(SchemeType.ACTIVATION) || x.getType().equals(SchemeType.SPECIAL_SUPPORT))
929
				.collect(Collectors.toMap(x -> x.getId(), x -> x));
1003
				.collect(Collectors.toMap(x -> x.getId(), x -> x));
930
		pendingPayouts = pendingPayouts.stream().filter(x -> schemesMap.get(x.getSchemeId()) != null)
1004
		pendingPayouts = pendingPayouts.stream().filter(x -> schemesMap.get(x.getSchemeId()) != null)
931
				.collect(Collectors.toList());
1005
				.collect(Collectors.toList());
932
 
1006
 
933
		for (SchemeInOut pendingPayout : pendingPayouts) {
1007
		for (SchemeInOut pendingPayout : pendingPayouts) {
Line 937... Line 1011...
937
				.collect(Collectors.toMap(x -> x.getId(), x -> x));
1011
				.collect(Collectors.toMap(x -> x.getId(), x -> x));
938
		Map<String, InventoryItem> serialNumberMap = inventoryItemMap.values().stream()
1012
		Map<String, InventoryItem> serialNumberMap = inventoryItemMap.values().stream()
939
				.collect(Collectors.toMap(x -> x.getSerialNumber(), x -> x));
1013
				.collect(Collectors.toMap(x -> x.getSerialNumber(), x -> x));
940
 
1014
 
941
		List<ActivatedImei> activatedImeis = activatedImeiRepository
1015
		List<ActivatedImei> activatedImeis = activatedImeiRepository
942
				.selectBySerialNumbers(new ArrayList<>(serialNumberMap.keySet()));
1016
				.selectBySerialNumbers(new ArrayList<>(serialNumberMap.keySet())).stream().collect(Collectors.toList());
943
 
1017
 
944
		Map<String, ActivatedImei> activatedImeiMap = activatedImeis.stream()
1018
		Map<String, ActivatedImei> activatedImeiMap = activatedImeis.stream()
945
				.collect(Collectors.toMap(x -> x.getSerialNumber(), x -> x));
1019
				.collect(Collectors.toMap(x -> x.getSerialNumber(), x -> x));
946
		for (SchemeInOut pendingPayout : pendingPayouts) {
1020
		for (SchemeInOut pendingPayout : pendingPayouts) {
947
			InventoryItem ii = inventoryItemMap.get(pendingPayout.getInventoryItemId());
1021
			InventoryItem ii = inventoryItemMap.get(pendingPayout.getInventoryItemId());
Line 958... Line 1032...
958
				int orderId = scanRecordRepository.selectByInventoryItemId(ii.getId()).stream()
1032
				int orderId = scanRecordRepository.selectByInventoryItemId(ii.getId()).stream()
959
						.filter(x -> x.getOrderId() > 0)
1033
						.filter(x -> x.getOrderId() > 0)
960
						.sorted(Comparator.comparing(ScanRecord::getCreateTimestamp).reversed()).findFirst().get()
1034
						.sorted(Comparator.comparing(ScanRecord::getCreateTimestamp).reversed()).findFirst().get()
961
						.getOrderId();
1035
						.getOrderId();
962
				FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(orderId);
1036
				FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(orderId);
-
 
1037
				if (scheme.getType().equals(SchemeType.ACTIVATION)) {
963
				walletService.addAmountToWallet(fofoId, orderId, WalletReferenceType.ACTIVATION_SCHEME,
1038
					walletService.addAmountToWallet(fofoId, orderId, WalletReferenceType.ACTIVATION_SCHEME,
964
						"Activation margin for Imei#" + serialNumber, pendingPayout.getAmount(),
1039
							"Activation margin for " + ii.getItem().getItemDescriptionNoColor() + ", Imei - " + serialNumber, pendingPayout.getAmount(),
-
 
1040
							fofoOrder.getCreateTimestamp());
-
 
1041
					pendingPayout.setStatusDescription("Activation margin credited");
-
 
1042
				} else {
-
 
1043
					walletService.addAmountToWallet(fofoId, orderId, WalletReferenceType.SPECIAL_SUPPORT,
-
 
1044
							"Special Support for " + ii.getItem().getItemDescriptionNoColor() + ", Imei - " + serialNumber, pendingPayout.getAmount(),
965
						fofoOrder.getCreateTimestamp());
1045
							fofoOrder.getCreateTimestamp());
-
 
1046
					pendingPayout.setStatusDescription("Special support credited");
-
 
1047
 
-
 
1048
				}
966
				pendingPayout.setCreditTimestamp(LocalDateTime.now());
1049
				pendingPayout.setCreditTimestamp(LocalDateTime.now());
967
				pendingPayout.setStatus(SchemePayoutStatus.CREDITED);
1050
				pendingPayout.setStatus(SchemePayoutStatus.CREDITED);
968
				pendingPayout.setStatusDescription("Activation margin credited");
-
 
969
			} else {
1051
			} else {
970
				pendingPayout.setStatus(SchemePayoutStatus.REJECTED);
1052
				pendingPayout.setStatus(SchemePayoutStatus.REJECTED);
971
				pendingPayout.setRolledBackTimestamp(LocalDateTime.now());
1053
				pendingPayout.setRolledBackTimestamp(LocalDateTime.now());
972
				;
1054
				;
973
				pendingPayout.setStatusDescription(
1055
				pendingPayout.setStatusDescription(