Subversion Repositories SmartDukaan

Rev

Rev 34870 | Rev 35044 | 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;
34880 ranu 7
import com.spice.profitmandi.dao.entity.logistics.PublicHolidays;
33917 ranu 8
import com.spice.profitmandi.dao.model.*;
33985 ranu 9
import com.spice.profitmandi.dao.repository.catalog.RbmAchievementsRepository;
33926 ranu 10
import com.spice.profitmandi.dao.repository.catalog.RbmTargetsRepository;
34397 ranu 11
import com.spice.profitmandi.dao.repository.fofo.MonthlyTargetRepository;
34880 ranu 12
import com.spice.profitmandi.dao.repository.logistics.PublicHolidaysRepository;
34397 ranu 13
import com.spice.profitmandi.dao.repository.transaction.OrderRepository;
33917 ranu 14
import org.apache.logging.log4j.LogManager;
15
import org.apache.logging.log4j.Logger;
16
import org.hibernate.Session;
17
import org.hibernate.SessionFactory;
18
import org.hibernate.query.NativeQuery;
19
import org.springframework.beans.factory.annotation.Autowired;
20
import org.springframework.stereotype.Component;
21
 
22
import javax.persistence.TypedQuery;
34880 ranu 23
import java.time.*;
24
import java.time.temporal.ChronoUnit;
33917 ranu 25
import java.util.ArrayList;
26
import java.util.List;
33997 ranu 27
import java.util.Map;
34034 ranu 28
import java.util.Optional;
33997 ranu 29
import java.util.stream.Collectors;
33917 ranu 30
 
