Subversion Repositories SmartDukaan

Rev

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

Rev 24976 Rev 25043
Line 1... Line 1...
1
package com.spice.profitmandi.service.scheme;
1
package com.spice.profitmandi.service.scheme;
2
 
2
 
3
import java.time.LocalDateTime;
3
import java.time.LocalDateTime;
4
import java.util.ArrayList;
4
import java.util.ArrayList;
5
import java.util.Arrays;
-
 
6
import java.util.HashMap;
5
import java.util.HashMap;
7
import java.util.HashSet;
6
import java.util.HashSet;
8
import java.util.List;
7
import java.util.List;
9
import java.util.Map;
8
import java.util.Map;
10
import java.util.Set;
9
import java.util.Set;
Line 28... Line 27...
28
import com.spice.profitmandi.dao.entity.fofo.FofoLineItem;
27
import com.spice.profitmandi.dao.entity.fofo.FofoLineItem;
29
import com.spice.profitmandi.dao.entity.fofo.FofoOrder;
28
import com.spice.profitmandi.dao.entity.fofo.FofoOrder;
30
import com.spice.profitmandi.dao.entity.fofo.FofoOrderItem;
29
import com.spice.profitmandi.dao.entity.fofo.FofoOrderItem;
31
import com.spice.profitmandi.dao.entity.fofo.InventoryItem;
30
import com.spice.profitmandi.dao.entity.fofo.InventoryItem;
32
import com.spice.profitmandi.dao.entity.fofo.Purchase;
31
import com.spice.profitmandi.dao.entity.fofo.Purchase;
-
 
32
import com.spice.profitmandi.dao.entity.fofo.ScanRecord;
33
import com.spice.profitmandi.dao.entity.fofo.SchemeInOut;
33
import com.spice.profitmandi.dao.entity.fofo.SchemeInOut;
34
import com.spice.profitmandi.dao.entity.fofo.SchemeItem;
34
import com.spice.profitmandi.dao.entity.fofo.SchemeItem;
35
import com.spice.profitmandi.dao.entity.transaction.Order;
-
 
36
import com.spice.profitmandi.dao.enumuration.catalog.AmountType;
35
import com.spice.profitmandi.dao.enumuration.catalog.AmountType;
37
import com.spice.profitmandi.dao.enumuration.catalog.SchemeType;
36
import com.spice.profitmandi.dao.enumuration.catalog.SchemeType;
38
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
37
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
39
import com.spice.profitmandi.dao.repository.catalog.RetailerSchemeRepository;
38
import com.spice.profitmandi.dao.repository.catalog.RetailerSchemeRepository;
40
import com.spice.profitmandi.dao.repository.catalog.SchemeRepository;
39
import com.spice.profitmandi.dao.repository.catalog.SchemeRepository;
Line 43... Line 42...
43
import com.spice.profitmandi.dao.repository.fofo.FofoLineItemRepository;
42
import com.spice.profitmandi.dao.repository.fofo.FofoLineItemRepository;
44
import com.spice.profitmandi.dao.repository.fofo.FofoOrderItemRepository;
43
import com.spice.profitmandi.dao.repository.fofo.FofoOrderItemRepository;
45
import com.spice.profitmandi.dao.repository.fofo.FofoOrderRepository;
44
import com.spice.profitmandi.dao.repository.fofo.FofoOrderRepository;
46
import com.spice.profitmandi.dao.repository.fofo.InventoryItemRepository;
45
import com.spice.profitmandi.dao.repository.fofo.InventoryItemRepository;
47
import com.spice.profitmandi.dao.repository.fofo.PurchaseRepository;
46
import com.spice.profitmandi.dao.repository.fofo.PurchaseRepository;
-
 
47
import com.spice.profitmandi.dao.repository.fofo.ScanRecordRepository;
48
import com.spice.profitmandi.dao.repository.fofo.SchemeInOutRepository;
48
import com.spice.profitmandi.dao.repository.fofo.SchemeInOutRepository;
49
import com.spice.profitmandi.dao.repository.fofo.SchemeItemRepository;
49
import com.spice.profitmandi.dao.repository.fofo.SchemeItemRepository;
50
import com.spice.profitmandi.dao.repository.transaction.OrderRepository;
-
 
