Subversion Repositories SmartDukaan

Rev

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

Rev 27877 Rev 27898
Line 81... Line 81...
81
	@Qualifier("fofoInventoryItemRepository")
81
	@Qualifier("fofoInventoryItemRepository")
82
	private InventoryItemRepository inventoryItemRepository;
82
	private InventoryItemRepository inventoryItemRepository;
83
 
83
 
84
	@Autowired
84
	@Autowired
85
	private ActivatedImeiRepository activatedImeiRepository;
85
	private ActivatedImeiRepository activatedImeiRepository;
86
	
86
 
87
	@Autowired
87
	@Autowired
88
	private PartnerTypeChangeService partnerTypeChangeService;
88
	private PartnerTypeChangeService partnerTypeChangeService;
89
 
89
 
90
	@Autowired
90
	@Autowired
91
	private PurchaseService purchaseService;
91
	private PurchaseService purchaseService;
Line 402... Line 402...
402
	public void processSchemeIn(int purchaseId, int retailerId) throws ProfitMandiBusinessException {
402
	public void processSchemeIn(int purchaseId, int retailerId) throws ProfitMandiBusinessException {
403
		LOGGER.info("Trying to process SchemeIn with purchaseId [{}] and retailerId [{}]", purchaseId, retailerId);
403
		LOGGER.info("Trying to process SchemeIn with purchaseId [{}] and retailerId [{}]", purchaseId, retailerId);
404
		Purchase purchase = purchaseRepository.selectByIdAndFofoId(purchaseId, retailerId);
404
		Purchase purchase = purchaseRepository.selectByIdAndFofoId(purchaseId, retailerId);
405
		PartnerType partnerType = partnerTypeChangeService.getTypeOnDate(retailerId,
405
		PartnerType partnerType = partnerTypeChangeService.getTypeOnDate(retailerId,
406
				purchase.getCreateTimestamp().toLocalDate());
406
				purchase.getCreateTimestamp().toLocalDate());
407
		LOGGER.info("purchase is completed = {}", (purchase.getCompleteTimestamp() != null));
-
 
408
		if (purchase.getCompleteTimestamp() != null) {
-
 
409
			List<Scheme> schemes = schemeRepository.selectActiveAll(SchemeType.IN, partnerType,
407
		List<Scheme> schemes = schemeRepository.selectActiveAll(SchemeType.IN, partnerType,
410
					purchase.getCompleteTimestamp(), false);
408
				purchase.getCreateTimestamp(), false);
411
			float totalCashback = 0;
409
		float totalCashback = 0;
412
			if (schemes.isEmpty()) {
410
		if (schemes.isEmpty()) {
413
				return;
411
			return;
414
			}
412
		}
415
			List<InventoryItem> inventoryItems = inventoryItemRepository.selectByPurchaseId(purchaseId);
413
		List<InventoryItem> inventoryItems = inventoryItemRepository.selectByPurchaseId(purchaseId);
416
 
-
 
417
			Set<Integer> itemIds = inventoryItems.stream().map(x -> x.getItemId()).collect(Collectors.toSet());
-
 
418
			LocalDateTime billingDate = purchaseService.getBillingDateOfPurchase(purchaseId);
-
 
419
			Set<Integer> itemIdsSet = tagListingRepository.selectByItemIdsAndTagIds(itemIds, tagIds).stream()
-
 
420
					.filter(x -> x.getEolDate() == null || x.getEolDate().isAfter(billingDate)).map(x -> x.getItemId())
-
 
421
					.collect(Collectors.toSet());
-
 
422
			// Only consider inventory items that were not returned
-
 
423
			inventoryItems = inventoryItems.stream().filter(x -> itemIdsSet.contains(x.getItemId()))
-
 
424
					.filter(x -> !x.getLastScanType().equals(ScanType.PURCHASE_RET_BAD))
-
 
425
					.filter(x -> !x.getLastScanType().equals(ScanType.PURCHASE_RET)).collect(Collectors.toList());
-
 
426
			LOGGER.info(inventoryItems);
-
 
427
			if (inventoryItems.size() == 0)
-
 
428
				return;
-
 
429
			Map<InventoryItem, Set<Scheme>> inventoryItemSchemesMap = this.toInventoryItemSchemesMap(schemes,
-
 
430
					inventoryItems);
-
 
431
 
-
 
432
			if (inventoryItemSchemesMap.isEmpty()) {
-
 
433
				return;
-
 
434
			}
-
 
435
			Map<InventoryItem, Set<Scheme>> allInventoryItemSchemesMap = new HashMap<>();
-
 
436
 
-
 
437
			for (Map.Entry<InventoryItem, Set<Scheme>> inventoryItemSchemesEntry : inventoryItemSchemesMap.entrySet()) {
-
 
438
				Set<Scheme> allSchemes = new HashSet<>();
-
 
439
				for (Scheme scheme : inventoryItemSchemesEntry.getValue()) {
-
 
440
					allSchemes.add(scheme);
-
 
441
				}
-
 
442
				allInventoryItemSchemesMap.put(inventoryItemSchemesEntry.getKey(), allSchemes);
-
 
443
			}
-
 
444
 
414
 
-
 
415
		Set<Integer> itemIds = inventoryItems.stream().map(x -> x.getItemId()).collect(Collectors.toSet());
-
 
416
		LocalDateTime billingDate = purchaseService.getBillingDateOfPurchase(purchaseId);
-
 
417
		Set<Integer> itemIdsSet = tagListingRepository.selectByItemIdsAndTagIds(itemIds, tagIds).stream()
-
 
418
				.filter(x -> x.getEolDate() == null || x.getEolDate().isAfter(billingDate)).map(x -> x.getItemId())
-
 
419
				.collect(Collectors.toSet());
-
 
420
		// Only consider inventory items that were not returned
-
 
421
		inventoryItems = inventoryItems.stream().filter(x -> itemIdsSet.contains(x.getItemId()))
-
 
422
				.filter(x -> !x.getLastScanType().equals(ScanType.PURCHASE_RET_BAD))
-
 
423
				.filter(x -> !x.getLastScanType().equals(ScanType.PURCHASE_RET)).collect(Collectors.toList());
-
 
424
		LOGGER.info(inventoryItems);
-
 
425
		if (inventoryItems.size() == 0)
445
			//
426
			return;
-
 
427
		Map<InventoryItem, Set<Scheme>> inventoryItemSchemesMap = this.toInventoryItemSchemesMap(schemes,
-
 
428
				inventoryItems);
446
 
429
 
447
			int itemsCount = 0;
430
		if (inventoryItemSchemesMap.isEmpty()) {
448
			for (Map.Entry<InventoryItem, Set<Scheme>> allInventoryItemSchemesEntry : allInventoryItemSchemesMap
-
 
449
					.entrySet()) {
431
			return;
450
				float inventoryItemCashback = 0;
-
 
451
				for (Scheme scheme : allInventoryItemSchemesEntry.getValue()) {
-
 
452
					InventoryItem inventoryItem = allInventoryItemSchemesEntry.getKey();
-
 
453
					float cashback = this.createSchemeInOut(scheme, inventoryItem);
-
 
454
					inventoryItemCashback += cashback;
-
 
455
				}
432
		}
456
				if (inventoryItemCashback > 0) {
-
 
457
					totalCashback += inventoryItemCashback;
433
		Map<InventoryItem, Set<Scheme>> allInventoryItemSchemesMap = new HashMap<>();
458
					itemsCount++;
-
 
459
				}
-
 
460
			}
-
 
461
 
434
 
-
 
435
		for (Map.Entry<InventoryItem, Set<Scheme>> inventoryItemSchemesEntry : inventoryItemSchemesMap.entrySet()) {
-
 
436
			Set<Scheme> allSchemes = new HashSet<>();
-
 
437
			for (Scheme scheme : inventoryItemSchemesEntry.getValue()) {
-
 
438
				allSchemes.add(scheme);
-
 
439
			}
462
			LOGGER.info("Items count for purchase id {} is {}", purchaseId, itemsCount);
440
			allInventoryItemSchemesMap.put(inventoryItemSchemesEntry.getKey(), allSchemes);
-
 
441
		}
-
 
442
 
-
 
443
		//
-
 
444
 
463
			if (itemsCount > 0) {
445
		int itemsCount = 0;
-
 
446
		for (Map.Entry<InventoryItem, Set<Scheme>> allInventoryItemSchemesEntry : allInventoryItemSchemesMap
-
 
447
				.entrySet()) {
464
				walletService.addAmountToWallet(
448
			float inventoryItemCashback = 0;
465
						retailerId, purchaseId, WalletReferenceType.SCHEME_IN, "Added for SCHEME IN against invoice "
449
			for (Scheme scheme : allInventoryItemSchemesEntry.getValue()) {
466
								+ purchase.getPurchaseReference() + " (total " + itemsCount + " pcs)",
450
				InventoryItem inventoryItem = allInventoryItemSchemesEntry.getKey();
467
						totalCashback, purchase.getCreateTimestamp());
451
				float cashback = this.createSchemeInOut(scheme, inventoryItem);
468
				LOGGER.info("Added Rs.{} for SCHEME IN against invoice {} total pcs({}) {}", totalCashback,
452
				inventoryItemCashback += cashback;
-
 
453
			}
469
						purchase.getPurchaseReference(), itemsCount);
454
			if (inventoryItemCashback > 0) {
470
				purchase.setCashback(purchase.getCashback() + totalCashback);
455
				totalCashback += inventoryItemCashback;
471
				purchaseRepository.persist(purchase);
456
				itemsCount++;
472
			}
457
			}
473
		}
458
		}
-
 
459
 
-
 
460
		LOGGER.info("Items count for purchase id {} is {}", purchaseId, itemsCount);
-
 
461
		if (itemsCount > 0) {
-
 
462
			walletService.addAmountToWallet(
-
 
463
					retailerId, purchaseId, WalletReferenceType.SCHEME_IN, "Added for SCHEME IN against invoice "
-
 
464
							+ purchase.getPurchaseReference() + " (total " + itemsCount + " pcs)",
-
 
465
					totalCashback, purchase.getCreateTimestamp());
-
 
466
			LOGGER.info("Added Rs.{} for SCHEME IN against invoice {} total pcs({}) {}", totalCashback,
-
 
467
					purchase.getPurchaseReference(), itemsCount);
-
 
468
			purchase.setCashback(purchase.getCashback() + totalCashback);
-
 
469
			purchaseRepository.persist(purchase);
-
 
470
		}
474
	}
471
	}