31
@Component
32
public class RbmTargetServiceImpl implements RbmTargetService {
33
    private static final Logger LOGGER = LogManager.getLogger(RbmTargetServiceImpl.class);
34
 
35
    @Autowired
36
    SessionFactory sessionFactory;
37
 
33926 ranu 38
    @Autowired
39
    RbmTargetsRepository rbmTargetsRepository;
33917 ranu 40
 
33985 ranu 41
    @Autowired
42
    RbmAchievementsRepository rbmAchievementsRepository;
43
 
34397 ranu 44
    @Autowired
45
    MonthlyTargetRepository monthlyTargetRepository;
46
 
34880 ranu 47
    @Autowired
48
    PublicHolidaysRepository publicHolidaysRepository;
49
 
33917 ranu 50
    @Override
51
    public List<WarehouseRbmTargetModel> getWarehouseWiseRbmMonthlyTarget() {
52
        Session session = sessionFactory.getCurrentSession();
53
        final TypedQuery<WarehouseRbmTargetModel> typedQuerySimilar = session.createNamedQuery("RbmTarget.getWarehouseWiseMonthlyTarget", WarehouseRbmTargetModel.class);
54
 
55
        return typedQuerySimilar.getResultList();
56
 
57
    }
58
 
59
    @Override
60
    public List<MTDAchievedTargetModel> getDateWiseAchievedTargetOfRbm(LocalDate startDate, LocalDate endDate) {
61
        Session session = sessionFactory.getCurrentSession();
62
        final TypedQuery<MTDAchievedTargetModel> typedQuerySimilar = session.createNamedQuery("RbmTarget.getRbmAchievedMonthlyTarget", MTDAchievedTargetModel.class);
63
        typedQuerySimilar.setParameter("startDate", startDate);
64
        typedQuerySimilar.setParameter("endDate", endDate);
65
        return typedQuerySimilar.getResultList();
66
 
67
    }
68
 
69
    @Override
34055 ranu 70
    public List<TodayAchievedMovementModel> getMovementWiseAchievementByDate(LocalDate startDate, LocalDate endDate) {
33917 ranu 71
        LOGGER.info("start date {}, end date {}", startDate, endDate);
72
        Session session = sessionFactory.getCurrentSession();
34055 ranu 73
        final TypedQuery<TodayAchievedMovementModel> typedQuerySimilar = session.createNamedQuery("RBMTarget.TodayAchivementByMovement", TodayAchievedMovementModel.class);
33917 ranu 74
        typedQuerySimilar.setParameter("startDate", startDate);
75
        typedQuerySimilar.setParameter("endDate", endDate);
76
        return typedQuerySimilar.getResultList();
77
 
78
    }
79
 
80
    @Override
81
    public List<WarehouseMobileStockByMovementModel> getWarehouseMobileStockByMovement() {
82
        Session session = sessionFactory.getCurrentSession();
83
        final TypedQuery<WarehouseMobileStockByMovementModel> typedQuerySimilar = session.createNamedQuery("WarehouseStock.MovementWiseMobileStock", WarehouseMobileStockByMovementModel.class);
84
 
85
        return typedQuerySimilar.getResultList();
86
 
87
    }
88
 
33991 ranu 89
    @Override
90
    public List<SoldCatalogsReportModel> getCatalogSoldReport(LocalDate startDate, LocalDate endDate) {
91
        Session session = sessionFactory.getCurrentSession();
92
        final TypedQuery<SoldCatalogsReportModel> typedQuerySimilar = session.createNamedQuery("CatalogsReport.SoldCatalogsReport", SoldCatalogsReportModel.class);
93
        typedQuerySimilar.setParameter("startDate", startDate);
94
        typedQuerySimilar.setParameter("endDate", endDate);
95
        return typedQuerySimilar.getResultList();
33917 ranu 96
 
33991 ranu 97
    }
98
 
99
 
33917 ranu 100
    public int getWorkingDaysCount(LocalDate startDate) {
101
        Session session = sessionFactory.getCurrentSession();
102
 
103
        // Convert the LocalDate to a format MySQL can interpret
104
        String startDateString = startDate.toString();
105
 
106
        final NativeQuery<?> nativeQuery = session.createNativeQuery(
107
                "SELECT (DATEDIFF(LAST_DAY(:startDate), :startDate) + 1) " +
108
                        " - (FLOOR((DATEDIFF(LAST_DAY(:startDate), :startDate) + (WEEKDAY(:startDate) + 1)) / 7)) " +
109
                        " - (SELECT COUNT(*) " +
110
                        " FROM logistics.publicholidays " +
111
                        " WHERE date BETWEEN :startDate AND LAST_DAY(:startDate) " +
112
                        " AND WEEKDAY(date) != 6) AS working_days"
113
        );
114
 
115
        // Set the start date parameter for each placeholder
116
        nativeQuery.setParameter("startDate", startDateString);
117
 
118
        Object result = nativeQuery.getSingleResult();
119
        return result != null ? ((Number) result).intValue() : 0;
120
    }
121
 
122
 
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
 
255
        int remainingWorkingDaysCount = getWorkingDaysCount(todayDate);
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
 
34028 ranu 265
            for (WarehouseRbmTargetModel rbmTarget : warehouseRbmTargetModels) {
33917 ranu 266
 
34028 ranu 267
                float monthlyTarget = rbmTarget.getMonthlyTarget();
268
                float achievedSoFar = (float) mtdAchievedTargetModels.stream()
269
                        .filter(x -> x.getAuthId() == rbmTarget.getAuthId() && x.getWarehouseId() == rbmTarget.getWarehouseId())
270
                        .mapToDouble(MTDAchievedTargetModel::getAcheivedMonthlyTarget)
271
                        .sum();
33917 ranu 272
 
34028 ranu 273
                float remainingTarget = monthlyTarget - achievedSoFar;
33953 ranu 274
 
34028 ranu 275
                float todayTarget = (remainingWorkingDaysCount > 0 && remainingTarget > 0) ? remainingTarget / remainingWorkingDaysCount : 0;
276
 
33926 ranu 277
                String warehouseName = ProfitMandiConstants.WAREHOUSE_MAP.getOrDefault(rbmTarget.getWarehouseId(), "Unknown");
33917 ranu 278
 
34288 ranu 279
                LOGGER.info("rbmTarget ==== {}", rbmTarget);
34281 ranu 280
 
34285 ranu 281
                TodayAchievedMovementModel todayAchievedMovementModel = todayAchievedMovementModels.stream()
282
                        .filter(x -> x.getAuthId() == rbmTarget.getAuthId() && x.getWarehouseId() == rbmTarget.getWarehouseId())
283
                        .findFirst()
284
                        .orElse(null);
34283 ranu 285
 
34285 ranu 286
 
34034 ranu 287
                Optional<RbmTargets> optionalTodayRbmTargets = todayRbmTargetsList.stream()
288
                        .filter(x -> x.getRbmAuthId() == rbmTarget.getAuthId() && x.getWarehouseId() == rbmTarget.getWarehouseId())
289
                        .findFirst();
33917 ranu 290
 
34034 ranu 291
                if (optionalTodayRbmTargets.isPresent()) {
292
                    RbmTargets todayRbmTargets = optionalTodayRbmTargets.get();
293
                    LOGGER.info("todayRbmTargets {}", todayRbmTargets);
294
                    RbmArrViewModel viewModel = new RbmArrViewModel();
33917 ranu 295
 
34034 ranu 296
                    viewModel.setAuthId(rbmTarget.getAuthId());
297
                    viewModel.setRbmName(rbmTarget.getRbmName());
298
                    viewModel.setWarehouseName(warehouseName);
299
                    viewModel.setTodayTarget(Math.round(todayTarget));
300
                    viewModel.setMonthlyTarget(Math.round(monthlyTarget));
301
                    viewModel.setMtdAchievedTarget(Math.round(achievedSoFar));
33926 ranu 302
 
34034 ranu 303
                    viewModel.setTodayHidTarget(Math.round((todayRbmTargets.getHidTarget())));
304
                    viewModel.setTodayFastMovingTarget(Math.round(todayRbmTargets.getFastMovingTarget()));
34098 ranu 305
                    viewModel.setTodaySlowMovingTarget(Math.round(todayRbmTargets.getSlowMovingtarget()));
306
                    viewModel.setTodayRunningTarget(Math.round(todayRbmTargets.getRunningtarget()));
34034 ranu 307
                    viewModel.setTodayOtherMovingTarget(Math.round(todayRbmTargets.getOtherTarget()));
33926 ranu 308
 
34283 ranu 309
                    if (todayAchievedMovementModel != null) {
310
                        viewModel.setTodayAchievedHidTarget(Math.round(todayAchievedMovementModel.getHidBilled()));
311
                        viewModel.setTodayAchievedFastMovingTarget(Math.round(todayAchievedMovementModel.getFastMovingBilled()));
312
                        viewModel.setTodayAchievedSlowMovingTarget(Math.round(todayAchievedMovementModel.getSlowMovinBilled()));
313
                        viewModel.setTodayAchievedRunningTarget(Math.round(todayAchievedMovementModel.getRunningBilled()));
314
                        viewModel.setTodayAchievedOtherMovingTarget(Math.round(todayAchievedMovementModel.getOtherBilled()));
315
                        viewModel.setTotalAchievedTarget(Math.round(todayAchievedMovementModel.getHidBilled() + todayAchievedMovementModel.getFastMovingBilled() + todayAchievedMovementModel.getSlowMovinBilled() + todayAchievedMovementModel.getRunningBilled() + todayAchievedMovementModel.getOtherBilled()));
316
                    } else {
317
                        viewModel.setTodayAchievedHidTarget(0);
318
                        viewModel.setTodayAchievedFastMovingTarget(0);
319
                        viewModel.setTodayAchievedSlowMovingTarget(0);
320
                        viewModel.setTodayAchievedRunningTarget(0);
321
                        viewModel.setTodayAchievedOtherMovingTarget(0);
322
                        viewModel.setTotalAchievedTarget(0);
323
                    }
34034 ranu 324
                    rbmArrViewModels.add(viewModel);
325
                } else {
326
                    LOGGER.info("No matching RbmTargets found for AuthId: {} and rbmname {} and WarehouseId: {}", rbmTarget.getAuthId(), rbmTarget.getRbmName(), rbmTarget.getWarehouseId());
327
                }
33917 ranu 328
 
34034 ranu 329
 
330
 
34028 ranu 331
            }
33917 ranu 332
        }
