Subversion Repositories SmartDukaan

Rev

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