475
 
472
 
476
	private float createSchemeInOut(Scheme scheme, InventoryItem inventoryItem) {
473
	private float createSchemeInOut(Scheme scheme, InventoryItem inventoryItem) {
477
		List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByScheme(scheme.getId(), inventoryItem.getId());
474
		List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByScheme(scheme.getId(), inventoryItem.getId());
478
		float amountToCredit = 0;
475
		float amountToCredit = 0;
Line 482... Line 479...
482
			amountToCredit = this.getAmount(inventoryItem, scheme);
479
			amountToCredit = this.getAmount(inventoryItem, scheme);
483
			schemeInOut.setSchemeId(scheme.getId());
480
			schemeInOut.setSchemeId(scheme.getId());
484
			schemeInOut.setInventoryItemId(inventoryItem.getId());
481
			schemeInOut.setInventoryItemId(inventoryItem.getId());
485
			schemeInOut.setAmount(amountToCredit);
482
			schemeInOut.setAmount(amountToCredit);
486
			schemeInOutRepository.persist(schemeInOut);
483
			schemeInOutRepository.persist(schemeInOut);
487
			if(scheme.getType().equals(SchemeType.ACTIVATION)) {
484
			if (scheme.getType().equals(SchemeType.ACTIVATION)) {
488
				schemeInOut.setStatus(SchemePayoutStatus.PENDING);
485
				schemeInOut.setStatus(SchemePayoutStatus.PENDING);
489
				schemeInOut.setStatusDescription("Activation pending for IMEI#" + inventoryItem.getSerialNumber());
486
				schemeInOut.setStatusDescription("Activation pending for IMEI#" + inventoryItem.getSerialNumber());
490
				return 0;
487
				return 0;
491
			} else if(scheme.getType().equals(SchemeType.INVESTMENT)) {
488
			} else if (scheme.getType().equals(SchemeType.INVESTMENT)) {
492
					schemeInOut.setStatus(SchemePayoutStatus.PENDING);
489
				schemeInOut.setStatus(SchemePayoutStatus.PENDING);
493
					schemeInOut.setStatusDescription("Subject to investment days maintained");
490
				schemeInOut.setStatusDescription("Subject to investment days maintained");
494
					return 0;
491
				return 0;
495
			} else {
492
			} else {
496
				schemeInOut.setStatus(SchemePayoutStatus.CREDITED);
493
				schemeInOut.setStatus(SchemePayoutStatus.CREDITED);
497
				if(scheme.getType().equals(SchemeType.IN)) {
494
				if (scheme.getType().equals(SchemeType.IN)) {
498
					schemeInOut.setStatusDescription("Credited for GRN of IMEI#" + inventoryItem.getSerialNumber());
495
					schemeInOut.setStatusDescription("Credited for GRN of IMEI#" + inventoryItem.getSerialNumber());
499
				}
496
				}
500
				schemeInOut.setStatusDescription("Credited for sale of IMEI#" + inventoryItem.getSerialNumber());
497
				schemeInOut.setStatusDescription("Credited for sale of IMEI#" + inventoryItem.getSerialNumber());
501
				schemeInOut.setCreditTimestamp(LocalDateTime.now());
498
				schemeInOut.setCreditTimestamp(LocalDateTime.now());
502
			}
499
			}
Line 574... Line 571...
574
		}
571
		}