333
 
334
        LOGGER.info("rbmArrViewModels {}", rbmArrViewModels);
335
        return rbmArrViewModels;
336
    }
337
 
33926 ranu 338
    @Override
339
    public void setMovementWiseRbmTargets() {
340
        LocalDate todayDate = LocalDate.now();
33917 ranu 341
 
33926 ranu 342
        LocalDate startDateOfMonthDay1 = LocalDate.now().withDayOfMonth(1);
343
 
344
        List<WarehouseRbmTargetModel> warehouseRbmTargetModels = this.getWarehouseWiseRbmMonthlyTarget();
345
 
346
        List<MTDAchievedTargetModel> mtdAchievedTargetModels = getDateWiseAchievedTargetOfRbm(startDateOfMonthDay1, todayDate);
347
 
348
 
349
        int remainingWorkingDaysCount = getWorkingDaysCount(todayDate);
350
 
351
        List<WarehouseMobileStockByMovementModel> warehouseMobileStockByMovementModels = getWarehouseMobileStockByMovement();
352
 
353
        for (WarehouseRbmTargetModel rbmTarget : warehouseRbmTargetModels) {
354
 
355
            float monthlyTarget = rbmTarget.getMonthlyTarget();
356
            float achievedSoFar = (float) mtdAchievedTargetModels.stream()
357
                    .filter(x -> x.getAuthId() == rbmTarget.getAuthId() && x.getWarehouseId() == rbmTarget.getWarehouseId())
358
                    .mapToDouble(MTDAchievedTargetModel::getAcheivedMonthlyTarget)
359
                    .sum();
360
 
361
 
362
            float remainingTarget = monthlyTarget - achievedSoFar;
33953 ranu 363
            LOGGER.info("remainingTarget {}", remainingTarget);
33926 ranu 364
 
33953 ranu 365
            float todayTarget = (remainingWorkingDaysCount > 0 && remainingTarget > 0) ? remainingTarget / remainingWorkingDaysCount : 0;
366
            LOGGER.info("todayTarget {}", todayTarget);
367
 
33926 ranu 368
            // Get the warehouse stock data
369
            WarehouseMobileStockByMovementModel warehouseMobileStockByMovementModel = warehouseMobileStockByMovementModels.stream()
370
                    .filter(x -> x.getWarehouseId() == rbmTarget.getWarehouseId()).findFirst().orElse(null);
371
 
372
 
373
            if (warehouseMobileStockByMovementModel != null) {
374
 
375
                // Total stock value for this warehouse
376
                float totalStockValue = warehouseMobileStockByMovementModel.getTotalAvailabilityPrice();
377
 
378
                // Calculate target allocation based on stock value proportion
379
                float hidTarget = (warehouseMobileStockByMovementModel.getTotalHidCatalogPrice() / totalStockValue) * todayTarget;
380
                float fastMovingTarget = (warehouseMobileStockByMovementModel.getTotalFastMovingCatalogPrice() / totalStockValue) * todayTarget;
381
                float slowMovingTarget = (warehouseMobileStockByMovementModel.getTotalSlowMovingCatalogPrice() / totalStockValue) * todayTarget;
34098 ranu 382
                float runningTarget = (warehouseMobileStockByMovementModel.getTotalRunningCatalogPrice() / totalStockValue) * todayTarget;
33926 ranu 383
                float otherTarget = (warehouseMobileStockByMovementModel.getTotalOtherCategoryCatalogPrice() / totalStockValue) * todayTarget;
384
 
385
                RbmTargets rbmTargets = new RbmTargets();
386
                rbmTargets.setWarehouseId(rbmTarget.getWarehouseId());
387
                rbmTargets.setRbmAuthId(rbmTarget.getAuthId());
388
                rbmTargets.setRbmName(rbmTarget.getRbmName());
34098 ranu 389
                rbmTargets.setRunningtarget(runningTarget);
33926 ranu 390
                rbmTargets.setHidTarget(hidTarget);
391
                rbmTargets.setFastMovingTarget(fastMovingTarget);
34098 ranu 392
                rbmTargets.setSlowMovingtarget(slowMovingTarget);
33926 ranu 393
                rbmTargets.setOtherTarget(otherTarget);
394
                rbmTargets.setCreateTimestamp(LocalDateTime.now());
395
 
396
                rbmTargetsRepository.persist(rbmTargets);
397
 
398
            }
399
        }
400
 
401
    }
