Subversion Repositories SmartDukaan

Rev

Rev 35651 | 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);
36278 ranu 107
        } else {
108
            FofoOpeningStock newOpeningStock = new FofoOpeningStock();
109
            newOpeningStock.setFofoId(fofoId);
110
            newOpeningStock.setCatalogId(catalogId);
111
            newOpeningStock.setOpeningDate(LocalDate.now());
112
            newOpeningStock.setOpeningQty(quantity);
113
            newOpeningStock.setCurrentQty(quantity);
114
            fofoOpeningStockRepository.persist(newOpeningStock);
33873 ranu 115
        }
116
 
117
    }
118
 
119
    @Override
120
    public void minusOpeningStock(int itemId, int fofoId, int quantity) throws ProfitMandiBusinessException{
121
        int catalogId = itemRepository.selectById(itemId).getCatalogItemId();
122
        FofoOpeningStock fofoOpeningStock = fofoOpeningStockRepository.findByFofoIdAndCatalogId(fofoId,catalogId);
123
        if(fofoOpeningStock !=null){
35651 aman 124
            int updatedQty = Math.max(fofoOpeningStock.getCurrentQty() - quantity, 0);
33873 ranu 125
            fofoOpeningStock.setCurrentQty(updatedQty);
126
        }
35493 amit 127
    }
33873 ranu 128
 
35493 amit 129
    @Override
130
    public void minusOpeningStockBatch(Map<Integer, Integer> itemIdQuantityMap, int fofoId) throws ProfitMandiBusinessException {
131
        if (itemIdQuantityMap == null || itemIdQuantityMap.isEmpty()) {
132
            return;
133
        }
33873 ranu 134
 
35493 amit 135
        // Batch fetch all items - 1 DB call instead of N
136
        List<Item> items = itemRepository.selectByIds(itemIdQuantityMap.keySet());
137
 
138
        // Build itemId -> catalogId map
139
        Map<Integer, Integer> itemToCatalogMap = items.stream()
140
                .collect(Collectors.toMap(Item::getId, Item::getCatalogItemId));
141
 
142
        // Get unique catalogIds and build catalogId -> quantity map
143
        Map<Integer, Integer> catalogQuantityMap = new HashMap<>();
144
        for (Map.Entry<Integer, Integer> entry : itemIdQuantityMap.entrySet()) {
145
            Integer catalogId = itemToCatalogMap.get(entry.getKey());
146
            if (catalogId != null) {
147
                catalogQuantityMap.merge(catalogId, entry.getValue(), Integer::sum);
148
            }
149
        }
150
 
151
        // Batch fetch all FofoOpeningStock records - 1 DB call instead of N
152
        List<FofoOpeningStock> openingStocks = fofoOpeningStockRepository.findByFofoIdAndCatalogIds(
153
                fofoId, catalogQuantityMap.keySet());
154
 
155
        // Update each opening stock
156
        for (FofoOpeningStock openingStock : openingStocks) {
157
            Integer quantityToSubtract = catalogQuantityMap.get(openingStock.getCatalogId());
158
            if (quantityToSubtract != null) {
35651 aman 159
                openingStock.setCurrentQty(Math.max(openingStock.getCurrentQty() - quantityToSubtract, 0));
35493 amit 160
            }
161
        }
33873 ranu 162
    }
163
 
164
    @Override
