Subversion Repositories SmartDukaan

Rev

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