Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
33917 ranu 1
package com.spice.profitmandi.service;
2
 
3
import com.spice.profitmandi.common.model.ProfitMandiConstants;
33985 ranu 4
import com.spice.profitmandi.dao.entity.inventory.RbmAchievements;
33926 ranu 5
import com.spice.profitmandi.dao.entity.inventory.RbmTargets;
33917 ranu 6
import com.spice.profitmandi.dao.model.*;
33985 ranu 7
import com.spice.profitmandi.dao.repository.catalog.RbmAchievementsRepository;
33926 ranu 8
import com.spice.profitmandi.dao.repository.catalog.RbmTargetsRepository;
33917 ranu 9
import org.apache.logging.log4j.LogManager;
10
import org.apache.logging.log4j.Logger;
11
import org.hibernate.Session;
12
import org.hibernate.SessionFactory;
13
import org.hibernate.query.NativeQuery;
14
import org.springframework.beans.factory.annotation.Autowired;
15
import org.springframework.stereotype.Component;
16
 
17
import javax.persistence.TypedQuery;
18
import java.time.LocalDate;
33926 ranu 19
import java.time.LocalDateTime;
20
import java.time.LocalTime;
33917 ranu 21
import java.util.ArrayList;
22
import java.util.List;
33997 ranu 23
import java.util.Map;
24
import java.util.stream.Collectors;
33917 ranu 25
 