51
import com.spice.profitmandi.service.authentication.RoleManager;
50
import com.spice.profitmandi.service.authentication.RoleManager;
52
import com.spice.profitmandi.service.order.OrderService;
-
 
53
import com.spice.profitmandi.service.wallet.WalletService;
51
import com.spice.profitmandi.service.wallet.WalletService;
54
 
52
 
55
import in.shop2020.model.v1.order.WalletReferenceType;
53
import in.shop2020.model.v1.order.WalletReferenceType;
56
 
54
 
57
@Component
55
@Component
Line 62... Line 60...
62
	@Autowired
60
	@Autowired
63
	@Qualifier("fofoInventoryItemRepository")
61
	@Qualifier("fofoInventoryItemRepository")
64
	private InventoryItemRepository inventoryItemRepository;
62
	private InventoryItemRepository inventoryItemRepository;
65
 
63
 
66
	@Autowired
64
	@Autowired
67
	private OrderService orderService;
65
	private ScanRecordRepository scanRecordRepository;
68
 
66
 
69
	@Autowired
67
	@Autowired
70
	private SchemeRepository schemeRepository;
68
	private SchemeRepository schemeRepository;
71
 
69
 
72
	@Autowired
70
	@Autowired
Line 102... Line 100...
102
 
100
 
103
	@Autowired
101
	@Autowired
104
	private PurchaseRepository purchaseRepository;
102
	private PurchaseRepository purchaseRepository;
105
 
103
 
106
	@Autowired
104
	@Autowired
107
	private OrderRepository orderRepository;
-
 
108
 
-
 
109
	@Autowired
-
 
110
	private FofoOrderRepository fofoOrderRepository;
105
	private FofoOrderRepository fofoOrderRepository;
111
 
106
 
112
	@Override
107
	@Override
113
	public void saveScheme(int creatorId, CreateSchemeRequest createSchemeRequest) throws ProfitMandiBusinessException {
108
	public void saveScheme(int creatorId, CreateSchemeRequest createSchemeRequest) throws ProfitMandiBusinessException {
114
 
109
 
Line 507... Line 502...
507
			}
502
			}
508
		}
503
		}
509
		return schemeIds;
504
		return schemeIds;
510
	}
505
	}
511
 
506
 
512
	private Set<Integer> fofoLineItemSchemesMapToSchemeIds(Map<FofoOrderItem, Set<Scheme>> fofoLineItemSchemesMap) {
-
 
513
		Set<Integer> schemeIds = new HashSet<>();
-
 
514
		for (Map.Entry<FofoOrderItem, Set<Scheme>> inventoryItemSchemesEntry : fofoLineItemSchemesMap.entrySet()) {
-
 
515
			for (Scheme scheme : inventoryItemSchemesEntry.getValue()) {
-
 
516
				schemeIds.add(scheme.getId());
-
 
517
			}
-
 
518
		}
-
 
519
		return schemeIds;
-
 
520
	}
-
 
521
 
-
 
522
	private Set<Integer> inventoryItemsToItemIds(List<InventoryItem> inventoryItems) {
507
	private Set<Integer> inventoryItemsToItemIds(List<InventoryItem> inventoryItems) {
523
		Set<Integer> itemIds = new HashSet<>();
508
		Set<Integer> itemIds = new HashSet<>();
524
		for (InventoryItem inventoryItem : inventoryItems) {
509
		for (InventoryItem inventoryItem : inventoryItems) {
525
			itemIds.add(inventoryItem.getItemId());
510
			itemIds.add(inventoryItem.getItemId());
526
		}
511
		}
527
		return itemIds;
512
		return itemIds;
528
	}
513
	}
529
 
514
 
530
	private Set<Integer> fofoOrderItemsToItemIds(List<FofoOrderItem> fofoOrderItems) {
-
 
531
		Set<Integer> itemIds = new HashSet<>();
-
 
532
		for (FofoOrderItem fofoOrderItem : fofoOrderItems) {
-
 
533
			itemIds.add(fofoOrderItem.getItemId());
-
 
534
		}
-
 
535
		return itemIds;
-
 
536
	}
