Subversion Repositories SmartDukaan

Rev

Rev 30836 | Rev 31773 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
26522 amit.gupta 1
package com.spice.profitmandi.dao.cart;
2
 
28166 tejbeer 3
import java.time.LocalDateTime;
26522 amit.gupta 4
import java.util.ArrayList;
5
import java.util.Arrays;
29327 tejbeer 6
import java.util.Collections;
26522 amit.gupta 7
import java.util.HashMap;
8
import java.util.HashSet;
29327 tejbeer 9
import java.util.LinkedHashMap;
26522 amit.gupta 10
import java.util.List;
11
import java.util.Map;
12
import java.util.Set;
29327 tejbeer 13
import java.util.Map.Entry;
26522 amit.gupta 14
import java.util.stream.Collectors;
15
 
31326 amit.gupta 16
import com.spice.profitmandi.dao.entity.inventory.SaholicCISTable;
17
import com.spice.profitmandi.dao.enumuration.fofo.Milestone;
18
import com.spice.profitmandi.dao.repository.inventory.SaholicCISTableRepository;
28653 amit.gupta 19
import org.apache.logging.log4j.LogManager;
20
import org.apache.logging.log4j.Logger;
26522 amit.gupta 21
import org.springframework.beans.factory.annotation.Autowired;
28170 tejbeer 22
import org.springframework.stereotype.Component;
26522 amit.gupta 23
 
28653 amit.gupta 24
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
29261 amit.gupta 25
import com.spice.profitmandi.common.model.ProfitMandiConstants;
26522 amit.gupta 26
import com.spice.profitmandi.dao.entity.catalog.Item;
27
import com.spice.profitmandi.dao.entity.catalog.TagListing;
29327 tejbeer 28
import com.spice.profitmandi.dao.entity.cs.PartnerRegion;
29
import com.spice.profitmandi.dao.entity.fofo.FofoStore;
30
import com.spice.profitmandi.dao.entity.inventory.SaholicCIS;
26522 amit.gupta 31
import com.spice.profitmandi.dao.entity.user.Cart;
28166 tejbeer 32
import com.spice.profitmandi.dao.entity.user.CartLine;
26522 amit.gupta 33
import com.spice.profitmandi.dao.entity.user.User;
28653 amit.gupta 34
import com.spice.profitmandi.dao.model.CartItem;
35
import com.spice.profitmandi.dao.model.CartItemResponseModel;
36
import com.spice.profitmandi.dao.model.CartMessage;
37
import com.spice.profitmandi.dao.model.CartResponse;
29327 tejbeer 38
import com.spice.profitmandi.dao.repository.catalog.FocusedModelRepository;
26522 amit.gupta 39
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
40
import com.spice.profitmandi.dao.repository.catalog.TagListingRepository;
29327 tejbeer 41
import com.spice.profitmandi.dao.repository.cs.PartnerRegionRepository;
26522 amit.gupta 42
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
29327 tejbeer 43
import com.spice.profitmandi.dao.repository.dtr.RetailerBlockBrandsRepository;
26522 amit.gupta 44
import com.spice.profitmandi.dao.repository.fofo.CurrentInventorySnapshotRepository;
29327 tejbeer 45
import com.spice.profitmandi.dao.repository.transaction.OrderRepository;
28166 tejbeer 46
import com.spice.profitmandi.dao.repository.user.CartLineRepository;
26522 amit.gupta 47
import com.spice.profitmandi.dao.repository.user.CartRepository;
48
import com.spice.profitmandi.dao.repository.user.UserRepository;
29327 tejbeer 49
import com.spice.profitmandi.service.NotificationService;
50
import com.spice.profitmandi.service.inventory.FocusedShortageModel;
28653 amit.gupta 51
import com.spice.profitmandi.service.inventory.SaholicInventoryService;
29327 tejbeer 52
import com.spice.profitmandi.service.transaction.TransactionService;
26522 amit.gupta 53
 
