Subversion Repositories SmartDukaan

Rev

Rev 35453 | Rev 35631 | 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;
34397 ranu 4
import com.spice.profitmandi.dao.entity.fofo.MonthlyTarget;
33985 ranu 5
import com.spice.profitmandi.dao.entity.inventory.RbmAchievements;
33926 ranu 6
import com.spice.profitmandi.dao.entity.inventory.RbmTargets;
33917 ranu 7
import com.spice.profitmandi.dao.model.*;
33985 ranu 8
import com.spice.profitmandi.dao.repository.catalog.RbmAchievementsRepository;
33926 ranu 9
import com.spice.profitmandi.dao.repository.catalog.RbmTargetsRepository;
34397 ranu 10
import com.spice.profitmandi.dao.repository.fofo.MonthlyTargetRepository;
34880 ranu 11
import com.spice.profitmandi.dao.repository.logistics.PublicHolidaysRepository;
34397 ranu 12
import com.spice.profitmandi.dao.repository.transaction.OrderRepository;
33917 ranu 13
import org.apache.logging.log4j.LogManager;
14
import org.apache.logging.log4j.Logger;
15
import org.hibernate.Session;
16
import org.hibernate.SessionFactory;
17
import org.hibernate.query.NativeQuery;
18
import org.springframework.beans.factory.annotation.Autowired;
19
import org.springframework.stereotype.Component;
20
 
21
import javax.persistence.TypedQuery;
34880 ranu 22
import java.time.*;
23
import java.time.temporal.ChronoUnit;
33917 ranu 24
import java.util.ArrayList;
25
import java.util.List;
33997 ranu 26
import java.util.Map;
34034 ranu 27
import java.util.Optional;
33997 ranu 28
import java.util.stream.Collectors;
33917 ranu 29
 
