Subversion Repositories SmartDukaan

Rev

Rev 35236 | Rev 35695 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 35236 Rev 35493
Line 395... Line 395...
395
        boolean noGST = false;
395
        boolean noGST = false;
396
        int changedTotalBillAmount = 0;
396
        int changedTotalBillAmount = 0;
397
        for (CustomPaymentOption cpo : createOrderRequest.getPaymentOptions()) {
397
        for (CustomPaymentOption cpo : createOrderRequest.getPaymentOptions()) {
398
            changedTotalBillAmount += cpo.getAmount();
398
            changedTotalBillAmount += cpo.getAmount();
399
        }
399
        }
-
 
400
 
-
 
401
        // N+1 fix: Batch fetch all PendingOrderItems before the validation loop
-
 
402
        List<Integer> validationPoiIds = createOrderRequest.getFofoOrderItems().stream()
-
 
403
                .map(CustomFofoOrderItem::getPoiId)
-
 
404
                .filter(id -> id > 0)
-
 
405
                .collect(Collectors.toList());
-
 
406
        Map<Integer, PendingOrderItem> pendingOrderItemMap = new HashMap<>();
-
 
407
        if (!validationPoiIds.isEmpty()) {
-
 
408
            List<PendingOrderItem> pendingOrderItems = pendingOrderItemRepository.selectByIds(validationPoiIds);
-
 
409
            pendingOrderItemMap = pendingOrderItems.stream()
-
 
410
                    .collect(Collectors.toMap(PendingOrderItem::getId, poi -> poi));
-
 
411
        }
-
 
412
 