165
    public Set<Integer> getAllItemIdsForSmartCartOfPartner(int fofoId) throws ProfitMandiBusinessException {
34938 ranu 166
        LocalDateTime todayDate = LocalDate.now().atStartOfDay();
167
        LocalDateTime fortyFiveAgoDate = todayDate.minusDays(45).with(LocalTime.MAX);
168
        List<SoldAllCatalogitemQtyByPartnerModel> soldAllCatalogitemQtyByPartnerModels = this.getAllSoldCatalogItemByPartner(fofoId,fortyFiveAgoDate,todayDate);
169
        Set<Integer> soldCatalogsIn45Days = soldAllCatalogitemQtyByPartnerModels.stream().map(x->x.getCatalogId()).collect(Collectors.toSet());
34972 amit 170
        if(soldCatalogsIn45Days.size() == 0) {
171
            return new HashSet<>();
172
        }
34938 ranu 173
        logger.info("soldCatalogsIn45Days {}",soldCatalogsIn45Days);
174
        List<Item> soldItems = itemRepository.selectAllByCatalogIds(soldCatalogsIn45Days);
175
        Set<Integer> soldItemIds = soldItems.stream().map(x->x.getId()).collect(Collectors.toSet());
176
        List<CurrentInventorySnapshot> currentInventorySnapshots =  currentInventorySnapshotRepository.selectByFofoItemIds(fofoId,soldItemIds);
177
        Set<Integer> instockItemIds = currentInventorySnapshots.stream().filter(x -> x.getAvailability() > 0).map(x->x.getItemId()).collect(Collectors.toSet());
33873 ranu 178
 
34938 ranu 179
        if(instockItemIds.size() > 0) {
180
                Set<Integer> filteredCatalogIds = itemRepository.selectByIds(instockItemIds).stream().map(x->x.getCatalogItemId()).collect(Collectors.toSet());
181
//            this logis has been stop as of now we are not checking that sold catalog is avaialable or not in our stock
182
            /*List<Item> soldItems = itemRepository.selectAllByCatalogIds(filteredCatalogIds);
33873 ranu 183
 
184
            List<Integer> soldItemIds = soldItems.stream().map(x -> x.getId()).collect(Collectors.toList());
185
 
186
            FofoStore fofoStore = fofoStoreRepository.selectByRetailerId(fofoId);
187
 
188
            Map<Integer, List<WarehouseItemQtyModel>> itemQtyMap = saholicInventoryService.getSaholicStock(fofoStore.getWarehouseId(), soldItemIds);
189
 
190
 
191
            // Collect items where availability is greater than 0
192
            Set<Integer> saholicStockItemIds = itemQtyMap.entrySet().stream()
193
                    .filter(entry -> entry.getValue().stream().anyMatch(x -> x.getNetAvailability() > 0))
194
                    .map(Map.Entry::getKey)
195
                    .collect(Collectors.toSet());
196
 
197
            if (saholicStockItemIds.size() > 0) {
198
                List<Item> items = itemRepository.selectByIds(saholicStockItemIds);
199
 
200
                Set<Integer> saholictStockCatalogIds = items.stream().map(x -> x.getCatalogItemId()).collect(Collectors.toSet());
201
 
202
 
203
                return saholictStockCatalogIds;
204
            } else {
205
 
206
                return new HashSet<>();
34938 ranu 207
            }*/
208
            return  filteredCatalogIds;
33873 ranu 209
          } else {
210
            return new HashSet<>();
211
         }
212
        }
213
 
214
 
34384 ranu 215
    @Override
34449 ranu 216
    public Map<Integer, Map<Integer, Integer>> activatedButNotBilledCatalogQtyMap() throws ProfitMandiBusinessException {
34384 ranu 217
        List<FofoStore> fofoStores = fofoStoreRepository.selectAll();
218
        List<Integer> fofoIds = fofoStores.stream().map(x -> x.getId()).collect(Collectors.toList());
34449 ranu 219
        Map<Integer, Map<Integer, Integer>> fofoCatalogQtyMap = new HashMap<>();
34384 ranu 220
        for (Integer fofoId : fofoIds) {
221
            List<InventoryItem> inventoryItems = inventoryItemRepository.selectByActivatedNotSold(fofoId);
34449 ranu 222
            Map<Integer, Integer> catalogIdQtyMap = new HashMap<>();
34459 ranu 223
            for (InventoryItem inventoryitem : inventoryItems) {
224
                Item item = itemRepository.selectById(inventoryitem.getItemId());
225
                Integer catalogId = item.getCatalogItemId(); // Assuming this exists
34449 ranu 226
                catalogIdQtyMap.put(catalogId, catalogIdQtyMap.getOrDefault(catalogId, 0) + 1);
34384 ranu 227
            }
34449 ranu 228
            fofoCatalogQtyMap.put(fofoId, catalogIdQtyMap);
34384 ranu 229
        }
34461 ranu 230
        //System.out.println("fofoCatalogQtyMap {}" + fofoCatalogQtyMap);
34449 ranu 231
        return fofoCatalogQtyMap;
34384 ranu 232
 
233
    }
234
 
33873 ranu 235
}
236
 
237
 
238