28170 tejbeer 54
@Component
26522 amit.gupta 55
public class CartServiceImpl implements CartService {
56
 
57
	private static final Set<Integer> tagIds = new HashSet<>(Arrays.asList(4));
58
 
28653 amit.gupta 59
	private static final Logger logger = LogManager.getLogger(CartServiceImpl.class);
60
 
29404 tejbeer 61
	private static final Map<Integer, List<Integer>> focusedModelVariantMap = new HashMap<>();
62
 
26522 amit.gupta 63
	@Autowired
64
	CartRepository cartRepository;
65
 
66
	@Autowired
28653 amit.gupta 67
	CartLineRepository cartLineRepository;
26522 amit.gupta 68
 
69
	@Autowired
70
	FofoStoreRepository fofoStoreRepository;
71
 
72
	@Autowired
73
	TagListingRepository tagListingRepository;
74
 
75
	@Autowired
76
	UserRepository saholicUserRepository;
77
 
78
	@Autowired
79
	ItemRepository itemRepository;
80
 
81
	@Autowired
28653 amit.gupta 82
	SaholicInventoryService saholicInventoryService;
28170 tejbeer 83
 
28166 tejbeer 84
	@Autowired
28653 amit.gupta 85
	CurrentInventorySnapshotRepository currentInventorySnapshotRepository;
26522 amit.gupta 86
 
29327 tejbeer 87
	@Autowired
88
	private FocusedModelRepository focusedModelRepository;
89
 
90
	@Autowired
91
	private PartnerRegionRepository partnerRegionRepository;
92
 
93
	@Autowired
94
	private TransactionService transactionService;
95
 
96
	@Autowired
97
	private RetailerBlockBrandsRepository retailerBlockBrandRepository;
98
 
99
	@Autowired
100
	private OrderRepository orderRepository;
101
 
102
	@Autowired
103
	private NotificationService notificationService;
31326 amit.gupta 104
	@Autowired
105
	private SaholicCISTableRepository saholicCISTableRepository;
29327 tejbeer 106
 
26522 amit.gupta 107
	@Override
29327 tejbeer 108
	// Unused method
26522 amit.gupta 109
	public CartModel addToCart(int cartId, int itemId, int quantity, float sellingPrice) {
28653 amit.gupta 110
		CartLine cartItem = cartLineRepository.selectByCartItem(cartId, itemId);
26522 amit.gupta 111
		if (cartItem == null) {
112
			this.createCartItem(cartId, itemId, quantity, sellingPrice);
113
		} else {
114
			cartItem.setQuantity(quantity);
115
			cartItem.setActualPrice(sellingPrice);
116
		}
117
		return null;
118
	}
29327 tejbeer 119
 
26522 amit.gupta 120
	private void createCartItem(int cartId, int itemId, int quantity, float sellingPrice) {
28653 amit.gupta 121
		CartLine cartLine = new CartLine();
122
		cartLine.setActualPrice(sellingPrice);
123
		cartLine.setCartId(cartId);
124
		cartLine.setQuantity(quantity);
26522 amit.gupta 125
		// TODO: Estmiate Logic
28653 amit.gupta 126
		cartLine.setEstimate(2);
127
		cartLineRepository.persist(cartLine);
26522 amit.gupta 128
 
129
	}
130
 
131
	@Override
28653 amit.gupta 132
	public boolean clearCart(int cartId) throws ProfitMandiBusinessException {
133
		List<CartLine> cartLines = cartLineRepository.selectAllByCart(cartId);
134
		cartLines.stream().forEach(cartLine -> cartLineRepository.delete(cartLine));
135
		Cart cart = cartRepository.selectById(cartId);
26522 amit.gupta 136
 
28653 amit.gupta 137
		cart.setUpdateTimestamp(LocalDateTime.now());
138
		cart.setCheckoutTimestamp(null);
139
		cart.setTotalPrice(0);
140
		cart.setWalletAmount(0);
141
		return true;
26522 amit.gupta 142
	}
143
 
144
	@Override
145
	public CartModel getCart(int cartId) {
146
		// TODO Auto-generated method stub
147
		return null;
148
	}
149
 
150
	// As of now it only works for Fofo Partners need to be refactored later
151
	private Map<Integer, Integer> getAvailabilityMap(User user, Set<Integer> itemIds) {
152
		Map<Integer, Integer> itemAvailabilityMap = new HashMap<>();
153
		List<TagListing> tags = tagListingRepository.selectByItemIdsAndTagIds(itemIds, tagIds);
154
		tags.stream().forEach(tagListing -> {
155
			if (!tagListing.isActive() || tagListing.isHotDeals()) {
156
				// show actual values here
157
			} else {
158
				itemAvailabilityMap.put(tagListing.getItemId(), 100);
159
			}
160
		});
161
		return itemAvailabilityMap;
162
	}
163
 
164
	// As of now it only works for Fofo Partners need to be refactored later
165
	private Map<Integer, Integer> getMinBuyQtyMap(User user, Set<Integer> itemIds) {
166
		List<Item> items = itemRepository.selectByIds(itemIds);
167
		return items.stream().collect(Collectors.toMap(x -> x.getId(), x -> x.getCategoryId() == 10020 ? 1 : 10));
168
	}
169
 
170
	// As of now it only works for Fofo Partners need to be refactored later
171
	private Map<Integer, Float> getPriceMap(User user, Set<Integer> itemIds) {
172
		List<TagListing> tags = tagListingRepository.selectByItemIdsAndTagIds(itemIds, tagIds);
173
		return tags.stream().collect(Collectors.toMap(x -> x.getItemId(), x -> x.getSellingPrice()));
174
 
175
	}
176
 
28166 tejbeer 177
	@Override
28653 amit.gupta 178
	public CartResponse getCartValidation(int cartId) throws ProfitMandiBusinessException {
179
		/*
180
		 * # No need to validate duplicate items since there are only two ways # to add
181
		 * items to a cart and both of them check whether the item being # added is a
182
		 * duplicate of an already existing item.
183
		 */
184
 
185
		Cart cart = cartRepository.selectById(cartId);
186
		List<CartLine> cartLines = cartLineRepository.selectAllByCart(cartId);
187
 
188
		User saholicUser = saholicUserRepository.selectByCartId(cartId);
189
 
190
		int totalQty = 0;
191
		double totalAmount = 0;
192
		CartResponse cartResponse = new CartResponse();
193
		List<CartMessage> cartMessages = new ArrayList<>();
194
		List<CartItemResponseModel> cartItemModels = new ArrayList<>();
195
		cartResponse.setCartMessages(cartMessages);
196
		cartResponse.setCartItems(cartItemModels);
197
 
198
		int cartMessageChanged = 0;
199
		int cartMessageOOS = 0;
200
		int cartMessageUndeliverable = 0;
201
 
202
		Set<Integer> itemIds = cartLines.stream().map(x -> x.getItemId()).collect(Collectors.toSet());
203
		logger.info("iteme ids -- {}", itemIds);
204
		List<TagListing> tagListings = tagListingRepository.selectByItemIdsAndTagIds(itemIds, tagIds);
205
		Map<Integer, TagListing> tagListingsMap = tagListings.stream()
206
				.collect(Collectors.toMap(x -> x.getItemId(), x -> x));
207
 
208
		cart.setTotalPrice(0);
209
		int nonAccessoryQuantity = 0;
210
		for (CartLine cartLine : cartLines) {
211
			boolean itemQuantityChanged = false;
212
			CartItemResponseModel cartItemResponseModel = new CartItemResponseModel();
213
			int oldEstimate = cartLine.getEstimate();
214
			int itemId = cartLine.getItemId();
215
			Item item = null;
216
			try {
217
				item = itemRepository.selectById(itemId);
218
				cartItemResponseModel.setTitle(item.getItemDescriptionNoColor());
219
			} catch (ProfitMandiBusinessException e) {
220
				e.printStackTrace();
221
				logger.info("Error finding item with id {}", itemId);
222
				cartLineRepository.delete(cartLine);
223
				continue;
224
			}
225
			cartItemResponseModel.setItemId(itemId);
226
			cartItemResponseModel.setQuantity(0);
227
			cartItemResponseModel.setColor(item.getColor());
228
			List<CartItemMessage> cartItemMessages = new ArrayList<>();
229
			cartItemResponseModel.setCartItemMessages(cartItemMessages);
230
			cartItemResponseModel.setCatalogItemId(item.getCatalogItemId());
231
			cartItemResponseModel.setMinBuyQuantity(1);
232
			cartItemResponseModel.setQuantityStep(1);
233
			cartItemResponseModel.setMaxQuantity(0);
234
 
235
			/*
236
			 * int netAvailability = itemAvailabilityMap.get(itemId).stream()
237
			 * .collect(Collectors.summingInt(x -> x.getNetavailability()));
238
			 */
30836 tejbeer 239
			int availability = 1000;
28653 amit.gupta 240
			if (availability < cartLine.getQuantity()) {
241
				cartLine.setQuantity(availability);
242
				itemQuantityChanged = true;
243
			}
244
			cartItemResponseModel.setMaxQuantity(Math.max(availability, 100));
245
			if (availability < cartItemResponseModel.getMinBuyQuantity()) {
246
				cartItemResponseModel.setMinBuyQuantity(availability);
247
			}
248
			if (cartLine.getQuantity() < cartItemResponseModel.getMinBuyQuantity()) {
249
				itemQuantityChanged = true;
250
				cartLine.setQuantity(cartItemResponseModel.getMinBuyQuantity());
251
			}
252
 
253
			if (cartLine.getQuantity() > cartItemResponseModel.getMaxQuantity()) {
254
				itemQuantityChanged = true;
255
				cartLine.setQuantity(cartItemResponseModel.getMaxQuantity());
256
			}
257
			cartLine.setActualPrice(tagListingsMap.get(itemId).getSellingPrice());
258
			if (item.getCategoryId() == 10006 || item.getCategoryId() == 10010) {
259
				nonAccessoryQuantity += cartItemResponseModel.getQuantity();
260
				cartItemResponseModel.setCategoryName("mobile");
261
			}
262
			cartItemResponseModel.setSellingPrice(cartLine.getActualPrice());
263
 
264
			if (availability > 0) {
265
				cart.setTotalPrice(cart.getTotalPrice() + (cartLine.getActualPrice() * cartLine.getQuantity()));
266
				cartItemResponseModel.setQuantity(cartLine.getQuantity());
267
				cartItemResponseModel.setEstimate(2);
268
				if (itemQuantityChanged) {
269
					cartMessageChanged += 1;
270
					if (oldEstimate != cartItemResponseModel.getEstimate()) {
271
						cartLine.setEstimate(cartItemResponseModel.getEstimate());
272
						cart.setUpdateTimestamp(LocalDateTime.now());
273
					}
274
				}
29497 amit.gupta 275
				totalAmount += cartLine.getActualPrice() * cartLine.getQuantity();
28653 amit.gupta 276
			} else {
277
				cartItemResponseModel.setQuantity(0);
278
				cartMessageOOS += 1;
279
				CartItemMessage cartItemMessage = new CartItemMessage();
280
				cartItemMessage.setType("danger");
281
				cartItemMessage.setMessageText("Out of Stock");
282
				cartItemMessages.add(cartItemMessage);
283
				cartLineRepository.delete(cartLine);
284
			}
285
			totalQty += cartItemResponseModel.getQuantity();
286
 
287
			if (cartItemMessages.size() > 0) {
288
				cartResponse.getCartItems().add(0, cartItemResponseModel);
289
			} else {
290
				cartResponse.getCartItems().add(cartItemResponseModel);
291
			}
292
		}
293
		if (cart.getCheckoutTimestamp() != null) {
294
			if (cart.getUpdateTimestamp().isBefore(cart.getCheckoutTimestamp())) {
295
				cart.setCheckoutTimestamp(null);
296
			}
297
		}
298
		cartResponse.setTotalQty(totalQty);
299
		cartResponse.setTotalAmount(totalAmount);
300
		cartResponse.setNonAccessoryQuantity(nonAccessoryQuantity);
301
		cartResponse.setShippingCharge(0);
302
		cartResponse.setCartMessageChanged(cartMessageChanged);
303
		cartResponse.setCartMessageOOS(cartMessageOOS);
304
		cartResponse.setCartMessageUndeliverable(cartMessageUndeliverable);
305
		cartResponse.setCod(false);
306
		return cartResponse;
307
	}
308
 
309
	@Override
310
	public void addItemsToCart(int cartId, List<CartItem> cartItems) throws ProfitMandiBusinessException {
311
		logger.info("cart items {}", cartItems);
312
		cartItems = cartItems.stream().filter(x -> x.getQuantity() > 0).collect(Collectors.toList());
313
		Map<Integer, Integer> itemQuantityMap = cartItems.stream()
314
				.collect(Collectors.toMap(x -> x.getItemId(), x -> x.getQuantity()));
315
		List<CartLine> cartLines = cartLineRepository.selectAllByCart(cartId);
316
		// Delete cartLines with 0 values
317
		for (CartLine cartLine : cartLines) {
318
			Integer quantity = itemQuantityMap.get(cartLine.getItemId());
319
			if (quantity == null || quantity.intValue() == 0) {
320
				cartLineRepository.delete(cartLine);
321
			} else {
322
				cartLine.setQuantity(itemQuantityMap.get(cartLine.getItemId()));
323
				cartLine.setUpdateTimestapm(LocalDateTime.now());
324
			}
325
		}
326
		for (CartItem cartItem : cartItems) {
327
			if (cartLineRepository.selectByCartItem(cartId, cartItem.getItemId()) == null) {
328
				CartLine cartLineNew = new CartLine();
329
				cartLineNew.setItemId(cartItem.getItemId());
330
				cartLineNew.setQuantity(cartItem.getQuantity());
331
				cartLineNew.setCartId(cartId);
332
				cartLineNew.setCreateTimestamp(LocalDateTime.now());
333
				cartLineRepository.persist(cartLineNew);
334
			}
335
		}
336
 
337
	}
338
 
339
	@Override
340
	public void addAddressToCart(int cartId, long addressId) throws ProfitMandiBusinessException {
341
		Cart cart = cartRepository.selectById(cartId);
342
		cart.setAddressId((int) addressId);
343
 
344
	}
345
 
346
	@Override
28166 tejbeer 347
	public void addShoppingBag(int cartId, long qty) {
348
		CartLine cl = new CartLine();
29261 amit.gupta 349
		cl.setItemId(ProfitMandiConstants.ITEM_CARRY_BAG);
28166 tejbeer 350
		cl.setQuantity((int) qty);
351
		cl.setCartId(cartId);
352
		cl.setCreateTimestamp(LocalDateTime.now());
353
		cl.setDataProtectionAmount(0);
354
		cl.setEstimate(0);
29261 amit.gupta 355
		cl.setInsuranceAmount(0f);
28166 tejbeer 356
		cl.setDataProtectionInsurer(0);
29261 amit.gupta 357
		cl.setActualPrice(0.01f);
28166 tejbeer 358
		cartLineRepository.persist(cl);
359
 
360
	}
361
 
28653 amit.gupta 362
	@Override
363
	public CartModel removeFromCart(int cartId, int itemId) {
364
		// TODO Auto-generated method stub
365
		return null;
366
	}
367
 
29327 tejbeer 368
	@Override
369
	public List<FocusedShortageModel> focusedModelShortageValidation(int fofoId,
370
			Map<Integer, Integer> catalogCartQtyMap) throws ProfitMandiBusinessException {
371
 
372
		logger.info("fofoId {}", fofoId);
373
 
29404 tejbeer 374
		focusedModelVariantMap.put(1022771, Arrays.asList(1022771));
375
		focusedModelVariantMap.put(1023025, Arrays.asList(1022975, 1022945));
376
 
377
		focusedModelVariantMap.put(1023027, Arrays.asList(1022706));
378
 
379
		focusedModelVariantMap.put(1022976, Arrays.asList(1022744));
380
		focusedModelVariantMap.put(1023045, Arrays.asList(1022768));
381
 
382
		focusedModelVariantMap.put(1023066, Arrays.asList(1022858));
383
 
29327 tejbeer 384
		Map<Integer, Long> inStockItemModel = new HashMap<>();
385
		Map<Integer, Long> itempendingIndent = new HashMap<>();
386
		Map<Integer, Long> grnItemPendingOrders = new HashMap<>();
387
 
388
		Map<Integer, Integer> focusedModelMap = null;
389
 
390
		inStockItemModel = currentInventorySnapshotRepository.selectSumInMobileStockGroupByCatalog(fofoId).stream()
391
				.collect(Collectors.toMap(x -> x.getCatalogItemId(), x -> x.getQty()));
392
 
393
		itempendingIndent = transactionService.getInTransitOrders(fofoId).stream()
394
				.collect(Collectors.groupingBy(x -> x.getLineItem().getItem().getCatalogItemId(),
395
						Collectors.summingLong(x -> (long) x.getLineItem().getQuantity())));
396
 
397
		grnItemPendingOrders = orderRepository.selectPendingGrnOrders(fofoId).stream()
398
				.collect(Collectors.groupingBy(x -> x.getLineItem().getItem().getCatalogItemId(),
399
						Collectors.summingLong(x -> (long) x.getLineItem().getQuantity())));
400
		List<PartnerRegion> partnerRegions = partnerRegionRepository.selectByfofoId(fofoId);
401
 
402
		FofoStore fofoStore = fofoStoreRepository.selectByRetailerId(fofoId);
403
 
404
		List<String> retailerBlockBrands = retailerBlockBrandRepository.selectAllByRetailer(fofoId).stream()
405
				.map(x -> x.getBlockBrands()).collect(Collectors.toList());
406
 
407
		if (partnerRegions.size() > 0) {
408
			focusedModelMap = focusedModelRepository
409
					.selectAllByRegionIds(
410
							partnerRegions.stream().map(x -> x.getRegionId()).collect(Collectors.toList()))
411
					.stream().collect(Collectors.toMap(x -> x.getCatalogId(), x -> x.getMinimumQty()));
412
		} else {
413
			focusedModelMap = new HashMap<>();
414
		}
415
 
416
		Map<Integer, Integer> catalogItemAailabilityMap = new HashMap<>();
417
 
418
		for (Entry<Integer, Integer> fm : focusedModelMap.entrySet()) {
419
			List<Item> items = itemRepository.selectAllByCatalogItemId(fm.getKey());
420
			int allColorNetAvailability = 0;
421
			for (Item item : items) {
422
				if (retailerBlockBrands.contains(item.getBrand()))
423
					continue;
31326 amit.gupta 424
				List<SaholicCISTable> currentAvailability = saholicCISTableRepository.selectByItemWarehouse(item.getId(), fofoStore.getWarehouseId());
29327 tejbeer 425
 
426
				if (currentAvailability != null) {
427
					allColorNetAvailability += currentAvailability.stream()
31326 amit.gupta 428
							.collect(Collectors.summingInt(SaholicCISTable::getNetAvailability));
29327 tejbeer 429
				}
430
			}
431
			catalogItemAailabilityMap.put(fm.getKey(), allColorNetAvailability);
432
		}
433
 
434
		List<FocusedShortageModel> focusedModelShortageList = new ArrayList<>();
435
 
436
		for (Entry<Integer, Integer> fm : focusedModelMap.entrySet()) {
437
 
438
			logger.info("fm {}", fm);
439
 
440
			long overallStock = (inStockItemModel.get(fm.getKey()) == null ? 0 : inStockItemModel.get(fm.getKey()))
441
					+ (itempendingIndent.get(fm.getKey()) == null ? 0 : itempendingIndent.get(fm.getKey()))
442
					+ (grnItemPendingOrders.get(fm.getKey()) == null ? 0 : grnItemPendingOrders.get(fm.getKey()));
443
			logger.info("overallStock {}", overallStock);
444
 
445
			// Blocked brands available quantity is discussed to zero
446
			long warehouseStock = catalogItemAailabilityMap.get(fm.getKey()) == null ? 0
447
					: catalogItemAailabilityMap.get(fm.getKey());
448
			logger.info("warehouseStock {}", warehouseStock);
449
 
450
			long cartValue = catalogCartQtyMap.get(fm.getKey()) == null ? 0 : catalogCartQtyMap.get(fm.getKey());
451
 
452
			logger.info("cartValue" + cartValue);
453
			long totalStock = overallStock + cartValue;
454
			logger.info("totalStock" + totalStock);
455
 
456
			long shortQty = Math.min(fm.getValue() - totalStock, warehouseStock);
457
			logger.info("shortQty {}", shortQty);
458
 
459
			if (shortQty > 0) {
29404 tejbeer 460
				if (focusedModelVariantMap.get(fm.getKey()) != null) {
461
					List<Integer> variantCatalogIds = focusedModelVariantMap.get(fm.getKey());
462
					logger.info("variantCatalogIds {}", variantCatalogIds);
29327 tejbeer 463
 
29404 tejbeer 464
					int variantAvailability = 0;
465
					for (Integer vc : variantCatalogIds) {
466
						long variantOverallStock = (inStockItemModel.get(vc) == null ? 0 : inStockItemModel.get(vc))
467
								+ (itempendingIndent.get(vc) == null ? 0 : itempendingIndent.get(vc))
468
								+ (grnItemPendingOrders.get(vc) == null ? 0 : grnItemPendingOrders.get(vc));
469
						logger.info("variantOverallStock {}", variantOverallStock);
470
 
471
						// Blocked brands available quantity is discussed to zero
472
						long variantWarehouseStock = catalogItemAailabilityMap.get(vc) == null ? 0
473
								: catalogItemAailabilityMap.get(vc);
474
						logger.info("variantWarehouseStock {}", variantWarehouseStock);
475
 
476
						long variantCartValue = catalogCartQtyMap.get(vc) == null ? 0 : catalogCartQtyMap.get(vc);
477
 
478
						logger.info("variantCartValue" + variantCartValue);
479
						long variantTotalStock = variantOverallStock + variantCartValue;
480
						logger.info("variantTotalStock" + variantTotalStock);
481
 
482
						variantAvailability += (int) variantTotalStock;
483
 
484
					}
485
 
486
					logger.info("variantAvailability {}", variantAvailability);
487
 
488
					shortQty = shortQty - variantAvailability;
489
 
490
				}
491
			}
492
 
493
			logger.info("shortQty" + shortQty);
494
 
495
			if (shortQty > 0) {
496
 
29327 tejbeer 497
				Map<Integer, Integer> requiredItemQty = new HashMap<>();
498
 
499
				List<Item> it = itemRepository.selectAllByCatalogItemId(fm.getKey());
500
				FocusedShortageModel fms = new FocusedShortageModel();
501
				fms.setShortageQty((int) shortQty);
502
				fms.setCatalogId(fm.getKey());
503
				fms.setAvailabitiy(fm.getValue());
504
				fms.setInStock(overallStock);
505
 
506
				fms.setItemName(it.get(0).getBrand() + it.get(0).getModelNumber() + it.get(0).getModelName());
507
 
508
				Map<Integer, Integer> itemQtyMap = new HashMap<>();
509
 
510
				for (Item i : it) {
511
 
31326 amit.gupta 512
					List<SaholicCISTable> ca = saholicCISTableRepository.selectByItemWarehouse(i.getId(), fofoStore.getWarehouseId());
29327 tejbeer 513
					if (ca != null) {
514
						itemQtyMap.put(i.getId(),
31326 amit.gupta 515
								ca.stream().collect(Collectors.summingInt(SaholicCISTable::getNetAvailability)));
29327 tejbeer 516
					}
517
				}
518
 
519
				itemQtyMap = itemQtyMap.entrySet().stream()
520
						.sorted(Collections.reverseOrder(Map.Entry.comparingByValue())).collect(Collectors
521
								.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2, LinkedHashMap::new));
522
 
523
				for (long i = shortQty; i > 0; i--) {
524
					if (shortQty == 0) {
525
						break;
526
					}
527
 
528
					for (Entry<Integer, Integer> itemQty : itemQtyMap.entrySet()) {
529
 
530
						int availbleQty = itemQty.getValue();
531
						if (availbleQty == 0) {
532
							break;
533
						}
534
						if (requiredItemQty.get(itemQty.getKey()) == null) {
535
							requiredItemQty.put(itemQty.getKey(), 1);
536
							availbleQty = availbleQty - 1;
537
							if (availbleQty != 0) {
538
								itemQtyMap.put(itemQty.getKey(), availbleQty);
539
							}
540
							shortQty -= 1;
541
						} else {
542
 
543
							int qty = requiredItemQty.get(itemQty.getKey());
544
 
545
							requiredItemQty.put(itemQty.getKey(), qty + 1);
546
 
547
							availbleQty = availbleQty - 1;
548
							if (availbleQty != 0) {
549
								itemQtyMap.put(itemQty.getKey(), availbleQty);
550
							}
551
							shortQty -= 1;
552
						}
553
 
554
						if (shortQty == 0) {
555
							break;
556
						}
557
 
558
					}
559
 
560
				}
561
 
562
				Set<CartItem> cartItems = new HashSet<>();
563
				for (Entry<Integer, Integer> itemQtySet : requiredItemQty.entrySet()) {
564
 
565
					CartItem ci = new CartItem();
566
					Item item = itemRepository.selectById(itemQtySet.getKey());
567
					TagListing tl = tagListingRepository.selectByItemId(item.getId());
568
					ci.setItemId(item.getId());
569
					ci.setQuantity(itemQtySet.getValue());
570
					ci.setSellingPrice(tl.getSellingPrice());
571
					cartItems.add(ci);
572
 
573
				}
574
				fms.setCartItems(cartItems);
575
 
576
				// fms.setItemQtyAvailability(requiredItemQty);
577
 
578
				focusedModelShortageList.add(fms);
579
 
580
			}
581
 
582
		}
583
 
584
		logger.info("focusedModelShortageList {}", focusedModelShortageList);
585
		return focusedModelShortageList;
586
	}
587
 
26522 amit.gupta 588
}