400
        for (CustomFofoOrderItem customFofoOrderItem : createOrderRequest.getFofoOrderItems()) {
413
        for (CustomFofoOrderItem customFofoOrderItem : createOrderRequest.getFofoOrderItems()) {
401
            if (customFofoOrderItem.getPoiId() > 0) {
414
            if (customFofoOrderItem.getPoiId() > 0) {
-
 
415
                // N+1 fix: Use pre-fetched map instead of querying per item
402
                PendingOrderItem pendingOrderItem = pendingOrderItemRepository.selectById(customFofoOrderItem.getPoiId());
416
                PendingOrderItem pendingOrderItem = pendingOrderItemMap.get(customFofoOrderItem.getPoiId());
-
 
417
                if (pendingOrderItem == null) {
-
 
418
                    throw new ProfitMandiBusinessException("poiId", customFofoOrderItem.getPoiId(), "Pending order item not found");
-
 
419
                }
403
                if (customFofoOrderItem.getQuantity() > pendingOrderItem.getQuantity()) {
420
                if (customFofoOrderItem.getQuantity() > pendingOrderItem.getQuantity()) {
404
                    throw new ProfitMandiBusinessException("itemIdQuantity", customFofoOrderItem.getItemId(), "Quantity should not be greater than order item quantity");
421
                    throw new ProfitMandiBusinessException("itemIdQuantity", customFofoOrderItem.getItemId(), "Quantity should not be greater than order item quantity");
405
                }
422
                }
406
                if (pendingOrderItem.getQuantity() > customFofoOrderItem.getQuantity()) {
423
                if (pendingOrderItem.getQuantity() > customFofoOrderItem.getQuantity()) {
407
                    pendingOrderService.duplicatePendingOrder(pendingOrderItem, customFofoOrderItem.getQuantity());
424
                    pendingOrderService.duplicatePendingOrder(pendingOrderItem, customFofoOrderItem.getQuantity());
Line 649... Line 666...
649
            } catch (Exception e) {
666
            } catch (Exception e) {
650
                LOGGER.error("Unable to get state rates");
667
                LOGGER.error("Unable to get state rates");
651
            }
668
            }
652
        }
669
        }
653
 
670
 
-
 
671
        // N+1 fix: Pre-fetch tagListings and GST rates before the loop
-
 
672
        Map<Integer, TagListing> tagListingMap = tagListingRepository.selectByItemIds(itemIdCustomFofoOrderItemMap.keySet());
-
 
673
        Map<Integer, GstRate> gstRateMap = null;
-
 
674
        if (stateId != null) {
-
 
675
            gstRateMap = stateGstRateRepository.getStateTaxRate(new ArrayList<>(itemMap.keySet()), stateId);
-
 
676
        } else {
-
 
677
            gstRateMap = stateGstRateRepository.getIgstTaxRate(new ArrayList<>(itemMap.keySet()));
-
 
678
        }
-
 
679
 
654
        for (CustomFofoOrderItem customFofoOrderItem : createOrderRequest.getFofoOrderItems()) {
680
        for (CustomFofoOrderItem customFofoOrderItem : createOrderRequest.getFofoOrderItems()) {
655
            FofoOrderItem fofoOrderItem = this.createAndGetFofoOrderItem(customFofoOrderItem, fofoOrder.getId(), itemMap, inventoryItemsToBill.get(customFofoOrderItem.getItemId()), stateId);
681
            FofoOrderItem fofoOrderItem = this.createAndGetFofoOrderItem(customFofoOrderItem, fofoOrder.getId(), itemMap, inventoryItemsToBill.get(customFofoOrderItem.getItemId()), tagListingMap, gstRateMap);
656
 
682
 
657
            Item item = itemMap.get(customFofoOrderItem.getItemId());
683
            Item item = itemMap.get(customFofoOrderItem.getItemId());
658
            if (item.getType().equals(ItemType.NON_SERIALIZED)) {
684
            if (item.getType().equals(ItemType.NON_SERIALIZED)) {
659
                if (customFofoOrderItem.getCustomSerialNumbers() != null && !customFofoOrderItem.getCustomSerialNumbers().isEmpty()) {
685
                if (customFofoOrderItem.getCustomSerialNumbers() != null && !customFofoOrderItem.getCustomSerialNumbers().isEmpty()) {
660
                    persistNonSerializedWithCustomSerialNumber(customFofoOrderItem, fofoOrderItem.getId());
686
                    persistNonSerializedWithCustomSerialNumber(customFofoOrderItem, fofoOrderItem.getId());
Line 673... Line 699...
673
            this.updateInventoryItemsAndScanRecord(inventoryItems, fofoId, inventoryItemIdQuantityUsed, fofoOrder.getId());
699
            this.updateInventoryItemsAndScanRecord(inventoryItems, fofoId, inventoryItemIdQuantityUsed, fofoOrder.getId());
674
        }
700
        }
675
 
701
 
676
        List<FofoOrderItem> fofoItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
702
        List<FofoOrderItem> fofoItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
677
 
703
 
678
        boolean smartPhone = false;
-
 
679
        for (FofoOrderItem fofoOrderItem : fofoItems) {
704
        // Use existing itemMap instead of querying DB per item (N+1 fix)
680
            Item item = itemRepository.selectById(fofoOrderItem.getItemId());
705
        boolean smartPhone = items.stream().anyMatch(Item::isSmartPhone);
681
 
-
 
682
            if (item.isSmartPhone()) {
706
        if (smartPhone) {
683
                LOGGER.info("fofoItem {}", fofoOrderItem);
707
            LOGGER.info("Smartphone found in order items");
684
                smartPhone = true;
-
 
685
            }
708
        } else {
686
        }
-
 
687
 
-
 
688
        if (!smartPhone) {
-
 
689
            LOGGER.warn("No smartphones found in fofoItems.");
709
            LOGGER.warn("No smartphones found in fofoItems.");
690
        }
710
        }
691
 
711
 
692
 
712
 
693
        if (smartPhone) {
713
        if (smartPhone) {
Line 710... Line 730...
710
        schemeService.processSchemeOut(fofoOrder.getId(), fofoId);
730
        schemeService.processSchemeOut(fofoOrder.getId(), fofoId);
711
 
731
 
712
        if (createOrderRequest.getPoId() != 0) {
732
        if (createOrderRequest.getPoId() != 0) {
713
            PendingOrder po = pendingOrderRepository.selectById(createOrderRequest.getPoId());
733
            PendingOrder po = pendingOrderRepository.selectById(createOrderRequest.getPoId());
714
            po.setBilledAmount(po.getBilledAmount() + totalAmount);
734
            po.setBilledAmount(po.getBilledAmount() + totalAmount);
-
 
735
 
-
 
736
            // N+1 fix: Batch fetch pending order items instead of querying per item
715
            for (CustomFofoOrderItem cfoi : createOrderRequest.getFofoOrderItems()) {
737
            List<Integer> poiIds = createOrderRequest.getFofoOrderItems().stream()
-
 
738
                    .map(CustomFofoOrderItem::getPoiId)
-
 
739
                    .filter(id -> id != 0)
-
 
740
                    .collect(Collectors.toList());
-
 
741
            if (!poiIds.isEmpty()) {
716
                PendingOrderItem poi = pendingOrderItemRepository.selectById(cfoi.getPoiId());
742
                List<PendingOrderItem> pendingOrderItems = pendingOrderItemRepository.selectByIds(poiIds);
-
 
743
                LocalDateTime now = LocalDateTime.now();
-
 
744
                for (PendingOrderItem poi : pendingOrderItems) {
717
                poi.setStatus(OrderStatus.BILLED);
745
                    poi.setStatus(OrderStatus.BILLED);
718
                poi.setBilledTimestamp(LocalDateTime.now());
746
                    poi.setBilledTimestamp(now);
-
 
747
                }
719
            }
748
            }
-
 
749
 
720
            po.setStatus(OrderStatus.BILLED);
750
            po.setStatus(OrderStatus.BILLED);
721
        }
751
        }
722
        //Process scratch
752
        //Process scratch
723
        this.processScratchOffer(fofoOrder);
753
        this.processScratchOffer(fofoOrder);
724
 
754
 
Line 750... Line 780...
750
                }
780
                }
751
 
781
 
752
            }
782
            }
753
        }
783
        }
754
 
784
 
755
//        enable it fo upsell call
785
//        enable it fo upsell call - N+1 fix: smartPhone already determined, no need to re-query items
756
        if (smartPhone) {
-
 
757
            if (fofoOrder.getId() > 0) {
786
        if (smartPhone && fofoOrder.getId() > 0) {
758
                List<InsurancePolicy> insurancePolicies = insurancePolicyRepository
787
            List<InsurancePolicy> insurancePolicies = insurancePolicyRepository
759
                        .selectByRetailerIdInvoiceNumber(fofoOrder.getInvoiceNumber());
788
                    .selectByRetailerIdInvoiceNumber(fofoOrder.getInvoiceNumber());
760
                if (insurancePolicies.isEmpty()) {
789
            if (insurancePolicies.isEmpty()) {
761
                    List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
-
 
762
                    for (FofoOrderItem fofoOrderItem : fofoOrderItems) {
-
 
763
                        Item item = itemRepository.selectById(fofoOrderItem.getItemId());
-
 
764
                        if (item.isSmartPhone()) {
-
 
765
                            UpSaleOrder upSaleOrder = new UpSaleOrder();
790
                UpSaleOrder upSaleOrder = new UpSaleOrder();
766
                            upSaleOrder.setCreatedTimestamp(LocalDateTime.now());
791
                upSaleOrder.setCreatedTimestamp(LocalDateTime.now());
767
                            upSaleOrder.setOrderId(fofoOrder.getId());
792
                upSaleOrder.setOrderId(fofoOrder.getId());
768
                            upSaleOrder.setFofoId(fofoOrder.getFofoId());
793
                upSaleOrder.setFofoId(fofoOrder.getFofoId());
769
                            upSaleOrderRepository.persist(upSaleOrder);
794
                upSaleOrderRepository.persist(upSaleOrder);
770
                            break; // Exit the loop after persisting the UpSaleOrder for the first smartphone
-
 
771
                        }
-
 
772
                    }
-
 
773
                }
-
 
774
            }
795
            }
775
        }
796
        }
776
 
797
 
777
        // Update Partner Opening Stock current qty
798
        // Update Partner Opening Stock current qty - N+1 fix: use existing itemMap and batch update
778
        if (fofoOrder.getId() > 0) {
799
        if (fofoOrder.getId() > 0) {
779
            List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
800
            Map<Integer, Integer> itemIdQuantityMap = new HashMap<>();
780
            for (FofoOrderItem fofoOrderItem : fofoOrderItems) {
801
            for (FofoOrderItem fofoOrderItem : fofoItems) {
781
                Item item = itemRepository.selectById(fofoOrderItem.getItemId());
-
 
782
                smartCartService.minusOpeningStock(item.getId(), fofoOrder.getFofoId(), fofoOrderItem.getQuantity());
802
                itemIdQuantityMap.merge(fofoOrderItem.getItemId(), fofoOrderItem.getQuantity(), Integer::sum);
783
            }
803
            }
-
 
804
            smartCartService.minusOpeningStockBatch(itemIdQuantityMap, fofoOrder.getFofoId());
784
        }
805
        }
785
 
806
 
786
 
807
 
787
        return fofoOrder.getId();
808
        return fofoOrder.getId();
788
    }
809
    }