-
 
537
 
-
 
538
	private Map<Integer, Set<Scheme>> toItemIdSchemesMap(List<SchemeItem> schemeItems, List<Scheme> schemes) {
515
	private Map<Integer, Set<Scheme>> toItemIdSchemesMap(List<SchemeItem> schemeItems, List<Scheme> schemes) {
539
		Map<Integer, Scheme> schemeIdSchemesMap = this.toSchemeIdSchemeMap(schemes);
516
		Map<Integer, Scheme> schemeIdSchemesMap = this.toSchemeIdSchemeMap(schemes);
540
		Map<Integer, Set<Scheme>> itemIdSchemesMap = new HashMap<>();
517
		Map<Integer, Set<Scheme>> itemIdSchemesMap = new HashMap<>();
541
		for (SchemeItem schemeItem : schemeItems) {
518
		for (SchemeItem schemeItem : schemeItems) {
542
			if (!itemIdSchemesMap.containsKey(schemeItem.getItemId())) {
519
			if (!itemIdSchemesMap.containsKey(schemeItem.getItemId())) {
Line 567... Line 544...
567
			}
544
			}
568
		}
545
		}
569
		return inventoryItemSchemsMap;
546
		return inventoryItemSchemsMap;
570
	}
547
	}
571
 
548
 
572
	private Map<FofoOrderItem, Set<Scheme>> toFofoOrderItemSchemesMap(List<Scheme> schemes,
-
 
573
			List<FofoOrderItem> fofoOrderItems) {
-
 
574
		Set<Integer> schemeIds = new HashSet<>();
-
 
575
		for (Scheme scheme : schemes) {
-
 
576
			schemeIds.add(scheme.getId());
-
 
577
		}
-
 
578
		Set<Integer> itemIds = this.fofoOrderItemsToItemIds(fofoOrderItems);
-
 
579
		List<SchemeItem> schemeItems = schemeItemRepository.selectBySchemeIdsAndItemIds(schemeIds, itemIds);
-
 
580
 
-
 
581
		Map<FofoOrderItem, Set<Scheme>> fofoOrderItemSchemsMap = new HashMap<>();
-
 
582
 
-
 
583
		if (!schemeItems.isEmpty()) {
-
 
584
			Map<Integer, Set<Scheme>> itemIdSchemesMap = this.toItemIdSchemesMap(schemeItems, schemes);
-
 
585
			for (FofoOrderItem fofoOrderItem : fofoOrderItems) {
-
 
586
				if (itemIdSchemesMap.containsKey(fofoOrderItem.getItemId())) {
-
 
587
					fofoOrderItemSchemsMap.put(fofoOrderItem, itemIdSchemesMap.get(fofoOrderItem.getItemId()));
-
 
588
				}
-
 
589
			}
-
 
590
		}
-
 
591
		return fofoOrderItemSchemsMap;
-
 
592
	}
-
 
593
 
-
 
594
	@Override
549
	@Override
