Subversion Repositories SmartDukaan

Rev

Rev 35493 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
33873 ranu 1
package com.spice.profitmandi.dao.cart;
2
 
3
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
4
import com.spice.profitmandi.dao.entity.catalog.Item;
34938 ranu 5
import com.spice.profitmandi.dao.entity.fofo.CurrentInventorySnapshot;
33873 ranu 6
import com.spice.profitmandi.dao.entity.fofo.FofoOpeningStock;
7
import com.spice.profitmandi.dao.entity.fofo.FofoStore;
34384 ranu 8
import com.spice.profitmandi.dao.entity.fofo.InventoryItem;
33873 ranu 9
import com.spice.profitmandi.dao.model.PoAndGrnPendingPartnerStockModel;
10
import com.spice.profitmandi.dao.model.SoldAllCatalogitemQtyByPartnerModel;
11
import com.spice.profitmandi.dao.model.SoldFocusedItemPartnerWiseModel;
12
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
13
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
34384 ranu 14
import com.spice.profitmandi.dao.repository.fofo.ActivatedImeiRepository;
33873 ranu 15
import com.spice.profitmandi.dao.repository.fofo.CurrentInventorySnapshotRepository;
16
import com.spice.profitmandi.dao.repository.fofo.FofoOpeningStockRepository;
34384 ranu 17
import com.spice.profitmandi.dao.repository.fofo.InventoryItemRepository;
33873 ranu 18
import com.spice.profitmandi.service.inventory.SaholicInventoryService;
19
import org.apache.logging.log4j.LogManager;
20
import org.apache.logging.log4j.Logger;
21
import org.hibernate.Session;
22
import org.hibernate.SessionFactory;
23
import org.springframework.beans.factory.annotation.Autowired;
24
import org.springframework.stereotype.Component;
25
 
26
import javax.persistence.TypedQuery;
34938 ranu 27
import java.time.LocalDate;
33873 ranu 28
import java.time.LocalDateTime;
34938 ranu 29
import java.time.LocalTime;
33873 ranu 30
import java.util.*;
31
import java.util.stream.Collectors;
32
 