30
@Component
31
public class RbmTargetServiceImpl implements RbmTargetService {
32
    private static final Logger LOGGER = LogManager.getLogger(RbmTargetServiceImpl.class);
33
 
34
    @Autowired
35
    SessionFactory sessionFactory;
36
 
33926 ranu 37
    @Autowired
38
    RbmTargetsRepository rbmTargetsRepository;
33917 ranu 39
 
33985 ranu 40
    @Autowired
41
    RbmAchievementsRepository rbmAchievementsRepository;
42
 
34397 ranu 43
    @Autowired
44
    MonthlyTargetRepository monthlyTargetRepository;
45
 
34880 ranu 46
    @Autowired
47
    PublicHolidaysRepository publicHolidaysRepository;
48
 
33917 ranu 49
    @Override
50
    public List<WarehouseRbmTargetModel> getWarehouseWiseRbmMonthlyTarget() {
51
        Session session = sessionFactory.getCurrentSession();
52
        final TypedQuery<WarehouseRbmTargetModel> typedQuerySimilar = session.createNamedQuery("RbmTarget.getWarehouseWiseMonthlyTarget", WarehouseRbmTargetModel.class);
53
 
54
        return typedQuerySimilar.getResultList();
55
 
56
    }
57
 
58
    @Override
59
    public List<MTDAchievedTargetModel> getDateWiseAchievedTargetOfRbm(LocalDate startDate, LocalDate endDate) {
60
        Session session = sessionFactory.getCurrentSession();
61
        final TypedQuery<MTDAchievedTargetModel> typedQuerySimilar = session.createNamedQuery("RbmTarget.getRbmAchievedMonthlyTarget", MTDAchievedTargetModel.class);
62
        typedQuerySimilar.setParameter("startDate", startDate);
63
        typedQuerySimilar.setParameter("endDate", endDate);
64
        return typedQuerySimilar.getResultList();
65
 
66
    }
67
 
68
    @Override
34055 ranu 69
    public List<TodayAchievedMovementModel> getMovementWiseAchievementByDate(LocalDate startDate, LocalDate endDate) {
33917 ranu 70
        LOGGER.info("start date {}, end date {}", startDate, endDate);
71
        Session session = sessionFactory.getCurrentSession();
34055 ranu 72
        final TypedQuery<TodayAchievedMovementModel> typedQuerySimilar = session.createNamedQuery("RBMTarget.TodayAchivementByMovement", TodayAchievedMovementModel.class);
33917 ranu 73
        typedQuerySimilar.setParameter("startDate", startDate);
74
        typedQuerySimilar.setParameter("endDate", endDate);
75
        return typedQuerySimilar.getResultList();
76
 
77
    }
78
 
79
    @Override
80
    public List<WarehouseMobileStockByMovementModel> getWarehouseMobileStockByMovement() {
81
        Session session = sessionFactory.getCurrentSession();
82
        final TypedQuery<WarehouseMobileStockByMovementModel> typedQuerySimilar = session.createNamedQuery("WarehouseStock.MovementWiseMobileStock", WarehouseMobileStockByMovementModel.class);
83
 
84
        return typedQuerySimilar.getResultList();
85
 
86
    }
87
 
33991 ranu 88
    @Override
89
    public List<SoldCatalogsReportModel> getCatalogSoldReport(LocalDate startDate, LocalDate endDate) {
90
        Session session = sessionFactory.getCurrentSession();
91
        final TypedQuery<SoldCatalogsReportModel> typedQuerySimilar = session.createNamedQuery("CatalogsReport.SoldCatalogsReport", SoldCatalogsReportModel.class);
92
        typedQuerySimilar.setParameter("startDate", startDate);
93
        typedQuerySimilar.setParameter("endDate", endDate);
94
        return typedQuerySimilar.getResultList();
33917 ranu 95
 
33991 ranu 96
    }
97
 
98
 
33917 ranu 99
    public int getWorkingDaysCount(LocalDate startDate) {
100
        Session session = sessionFactory.getCurrentSession();
101
 
102
        // Convert the LocalDate to a format MySQL can interpret
103
        String startDateString = startDate.toString();
104
 
105
        final NativeQuery<?> nativeQuery = session.createNativeQuery(
106
                "SELECT (DATEDIFF(LAST_DAY(:startDate), :startDate) + 1) " +
107
                        " - (FLOOR((DATEDIFF(LAST_DAY(:startDate), :startDate) + (WEEKDAY(:startDate) + 1)) / 7)) " +
108
                        " - (SELECT COUNT(*) " +
109
                        " FROM logistics.publicholidays " +
110
                        " WHERE date BETWEEN :startDate AND LAST_DAY(:startDate) " +
111
                        " AND WEEKDAY(date) != 6) AS working_days"
112
        );
113
 
114
        // Set the start date parameter for each placeholder
115
        nativeQuery.setParameter("startDate", startDateString);
116
 
117
        Object result = nativeQuery.getSingleResult();
118
        return result != null ? ((Number) result).intValue() : 0;
119
    }
120
 
121
 
35044 ranu 122
 
33917 ranu 123
    @Override
124
    public List<RbmArrViewModel> getRbmTodayArr() throws Exception {
125
        LocalDate todayDate = LocalDate.now();
126
        return getRbmTodayArr(todayDate);
127
    }
128
 
129
    @Override
33997 ranu 130
    public List<RbmTargetAndAchievementsModel> getRbmTargetsAndAchievemnts(LocalDate startDate, LocalDate endDate) {
131
 
34002 ranu 132
        List<RbmTargetsModel> rbmTargetsList = rbmTargetsRepository.selectTargetsModelListByDates(startDate.atStartOfDay(), endDate.atTime(LocalTime.MAX));
33997 ranu 133
 
134
        LOGGER.info("rbmTargetsList {}", rbmTargetsList);
135
        // Group Targtes by RBM and Warehouse
34002 ranu 136
        Map<String, RbmTargetsModel> targetsMap = rbmTargetsList.stream()
33997 ranu 137
                .collect(Collectors.toMap(
138
                        a -> a.getRbmAuthId() + "-" + a.getWarehouseId(),
139
                        a -> a,
140
                        (a1, a2) -> mergeTargets(a1, a2) // Handle duplicates by merging
141
                ));
142
 
143
 
34002 ranu 144
        List<RbmAchievementsModel> rbmAchievements = rbmAchievementsRepository.selectAchievementsModelListByDates(startDate.atStartOfDay(), endDate.atTime(LocalTime.MAX));
33997 ranu 145
        LOGGER.info("rbmTargetsList {}", rbmAchievements);
146
        // Group achievements by RBM and Warehouse
34002 ranu 147
        Map<String, RbmAchievementsModel> achievementMap = rbmAchievements.stream()
33997 ranu 148
                .collect(Collectors.toMap(
149
                        a -> a.getRbmAuthId() + "-" + a.getWarehouseId(),
150
                        a -> a,
151
                        (a1, a2) -> mergeAchievements(a1, a2) // Handle duplicates by merging
152
                ));
153
 
154
        return targetsMap.keySet().stream()
155
                .map(key -> {
156
                    String[] parts = key.split("-");
157
                    int rbmAuthId = Integer.parseInt(parts[0]);
158
                    int warehouseId = Integer.parseInt(parts[1]);
159
 
34002 ranu 160
                    RbmTargetsModel target = targetsMap.get(key);
161
                    RbmAchievementsModel achievement = achievementMap.getOrDefault(key, new RbmAchievementsModel());
33997 ranu 162
 
163
                    RbmTargetAndAchievementsModel model = new RbmTargetAndAchievementsModel();
164
                    model.setAuthId(rbmAuthId);
165
                    model.setRbmName(target.getRbmName());
166
                    model.setWarehouseName(ProfitMandiConstants.WAREHOUSE_MAP.getOrDefault(warehouseId, "Unknown"));
167
 
168
                    // Set target values
34006 ranu 169
                    model.setHidTarget((long) target.getHidTarget());
34098 ranu 170
                    model.setRunningTarget((long) target.getRunningTarget());
34006 ranu 171
                    model.setFastMovingTarget((long) target.getFastMovingTarget());
172
                    model.setSlowMovingTarget((long) target.getSlowMovingTarget());
173
                    model.setOtherMovingTarget((long) target.getOtherTarget());
33997 ranu 174
 
175
                    // Set achievement values
34006 ranu 176
                    model.setAchievedHid((long) achievement.getAchievedHidTarget());
34098 ranu 177
                    model.setAchievedRunning((long) achievement.getAchievedRunningTarget());
34006 ranu 178
                    model.setAchievedFastMoving((long) achievement.getAchievedFastMovingTarget());
179
                    model.setAchievedSlowMoving((long) achievement.getAchievedSlowMovingTarget());
180
                    model.setAchievedOtherMoving((long) achievement.getAchievedOtherTarget());
33997 ranu 181
 
182
                    model.setTotalTarget(
34006 ranu 183
                            (long) target.getHidTarget() +
34098 ranu 184
                                    (long) target.getRunningTarget() +
34006 ranu 185
                                    (long) target.getFastMovingTarget() +
186
                                    (long) target.getSlowMovingTarget() +
187
                                    (long) target.getOtherTarget()
33997 ranu 188
                    );
189
                    model.setTotalAchievemnt(
34006 ranu 190
                            (long) achievement.getAchievedHidTarget() +
34098 ranu 191
                                    (long) achievement.getAchievedRunningTarget() +
34006 ranu 192
                                    (long) achievement.getAchievedFastMovingTarget() +
193
                                    (long) achievement.getAchievedSlowMovingTarget() +
194
                                    (long) achievement.getAchievedOtherTarget()
33997 ranu 195
                    );
196
 
197
                    return model;
198
                })
199
                .collect(Collectors.toList());
200
 
201
    }
202
 
34002 ranu 203
    private RbmTargetsModel mergeTargets(RbmTargetsModel a1, RbmTargetsModel a2) {
33997 ranu 204
 
205
        // Merge logic for achievements (aggregate the target and achieved values)
34006 ranu 206
        a1.setHidTarget((a1.getHidTarget()) +
207
                (a2.getHidTarget()));
33997 ranu 208
 
34006 ranu 209
        a1.setFastMovingTarget((a1.getFastMovingTarget()) +
210
                (a2.getFastMovingTarget()));
33997 ranu 211
 
34006 ranu 212
        a1.setSlowMovingTarget((a1.getSlowMovingTarget()) +
213
                (a2.getSlowMovingTarget()));
33997 ranu 214
 
34098 ranu 215
        a1.setRunningTarget((a1.getRunningTarget()) +
216
                (a2.getRunningTarget()));
33997 ranu 217
 
34006 ranu 218
        a1.setOtherTarget((a1.getOtherTarget()) +
219
                (a2.getOtherTarget()));
33997 ranu 220
        return a1;
221
    }
222
 
34002 ranu 223
    private RbmAchievementsModel mergeAchievements(RbmAchievementsModel a1, RbmAchievementsModel a2) {
33997 ranu 224
        // Merge logic for achievements (aggregate the target and achieved values)
34006 ranu 225
        a1.setAchievedHidTarget((a1.getAchievedHidTarget()) +
226
                (a2.getAchievedHidTarget()));
33997 ranu 227
 
34098 ranu 228
        a1.setAchievedRunningTarget((a1.getAchievedRunningTarget()) +
229
                (a2.getAchievedRunningTarget()));
33997 ranu 230
 
34006 ranu 231
        a1.setAchievedFastMovingTarget((a1.getAchievedFastMovingTarget()) +
232
                (a2.getAchievedFastMovingTarget()));
33997 ranu 233
 
34006 ranu 234
        a1.setAchievedSlowMovingTarget((a1.getAchievedSlowMovingTarget()) +
235
                (a2.getAchievedSlowMovingTarget()));
33997 ranu 236
 
34006 ranu 237
        a1.setAchievedOtherTarget((a1.getAchievedOtherTarget()) +
238
                (a2.getAchievedOtherTarget()));
33997 ranu 239
 
240
        return a1;
241
    }
34002 ranu 242
 
33997 ranu 243
    @Override
33917 ranu 244
    public List<RbmArrViewModel> getRbmTodayArr(LocalDate todayDate) throws Exception {
245
 
246
        LocalDate startDateOfMonthDay1 = LocalDate.now().withDayOfMonth(1);
247
 
34289 ranu 248
        List<WarehouseRbmTargetModel> warehouseRbmTargetModelList = this.getWarehouseWiseRbmMonthlyTarget();
249
        List<WarehouseRbmTargetModel> warehouseRbmTargetModels = warehouseRbmTargetModelList.stream().filter(x -> x.getMonthlyTarget() > 0).collect(Collectors.toList());
250
        LOGGER.info("warehouseRbmTargetModels {}", warehouseRbmTargetModels);
251
        List<TodayAchievedMovementModel> todayAchievedMovementModels = getMovementWiseAchievementByDate(todayDate, todayDate.plusDays(1));
33917 ranu 252
 
253
        List<MTDAchievedTargetModel> mtdAchievedTargetModels = getDateWiseAchievedTargetOfRbm(startDateOfMonthDay1, todayDate);
254
 
35044 ranu 255
        int remainingWorkingDaysCount = (int) getRemainingDaysInMonth(todayDate);
33917 ranu 256
 
33926 ranu 257
        List<RbmTargets> todayRbmTargetsList = rbmTargetsRepository.selectTargetsByDates(todayDate.atStartOfDay(), todayDate.atTime(LocalTime.MAX));
33917 ranu 258
 
33926 ranu 259
        LOGGER.info("todayRbmTargetsList {}", todayRbmTargetsList);
33917 ranu 260
 
261
        List<RbmArrViewModel> rbmArrViewModels = new ArrayList<>();
262
 
34028 ranu 263
        if (!todayRbmTargetsList.isEmpty()) {
33917 ranu 264
 
35454 amit 265
            // OPTIMIZED: Pre-build maps for O(1) lookup instead of O(n) filter in each iteration
266
            // Map key: "authId-warehouseId"
267
            Map<String, Double> mtdAchievedMap = mtdAchievedTargetModels.stream()
268
                    .collect(Collectors.groupingBy(
269
                            x -> x.getAuthId() + "-" + x.getWarehouseId(),
270
                            Collectors.summingDouble(MTDAchievedTargetModel::getAcheivedMonthlyTarget)
271
                    ));
272
 
273
            Map<String, TodayAchievedMovementModel> todayAchievedMap = todayAchievedMovementModels.stream()
274
                    .collect(Collectors.toMap(
275
                            x -> x.getAuthId() + "-" + x.getWarehouseId(),
276
                            x -> x,
277
                            (a, b) -> a
278
                    ));
279
 
280
            Map<String, RbmTargets> todayRbmTargetsMap = todayRbmTargetsList.stream()
281
                    .collect(Collectors.toMap(
282
                            x -> x.getRbmAuthId() + "-" + x.getWarehouseId(),
283
                            x -> x,
284
                            (a, b) -> a
285
                    ));
286
 
34028 ranu 287
            for (WarehouseRbmTargetModel rbmTarget : warehouseRbmTargetModels) {
33917 ranu 288
 
35454 amit 289
                String lookupKey = rbmTarget.getAuthId() + "-" + rbmTarget.getWarehouseId();
290
 
34028 ranu 291
                float monthlyTarget = rbmTarget.getMonthlyTarget();
35454 amit 292
                float achievedSoFar = mtdAchievedMap.getOrDefault(lookupKey, 0.0).floatValue();
33917 ranu 293
 
34028 ranu 294
                float remainingTarget = monthlyTarget - achievedSoFar;
33953 ranu 295
 
34028 ranu 296
                float todayTarget = (remainingWorkingDaysCount > 0 && remainingTarget > 0) ? remainingTarget / remainingWorkingDaysCount : 0;
297
 
33926 ranu 298
                String warehouseName = ProfitMandiConstants.WAREHOUSE_MAP.getOrDefault(rbmTarget.getWarehouseId(), "Unknown");
33917 ranu 299
 
34288 ranu 300
                LOGGER.info("rbmTarget ==== {}", rbmTarget);
34281 ranu 301
 
35454 amit 302
                TodayAchievedMovementModel todayAchievedMovementModel = todayAchievedMap.get(lookupKey);
34283 ranu 303
 
35454 amit 304
                RbmTargets todayRbmTargets = todayRbmTargetsMap.get(lookupKey);
34285 ranu 305
 
35454 amit 306
                if (todayRbmTargets != null) {
34034 ranu 307
                    LOGGER.info("todayRbmTargets {}", todayRbmTargets);
308
                    RbmArrViewModel viewModel = new RbmArrViewModel();
33917 ranu 309
 
34034 ranu 310
                    viewModel.setAuthId(rbmTarget.getAuthId());
311
                    viewModel.setRbmName(rbmTarget.getRbmName());
312
                    viewModel.setWarehouseName(warehouseName);
313
                    viewModel.setTodayTarget(Math.round(todayTarget));
314
                    viewModel.setMonthlyTarget(Math.round(monthlyTarget));
315
                    viewModel.setMtdAchievedTarget(Math.round(achievedSoFar));
33926 ranu 316
 
34034 ranu 317
                    viewModel.setTodayHidTarget(Math.round((todayRbmTargets.getHidTarget())));
318
                    viewModel.setTodayFastMovingTarget(Math.round(todayRbmTargets.getFastMovingTarget()));
34098 ranu 319
                    viewModel.setTodaySlowMovingTarget(Math.round(todayRbmTargets.getSlowMovingtarget()));
320
                    viewModel.setTodayRunningTarget(Math.round(todayRbmTargets.getRunningtarget()));
34034 ranu 321
                    viewModel.setTodayOtherMovingTarget(Math.round(todayRbmTargets.getOtherTarget()));
33926 ranu 322
 
34283 ranu 323
                    if (todayAchievedMovementModel != null) {
324
                        viewModel.setTodayAchievedHidTarget(Math.round(todayAchievedMovementModel.getHidBilled()));
325
                        viewModel.setTodayAchievedFastMovingTarget(Math.round(todayAchievedMovementModel.getFastMovingBilled()));
326
                        viewModel.setTodayAchievedSlowMovingTarget(Math.round(todayAchievedMovementModel.getSlowMovinBilled()));
327
                        viewModel.setTodayAchievedRunningTarget(Math.round(todayAchievedMovementModel.getRunningBilled()));
328
                        viewModel.setTodayAchievedOtherMovingTarget(Math.round(todayAchievedMovementModel.getOtherBilled()));
329
                        viewModel.setTotalAchievedTarget(Math.round(todayAchievedMovementModel.getHidBilled() + todayAchievedMovementModel.getFastMovingBilled() + todayAchievedMovementModel.getSlowMovinBilled() + todayAchievedMovementModel.getRunningBilled() + todayAchievedMovementModel.getOtherBilled()));
330
                    } else {
331
                        viewModel.setTodayAchievedHidTarget(0);
332
                        viewModel.setTodayAchievedFastMovingTarget(0);
333
                        viewModel.setTodayAchievedSlowMovingTarget(0);
334
                        viewModel.setTodayAchievedRunningTarget(0);
335
                        viewModel.setTodayAchievedOtherMovingTarget(0);
336
                        viewModel.setTotalAchievedTarget(0);
337
                    }
34034 ranu 338
                    rbmArrViewModels.add(viewModel);
339
                } else {
340
                    LOGGER.info("No matching RbmTargets found for AuthId: {} and rbmname {} and WarehouseId: {}", rbmTarget.getAuthId(), rbmTarget.getRbmName(), rbmTarget.getWarehouseId());
341
                }
33917 ranu 342
 
34034 ranu 343
 
344
 
34028 ranu 345
            }
33917 ranu 346
        }
347
 
348
        LOGGER.info("rbmArrViewModels {}", rbmArrViewModels);
349
        return rbmArrViewModels;
350
    }
351
 
33926 ranu 352
    @Override
353
    public void setMovementWiseRbmTargets() {
354
        LocalDate todayDate = LocalDate.now();
33917 ranu 355
 
33926 ranu 356
        LocalDate startDateOfMonthDay1 = LocalDate.now().withDayOfMonth(1);
357
 
358
        List<WarehouseRbmTargetModel> warehouseRbmTargetModels = this.getWarehouseWiseRbmMonthlyTarget();
359
 
360
        List<MTDAchievedTargetModel> mtdAchievedTargetModels = getDateWiseAchievedTargetOfRbm(startDateOfMonthDay1, todayDate);
361
 
362
 
35044 ranu 363
        int remainingWorkingDaysCount = (int) getRemainingDaysInMonth(todayDate);
33926 ranu 364
 
365
        List<WarehouseMobileStockByMovementModel> warehouseMobileStockByMovementModels = getWarehouseMobileStockByMovement();
366
 
35454 amit 367
        // OPTIMIZED: Pre-build maps for O(1) lookup instead of O(n) filter in each iteration
368
        Map<String, Double> mtdAchievedMap = mtdAchievedTargetModels.stream()
369
                .collect(Collectors.groupingBy(
370
                        x -> x.getAuthId() + "-" + x.getWarehouseId(),
371
                        Collectors.summingDouble(MTDAchievedTargetModel::getAcheivedMonthlyTarget)
372
                ));
373
 
374
        Map<Integer, WarehouseMobileStockByMovementModel> warehouseStockMap = warehouseMobileStockByMovementModels.stream()
375
                .collect(Collectors.toMap(
376
                        WarehouseMobileStockByMovementModel::getWarehouseId,
377
                        x -> x,
378
                        (a, b) -> a
379
                ));
380
 
33926 ranu 381
        for (WarehouseRbmTargetModel rbmTarget : warehouseRbmTargetModels) {
382
 
35454 amit 383
            String lookupKey = rbmTarget.getAuthId() + "-" + rbmTarget.getWarehouseId();
384
 
33926 ranu 385
            float monthlyTarget = rbmTarget.getMonthlyTarget();
35454 amit 386
            float achievedSoFar = mtdAchievedMap.getOrDefault(lookupKey, 0.0).floatValue();
33926 ranu 387
 
388
 
389
            float remainingTarget = monthlyTarget - achievedSoFar;
33953 ranu 390
            LOGGER.info("remainingTarget {}", remainingTarget);
33926 ranu 391
 
33953 ranu 392
            float todayTarget = (remainingWorkingDaysCount > 0 && remainingTarget > 0) ? remainingTarget / remainingWorkingDaysCount : 0;
393
            LOGGER.info("todayTarget {}", todayTarget);
394
 
33926 ranu 395
            // Get the warehouse stock data
35454 amit 396
            WarehouseMobileStockByMovementModel warehouseMobileStockByMovementModel = warehouseStockMap.get(rbmTarget.getWarehouseId());
33926 ranu 397
 
398
 
399
            if (warehouseMobileStockByMovementModel != null) {
400
 
401
                // Total stock value for this warehouse
402
                float totalStockValue = warehouseMobileStockByMovementModel.getTotalAvailabilityPrice();
403
 
404
                // Calculate target allocation based on stock value proportion
405
                float hidTarget = (warehouseMobileStockByMovementModel.getTotalHidCatalogPrice() / totalStockValue) * todayTarget;
406
                float fastMovingTarget = (warehouseMobileStockByMovementModel.getTotalFastMovingCatalogPrice() / totalStockValue) * todayTarget;
407
                float slowMovingTarget = (warehouseMobileStockByMovementModel.getTotalSlowMovingCatalogPrice() / totalStockValue) * todayTarget;
34098 ranu 408
                float runningTarget = (warehouseMobileStockByMovementModel.getTotalRunningCatalogPrice() / totalStockValue) * todayTarget;
33926 ranu 409
                float otherTarget = (warehouseMobileStockByMovementModel.getTotalOtherCategoryCatalogPrice() / totalStockValue) * todayTarget;
410
 
411
                RbmTargets rbmTargets = new RbmTargets();
412
                rbmTargets.setWarehouseId(rbmTarget.getWarehouseId());
413
                rbmTargets.setRbmAuthId(rbmTarget.getAuthId());
414
                rbmTargets.setRbmName(rbmTarget.getRbmName());
34098 ranu 415
                rbmTargets.setRunningtarget(runningTarget);
33926 ranu 416
                rbmTargets.setHidTarget(hidTarget);
417
                rbmTargets.setFastMovingTarget(fastMovingTarget);
34098 ranu 418
                rbmTargets.setSlowMovingtarget(slowMovingTarget);
33926 ranu 419
                rbmTargets.setOtherTarget(otherTarget);
420
                rbmTargets.setCreateTimestamp(LocalDateTime.now());
421
 
422
                rbmTargetsRepository.persist(rbmTargets);
423
 
424
            }
425
        }
426
 
427
    }
428
 
429
 
33985 ranu 430
    @Override
431
    public void setMovementWiseRbmAchievement() {
432
        LocalDate todayDate = LocalDate.now();
433
 
34055 ranu 434
        List<TodayAchievedMovementModel> todayAchievedMovementModels = getMovementWiseAchievementByDate(todayDate, todayDate.plusDays(1));
33985 ranu 435
 
436
 
437
        for (TodayAchievedMovementModel achievement : todayAchievedMovementModels) {
438
 
439
            RbmAchievements rbmAchievements = new RbmAchievements();
440
 
441
            rbmAchievements.setRbmAuthId(achievement.getAuthId());
442
            rbmAchievements.setRbmName(achievement.getRbmName());
443
            rbmAchievements.setWarehouseId(achievement.getWarehouseId());
444
            rbmAchievements.setAchievedHidTarget(achievement.getHidBilled());
445
            rbmAchievements.setAchievedFastMovingTarget(achievement.getFastMovingBilled());
34098 ranu 446
            rbmAchievements.setAchievedSlowMovingTarget(achievement.getSlowMovinBilled());
447
            rbmAchievements.setAchievedRunningTarget(achievement.getRunningBilled());
34012 ranu 448
            rbmAchievements.setAchievedOtherTarget(achievement.getOtherBilled());
33985 ranu 449
            rbmAchievements.setCreateTimestamp(LocalDateTime.now());
450
 
451
            rbmAchievementsRepository.persist(rbmAchievements);
452
 
453
        }
454
 
455
    }
456
 
34055 ranu 457
    @Override
458
    public List<Sold15daysOldAgingModel> getAgingSale(LocalDate startDate, LocalDate endDate) {
459
        Session session = sessionFactory.getCurrentSession();
460
        final TypedQuery<Sold15daysOldAgingModel> typedQuerySimilar = session.createNamedQuery("Aging.SoldAgingModel", Sold15daysOldAgingModel.class);
34056 ranu 461
        typedQuerySimilar.setParameter("startDate", startDate);
462
        typedQuerySimilar.setParameter("endDate", endDate);
34055 ranu 463
        return typedQuerySimilar.getResultList();
33985 ranu 464
 
34055 ranu 465
    }
466
 
34103 ranu 467
    @Override
468
    public List<RbmBilledFofoIdsModel> getDateWiseBilledFofoIdByRbm(LocalDate startDate, LocalDate endDate) {
469
        Session session = sessionFactory.getCurrentSession();
470
        final TypedQuery<RbmBilledFofoIdsModel> typedQuerySimilar = session.createNamedQuery("RBM.RbmBilledFofoId", RbmBilledFofoIdsModel.class);
471
        typedQuerySimilar.setParameter("startDate", startDate);
472
        typedQuerySimilar.setParameter("endDate", endDate);
473
        return typedQuerySimilar.getResultList();
35453 amit 474
    }
34103 ranu 475
 
35453 amit 476
    @Override
477
    public List<RbmWeeklyBillingModel> getWeeklyBillingDataForMonth(LocalDate monthStart, LocalDate monthEnd) {
478
        Session session = sessionFactory.getCurrentSession();
479
        final TypedQuery<RbmWeeklyBillingModel> typedQuery = session.createNamedQuery("RBM.WeeklyBilling", RbmWeeklyBillingModel.class);
480
        typedQuery.setParameter("startDate", monthStart);
481
        typedQuery.setParameter("endDate", monthEnd);
482
        return typedQuery.getResultList();
34103 ranu 483
    }
484
 
34055 ranu 485
    public List<Our15DaysOldAgingStock> our15DaysAgingStock() {
486
        Session session = sessionFactory.getCurrentSession();
487
        final TypedQuery<Our15DaysOldAgingStock> typedQuerySimilar = session.createNamedQuery("Aging.15DaysOurStock", Our15DaysOldAgingStock.class);
488
        return typedQuerySimilar.getResultList();
489
 
490
    }
491
 
34397 ranu 492
    @Autowired
493
    OrderRepository orderRepository;
34055 ranu 494
 
34397 ranu 495
    @Override
34641 ranu 496
    public double calculateFofoIdTodayTarget(int fofoId, double secondryMtd,LocalDate date) {
34397 ranu 497
 
498
        MonthlyTarget monthlyTarget = monthlyTargetRepository.selectByDateAndFofoId(YearMonth.now(), fofoId);
34404 ranu 499
        if (monthlyTarget == null) {
500
            // Log or handle as needed
501
            return 0; // or -1 or some fallback
502
        }
34397 ranu 503
 
504
        double remainingTarget = monthlyTarget.getPurchaseTarget() - secondryMtd;
34880 ranu 505
//        double remainingWorkingDays = getWorkingDaysCount(date);
506
        double remainingWorkingDays = (double) getRemainingDaysInMonth(date);
34397 ranu 507
 
508
 
34716 ranu 509
 
34397 ranu 510
        if (remainingWorkingDays == 0) return remainingTarget; // Last day
34716 ranu 511
        LOGGER.info("remainingWorkingDays {}", remainingWorkingDays);
512
        LOGGER.info("remainingTarget {}", remainingTarget);
34397 ranu 513
 
514
        return (int) Math.ceil(remainingTarget / remainingWorkingDays);
515
    }
516
 
34880 ranu 517
    @Override
518
    public long getRemainingDaysInMonth(LocalDate date) {
519
        LocalDate lastDayOfMonth = YearMonth.from(date).atEndOfMonth();
34397 ranu 520
 
34880 ranu 521
        long totalDays = ChronoUnit.DAYS.between(date, lastDayOfMonth) + 1;
34397 ranu 522
 
34880 ranu 523
        // Count Sundays manually
524
        long sundayCount = 0;
525
        LocalDate current = date;
526
        while (!current.isAfter(lastDayOfMonth)) {
527
            if (current.getDayOfWeek() == DayOfWeek.SUNDAY) {
528
                sundayCount++;
529
            }
530
            current = current.plusDays(1);
531
        }
532
 
533
        // Public holidays in the range
534
        long publicHolidays = publicHolidaysRepository
535
                .selectAllBetweenDates(date, lastDayOfMonth)
536
                .size();
537
 
538
        long remainingDays = totalDays - sundayCount - publicHolidays;
539
 
540
        LOGGER.info("remainingDays {}", remainingDays);
541
        LOGGER.info("totalDays {}", totalDays);
542
        LOGGER.info("sundays {}", sundayCount);
543
        LOGGER.info("publicHolidays {}", publicHolidays);
544
 
545
        return remainingDays;
546
    }
547
 
548
 
549
 
33917 ranu 550
}