595
	public void processSchemeIn(int purchaseId, int retailerId) throws ProfitMandiBusinessException {
550
	public void processSchemeIn(int purchaseId, int retailerId) throws ProfitMandiBusinessException {
596
		LOGGER.info("Trying to process SchemeIn with purchaseId [{}] and retailerId [{}]", purchaseId, retailerId);
551
		LOGGER.info("Trying to process SchemeIn with purchaseId [{}] and retailerId [{}]", purchaseId, retailerId);
597
		Purchase purchase = purchaseRepository.selectByIdAndFofoId(purchaseId, retailerId);
552
		Purchase purchase = purchaseRepository.selectByIdAndFofoId(purchaseId, retailerId);
598
		LOGGER.info("purchase is completed = {}", (purchase.getCompleteTimestamp() != null));
553
		LOGGER.info("purchase is completed = {}", (purchase.getCompleteTimestamp() != null));
599
		if (purchase.getCompleteTimestamp() != null) {
554
		if (purchase.getCompleteTimestamp() != null) {
-
 
555
			/*
-
 
556
			 * List<Order> orders =
600
			List<Order> orders = orderRepository.selectByAirwayBillOrInvoiceNumber(purchase.getPurchaseReference(),
557
			 * orderRepository.selectByAirwayBillOrInvoiceNumber(purchase.
601
					retailerId);
-
 
602
			LocalDateTime billingTimestamp = purchase.getCreateTimestamp();
558
			 * getPurchaseReference(), retailerId);
-
 
559
			 */
-
 
560
			/*
603
			if (!orders.isEmpty()) {
561
			 * if (!orders.isEmpty()) { billingTimestamp =
604
				billingTimestamp = orders.get(0).getBillingTimestamp();
562
			 * orders.get(0).getBillingTimestamp(); }
605
			}
563
			 */
606
			List<Scheme> schemes = schemeRepository.selectActiveAll(SchemeType.IN, billingTimestamp);
564
			List<Scheme> schemes = schemeRepository.selectActiveAll(SchemeType.IN, purchase.getCompleteTimestamp());
607
			float totalCashback = 0;
565
			float totalCashback = 0;
608
			if (schemes.isEmpty()) {
566
			if (schemes.isEmpty()) {
609
				return;
567
				return;
610
			}
568
			}
611
			List<InventoryItem> inventoryItems = inventoryItemRepository.selectByPurchaseId(purchaseId);
569
			List<InventoryItem> inventoryItems = inventoryItemRepository.selectByPurchaseId(purchaseId);
Line 713... Line 671...
713
				}
671
				}
714
			}
672
			}
715
			float taxableSellingPrice = amount / (1 + totalTaxRate / 100);
673
			float taxableSellingPrice = amount / (1 + totalTaxRate / 100);
716
			amount = taxableSellingPrice * scheme.getAmount() / 100;
674
			amount = taxableSellingPrice * scheme.getAmount() / 100;
717
		} else {
675
		} else {
-
 
676
			/*
718
			/*List<SchemeInOut> sios = schemeInOutRepository.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItem.getId())));
677
			 * List<SchemeInOut> sios = schemeInOutRepository.selectByInventoryItemIds(new
-
 
678
			 * HashSet<>(Arrays.asList(inventoryItem.getId()))); List<Integer> schemeIds =
719
			List<Integer> schemeIds = sios.stream().filter(x->x.getSchemeType().equals(SchemeType.IN)).map(x->x.getSchemeId()).collect(Collectors.toList());
679
			 * sios.stream().filter(x->x.getSchemeType().equals(SchemeType.IN)).map(x->x.
-
 
680
			 * getSchemeId()).collect(Collectors.toList()); List<Scheme> schemes =
720
			List<Scheme> schemes = schemeRepository.selectBySchemeIds(schemeIds, 0, 0);
681
			 * schemeRepository.selectBySchemeIds(schemeIds, 0, 0); if(schemes.
721
			if(schemes.*/
682
			 */
722
			amount = scheme.getAmount();
683
			amount = scheme.getAmount();
723
		}
684
		}
724
		return amount;
685
		return amount;
725
	}
686
	}
726
 
687
 
727
	private Map<Integer, InventoryItem> toInventoryItemIdInventoryItemMap(List<InventoryItem> inventoryItems) {
-
 
728
		Map<Integer, InventoryItem> itemIdInventoryItemMap = new HashMap<>();
-
 
729
		for (InventoryItem inventoryItem : inventoryItems) {
-
 
730
			itemIdInventoryItemMap.put(inventoryItem.getId(), inventoryItem);
-
 
731
		}
-
 
732
		return itemIdInventoryItemMap;
-
 
733
	}
-
 
734
 
-
 
735
	private Set<Integer> toInventoryItemIds(Set<FofoOrderItem> fofoOrderItems) {
-
 
736
		Set<Integer> inventoryItemIds = new HashSet<>();
-
 
737
		// Map<Integer, Set<FofoLineItem>> fofoOrderItemIdFofoLineItemsMap =
-
 
738
		// this.toFofoOrderItemIdFofoLineItems(fofoOrderItems);
-
 
739
		for (FofoOrderItem fofoOrderItem : fofoOrderItems) {
-
 
740
			for (FofoLineItem fofoLineItem : fofoOrderItem.getFofoLineItems()) {
-
 
741
				inventoryItemIds.add(fofoLineItem.getInventoryItemId());
-
 
742
			}
-
 
743
		}
-
 
744
		return inventoryItemIds;
-
 
745
	}