402
 
403
 
33985 ranu 404
    @Override
405
    public void setMovementWiseRbmAchievement() {
406
        LocalDate todayDate = LocalDate.now();
407
 
34055 ranu 408
        List<TodayAchievedMovementModel> todayAchievedMovementModels = getMovementWiseAchievementByDate(todayDate, todayDate.plusDays(1));
33985 ranu 409
 
410
 
411
        for (TodayAchievedMovementModel achievement : todayAchievedMovementModels) {
412
 
413
            RbmAchievements rbmAchievements = new RbmAchievements();
414
 
415
            rbmAchievements.setRbmAuthId(achievement.getAuthId());
416
            rbmAchievements.setRbmName(achievement.getRbmName());
417
            rbmAchievements.setWarehouseId(achievement.getWarehouseId());
418
            rbmAchievements.setAchievedHidTarget(achievement.getHidBilled());
419
            rbmAchievements.setAchievedFastMovingTarget(achievement.getFastMovingBilled());
34098 ranu 420
            rbmAchievements.setAchievedSlowMovingTarget(achievement.getSlowMovinBilled());
421
            rbmAchievements.setAchievedRunningTarget(achievement.getRunningBilled());
34012 ranu 422
            rbmAchievements.setAchievedOtherTarget(achievement.getOtherBilled());
33985 ranu 423
            rbmAchievements.setCreateTimestamp(LocalDateTime.now());
424
 
425
            rbmAchievementsRepository.persist(rbmAchievements);
426
 
427
        }
428
 
429
    }
