Subversion Repositories SmartDukaan

Rev

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