575
 
572
 
576
		float totalCashback = 0;
573
		float totalCashback = 0;
577
		int count = 0;
574
		int count = 0;
578
 
575
 
579
		List<Scheme> allActiveSchemes = schemeRepository
576
		List<Scheme> allActiveSchemes = schemeRepository.selectActiveAll(SchemeType.OUT, partnerType,
580
				.selectActiveAll(SchemeType.OUT, partnerType, fofoOrder.getCreateTimestamp(), false);
577
				fofoOrder.getCreateTimestamp(), false);
581
		allActiveSchemes.addAll(schemeRepository.selectActiveAll(SchemeType.ACTIVATION, partnerType, fofoOrder.getCreateTimestamp(), false));
578
		allActiveSchemes.addAll(schemeRepository.selectActiveAll(SchemeType.ACTIVATION, partnerType,
-
 
579
				fofoOrder.getCreateTimestamp(), false));
582
		allActiveSchemes.addAll(schemeRepository.selectActiveAll(SchemeType.INVESTMENT, partnerType, fofoOrder.getCreateTimestamp(), false));
580
		allActiveSchemes.addAll(schemeRepository.selectActiveAll(SchemeType.INVESTMENT, partnerType,
-
 
581
				fofoOrder.getCreateTimestamp(), false));
