Subversion Repositories SmartDukaan

Rev

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