Line 790... Line 811...
790
    @Override
811
    @Override
791
    public void processScratchOffer(FofoOrder fofoOrder) throws ProfitMandiBusinessException {
812
    public void processScratchOffer(FofoOrder fofoOrder) throws ProfitMandiBusinessException {
792
        boolean isSmartPhonePurchased = false;
813
        boolean isSmartPhonePurchased = false;
793
        float maxPurchaseValue = 0;
814
        float maxPurchaseValue = 0;
794
        List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
815
        List<FofoOrderItem> fofoOrderItems = fofoOrderItemRepository.selectByOrderId(fofoOrder.getId());
-
 
816
 
-
 
817
        // N+1 fix: batch fetch all items instead of querying per order item
-
 
818
        Set<Integer> itemIds = fofoOrderItems.stream()
-
 
819
                .map(FofoOrderItem::getItemId)
-
 
820
                .collect(Collectors.toSet());
-
 
821
        Map<Integer, Item> itemMap = itemRepository.selectByIds(itemIds).stream()
-
 
822
                .collect(Collectors.toMap(Item::getId, item -> item));
-
 
823
 
795
        for (FofoOrderItem fofoOrderItem : fofoOrderItems) {
824
        for (FofoOrderItem fofoOrderItem : fofoOrderItems) {
796
            Item item = itemRepository.selectById(fofoOrderItem.getItemId());
825
            Item item = itemMap.get(fofoOrderItem.getItemId());
797
 
826
 
798
            if (item.isSmartPhone()) {
827
            if (item != null && item.isSmartPhone()) {
799
                LOGGER.info("fofoItem {}", fofoOrderItem);
828
                LOGGER.info("fofoItem {}", fofoOrderItem);
800
                isSmartPhonePurchased = true;
829
                isSmartPhonePurchased = true;
801
                maxPurchaseValue = Math.max(fofoOrderItem.getSellingPrice(), maxPurchaseValue);
830
                maxPurchaseValue = Math.max(fofoOrderItem.getSellingPrice(), maxPurchaseValue);
802
 
-
 
803
            }
831
            }
804
        }
832
        }
805
        LocalDate startDate = ProfitMandiConstants.SCRATCH_OFFER_START_DATE;
833
        LocalDate startDate = ProfitMandiConstants.SCRATCH_OFFER_START_DATE;
806
        LocalDate endDate = ProfitMandiConstants.SCRATCH_OFFER_END_DATE;
834
        LocalDate endDate = ProfitMandiConstants.SCRATCH_OFFER_END_DATE;
807
        boolean specificPriceOffer = ProfitMandiConstants.SPECIFIC_PRICE_OFFER;
835
        boolean specificPriceOffer = ProfitMandiConstants.SPECIFIC_PRICE_OFFER;
Line 1795... Line 1823...
1795
            fofoLineItemRepository.persist(fofoLineItem);
1823
            fofoLineItemRepository.persist(fofoLineItem);
1796
        }
1824
        }