33
@Component
34
public class SmartCartServiceImpl implements SmartCartService {
35
 
36
    private static final Set<Integer> tagIds = new HashSet<>(Arrays.asList(4));
37
 
38
    private static final Logger logger = LogManager.getLogger(SmartCartServiceImpl.class);
39
 
40
    @Autowired
41
    SessionFactory sessionFactory;
42
 
43
    @Autowired
44
    ItemRepository itemRepository;
45
 
34384 ranu 46
    @Autowired
47
    InventoryItemRepository inventoryItemRepository;
33873 ranu 48
 
34384 ranu 49
 
33873 ranu 50
    @Autowired
51
    CurrentInventorySnapshotRepository currentInventorySnapshotRepository;
52
 
53
    @Autowired
54
    FofoOpeningStockRepository fofoOpeningStockRepository;
55
 
56
 
57
    @Autowired
58
    private FofoStoreRepository fofoStoreRepository;
59
 
60
    @Autowired
61
    private SaholicInventoryService saholicInventoryService;
62
 
34384 ranu 63
    @Autowired
64
    private ActivatedImeiRepository activatedImeiRepository;
65
 
66
 
33873 ranu 67
    @Override
68
    public List<SoldFocusedItemPartnerWiseModel> getAllSoldFocusModelByPartner(int fofoId, LocalDateTime orderDate){
69
        Session session = sessionFactory.getCurrentSession();
70
        final TypedQuery<SoldFocusedItemPartnerWiseModel> typedQuerySimilar = session.createNamedQuery("Focused.soldFocusItemByPartner", SoldFocusedItemPartnerWiseModel.class);
71
 
72
        typedQuerySimilar.setParameter("fofoId", fofoId);
73
        typedQuerySimilar.setParameter("orderDate", orderDate);
74
 
75
        return typedQuerySimilar.getResultList();
76
    }
77
 
78
    @Override
79
    public List<SoldAllCatalogitemQtyByPartnerModel> getAllSoldCatalogItemByPartner(int fofoId, LocalDateTime startOfday, LocalDateTime endOfDay){
80
        Session session = sessionFactory.getCurrentSession();
81
        final TypedQuery<SoldAllCatalogitemQtyByPartnerModel> typedQuerySimilar = session.createNamedQuery("FofoOrder.soldAllItemByToday", SoldAllCatalogitemQtyByPartnerModel.class);
82
 
83
        typedQuerySimilar.setParameter("fofoId", fofoId);
84
        typedQuerySimilar.setParameter("startOfDay", startOfday);
85
        typedQuerySimilar.setParameter("endOfDay", endOfDay);
86
 
87
        return typedQuerySimilar.getResultList();
88
    }
89
 
90
    @Override
91
    public List<PoAndGrnPendingPartnerStockModel> getAllGrnPendingAndPoPartnerStock(int fofoId){
92
        Session session = sessionFactory.getCurrentSession();
93
        final TypedQuery<PoAndGrnPendingPartnerStockModel> typedQuerySimilar = session.createNamedQuery("Order.partnerStockPoAndGrnPending", PoAndGrnPendingPartnerStockModel.class);
94
 
95
        typedQuerySimilar.setParameter("fofoId", fofoId);
96
 
97
        return typedQuerySimilar.getResultList();
98
    }
99
 
100
    @Override
101
    public void addOpeningStock(int itemId, int fofoId, int quantity) throws ProfitMandiBusinessException{
102
        int catalogId = itemRepository.selectById(itemId).getCatalogItemId();
103
        FofoOpeningStock fofoOpeningStock = fofoOpeningStockRepository.findByFofoIdAndCatalogId(fofoId,catalogId);
104
        if(fofoOpeningStock !=null){
105
            int updatedQty = fofoOpeningStock.getCurrentQty() + quantity;
106
            fofoOpeningStock.setCurrentQty(updatedQty);
107
        }
108
 
109
    }
110
 
111
    @Override
112
    public void minusOpeningStock(int itemId, int fofoId, int quantity) throws ProfitMandiBusinessException{
113
        int catalogId = itemRepository.selectById(itemId).getCatalogItemId();
114
        FofoOpeningStock fofoOpeningStock = fofoOpeningStockRepository.findByFofoIdAndCatalogId(fofoId,catalogId);
115
        if(fofoOpeningStock !=null){
35651 aman 116
            int updatedQty = Math.max(fofoOpeningStock.getCurrentQty() - quantity, 0);
33873 ranu 117
            fofoOpeningStock.setCurrentQty(updatedQty);
118
        }
35493 amit 119
    }
33873 ranu 120
 
35493 amit 121
    @Override
122
    public void minusOpeningStockBatch(Map<Integer, Integer> itemIdQuantityMap, int fofoId) throws ProfitMandiBusinessException {
123
        if (itemIdQuantityMap == null || itemIdQuantityMap.isEmpty()) {
124
            return;
125
        }
33873 ranu 126
 
35493 amit 127
        // Batch fetch all items - 1 DB call instead of N
128
        List<Item> items = itemRepository.selectByIds(itemIdQuantityMap.keySet());
129
 
130
        // Build itemId -> catalogId map
131
        Map<Integer, Integer> itemToCatalogMap = items.stream()
132
                .collect(Collectors.toMap(Item::getId, Item::getCatalogItemId));
133
 
134
        // Get unique catalogIds and build catalogId -> quantity map
135
        Map<Integer, Integer> catalogQuantityMap = new HashMap<>();
136
        for (Map.Entry<Integer, Integer> entry : itemIdQuantityMap.entrySet()) {
137
            Integer catalogId = itemToCatalogMap.get(entry.getKey());
138
            if (catalogId != null) {
139
                catalogQuantityMap.merge(catalogId, entry.getValue(), Integer::sum);
140
            }
141
        }
142
 
143
        // Batch fetch all FofoOpeningStock records - 1 DB call instead of N
144
        List<FofoOpeningStock> openingStocks = fofoOpeningStockRepository.findByFofoIdAndCatalogIds(
145
                fofoId, catalogQuantityMap.keySet());
146
 
147
        // Update each opening stock
148
        for (FofoOpeningStock openingStock : openingStocks) {
149
            Integer quantityToSubtract = catalogQuantityMap.get(openingStock.getCatalogId());
150
            if (quantityToSubtract != null) {
35651 aman 151
                openingStock.setCurrentQty(Math.max(openingStock.getCurrentQty() - quantityToSubtract, 0));
35493 amit 152
            }
153
        }
33873 ranu 154
    }
155
 
156
    @Override
157
    public Set<Integer> getAllItemIdsForSmartCartOfPartner(int fofoId) throws ProfitMandiBusinessException {
34938 ranu 158
        LocalDateTime todayDate = LocalDate.now().atStartOfDay();
159
        LocalDateTime fortyFiveAgoDate = todayDate.minusDays(45).with(LocalTime.MAX);
160
        List<SoldAllCatalogitemQtyByPartnerModel> soldAllCatalogitemQtyByPartnerModels = this.getAllSoldCatalogItemByPartner(fofoId,fortyFiveAgoDate,todayDate);
161
        Set<Integer> soldCatalogsIn45Days = soldAllCatalogitemQtyByPartnerModels.stream().map(x->x.getCatalogId()).collect(Collectors.toSet());
34972 amit 162
        if(soldCatalogsIn45Days.size() == 0) {
163
            return new HashSet<>();
164
        }
34938 ranu 165
        logger.info("soldCatalogsIn45Days {}",soldCatalogsIn45Days);
166
        List<Item> soldItems = itemRepository.selectAllByCatalogIds(soldCatalogsIn45Days);
167
        Set<Integer> soldItemIds = soldItems.stream().map(x->x.getId()).collect(Collectors.toSet());
168
        List<CurrentInventorySnapshot> currentInventorySnapshots =  currentInventorySnapshotRepository.selectByFofoItemIds(fofoId,soldItemIds);
169
        Set<Integer> instockItemIds = currentInventorySnapshots.stream().filter(x -> x.getAvailability() > 0).map(x->x.getItemId()).collect(Collectors.toSet());
33873 ranu 170
 
34938 ranu 171
        if(instockItemIds.size() > 0) {
172
                Set<Integer> filteredCatalogIds = itemRepository.selectByIds(instockItemIds).stream().map(x->x.getCatalogItemId()).collect(Collectors.toSet());
173
//            this logis has been stop as of now we are not checking that sold catalog is avaialable or not in our stock
174
            /*List<Item> soldItems = itemRepository.selectAllByCatalogIds(filteredCatalogIds);
33873 ranu 175
 
176
            List<Integer> soldItemIds = soldItems.stream().map(x -> x.getId()).collect(Collectors.toList());
177
 
178
            FofoStore fofoStore = fofoStoreRepository.selectByRetailerId(fofoId);
179
 
180
            Map<Integer, List<WarehouseItemQtyModel>> itemQtyMap = saholicInventoryService.getSaholicStock(fofoStore.getWarehouseId(), soldItemIds);
181
 
182
 
183
            // Collect items where availability is greater than 0
184
            Set<Integer> saholicStockItemIds = itemQtyMap.entrySet().stream()
185
                    .filter(entry -> entry.getValue().stream().anyMatch(x -> x.getNetAvailability() > 0))
186
                    .map(Map.Entry::getKey)
187
                    .collect(Collectors.toSet());
188
 
189
            if (saholicStockItemIds.size() > 0) {
190
                List<Item> items = itemRepository.selectByIds(saholicStockItemIds);
191
 
192
                Set<Integer> saholictStockCatalogIds = items.stream().map(x -> x.getCatalogItemId()).collect(Collectors.toSet());
193
 
194
 
195
                return saholictStockCatalogIds;
196
            } else {
197
 
198
                return new HashSet<>();
34938 ranu 199
            }*/
200
            return  filteredCatalogIds;
33873 ranu 201
          } else {
202
            return new HashSet<>();
203
         }
204
        }
205
 
206
 
34384 ranu 207
    @Override
34449 ranu 208
    public Map<Integer, Map<Integer, Integer>> activatedButNotBilledCatalogQtyMap() throws ProfitMandiBusinessException {
34384 ranu 209
        List<FofoStore> fofoStores = fofoStoreRepository.selectAll();
210
        List<Integer> fofoIds = fofoStores.stream().map(x -> x.getId()).collect(Collectors.toList());
34449 ranu 211
        Map<Integer, Map<Integer, Integer>> fofoCatalogQtyMap = new HashMap<>();
34384 ranu 212
        for (Integer fofoId : fofoIds) {
213
            List<InventoryItem> inventoryItems = inventoryItemRepository.selectByActivatedNotSold(fofoId);
34449 ranu 214
            Map<Integer, Integer> catalogIdQtyMap = new HashMap<>();
34459 ranu 215
            for (InventoryItem inventoryitem : inventoryItems) {
216
                Item item = itemRepository.selectById(inventoryitem.getItemId());
217
                Integer catalogId = item.getCatalogItemId(); // Assuming this exists
34449 ranu 218
                catalogIdQtyMap.put(catalogId, catalogIdQtyMap.getOrDefault(catalogId, 0) + 1);
34384 ranu 219
            }
34449 ranu 220
            fofoCatalogQtyMap.put(fofoId, catalogIdQtyMap);
34384 ranu 221
        }
34461 ranu 222
        //System.out.println("fofoCatalogQtyMap {}" + fofoCatalogQtyMap);
34449 ranu 223
        return fofoCatalogQtyMap;
34384 ranu 224
 
225
    }
226
 
33873 ranu 227
}
228
 
229
 
230