26
@Component
27
public class RbmTargetServiceImpl implements RbmTargetService {
28
    private static final Logger LOGGER = LogManager.getLogger(RbmTargetServiceImpl.class);
29
 
30
    @Autowired
31
    SessionFactory sessionFactory;
32
 
33926 ranu 33
    @Autowired
34
    RbmTargetsRepository rbmTargetsRepository;
33917 ranu 35
 
33985 ranu 36
    @Autowired
37
    RbmAchievementsRepository rbmAchievementsRepository;
38
 
33917 ranu 39
    @Override
40
    public List<WarehouseRbmTargetModel> getWarehouseWiseRbmMonthlyTarget() {
41
        Session session = sessionFactory.getCurrentSession();
42
        final TypedQuery<WarehouseRbmTargetModel> typedQuerySimilar = session.createNamedQuery("RbmTarget.getWarehouseWiseMonthlyTarget", WarehouseRbmTargetModel.class);
43
 
44
        return typedQuerySimilar.getResultList();
45
 
46
    }
47
 
48
    @Override
49
    public List<MTDAchievedTargetModel> getDateWiseAchievedTargetOfRbm(LocalDate startDate, LocalDate endDate) {
50
        Session session = sessionFactory.getCurrentSession();
51
        final TypedQuery<MTDAchievedTargetModel> typedQuerySimilar = session.createNamedQuery("RbmTarget.getRbmAchievedMonthlyTarget", MTDAchievedTargetModel.class);
52
        typedQuerySimilar.setParameter("startDate", startDate);
53
        typedQuerySimilar.setParameter("endDate", endDate);
54
        return typedQuerySimilar.getResultList();
55
 
56
    }
57
 
58
    @Override
59
    public List<TodayAchievedMovementModel> getTodayTargetByMovement(LocalDate startDate, LocalDate endDate) {
60
        LOGGER.info("start date {}, end date {}", startDate, endDate);
61
        Session session = sessionFactory.getCurrentSession();
62
        final TypedQuery<TodayAchievedMovementModel> typedQuerySimilar = session.createNamedQuery("RBMTarget.TodayTargetByMovement", TodayAchievedMovementModel.class);
63
        typedQuerySimilar.setParameter("startDate", startDate);
64
        typedQuerySimilar.setParameter("endDate", endDate);
65
        return typedQuerySimilar.getResultList();
66
 
67
    }
68
 
69
    @Override
70
    public List<WarehouseMobileStockByMovementModel> getWarehouseMobileStockByMovement() {
71
        Session session = sessionFactory.getCurrentSession();
72
        final TypedQuery<WarehouseMobileStockByMovementModel> typedQuerySimilar = session.createNamedQuery("WarehouseStock.MovementWiseMobileStock", WarehouseMobileStockByMovementModel.class);
73
 
74
        return typedQuerySimilar.getResultList();
75
 
76
    }
77
 
33991 ranu 78
    @Override
79
    public List<SoldCatalogsReportModel> getCatalogSoldReport(LocalDate startDate, LocalDate endDate) {
80
        Session session = sessionFactory.getCurrentSession();
81
        final TypedQuery<SoldCatalogsReportModel> typedQuerySimilar = session.createNamedQuery("CatalogsReport.SoldCatalogsReport", SoldCatalogsReportModel.class);
82
        typedQuerySimilar.setParameter("startDate", startDate);
83
        typedQuerySimilar.setParameter("endDate", endDate);
84
        return typedQuerySimilar.getResultList();
33917 ranu 85
 
33991 ranu 86
    }
87
 
88
 
33917 ranu 89
    public int getWorkingDaysCount(LocalDate startDate) {
90
        Session session = sessionFactory.getCurrentSession();
91
 
92
        // Convert the LocalDate to a format MySQL can interpret
93
        String startDateString = startDate.toString();
94
 
95
        final NativeQuery<?> nativeQuery = session.createNativeQuery(
96
                "SELECT (DATEDIFF(LAST_DAY(:startDate), :startDate) + 1) " +
97
                        " - (FLOOR((DATEDIFF(LAST_DAY(:startDate), :startDate) + (WEEKDAY(:startDate) + 1)) / 7)) " +
98
                        " - (CASE WHEN WEEKDAY(:startDate) = 6 THEN 1 ELSE 0 END) " +
99
                        " - (SELECT COUNT(*) " +
100
                        " FROM logistics.publicholidays " +
101
                        " WHERE date BETWEEN :startDate AND LAST_DAY(:startDate) " +
102
                        " AND WEEKDAY(date) != 6) AS working_days"
103
        );
104
 
105
        // Set the start date parameter for each placeholder
106
        nativeQuery.setParameter("startDate", startDateString);
107
 
108
        Object result = nativeQuery.getSingleResult();
109
        return result != null ? ((Number) result).intValue() : 0;
110
    }
111
 
112
 
113
    @Override
114
    public List<RbmArrViewModel> getRbmTodayArr() throws Exception {
115
        LocalDate todayDate = LocalDate.now();
116
        return getRbmTodayArr(todayDate);
117
    }
118
 
119
    @Override
33997 ranu 120
    public List<RbmTargetAndAchievementsModel> getRbmTargetsAndAchievemnts(LocalDate startDate, LocalDate endDate) {
121
 
34002 ranu 122
        List<RbmTargetsModel> rbmTargetsList = rbmTargetsRepository.selectTargetsModelListByDates(startDate.atStartOfDay(), endDate.atTime(LocalTime.MAX));
33997 ranu 123
 
124
        LOGGER.info("rbmTargetsList {}", rbmTargetsList);
125
        // Group Targtes by RBM and Warehouse
34002 ranu 126
        Map<String, RbmTargetsModel> targetsMap = rbmTargetsList.stream()
33997 ranu 127
                .collect(Collectors.toMap(
128
                        a -> a.getRbmAuthId() + "-" + a.getWarehouseId(),
129
                        a -> a,
130
                        (a1, a2) -> mergeTargets(a1, a2) // Handle duplicates by merging
131
                ));
132
 
133
 
34002 ranu 134
        List<RbmAchievementsModel> rbmAchievements = rbmAchievementsRepository.selectAchievementsModelListByDates(startDate.atStartOfDay(), endDate.atTime(LocalTime.MAX));
33997 ranu 135
        LOGGER.info("rbmTargetsList {}", rbmAchievements);
136
        // Group achievements by RBM and Warehouse
34002 ranu 137
        Map<String, RbmAchievementsModel> achievementMap = rbmAchievements.stream()
33997 ranu 138
                .collect(Collectors.toMap(
139
                        a -> a.getRbmAuthId() + "-" + a.getWarehouseId(),
140
                        a -> a,
141
                        (a1, a2) -> mergeAchievements(a1, a2) // Handle duplicates by merging
142
                ));
143
 
144
        return targetsMap.keySet().stream()
145
                .map(key -> {
146
                    String[] parts = key.split("-");
147
                    int rbmAuthId = Integer.parseInt(parts[0]);
148
                    int warehouseId = Integer.parseInt(parts[1]);
149
 
34002 ranu 150
                    RbmTargetsModel target = targetsMap.get(key);
151
                    RbmAchievementsModel achievement = achievementMap.getOrDefault(key, new RbmAchievementsModel());
33997 ranu 152
 
153
                    RbmTargetAndAchievementsModel model = new RbmTargetAndAchievementsModel();
154
                    model.setAuthId(rbmAuthId);
155
                    model.setRbmName(target.getRbmName());
156
                    model.setWarehouseName(ProfitMandiConstants.WAREHOUSE_MAP.getOrDefault(warehouseId, "Unknown"));
157
 
158
                    // Set target values
34006 ranu 159
                    model.setHidTarget((long) target.getHidTarget());
160
                    model.setEolTarget((long) target.getEolTarget());
161
                    model.setFastMovingTarget((long) target.getFastMovingTarget());
162
                    model.setSlowMovingTarget((long) target.getSlowMovingTarget());
163
                    model.setOtherMovingTarget((long) target.getOtherTarget());
33997 ranu 164
 
165
                    // Set achievement values
34006 ranu 166
                    model.setAchievedHid((long) achievement.getAchievedHidTarget());
167
                    model.setAchievedEol((long) achievement.getAchievedEolTarget());
168
                    model.setAchievedFastMoving((long) achievement.getAchievedFastMovingTarget());
169
                    model.setAchievedSlowMoving((long) achievement.getAchievedSlowMovingTarget());
170
                    model.setAchievedOtherMoving((long) achievement.getAchievedOtherTarget());
33997 ranu 171
 
172
                    model.setTotalTarget(
34006 ranu 173
                            (long) target.getHidTarget() +
174
                                    (long) target.getEolTarget() +
175
                                    (long) target.getFastMovingTarget() +
176
                                    (long) target.getSlowMovingTarget() +
177
                                    (long) target.getOtherTarget()
33997 ranu 178
                    );
179
                    model.setTotalAchievemnt(
34006 ranu 180
                            (long) achievement.getAchievedHidTarget() +
181
                                    (long) achievement.getAchievedEolTarget() +
182
                                    (long) achievement.getAchievedFastMovingTarget() +
183
                                    (long) achievement.getAchievedSlowMovingTarget() +
184
                                    (long) achievement.getAchievedOtherTarget()
33997 ranu 185
                    );
186
 
187
                    return model;
188
                })
189
                .collect(Collectors.toList());
190
 
191
    }
192
 
34002 ranu 193
    private RbmTargetsModel mergeTargets(RbmTargetsModel a1, RbmTargetsModel a2) {
33997 ranu 194
 
195
        // Merge logic for achievements (aggregate the target and achieved values)
34006 ranu 196
        a1.setHidTarget((a1.getHidTarget()) +
197
                (a2.getHidTarget()));
33997 ranu 198
 
34006 ranu 199
        a1.setFastMovingTarget((a1.getFastMovingTarget()) +
200
                (a2.getFastMovingTarget()));
33997 ranu 201
 
34006 ranu 202
        a1.setSlowMovingTarget((a1.getSlowMovingTarget()) +
203
                (a2.getSlowMovingTarget()));
33997 ranu 204
 
34006 ranu 205
        a1.setEolTarget((a1.getEolTarget()) +
206
                (a2.getEolTarget()));
33997 ranu 207
 
34006 ranu 208
        a1.setOtherTarget((a1.getOtherTarget()) +
209
                (a2.getOtherTarget()));
33997 ranu 210
        return a1;
211
    }
212
 
34002 ranu 213
    private RbmAchievementsModel mergeAchievements(RbmAchievementsModel a1, RbmAchievementsModel a2) {
33997 ranu 214
        // Merge logic for achievements (aggregate the target and achieved values)
34006 ranu 215
        a1.setAchievedHidTarget((a1.getAchievedHidTarget()) +
216
                (a2.getAchievedHidTarget()));
33997 ranu 217
 
34006 ranu 218
        a1.setAchievedEolTarget((a1.getAchievedEolTarget()) +
219
                (a2.getAchievedEolTarget()));
33997 ranu 220
 
34006 ranu 221
        a1.setAchievedFastMovingTarget((a1.getAchievedFastMovingTarget()) +
222
                (a2.getAchievedFastMovingTarget()));
33997 ranu 223
 
34006 ranu 224
        a1.setAchievedSlowMovingTarget((a1.getAchievedSlowMovingTarget()) +
225
                (a2.getAchievedSlowMovingTarget()));
33997 ranu 226
 
34006 ranu 227
        a1.setAchievedOtherTarget((a1.getAchievedOtherTarget()) +
228
                (a2.getAchievedOtherTarget()));
33997 ranu 229
 
230
        return a1;
231
    }
34002 ranu 232
 
33997 ranu 233
    @Override
33917 ranu 234
    public List<RbmArrViewModel> getRbmTodayArr(LocalDate todayDate) throws Exception {
235
 
236
        LocalDate startDateOfMonthDay1 = LocalDate.now().withDayOfMonth(1);
237
 
238
        List<WarehouseRbmTargetModel> warehouseRbmTargetModels = this.getWarehouseWiseRbmMonthlyTarget();
239
 
33955 ranu 240
        List<TodayAchievedMovementModel> todayAchievedMovementModels = getTodayTargetByMovement(todayDate, todayDate.plusDays(1));
33917 ranu 241
 
242
        List<MTDAchievedTargetModel> mtdAchievedTargetModels = getDateWiseAchievedTargetOfRbm(startDateOfMonthDay1, todayDate);
243
 
244
        int remainingWorkingDaysCount = getWorkingDaysCount(todayDate);
245
 
33926 ranu 246
        List<RbmTargets> todayRbmTargetsList = rbmTargetsRepository.selectTargetsByDates(todayDate.atStartOfDay(), todayDate.atTime(LocalTime.MAX));
33917 ranu 247
 
33926 ranu 248
        LOGGER.info("todayRbmTargetsList {}", todayRbmTargetsList);
33917 ranu 249
 
250
        List<RbmArrViewModel> rbmArrViewModels = new ArrayList<>();
251
 
252
        for (WarehouseRbmTargetModel rbmTarget : warehouseRbmTargetModels) {
253
 
254
            float monthlyTarget = rbmTarget.getMonthlyTarget();
255
            float achievedSoFar = (float) mtdAchievedTargetModels.stream()
256
                    .filter(x -> x.getAuthId() == rbmTarget.getAuthId() && x.getWarehouseId() == rbmTarget.getWarehouseId())
257
                    .mapToDouble(MTDAchievedTargetModel::getAcheivedMonthlyTarget)
258
                    .sum();
259
 
260
            float remainingTarget = monthlyTarget - achievedSoFar;
261
 
33953 ranu 262
            float todayTarget = (remainingWorkingDaysCount > 0 && remainingTarget > 0) ? remainingTarget / remainingWorkingDaysCount : 0;
263
 
33926 ranu 264
                String warehouseName = ProfitMandiConstants.WAREHOUSE_MAP.getOrDefault(rbmTarget.getWarehouseId(), "Unknown");
33917 ranu 265
 
33926 ranu 266
                TodayAchievedMovementModel todayAchievedMovementModel = todayAchievedMovementModels.stream().filter(x -> x.getAuthId() == rbmTarget.getAuthId() && x.getWarehouseId() == rbmTarget.getWarehouseId()).findFirst().get();
33917 ranu 267
 
33926 ranu 268
            RbmTargets todayRbmTargets = todayRbmTargetsList.stream().filter(x -> x.getRbmAuthId() == rbmTarget.getAuthId() && x.getWarehouseId() == rbmTarget.getWarehouseId()).findFirst().get();
269
            LOGGER.info("todayRbmTargets {}", todayRbmTargets);
33917 ranu 270
 
271
                RbmArrViewModel viewModel = new RbmArrViewModel();
272
 
273
                viewModel.setAuthId(rbmTarget.getAuthId());
274
                viewModel.setRbmName(rbmTarget.getRbmName());
275
                viewModel.setWarehouseName(warehouseName);
276
                viewModel.setTodayTarget(Math.round(todayTarget));
277
                viewModel.setMonthlyTarget(Math.round(monthlyTarget));
278
                viewModel.setMtdAchievedTarget(Math.round(achievedSoFar));
33926 ranu 279
 
280
            viewModel.setTodayHidTarget(Math.round((todayRbmTargets.getHidTarget())));
281
            viewModel.setTodayFastMovingTarget(Math.round(todayRbmTargets.getFastMovingTarget()));
282
            viewModel.setTodaySlowMovingTarget(Math.round(todayRbmTargets.getSlowMovingTarget()));
283
            viewModel.setTodayEolTarget(Math.round(todayRbmTargets.getEolTarget()));
284
            viewModel.setTodayOtherMovingTarget(Math.round(todayRbmTargets.getOtherTarget()));
285
 
33917 ranu 286
                viewModel.setTodayAchievedHidTarget(Math.round(todayAchievedMovementModel.getHidBilled()));
287
                viewModel.setTodayAchievedFastMovingTarget(Math.round(todayAchievedMovementModel.getFastMovingBilled()));
288
                viewModel.setTodayAchievedSlowMovingTarget(Math.round(todayAchievedMovementModel.getSlowMovingBilled()));
289
                viewModel.setTodayAchievedEolTarget(Math.round(todayAchievedMovementModel.getEolBilled()));
290
                viewModel.setTodayAchievedOtherMovingTarget(Math.round(todayAchievedMovementModel.getOtherBilled()));
291
                viewModel.setTotalAchievedTarget(Math.round(todayAchievedMovementModel.getHidBilled() + todayAchievedMovementModel.getFastMovingBilled() + todayAchievedMovementModel.getSlowMovingBilled() + todayAchievedMovementModel.getEolBilled() + todayAchievedMovementModel.getOtherBilled()));
292
 
293
                rbmArrViewModels.add(viewModel);
294
 
295
        }
296
 
297
        LOGGER.info("rbmArrViewModels {}", rbmArrViewModels);
298
        return rbmArrViewModels;
299
    }
300
 
33926 ranu 301
    @Override
302
    public void setMovementWiseRbmTargets() {
303
        LocalDate todayDate = LocalDate.now();
33917 ranu 304
 
33926 ranu 305
        LocalDate startDateOfMonthDay1 = LocalDate.now().withDayOfMonth(1);
306
 
307
        List<WarehouseRbmTargetModel> warehouseRbmTargetModels = this.getWarehouseWiseRbmMonthlyTarget();
308
 
309
        List<MTDAchievedTargetModel> mtdAchievedTargetModels = getDateWiseAchievedTargetOfRbm(startDateOfMonthDay1, todayDate);
310
 
311
 
312
        int remainingWorkingDaysCount = getWorkingDaysCount(todayDate);
313
 
314
        List<WarehouseMobileStockByMovementModel> warehouseMobileStockByMovementModels = getWarehouseMobileStockByMovement();
315
 
316
        for (WarehouseRbmTargetModel rbmTarget : warehouseRbmTargetModels) {
317
 
318
            float monthlyTarget = rbmTarget.getMonthlyTarget();
319
            float achievedSoFar = (float) mtdAchievedTargetModels.stream()
320
                    .filter(x -> x.getAuthId() == rbmTarget.getAuthId() && x.getWarehouseId() == rbmTarget.getWarehouseId())
321
                    .mapToDouble(MTDAchievedTargetModel::getAcheivedMonthlyTarget)
322
                    .sum();
323
 
324
 
325
            float remainingTarget = monthlyTarget - achievedSoFar;
33953 ranu 326
            LOGGER.info("remainingTarget {}", remainingTarget);
33926 ranu 327
 
33953 ranu 328
            float todayTarget = (remainingWorkingDaysCount > 0 && remainingTarget > 0) ? remainingTarget / remainingWorkingDaysCount : 0;
329
            LOGGER.info("todayTarget {}", todayTarget);
330
 
33926 ranu 331
            // Get the warehouse stock data
332
            WarehouseMobileStockByMovementModel warehouseMobileStockByMovementModel = warehouseMobileStockByMovementModels.stream()
333
                    .filter(x -> x.getWarehouseId() == rbmTarget.getWarehouseId()).findFirst().orElse(null);
334
 
335
 
336
            if (warehouseMobileStockByMovementModel != null) {
337
 
338
                // Total stock value for this warehouse
339
                float totalStockValue = warehouseMobileStockByMovementModel.getTotalAvailabilityPrice();
340
 
341
                // Calculate target allocation based on stock value proportion
342
                float hidTarget = (warehouseMobileStockByMovementModel.getTotalHidCatalogPrice() / totalStockValue) * todayTarget;
343
                float fastMovingTarget = (warehouseMobileStockByMovementModel.getTotalFastMovingCatalogPrice() / totalStockValue) * todayTarget;
344
                float slowMovingTarget = (warehouseMobileStockByMovementModel.getTotalSlowMovingCatalogPrice() / totalStockValue) * todayTarget;
345
                float eolTarget = (warehouseMobileStockByMovementModel.getTotalEolCatalogPrice() / totalStockValue) * todayTarget;
346
                float otherTarget = (warehouseMobileStockByMovementModel.getTotalOtherCategoryCatalogPrice() / totalStockValue) * todayTarget;
347
 
348
                RbmTargets rbmTargets = new RbmTargets();
349
                rbmTargets.setWarehouseId(rbmTarget.getWarehouseId());
350
                rbmTargets.setRbmAuthId(rbmTarget.getAuthId());
351
                rbmTargets.setRbmName(rbmTarget.getRbmName());
352
                rbmTargets.setEolTarget(eolTarget);
353
                rbmTargets.setHidTarget(hidTarget);
354
                rbmTargets.setFastMovingTarget(fastMovingTarget);
355
                rbmTargets.setSlowMovingTarget(slowMovingTarget);
356
                rbmTargets.setOtherTarget(otherTarget);
357
                rbmTargets.setCreateTimestamp(LocalDateTime.now());
358
 
359
                rbmTargetsRepository.persist(rbmTargets);
360
 
361
            }
362
        }
363
 
364
    }
365
 
366
 
33985 ranu 367
    @Override
368
    public void setMovementWiseRbmAchievement() {
369
        LocalDate todayDate = LocalDate.now();
370
 
371
        List<TodayAchievedMovementModel> todayAchievedMovementModels = getTodayTargetByMovement(todayDate, todayDate.plusDays(1));
372
 
373
 
374
        for (TodayAchievedMovementModel achievement : todayAchievedMovementModels) {
375
 
376
            RbmAchievements rbmAchievements = new RbmAchievements();
377
 
378
            rbmAchievements.setRbmAuthId(achievement.getAuthId());
379
            rbmAchievements.setRbmName(achievement.getRbmName());
380
            rbmAchievements.setWarehouseId(achievement.getWarehouseId());
381
            rbmAchievements.setAchievedHidTarget(achievement.getHidBilled());
382
            rbmAchievements.setAchievedFastMovingTarget(achievement.getFastMovingBilled());
383
            rbmAchievements.setAchievedSlowMovingTarget(achievement.getSlowMovingBilled());
384
            rbmAchievements.setAchievedEolTarget(achievement.getEolBilled());
385
            rbmAchievements.setCreateTimestamp(LocalDateTime.now());
386
 
387
            rbmAchievementsRepository.persist(rbmAchievements);
388
 
389
        }
390
 
391
    }
392
 
393
 
33917 ranu 394
}