-
 
746
 
-
 
747
	@Override
688
	@Override
748
	public void processSchemeOut(int fofoOrderId, int retailerId) throws ProfitMandiBusinessException {
689
	public void processSchemeOut(int fofoOrderId, int retailerId) throws ProfitMandiBusinessException {
749
		FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndOrderId(retailerId, fofoOrderId);
690
		FofoOrder fofoOrder = fofoOrderRepository.selectByFofoIdAndOrderId(retailerId, fofoOrderId);
750
		List<Scheme> schemes = schemeRepository.selectActiveAll(SchemeType.OUT, fofoOrder.getCreateTimestamp());
-
 
751
		LOGGER.info("Active Schemes {}", schemes);
-
 
752
		float totalCashback = 0;
-
 
753
		int count = 0;
-
 
754
		if (schemes.isEmpty()) {
-
 
755
			return;
-
 
756
		}
-
 
757
 
691
 
758
		List<FofoOrderItem> fofoOrderItems = orderService.getByOrderId(fofoOrderId);
692
		List<ScanRecord> scanRecords = scanRecordRepository.selectAllByOrderId(fofoOrderId);
-
 
693
		Set<Integer> inventoryItemIds = scanRecords.stream().map(x -> x.getInventoryItemId())
759
		// LOGGER.info("fofoOrderItems {}", fofoOrderItems);
694
				.collect(Collectors.toSet());
-
 
695
		Set<InventoryItem> inventoryItems = inventoryItemRepository.selectByIds(inventoryItemIds).stream()
-
 
696
				.filter(x -> x.getSerialNumber() != null && !x.getSerialNumber().equals(""))
-
 
697
				.collect(Collectors.toSet());
760
 
698
 
761
		Map<FofoOrderItem, Set<Scheme>> fofoOrderItemSchemesMap = this.toFofoOrderItemSchemesMap(schemes,
-
 
762
				fofoOrderItems);
-
 
763
 
-
 
764
		LOGGER.info("fofoOrderItemSchemesMap {}", fofoOrderItemSchemesMap);
-
 
765
 
-
 
766
		if (fofoOrderItemSchemesMap.isEmpty()) {
699
		if (inventoryItems.size() == 0) {
767
			return;
700
			return;
768
		}
701
		}
769
 
702
 
770
		Set<Integer> inventoryItemIds = this.toInventoryItemIds(fofoOrderItemSchemesMap.keySet());
-
 
771
 
-
 
772
		List<InventoryItem> inventoryItems = inventoryItemRepository.selectByIds(inventoryItemIds);
-
 
773
 
-
 
774
		Map<Integer, InventoryItem> inventoryItemIdInventoryItemMap = this
-
 
775
				.toInventoryItemIdInventoryItemMap(inventoryItems);
-
 
776
 
-
 
777
		Map<FofoOrderItem, Set<Scheme>> notAllFofoOrderItemSchemesMap = new HashMap<>();
-
 
778
		Map<FofoOrderItem, Set<Scheme>> allFofoOrderItemSchemesMap = new HashMap<>();
-
 
779
 
-
 
780
		for (Map.Entry<FofoOrderItem, Set<Scheme>> fofoOrderItemSchemesEntry : fofoOrderItemSchemesMap.entrySet()) {
-
 
781
			Set<Scheme> notAllSchemes = new HashSet<>();
-
 
782
			Set<Scheme> allSchemes = new HashSet<>();
-
 
783
			for (Scheme scheme : fofoOrderItemSchemesEntry.getValue()) {
-
 
784
				if (!scheme.isRetailerAll()) {
-
 
785
					notAllSchemes.add(scheme);
-
 
786
				} else {
-
 
787
					allSchemes.add(scheme);
-
 
788
				}
-
 
789
			}
-
 
790
			notAllFofoOrderItemSchemesMap.put(fofoOrderItemSchemesEntry.getKey(), notAllSchemes);
-
 
791
			allFofoOrderItemSchemesMap.put(fofoOrderItemSchemesEntry.getKey(), allSchemes);
-
 
792
		}
-
 
793
 
-
 
794
		for (Map.Entry<FofoOrderItem, Set<Scheme>> allFofoOrderItemSchemesEntry : allFofoOrderItemSchemesMap
-
 
795
				.entrySet()) {
-
 
796
			for (FofoLineItem fofoLineItem : allFofoOrderItemSchemesEntry.getKey().getFofoLineItems()) {
-
 
797
				float itemCashback = 0;
703
		float totalCashback = 0;
798
				for (Scheme scheme : allFofoOrderItemSchemesEntry.getValue()) {
-
 
799
					itemCashback += this.createSchemeInOut(scheme,
-
 
800
							inventoryItemIdInventoryItemMap.get(fofoLineItem.getInventoryItemId()));
-
 
801
				}
-
 
802
				if (itemCashback > 0) {
-
 
803
					totalCashback += itemCashback;
-
 
804
					count += 1;
704
		int count = 0;
805
				}
-
 
806
			}
-
 
807
		}
-
 
808
 
-
 
809
		Set<Integer> schemeIds = this.fofoLineItemSchemesMapToSchemeIds(notAllFofoOrderItemSchemesMap);
-
 
810
 
-
 
811
		if (!schemeIds.isEmpty()) {
-
 
812
			List<Integer> foundSchemeIds = retailerSchemeRepository.selectSchemeIds(schemeIds, retailerId);
-
 
813
 
705
 
814
			for (Map.Entry<FofoOrderItem, Set<Scheme>> notAllFofoOrderItemSchemesEntry : notAllFofoOrderItemSchemesMap
706
		for (InventoryItem inventoryItem : inventoryItems) {
815
					.entrySet()) {
707
			int itemCashback = 0;
816
				for (FofoLineItem fofoLineItem : notAllFofoOrderItemSchemesEntry.getKey().getFofoLineItems()) {
708
			Purchase purchase = purchaseRepository.selectByIdAndFofoId(inventoryItem.getPurchaseId(), retailerId);
817
					float itemCashback = 0;
709
			Set<Integer> schemeIds = new HashSet<>(
818
					for (Scheme scheme : notAllFofoOrderItemSchemesEntry.getValue()) {
710
					schemeItemRepository.selectSchemeIdByItemId(inventoryItem.getItemId()));
-
 
711
			List<Scheme> schemes = schemeRepository.selectActiveAll(SchemeType.OUT, purchase.getCompleteTimestamp())
819
						if (foundSchemeIds.contains(scheme.getId())) {
712
					.stream().filter(x -> schemeIds.contains(x.getId())).collect(Collectors.toList());
820
							itemCashback += this.createSchemeInOut(scheme,
713
			for (Scheme scheme : schemes) {
821
									inventoryItemIdInventoryItemMap.get(fofoLineItem.getInventoryItemId()));
714
				itemCashback += this.createSchemeInOut(scheme, inventoryItem);
822
						}
-
 
823
					}
715
			}
824
					if (itemCashback > 0) {
716
			if (itemCashback > 0) {
-
 
717
				count++;
825
						totalCashback += itemCashback;
718
				totalCashback += itemCashback;
826
						count += 1;
-
 
827
					}
-
 
828
				}
-
 
829
			}
719
			}
830
		}
720
		}
831
		if (totalCashback > 0) {
721
		if (count > 0) {
832
			walletService.addAmountToWallet(retailerId, fofoOrderId, WalletReferenceType.SCHEME_OUT,
722
			walletService.addAmountToWallet(retailerId, fofoOrderId, WalletReferenceType.SCHEME_OUT,
833
					"Sales margin for invoice number " + fofoOrder.getInvoiceNumber() + ". Total " + count + " pc(s)",
723
					"Sales margin for invoice number " + fofoOrder.getInvoiceNumber() + ". Total " + count + " pc(s)",
834
					totalCashback);
724
					totalCashback);
835
			fofoOrder.setCashback(totalCashback);
725
			fofoOrder.setCashback(totalCashback);
836
			fofoOrderRepository.persist(fofoOrder);
726
			fofoOrderRepository.persist(fofoOrder);