583
		
582
 
584
		for (InventoryItem inventoryItem : inventoryItems) {
583
		for (InventoryItem inventoryItem : inventoryItems) {
585
			float itemCashback = 0;
584
			float itemCashback = 0;
586
			Purchase purchase = purchaseRepository.selectByIdAndFofoId(inventoryItem.getPurchaseId(), retailerId);
-
 
587
			Set<Integer> schemeIds = new HashSet<>(
585
			Set<Integer> schemeIds = new HashSet<>(
588
					schemeItemRepository.selectSchemeIdByItemId(inventoryItem.getItemId()));
586
					schemeItemRepository.selectSchemeIdByItemId(inventoryItem.getItemId()));
589
			if (purchase.getCompleteTimestamp() == null) {
-
 
590
				continue;
-
 
591
			}
-
 
592
			allActiveSchemes = allActiveSchemes.stream().filter(x -> schemeIds.contains(x.getId())).collect(Collectors.toList());
587
			allActiveSchemes = allActiveSchemes.stream().filter(x -> schemeIds.contains(x.getId()))
-
 
588
					.collect(Collectors.toList());
593
			for (Scheme scheme : allActiveSchemes) {
589
			for (Scheme scheme : allActiveSchemes) {
594
				itemCashback += this.createSchemeInOut(scheme, inventoryItem);
590
				itemCashback += this.createSchemeInOut(scheme, inventoryItem);
595
			}
591
			}
596
			if (itemCashback > 0) {
592
			if (itemCashback > 0) {
597
				count++;
593
				count++;
Line 614... Line 610...
614
		float amountToRollback = 0;
610
		float amountToRollback = 0;
615
		List<SchemeInOut> schemes = schemeInOutRepository.selectByInventoryItemIds(inventoryItemIdSet);
611
		List<SchemeInOut> schemes = schemeInOutRepository.selectByInventoryItemIds(inventoryItemIdSet);
616
		for (SchemeInOut schemeInOut : schemes) {
612
		for (SchemeInOut schemeInOut : schemes) {
617
			if (schemeInOut.getRolledBackTimestamp() == null) {
613
			if (schemeInOut.getRolledBackTimestamp() == null) {
618
				schemeInOut.setRolledBackTimestamp(LocalDateTime.now());
614
				schemeInOut.setRolledBackTimestamp(LocalDateTime.now());
619
				if(schemeInOut.getStatus().equals(SchemePayoutStatus.CREDITED)) {
615
				if (schemeInOut.getStatus().equals(SchemePayoutStatus.CREDITED)) {
620
					amountToRollback += schemeInOut.getAmount();
616
					amountToRollback += schemeInOut.getAmount();
621
				}
617
				}
622
				schemeInOut.setStatus(SchemePayoutStatus.REJECTED);
618
				schemeInOut.setStatus(SchemePayoutStatus.REJECTED);
623
				schemeInOut.setStatusDescription(rollbackReason);
619
				schemeInOut.setStatusDescription(rollbackReason);
624
			}
620
			}
625
		}
621
		}
626
		if (amountToRollback > 0) {
622
		if (amountToRollback > 0) {
627
			int inventoryItemId = inventoryItemIds.get(0);
623
			int inventoryItemId = inventoryItemIds.get(0);
628
			InventoryItem ii = inventoryItemRepository.selectById(inventoryItemId);
624
			InventoryItem ii = inventoryItemRepository.selectById(inventoryItemId);
629
			Integer fofoId = ii.getFofoId();
625
			Integer fofoId = ii.getFofoId();
630
			//Purchase p = purchaseRepository.selectById(ii.getPurchaseId());
626
			// Purchase p = purchaseRepository.selectById(ii.getPurchaseId());
631
			// TODO//
627
			// TODO//
632
			walletService.rollbackAmountFromWallet(fofoId, amountToRollback, ii.getPurchaseId(),
628
			walletService.rollbackAmountFromWallet(fofoId, amountToRollback, ii.getPurchaseId(),
633
					WalletReferenceType.SCHEME_IN, rollbackReason, LocalDateTime.now());
629
					WalletReferenceType.SCHEME_IN, rollbackReason, LocalDateTime.now());
634
		}
630
		}
635
	}
631
	}
Line 670... Line 666...
670
		}
666
		}
671
		return schemes;
667
		return schemes;
672
	}
668
	}
673
 
669
 