430
 
34055 ranu 431
    @Override
432
    public List<Sold15daysOldAgingModel> getAgingSale(LocalDate startDate, LocalDate endDate) {
433
        Session session = sessionFactory.getCurrentSession();
434
        final TypedQuery<Sold15daysOldAgingModel> typedQuerySimilar = session.createNamedQuery("Aging.SoldAgingModel", Sold15daysOldAgingModel.class);
34056 ranu 435
        typedQuerySimilar.setParameter("startDate", startDate);
436
        typedQuerySimilar.setParameter("endDate", endDate);
34055 ranu 437
        return typedQuerySimilar.getResultList();
33985 ranu 438
 
34055 ranu 439
    }
440
 
34103 ranu 441
    @Override
442
    public List<RbmBilledFofoIdsModel> getDateWiseBilledFofoIdByRbm(LocalDate startDate, LocalDate endDate) {
443
        Session session = sessionFactory.getCurrentSession();
444
        final TypedQuery<RbmBilledFofoIdsModel> typedQuerySimilar = session.createNamedQuery("RBM.RbmBilledFofoId", RbmBilledFofoIdsModel.class);
445
        typedQuerySimilar.setParameter("startDate", startDate);
446
        typedQuerySimilar.setParameter("endDate", endDate);
447
        return typedQuerySimilar.getResultList();
448
 
449
    }
450
 
34055 ranu 451
    public List<Our15DaysOldAgingStock> our15DaysAgingStock() {
452
        Session session = sessionFactory.getCurrentSession();
453
        final TypedQuery<Our15DaysOldAgingStock> typedQuerySimilar = session.createNamedQuery("Aging.15DaysOurStock", Our15DaysOldAgingStock.class);
454
        return typedQuerySimilar.getResultList();
455
 
456
    }
457
 
34397 ranu 458
    @Autowired
459
    OrderRepository orderRepository;
34055 ranu 460
 
34397 ranu 461
    @Override
34641 ranu 462
    public double calculateFofoIdTodayTarget(int fofoId, double secondryMtd,LocalDate date) {
34397 ranu 463
 
464
        MonthlyTarget monthlyTarget = monthlyTargetRepository.selectByDateAndFofoId(YearMonth.now(), fofoId);
34404 ranu 465
        if (monthlyTarget == null) {
466
            // Log or handle as needed
467
            return 0; // or -1 or some fallback
468
        }
34397 ranu 469
 
470
        double remainingTarget = monthlyTarget.getPurchaseTarget() - secondryMtd;
34880 ranu 471
//        double remainingWorkingDays = getWorkingDaysCount(date);
472
        double remainingWorkingDays = (double) getRemainingDaysInMonth(date);
34397 ranu 473
 
474
 
34716 ranu 475
 
34397 ranu 476
        if (remainingWorkingDays == 0) return remainingTarget; // Last day
34716 ranu 477
        LOGGER.info("remainingWorkingDays {}", remainingWorkingDays);
478
        LOGGER.info("remainingTarget {}", remainingTarget);
34397 ranu 479
 
480
        return (int) Math.ceil(remainingTarget / remainingWorkingDays);
481
    }
482
 
34880 ranu 483
    @Override
484
    public long getRemainingDaysInMonth(LocalDate date) {
485
        LocalDate lastDayOfMonth = YearMonth.from(date).atEndOfMonth();
34397 ranu 486
 
34880 ranu 487
        long totalDays = ChronoUnit.DAYS.between(date, lastDayOfMonth) + 1;
34397 ranu 488
 
34880 ranu 489
        // Count Sundays manually
490
        long sundayCount = 0;
491
        LocalDate current = date;
492
        while (!current.isAfter(lastDayOfMonth)) {
493
            if (current.getDayOfWeek() == DayOfWeek.SUNDAY) {
494
                sundayCount++;
495
            }
496
            current = current.plusDays(1);
497
        }
498
 
499
        // Public holidays in the range
500
        long publicHolidays = publicHolidaysRepository
501
                .selectAllBetweenDates(date, lastDayOfMonth)
502
                .size();
503
 
504
        long remainingDays = totalDays - sundayCount - publicHolidays;
505
 
506
        LOGGER.info("remainingDays {}", remainingDays);
507
        LOGGER.info("totalDays {}", totalDays);
508
        LOGGER.info("sundays {}", sundayCount);
509
        LOGGER.info("publicHolidays {}", publicHolidays);
510
 
511
        return remainingDays;
512
    }
513
 
514
 
515
 
33917 ranu 516
}