Subversion Repositories SmartDukaan

Rev

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

Rev 28749 Rev 28969
Line 1... Line 1...
1
package com.spice.profitmandi.service.scheme;
1
package com.spice.profitmandi.service.scheme;
2
 
2
 
3
import java.text.MessageFormat;
3
import java.text.MessageFormat;
4
import java.time.LocalDate;
4
import java.time.LocalDate;
5
import java.time.LocalDateTime;
5
import java.time.LocalDateTime;
-
 
6
import java.time.YearMonth;
6
import java.util.ArrayList;
7
import java.util.ArrayList;
7
import java.util.Arrays;
8
import java.util.Arrays;
8
import java.util.Comparator;
9
import java.util.Comparator;
9
import java.util.HashMap;
10
import java.util.HashMap;
10
import java.util.HashSet;
11
import java.util.HashSet;
Line 404... Line 405...
404
 
405
 
405
	@Override
406
	@Override
406
	public void processSchemeIn(int purchaseId, int retailerId) throws ProfitMandiBusinessException {
407
	public void processSchemeIn(int purchaseId, int retailerId) throws ProfitMandiBusinessException {
407
		LOGGER.info("Trying to process SchemeIn with purchaseId [{}] and retailerId [{}]", purchaseId, retailerId);
408
		LOGGER.info("Trying to process SchemeIn with purchaseId [{}] and retailerId [{}]", purchaseId, retailerId);
408
		Purchase purchase = purchaseRepository.selectByIdAndFofoId(purchaseId, retailerId);
409
		Purchase purchase = purchaseRepository.selectByIdAndFofoId(purchaseId, retailerId);
409
		PartnerType partnerType = partnerTypeChangeService.getTypeOnDate(retailerId,
410
		PartnerType partnerType = partnerTypeChangeService.getTypeOnMonth(retailerId, YearMonth.from(purchase.getCreateTimestamp()));
410
				purchase.getCreateTimestamp().toLocalDate());
-
 
411
		List<Scheme> schemes = schemeRepository.selectActiveAll(SchemeType.IN, partnerType,
411
		List<Scheme> schemes = schemeRepository.selectActiveAll(SchemeType.IN, partnerType,
412
				purchase.getCreateTimestamp(), false);
412
				purchase.getCreateTimestamp(), false);
413
		float totalCashback = 0;
413
		float totalCashback = 0;
414
		if (schemes.isEmpty()) {
414
		if (schemes.isEmpty()) {
415
			return;
415
			return;
Line 473... Line 473...
473
			purchaseRepository.persist(purchase);
473
			purchaseRepository.persist(purchase);
474
		}
474
		}
475
	}
475
	}
476
 
476
 
477
	private float createSchemeInOut(Scheme scheme, InventoryItem inventoryItem) {
477
	private float createSchemeInOut(Scheme scheme, InventoryItem inventoryItem) {
478
		List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectByScheme(scheme.getId(), inventoryItem.getId());
478
		List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectAll(inventoryItem.getId());
479
		float amountToCredit = 0;
479
		float amountToCredit = 0;
480
		if (schemeInOuts.stream().filter(x -> x.getRolledBackTimestamp() == null).collect(Collectors.toList())
480
		if (schemeInOuts.stream().filter(x -> x.getRolledBackTimestamp() == null).collect(Collectors.toList())
481
				.size() == 0) {
481
				.size() == 0) {
482
			SchemeInOut schemeInOut = new SchemeInOut();
482
			SchemeInOut schemeInOut = new SchemeInOut();
483
			amountToCredit = this.getAmount(inventoryItem, scheme);
483
			amountToCredit = this.getAmount(inventoryItem, scheme);
Line 497... Line 497...
497
				schemeInOut.setStatus(SchemePayoutStatus.CREDITED);
497
				schemeInOut.setStatus(SchemePayoutStatus.CREDITED);
498
				if (scheme.getType().equals(SchemeType.IN)) {
498
				if (scheme.getType().equals(SchemeType.IN)) {
499
					schemeInOut.setStatusDescription("Credited for GRN of IMEI#" + inventoryItem.getSerialNumber());
499
					schemeInOut.setStatusDescription("Credited for GRN of IMEI#" + inventoryItem.getSerialNumber());
500
				} else if(scheme.getType().equals(SchemeType.OUT) || scheme.getType().equals(SchemeType.CATEGORY)){
500
				} else if(scheme.getType().equals(SchemeType.OUT) || scheme.getType().equals(SchemeType.CATEGORY)){
501
					schemeInOut.setStatusDescription("Credited for sale of IMEI#" + inventoryItem.getSerialNumber());
501
					schemeInOut.setStatusDescription("Credited for sale of IMEI#" + inventoryItem.getSerialNumber());
-
 
502
					if(scheme.getType().equals(SchemeType.CATEGORY)) {
-
 
503
						
-
 
504
						List<SchemeInOut> sios = schemeInOutRepository.selectAllByType(SchemeType.CATEGORY, inventoryItem.getId());
-
 
505
						SchemeInOut sio = sios.stream().filter(x->x.getId()!=schemeInOut.getId()).findFirst().orElse(null);
-
 
506
						if(sio != null) {
-
 
507
							sio.setRolledBackTimestamp(LocalDateTime.now());
-
 
508
							sio.setStatus(SchemePayoutStatus.REJECTED);
-
 
509
							sio.setStatusDescription("Category upgraded, new entry added");
-
 
510
							amountToCredit -= sio.getAmount();
-
 
511
							schemeInOut.setStatusDescription("Category upgraded, higher margins credited for sale of IMEI#" + inventoryItem.getSerialNumber());
-
 
512
						}
-
 
513
					}
-
 
514
					
502
				}
515
				}
503
				schemeInOut.setCreditTimestamp(LocalDateTime.now());
516
				schemeInOut.setCreditTimestamp(LocalDateTime.now());
504
			}
517
			}
505
		}
518
		}