674
	@Override
670
	@Override
675
	//This is being called to reverse schemes while processing price Drop
671
	// This is being called to reverse schemes while processing price Drop
676
	public void reverseSchemes(List<InventoryItem> inventoryItems, int priceDropId, String reversalReason)
672
	public void reverseSchemes(List<InventoryItem> inventoryItems, int priceDropId, String reversalReason)
677
			throws ProfitMandiBusinessException {
673
			throws ProfitMandiBusinessException {
678
		PriceDrop priceDrop = priceDropRepository.selectById(priceDropId);
674
		PriceDrop priceDrop = priceDropRepository.selectById(priceDropId);
679
		Map<Integer, List<InventoryItem>> purchaseInventoryListMap = inventoryItems.stream()
675
		Map<Integer, List<InventoryItem>> purchaseInventoryListMap = inventoryItems.stream()
680
				.collect(Collectors.groupingBy(InventoryItem::getPurchaseId, Collectors.toList()));
676
				.collect(Collectors.groupingBy(InventoryItem::getPurchaseId, Collectors.toList()));
Line 688... Line 684...
688
			Map<Integer, InventoryItem> inventoryItemsMap = purchaseInventoryItemList.stream()
684
			Map<Integer, InventoryItem> inventoryItemsMap = purchaseInventoryItemList.stream()
689
					.collect(Collectors.toMap(x -> x.getId(), x -> x));
685
					.collect(Collectors.toMap(x -> x.getId(), x -> x));
690
 
686
 
691
			List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByInventoryItemIds(inventoryItemsMap.keySet());
687
			List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByInventoryItemIds(inventoryItemsMap.keySet());
692
			LOGGER.info("Scheme InOuts , {}", schemeInOuts);
688
			LOGGER.info("Scheme InOuts , {}", schemeInOuts);
693
			if(schemeInOuts.size() == 0) {
689
			if (schemeInOuts.size() == 0) {
694
				continue;
690
				continue;
695
			}
691
			}
696
			List<Integer> schemeIds = schemeInOuts.stream().map(x -> x.getSchemeId()).collect(Collectors.toList());
692
			List<Integer> schemeIds = schemeInOuts.stream().map(x -> x.getSchemeId()).collect(Collectors.toList());
697
			Map<Integer, Scheme> schemesMap = schemeRepository.selectBySchemeIds(schemeIds, 0, schemeIds.size())
693
			Map<Integer, Scheme> schemesMap = schemeRepository.selectBySchemeIds(schemeIds, 0, schemeIds.size())
698
					.stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
694
					.stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
Line 704... Line 700...
704
				}
700
				}
705
				if (scheme.getType().equals(SchemeType.IN) && schemeInOut.getRolledBackTimestamp() == null) {
701
				if (scheme.getType().equals(SchemeType.IN) && schemeInOut.getRolledBackTimestamp() == null) {
706
					float newAmount = getAmount(ii, scheme);
702
					float newAmount = getAmount(ii, scheme);
707
					if (schemeInOut.getAmount() - newAmount >= 0.01f) {
703
					if (schemeInOut.getAmount() - newAmount >= 0.01f) {
708
						schemeInOut.setRolledBackTimestamp(LocalDateTime.now());
704
						schemeInOut.setRolledBackTimestamp(LocalDateTime.now());
709
						
705
 
710
						SchemeInOut sioNew = new SchemeInOut();
706
						SchemeInOut sioNew = new SchemeInOut();
711
						sioNew.setAmount(newAmount);
707
						sioNew.setAmount(newAmount);
712
						sioNew.setStatus(schemeInOut.getStatus());
708
						sioNew.setStatus(schemeInOut.getStatus());
713
						sioNew.setStatusDescription(schemeInOut.getStatusDescription());
709
						sioNew.setStatusDescription(schemeInOut.getStatusDescription());
714
						sioNew.setInventoryItemId(schemeInOut.getInventoryItemId());
710
						sioNew.setInventoryItemId(schemeInOut.getInventoryItemId());
715
						sioNew.setSchemeId(schemeInOut.getSchemeId());
711
						sioNew.setSchemeId(schemeInOut.getSchemeId());
716
						schemeInOutRepository.persist(sioNew);
712
						schemeInOutRepository.persist(sioNew);
717
 
713
 
718
						schemeInOut.setStatus(SchemePayoutStatus.REJECTED);
714
						schemeInOut.setStatus(SchemePayoutStatus.REJECTED);
719
						schemeInOut.setStatusDescription("Pricedrop processed, new entries added");
715
						schemeInOut.setStatusDescription("Pricedrop processed, new entries added");
720
						//IF not credited then dont consider any credit/debit for that sio entry
716
						// IF not credited then dont consider any credit/debit for that sio entry
721
						if(schemeInOut.getCreditTimestamp()!=null) {
717
						if (schemeInOut.getCreditTimestamp() != null) {
722
							amountToCredit += sioNew.getAmount();
718
							amountToCredit += sioNew.getAmount();
723
							amountToDebit += schemeInOut.getAmount();
719
							amountToDebit += schemeInOut.getAmount();
724
						}
720
						}
725
					}
721
					}
726
 
722
 
Line 739... Line 735...
739
			}
735
			}
