Subversion Repositories SmartDukaan

Rev

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