1797
    }
1825
    }
1798
 
1826
 
1799
    private FofoOrderItem createAndGetFofoOrderItem(CustomFofoOrderItem customFofoOrderItem, int fofoOrderId, Map<
1827
    private FofoOrderItem createAndGetFofoOrderItem(CustomFofoOrderItem customFofoOrderItem, int fofoOrderId, Map<
1800
            Integer, Item> itemMap, Set<InventoryItem> inventoryItems, Integer stateId) throws
1828
            Integer, Item> itemMap, Set<InventoryItem> inventoryItems, Map<Integer, TagListing> tagListingMap,
1801
            ProfitMandiBusinessException {
1829
            Map<Integer, GstRate> gstRateMap) throws ProfitMandiBusinessException {
1802
        FofoOrderItem fofoOrderItem = new FofoOrderItem();
1830
        FofoOrderItem fofoOrderItem = new FofoOrderItem();
1803
        fofoOrderItem.setItemId(customFofoOrderItem.getItemId());
1831
        fofoOrderItem.setItemId(customFofoOrderItem.getItemId());
1804
        fofoOrderItem.setQuantity(customFofoOrderItem.getQuantity());
1832
        fofoOrderItem.setQuantity(customFofoOrderItem.getQuantity());
1805
        fofoOrderItem.setSellingPrice(customFofoOrderItem.getSellingPrice());
1833
        fofoOrderItem.setSellingPrice(customFofoOrderItem.getSellingPrice());
1806
        fofoOrderItem.setPendingOrderItemId(customFofoOrderItem.getPoiId());
1834
        fofoOrderItem.setPendingOrderItemId(customFofoOrderItem.getPoiId());
1807
        fofoOrderItem.setOrderId(fofoOrderId);
1835
        fofoOrderItem.setOrderId(fofoOrderId);
-
 
1836
 
-
 
1837
        // N+1 fix: Use pre-fetched tagListingMap instead of querying per item
1808
        TagListing tl = tagListingRepository.selectByItemId(customFofoOrderItem.getItemId());
1838
        TagListing tl = tagListingMap.get(customFofoOrderItem.getItemId());
1809
        // In case listing gets removed rebill it using the selling price
1839
        // In case listing gets removed rebill it using the selling price
1810
        if (tl != null) {
1840
        if (tl != null) {
1811
            fofoOrderItem.setDp(tl.getSellingPrice());
1841
            fofoOrderItem.setDp(tl.getSellingPrice());
1812
            fofoOrderItem.setMop(tl.getMop());
1842
            fofoOrderItem.setMop(tl.getMop());
1813
        } else {
1843
        } else {
Line 1815... Line 1845...
1815
            fofoOrderItem.setMop(customFofoOrderItem.getSellingPrice());
1845
            fofoOrderItem.setMop(customFofoOrderItem.getSellingPrice());
1816
        }
1846
        }
1817
        fofoOrderItem.setDiscount(customFofoOrderItem.getDiscountAmount());
1847
        fofoOrderItem.setDiscount(customFofoOrderItem.getDiscountAmount());
1818
 
1848
 
1819
        Item item = itemMap.get(customFofoOrderItem.getItemId());
1849
        Item item = itemMap.get(customFofoOrderItem.getItemId());
1820
        Map<Integer, GstRate> itemIdStateTaxRateMap = null;
-
 
1821
        if (stateId != null) {
-
 
1822
            itemIdStateTaxRateMap = stateGstRateRepository.getStateTaxRate(new ArrayList<>(itemMap.keySet()), stateId);
-
 
1823
        } else {
-
 
1824
            itemIdStateTaxRateMap = stateGstRateRepository.getIgstTaxRate(new ArrayList<>(itemMap.keySet()));
-
 
1825
        }
-
 
1826
        for (InventoryItem inventoryItem : inventoryItems) {
-
 
1827
 
-
 
1828
            fofoOrderItem.setIgstRate(itemIdStateTaxRateMap.get(inventoryItem.getItemId()).getIgstRate());
-
 
1829
 
-
 
1830
            fofoOrderItem.setCgstRate(itemIdStateTaxRateMap.get(inventoryItem.getItemId()).getCgstRate());
-
 
1831
            fofoOrderItem.setSgstRate(itemIdStateTaxRateMap.get(inventoryItem.getItemId()).getSgstRate());
-
 
1832
 
-
 
1833
 
1850
 
-
 
1851
        // N+1 fix: Use pre-fetched gstRateMap instead of querying per item
-
 
1852
        for (InventoryItem inventoryItem : inventoryItems) {
-
 
1853
            GstRate gstRate = gstRateMap.get(inventoryItem.getItemId());
-
 
1854
            if (gstRate != null) {
-
 
1855
                fofoOrderItem.setIgstRate(gstRate.getIgstRate());
-
 
1856
                fofoOrderItem.setCgstRate(gstRate.getCgstRate());
-
 
1857
                fofoOrderItem.setSgstRate(gstRate.getSgstRate());
-
 
1858
            }
1834
            fofoOrderItem.setHsnCode(inventoryItem.getHsnCode());
1859
            fofoOrderItem.setHsnCode(inventoryItem.getHsnCode());
1835
            break;
1860
            break;
1836
        }
1861
        }
1837
        fofoOrderItem.setBrand(item.getBrand());
1862
        fofoOrderItem.setBrand(item.getBrand());
1838
        fofoOrderItem.setModelName(item.getModelName());
1863
        fofoOrderItem.setModelName(item.getModelName());