740
		}
736
		}
741
	}
737
	}
742
 
738
 
743
	@Override
739
	@Override
744
	//Always being called from cancel order means no SCHEME IN is considered
740
	// Always being called from cancel order means no SCHEME IN is considered
745
	public void reverseSchemes(List<InventoryItem> inventoryItems, int reversalReference, String reversalReason,
741
	public void reverseSchemes(List<InventoryItem> inventoryItems, int reversalReference, String reversalReason,
746
			SchemeType schemeType) throws ProfitMandiBusinessException {
742
			SchemeType schemeType) throws ProfitMandiBusinessException {
747
		Map<Integer, InventoryItem> inventoryItemsMap = inventoryItems.stream()
743
		Map<Integer, InventoryItem> inventoryItemsMap = inventoryItems.stream()
748
				.collect(Collectors.toMap(x -> x.getId(), x -> x));
744
				.collect(Collectors.toMap(x -> x.getId(), x -> x));
749
		List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByInventoryItemIds(inventoryItemsMap.keySet());
745
		List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByInventoryItemIds(inventoryItemsMap.keySet());
Line 754... Line 750...
754
		for (SchemeInOut schemeInOut : schemeInOuts) {
750
		for (SchemeInOut schemeInOut : schemeInOuts) {
755
			Scheme scheme = schemesMap.get(schemeInOut.getSchemeId());
751
			Scheme scheme = schemesMap.get(schemeInOut.getSchemeId());
756
			if (scheme.getType().equals(schemeType)) {
752
			if (scheme.getType().equals(schemeType)) {
757
				if (schemeInOut.getRolledBackTimestamp() == null) {
753
				if (schemeInOut.getRolledBackTimestamp() == null) {
758
					schemeInOut.setRolledBackTimestamp(LocalDateTime.now());
754
					schemeInOut.setRolledBackTimestamp(LocalDateTime.now());
759
					if(schemeInOut.getStatus().equals(SchemePayoutStatus.CREDITED)) {
755
					if (schemeInOut.getStatus().equals(SchemePayoutStatus.CREDITED)) {
760
						amountToRollback += schemeInOut.getAmount();
756
						amountToRollback += schemeInOut.getAmount();
761
					}
757
					}
762
					schemeInOut.setStatus(SchemePayoutStatus.REJECTED);
758
					schemeInOut.setStatus(SchemePayoutStatus.REJECTED);
763
					schemeInOut.setStatusDescription(reversalReason);
759
					schemeInOut.setStatusDescription(reversalReason);
764
				}
760
				}
765
			}
761
			}
766
		}
762
		}
767
		int fofoId = inventoryItems.get(0).getFofoId();
763
		int fofoId = inventoryItems.get(0).getFofoId();
768
		WalletReferenceType walletReferenceType = schemeType.equals(SchemeType.OUT) ? WalletReferenceType.SCHEME_OUT
764
		WalletReferenceType walletReferenceType = schemeType.equals(SchemeType.OUT) ? WalletReferenceType.SCHEME_OUT
769
				: schemeType.equals(SchemeType.INVESTMENT) ? WalletReferenceType.INVESTMENT_PAYOUT : WalletReferenceType.ACTIVATION_SCHEME;
765
				: schemeType.equals(SchemeType.INVESTMENT) ? WalletReferenceType.INVESTMENT_PAYOUT
-
 
766
						: WalletReferenceType.ACTIVATION_SCHEME;
770
		if (amountToRollback > 0) {
767
		if (amountToRollback > 0) {
771
			// TODO//
768
			// TODO//
772
			walletService.rollbackAmountFromWallet(fofoId, amountToRollback, reversalReference, walletReferenceType,
769
			walletService.rollbackAmountFromWallet(fofoId, amountToRollback, reversalReference, walletReferenceType,
773
					reversalReason, LocalDateTime.now());
770
					reversalReason, LocalDateTime.now());
774
		}
771
		}
Line 826... Line 823...
826
	 * 
823
	 * 
827
	 * }
824
	 * }
828
	 */
825
	 */
829
 
826
 
830
	@Override
827
	@Override