506
		return amountToCredit;
519
		return amountToCredit;
Line 547... Line 560...
547
	}
560
	}
548
 
561
 
549
	@Override
562
	@Override
550
	public void processSchemeOut(int fofoOrderId, int retailerId) throws ProfitMandiBusinessException {
563
	public void processSchemeOut(int fofoOrderId, int retailerId) throws ProfitMandiBusinessException {
551
		FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndOrderId(retailerId, fofoOrderId);
564
		FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndOrderId(retailerId, fofoOrderId);
552
 
-
 
-
 
565
		//Process only if order is not cancelled
-
 
566
		if(fofoOrder.getCancelledTimestamp()==null) {
553
		PartnerType partnerType = partnerTypeChangeService.getTypeOnDate(retailerId,
567
			//PartnerType partnerType = partnerTypeChangeService.getTypeOnDate(retailerId,
554
				fofoOrder.getCreateTimestamp().toLocalDate());
568
			//		fofoOrder.getCreateTimestamp().toLocalDate());
-
 
569
			
-
 
570
			PartnerType partnerType = partnerTypeChangeService.getTypeOnMonth(retailerId, YearMonth.from(fofoOrder.getCreateTimestamp()));
555
 
571
			
556
		List<ScanRecord> scanRecords = scanRecordRepository.selectAllByOrderId(fofoOrderId);
572
			List<ScanRecord> scanRecords = scanRecordRepository.selectAllByOrderId(fofoOrderId);
557
		Set<Integer> inventoryItemIds = scanRecords.stream().map(x -> x.getInventoryItemId())
573
			Set<Integer> inventoryItemIds = scanRecords.stream().map(x -> x.getInventoryItemId())
558
				.collect(Collectors.toSet());
574
					.collect(Collectors.toSet());
559
		Set<InventoryItem> inventoryItems = inventoryItemRepository.selectByIds(inventoryItemIds).stream()
575
			Set<InventoryItem> inventoryItems = inventoryItemRepository.selectByIds(inventoryItemIds).stream()
560
				.filter(x -> x.getSerialNumber() != null && !x.getSerialNumber().equals(""))
576
					.filter(x -> x.getSerialNumber() != null && !x.getSerialNumber().equals(""))
561
				.collect(Collectors.toSet());
577
					.collect(Collectors.toSet());
562
		if (inventoryItems.size() == 0) {
578
			if (inventoryItems.size() == 0) {
563
			return;
579
				return;
564
		}
580
			}
565
		Set<Integer> itemIds = inventoryItems.stream().map(x -> x.getItemId()).collect(Collectors.toSet());
581
			Set<Integer> itemIds = inventoryItems.stream().map(x -> x.getItemId()).collect(Collectors.toSet());
566
 
582
			
-
 
583
			//Remove Items that are eol now.
567
		Set<Integer> itemIdsSet = tagListingRepository.selectByItemIdsAndTagIds(itemIds, tagIds).stream()
584
			Set<Integer> itemIdsSet = tagListingRepository.selectByItemIdsAndTagIds(itemIds, tagIds).stream()
568
				.filter(x -> x.getEolDate() == null || x.getEolDate().isAfter(fofoOrder.getCreateTimestamp()))
585
					.filter(x -> x.getEolDate() == null || x.getEolDate().isAfter(fofoOrder.getCreateTimestamp()))
569
				.map(x -> x.getItemId()).collect(Collectors.toSet());
586
					.map(x -> x.getItemId()).collect(Collectors.toSet());
570
		// Only consider inventory items that were not returned
587
			// Only consider inventory items that were not returned
571
		inventoryItems = inventoryItems.stream().filter(x -> itemIdsSet.contains(x.getItemId()))
588
			inventoryItems = inventoryItems.stream().filter(x -> itemIdsSet.contains(x.getItemId()))
572
				.collect(Collectors.toSet());
589
					.collect(Collectors.toSet());
573
 
590
			
574
		if (inventoryItems.size() == 0) {
591
			if (inventoryItems.size() == 0) {
575
			return;
592
				return;
576
		}
593
			}
577
 
594
			
578
		float totalCashback = 0;
595
			float totalCashback = 0;
579
		int count = 0;
596
			int count = 0;
580
 
597
			
581
		List<Scheme> allActiveSchemes = schemeRepository.selectActiveAll(SchemeType.OUT, partnerType,
598
			List<Scheme> allActiveSchemes = schemeRepository.selectActiveAll(SchemeType.OUT, partnerType,
582
				fofoOrder.getCreateTimestamp(), false);
599
					fofoOrder.getCreateTimestamp(), false);
583
		allActiveSchemes.addAll(schemeRepository.selectActiveAll(SchemeType.ACTIVATION, partnerType,
600
			allActiveSchemes.addAll(schemeRepository.selectActiveAll(SchemeType.ACTIVATION, partnerType,
584
				fofoOrder.getCreateTimestamp(), false));
601
					fofoOrder.getCreateTimestamp(), false));
585
		allActiveSchemes.addAll(schemeRepository.selectActiveAll(SchemeType.INVESTMENT, partnerType,
602
			allActiveSchemes.addAll(schemeRepository.selectActiveAll(SchemeType.INVESTMENT, partnerType,
586
				fofoOrder.getCreateTimestamp(), false));
603
					fofoOrder.getCreateTimestamp(), false));
587
		allActiveSchemes.addAll(schemeRepository.selectActiveAll(SchemeType.CATEGORY, partnerType,
604
			allActiveSchemes.addAll(schemeRepository.selectActiveAll(SchemeType.CATEGORY, partnerType,
588
				fofoOrder.getCreateTimestamp(), false));
605
					fofoOrder.getCreateTimestamp(), false));
589
 
606
			
590
		for (InventoryItem inventoryItem : inventoryItems) {
607
			for (InventoryItem inventoryItem : inventoryItems) {
591
			float itemCashback = 0;
608
				float itemCashback = 0;
592
			Set<Integer> schemeIds = new HashSet<>(
609
				Set<Integer> schemeIds = new HashSet<>(
593
					schemeItemRepository.selectSchemeIdByItemId(inventoryItem.getItemId()));
610
						schemeItemRepository.selectSchemeIdByItemId(inventoryItem.getItemId()));
594
			allActiveSchemes = allActiveSchemes.stream().filter(x -> schemeIds.contains(x.getId()))
611
				allActiveSchemes = allActiveSchemes.stream().filter(x -> schemeIds.contains(x.getId()))
595
					.collect(Collectors.toList());
612
						.collect(Collectors.toList());
596
			for (Scheme scheme : allActiveSchemes) {
613
				for (Scheme scheme : allActiveSchemes) {
597
				itemCashback += this.createSchemeInOut(scheme, inventoryItem);
614
					itemCashback += this.createSchemeInOut(scheme, inventoryItem);
598
			}
615
				}
599
			if (itemCashback > 0) {
616
				if (itemCashback > 0) {
600
				count++;
617
					count++;
601
				totalCashback += itemCashback;
618
					totalCashback += itemCashback;
602
			}
619
				}
603
		}
620
			}
604
		if (count > 0) {
621
			if (count > 0) {
605
			walletService.addAmountToWallet(retailerId, fofoOrderId, WalletReferenceType.SCHEME_OUT,
622
				walletService.addAmountToWallet(retailerId, fofoOrderId, WalletReferenceType.SCHEME_OUT,
606
					"Sales margin for invoice number " + fofoOrder.getInvoiceNumber() + ". Total " + count + " pc(s)",
623
						"Sales margin for invoice number " + fofoOrder.getInvoiceNumber() + ". Total " + count + " pc(s)",
607
					totalCashback, fofoOrder.getCreateTimestamp());
624
						totalCashback, fofoOrder.getCreateTimestamp());
608
			fofoOrder.setCashback(totalCashback);
625
				fofoOrder.setCashback(totalCashback);
609
			fofoOrderRepository.persist(fofoOrder);
626
				fofoOrderRepository.persist(fofoOrder);
-
 
627
			}
610
		}
628
		}
611
	}
629
	}
612
 
630
 
613
	@Override
631
	@Override
614
	public void rollbackSchemes(List<Integer> inventoryItemIds, int rollbackReference, String rollbackReason)
632
	public void rollbackSchemes(List<Integer> inventoryItemIds, int rollbackReference, String rollbackReason)