831
	public List<Scheme> selectSchemeByPartnerType(PartnerType partnerType, LocalDate onDate, int itemId, boolean isAdmin, int offset,
828
	public List<Scheme> selectSchemeByPartnerType(PartnerType partnerType, LocalDate onDate, int itemId,
832
			int limit) throws ProfitMandiBusinessException {
829
			boolean isAdmin, int offset, int limit) throws ProfitMandiBusinessException {
833
		Session session = sessionFactory.getCurrentSession();
830
		Session session = sessionFactory.getCurrentSession();
834
		CriteriaBuilder cb = session.getCriteriaBuilder();
831
		CriteriaBuilder cb = session.getCriteriaBuilder();
835
		CriteriaQuery<Scheme> query = cb.createQuery(Scheme.class);
832
		CriteriaQuery<Scheme> query = cb.createQuery(Scheme.class);
836
		Root<Scheme> scheme = query.from(Scheme.class);
833
		Root<Scheme> scheme = query.from(Scheme.class);
837
		List<PartnerType> pt = new ArrayList<>();
834
		List<PartnerType> pt = new ArrayList<>();
Line 842... Line 839...
842
		cb.desc(cb.isNull(scheme.get("expireTimestamp")));
839
		cb.desc(cb.isNull(scheme.get("expireTimestamp")));
843
 
840
 
844
		Predicate p3 = null;
841
		Predicate p3 = null;
845
		Predicate finalPredicate = null;
842
		Predicate finalPredicate = null;
846
		if (itemId != 0) {
843
		if (itemId != 0) {
847
			
844
 
848
			List<Integer> schemeIds = schemeItemRepository.selectSchemeIdByItemId(itemId);
845
			List<Integer> schemeIds = schemeItemRepository.selectSchemeIdByItemId(itemId);
849
			LOGGER.info("schemeId" + schemeIds);
846
			LOGGER.info("schemeId" + schemeIds);
850
			if(schemeIds.isEmpty()) {
847
			if (schemeIds.isEmpty()) {
851
				return new ArrayList<>();
848
				return new ArrayList<>();
852
			}
849
			}
853
			p3 = cb.in(scheme.get("id")).value(schemeIds);
850
			p3 = cb.in(scheme.get("id")).value(schemeIds);
854
			if (!isAdmin) {
851
			if (!isAdmin) {
855
 
852
 
Line 912... Line 909...
912
		}
909
		}
913
 
910
 
914
		return session.createQuery(query).getSingleResult();
911
		return session.createQuery(query).getSingleResult();
915
 
912
 
916
	}
913
	}
917
	
914
 
918
	@Override
915
	@Override
919
	public void processActivation() throws ProfitMandiBusinessException {
916
	public void processActivation() throws ProfitMandiBusinessException {
920
		List<SchemeInOut> pendingPayouts = schemeInOutRepository.selectAllPending();
917
		List<SchemeInOut> pendingPayouts = schemeInOutRepository.selectAllPending();
921
		List<Integer> schemeIds = new ArrayList<>();
918
		List<Integer> schemeIds = new ArrayList<>();
922
		Set<Integer> inventoryIds = new HashSet<>();
919
		Set<Integer> inventoryIds = new HashSet<>();
923
		for (SchemeInOut pendingPayout: pendingPayouts) {
920
		for (SchemeInOut pendingPayout : pendingPayouts) {
924
			schemeIds.add(pendingPayout.getSchemeId());
921
			schemeIds.add(pendingPayout.getSchemeId());
925
		}
922
		}
926
		Map<Integer, Scheme> schemesMap = schemeRepository.selectBySchemeIds(schemeIds, 0, 0).stream()
923
		Map<Integer, Scheme> schemesMap = schemeRepository.selectBySchemeIds(schemeIds, 0, 0).stream()
927
				.filter(x->x.getType().equals(SchemeType.ACTIVATION)).collect(Collectors.toMap(x->x.getId(), x->x));
924
				.filter(x -> x.getType().equals(SchemeType.ACTIVATION))
-
 
925
				.collect(Collectors.toMap(x -> x.getId(), x -> x));
928
		pendingPayouts = pendingPayouts.stream().filter(x->schemesMap.get(x.getSchemeId())!=null).collect(Collectors.toList());
926
		pendingPayouts = pendingPayouts.stream().filter(x -> schemesMap.get(x.getSchemeId()) != null)
-
 
927
				.collect(Collectors.toList());
929
 
928
 
930
		for (SchemeInOut pendingPayout: pendingPayouts) {
929
		for (SchemeInOut pendingPayout : pendingPayouts) {
931
			inventoryIds.add(pendingPayout.getInventoryItemId());
930
			inventoryIds.add(pendingPayout.getInventoryItemId());
932
		}
931
		}
933
		Map<Integer, InventoryItem> inventoryItemMap = inventoryItemRepository.selectByIds(inventoryIds).stream().collect(Collectors.toMap(x->x.getId(), x->x));
932
		Map<Integer, InventoryItem> inventoryItemMap = inventoryItemRepository.selectByIds(inventoryIds).stream()
-
 
933
				.collect(Collectors.toMap(x -> x.getId(), x -> x));
934
		Map<String, InventoryItem> serialNumberMap = inventoryItemMap.values().stream(). collect(Collectors.toMap(x->x.getSerialNumber(), x->x));
934
		Map<String, InventoryItem> serialNumberMap = inventoryItemMap.values().stream()
935
		
-
 
-
 
935
				.collect(Collectors.toMap(x -> x.getSerialNumber(), x -> x));
936
		
936
 
-
 
937
		List<ActivatedImei> activatedImeis = activatedImeiRepository
937
		List<ActivatedImei> activatedImeis = activatedImeiRepository.selectBySerialNumbers(new ArrayList<>(serialNumberMap.keySet()));
938
				.selectBySerialNumbers(new ArrayList<>(serialNumberMap.keySet()));
938
		
939
 
939
		Map<String, ActivatedImei> activatedImeiMap = activatedImeis.stream().collect(Collectors.toMap(x->x.getSerialNumber(), x->x));
940
		Map<String, ActivatedImei> activatedImeiMap = activatedImeis.stream()
-
 
941
				.collect(Collectors.toMap(x -> x.getSerialNumber(), x -> x));
940
		for(SchemeInOut pendingPayout : pendingPayouts) {
942
		for (SchemeInOut pendingPayout : pendingPayouts) {
941
			InventoryItem ii = inventoryItemMap.get(pendingPayout.getInventoryItemId());
943
			InventoryItem ii = inventoryItemMap.get(pendingPayout.getInventoryItemId());
942
			String serialNumber = ii.getSerialNumber();
944
			String serialNumber = ii.getSerialNumber();
943
			ActivatedImei activatedImei = activatedImeiMap.get(serialNumber);
945
			ActivatedImei activatedImei = activatedImeiMap.get(serialNumber);
944
			if(activatedImei == null) {
946
			if (activatedImei == null) {
945
				continue;
947
				continue;
946
			}
948
			}
947
			Scheme scheme = schemesMap.get(pendingPayout.getSchemeId());
949
			Scheme scheme = schemesMap.get(pendingPayout.getSchemeId());
948
			if(activatedImei.getActivationTimestamp().isBefore(scheme.getEndDateTime()) 
950
			if (activatedImei.getActivationTimestamp().isBefore(scheme.getEndDateTime())
949
				&& activatedImei.getActivationTimestamp().isAfter(scheme.getStartDateTime())) {
951
					&& activatedImei.getActivationTimestamp().isAfter(scheme.getStartDateTime())) {
950
				int fofoId = ii.getFofoId();
952
				int fofoId = ii.getFofoId();
951
				//Get latest order Id
953
				// Get latest order Id
952
				int orderId = scanRecordRepository.selectByInventoryItemId(ii.getId()).stream().filter(x->x.getOrderId() > 0).
954
				int orderId = scanRecordRepository.selectByInventoryItemId(ii.getId()).stream()
-
 
955
						.filter(x -> x.getOrderId() > 0)
953
				sorted(Comparator.comparing(ScanRecord::getCreateTimestamp).reversed()).findFirst().get().getOrderId();
956
						.sorted(Comparator.comparing(ScanRecord::getCreateTimestamp).reversed()).findFirst().get()
-
 
957
						.getOrderId();
954
				FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(orderId);
958
				FofoOrder fofoOrder = fofoOrderRepository.selectByOrderId(orderId);
955
				walletService.addAmountToWallet(fofoId, orderId, WalletReferenceType.ACTIVATION_SCHEME, "Activation margin for Imei#" + serialNumber, 
959
				walletService.addAmountToWallet(fofoId, orderId, WalletReferenceType.ACTIVATION_SCHEME,
-
 
960
						"Activation margin for Imei#" + serialNumber, pendingPayout.getAmount(),
956
						pendingPayout.getAmount(), fofoOrder.getCreateTimestamp());
961
						fofoOrder.getCreateTimestamp());
957
				pendingPayout.setCreditTimestamp(LocalDateTime.now());
962
				pendingPayout.setCreditTimestamp(LocalDateTime.now());
958
				pendingPayout.setStatus(SchemePayoutStatus.CREDITED);
963
				pendingPayout.setStatus(SchemePayoutStatus.CREDITED);
959
				pendingPayout.setStatusDescription("Activation margin credited");
964
				pendingPayout.setStatusDescription("Activation margin credited");
960
			} else {
965
			} else {
961
				pendingPayout.setStatus(SchemePayoutStatus.REJECTED);
966
				pendingPayout.setStatus(SchemePayoutStatus.REJECTED);
962
				pendingPayout.setRolledBackTimestamp(LocalDateTime.now());;
967
				pendingPayout.setRolledBackTimestamp(LocalDateTime.now());
-
 
968
				;
-
 
969
				pendingPayout.setStatusDescription(
963
				pendingPayout.setStatusDescription("Rejected, activated on " + FormattingUtils.formatDate(activatedImei.getActivationTimestamp()));
970
						"Rejected, activated on " + FormattingUtils.formatDate(activatedImei.getActivationTimestamp()));
964
			}
971
			}
965
		}
972
		}
966
	}
973
	}
967
 
974
 
968
}
975
}