Subversion Repositories SmartDukaan

Rev

Rev 33985 | Rev 33997 | 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;
23
 
24
@Component
25
public class RbmTargetServiceImpl implements RbmTargetService {
26
    private static final Logger LOGGER = LogManager.getLogger(RbmTargetServiceImpl.class);
27
 
28
    @Autowired
29
    SessionFactory sessionFactory;
30
 
33926 ranu 31
    @Autowired
32
    RbmTargetsRepository rbmTargetsRepository;
33917 ranu 33
 
33985 ranu 34
    @Autowired
35
    RbmAchievementsRepository rbmAchievementsRepository;
36
 
33917 ranu 37
    @Override
38
    public List<WarehouseRbmTargetModel> getWarehouseWiseRbmMonthlyTarget() {
39
        Session session = sessionFactory.getCurrentSession();
40
        final TypedQuery<WarehouseRbmTargetModel> typedQuerySimilar = session.createNamedQuery("RbmTarget.getWarehouseWiseMonthlyTarget", WarehouseRbmTargetModel.class);
41
 
42
        return typedQuerySimilar.getResultList();
43
 
44
    }
45
 
46
    @Override
47
    public List<MTDAchievedTargetModel> getDateWiseAchievedTargetOfRbm(LocalDate startDate, LocalDate endDate) {
48
        Session session = sessionFactory.getCurrentSession();
49
        final TypedQuery<MTDAchievedTargetModel> typedQuerySimilar = session.createNamedQuery("RbmTarget.getRbmAchievedMonthlyTarget", MTDAchievedTargetModel.class);
50
        typedQuerySimilar.setParameter("startDate", startDate);
51
        typedQuerySimilar.setParameter("endDate", endDate);
52
        return typedQuerySimilar.getResultList();
53
 
54
    }
55
 
56
    @Override
57
    public List<TodayAchievedMovementModel> getTodayTargetByMovement(LocalDate startDate, LocalDate endDate) {
58
        LOGGER.info("start date {}, end date {}", startDate, endDate);
59
        Session session = sessionFactory.getCurrentSession();
60
        final TypedQuery<TodayAchievedMovementModel> typedQuerySimilar = session.createNamedQuery("RBMTarget.TodayTargetByMovement", TodayAchievedMovementModel.class);
61
        typedQuerySimilar.setParameter("startDate", startDate);
62
        typedQuerySimilar.setParameter("endDate", endDate);
63
        return typedQuerySimilar.getResultList();
64
 
65
    }
66
 
67
    @Override
68
    public List<WarehouseMobileStockByMovementModel> getWarehouseMobileStockByMovement() {
69
        Session session = sessionFactory.getCurrentSession();
70
        final TypedQuery<WarehouseMobileStockByMovementModel> typedQuerySimilar = session.createNamedQuery("WarehouseStock.MovementWiseMobileStock", WarehouseMobileStockByMovementModel.class);
71
 
72
        return typedQuerySimilar.getResultList();
73
 
74
    }
75
 
33991 ranu 76
    @Override
77
    public List<SoldCatalogsReportModel> getCatalogSoldReport(LocalDate startDate, LocalDate endDate) {
78
        Session session = sessionFactory.getCurrentSession();
79
        final TypedQuery<SoldCatalogsReportModel> typedQuerySimilar = session.createNamedQuery("CatalogsReport.SoldCatalogsReport", SoldCatalogsReportModel.class);
80
        typedQuerySimilar.setParameter("startDate", startDate);
81
        typedQuerySimilar.setParameter("endDate", endDate);
82
        return typedQuerySimilar.getResultList();
33917 ranu 83
 
33991 ranu 84
    }
85
 
86
 
33917 ranu 87
    public int getWorkingDaysCount(LocalDate startDate) {
88
        Session session = sessionFactory.getCurrentSession();
89
 
90
        // Convert the LocalDate to a format MySQL can interpret
91
        String startDateString = startDate.toString();
92
 
93
        final NativeQuery<?> nativeQuery = session.createNativeQuery(
94
                "SELECT (DATEDIFF(LAST_DAY(:startDate), :startDate) + 1) " +
95
                        " - (FLOOR((DATEDIFF(LAST_DAY(:startDate), :startDate) + (WEEKDAY(:startDate) + 1)) / 7)) " +
96
                        " - (CASE WHEN WEEKDAY(:startDate) = 6 THEN 1 ELSE 0 END) " +
97
                        " - (SELECT COUNT(*) " +
98
                        " FROM logistics.publicholidays " +
99
                        " WHERE date BETWEEN :startDate AND LAST_DAY(:startDate) " +
100
                        " AND WEEKDAY(date) != 6) AS working_days"
101
        );
102
 
103
        // Set the start date parameter for each placeholder
104
        nativeQuery.setParameter("startDate", startDateString);
105
 
106
        Object result = nativeQuery.getSingleResult();
107
        return result != null ? ((Number) result).intValue() : 0;
108
    }
109
 
110
 
111
    @Override
112
    public List<RbmArrViewModel> getRbmTodayArr() throws Exception {
113
        LocalDate todayDate = LocalDate.now();
114
        return getRbmTodayArr(todayDate);
115
    }
116
 
117
    @Override
118
    public List<RbmArrViewModel> getRbmTodayArr(LocalDate todayDate) throws Exception {
119
 
120
        LocalDate startDateOfMonthDay1 = LocalDate.now().withDayOfMonth(1);
121
 
122
        List<WarehouseRbmTargetModel> warehouseRbmTargetModels = this.getWarehouseWiseRbmMonthlyTarget();
123
 
33955 ranu 124
        List<TodayAchievedMovementModel> todayAchievedMovementModels = getTodayTargetByMovement(todayDate, todayDate.plusDays(1));
33917 ranu 125
 
126
        List<MTDAchievedTargetModel> mtdAchievedTargetModels = getDateWiseAchievedTargetOfRbm(startDateOfMonthDay1, todayDate);
127
 
128
        int remainingWorkingDaysCount = getWorkingDaysCount(todayDate);
129
 
33926 ranu 130
        List<RbmTargets> todayRbmTargetsList = rbmTargetsRepository.selectTargetsByDates(todayDate.atStartOfDay(), todayDate.atTime(LocalTime.MAX));
33917 ranu 131
 
33926 ranu 132
        LOGGER.info("todayRbmTargetsList {}", todayRbmTargetsList);
33917 ranu 133
 
134
        List<RbmArrViewModel> rbmArrViewModels = new ArrayList<>();
135
 
136
        for (WarehouseRbmTargetModel rbmTarget : warehouseRbmTargetModels) {
137
 
138
            float monthlyTarget = rbmTarget.getMonthlyTarget();
139
            float achievedSoFar = (float) mtdAchievedTargetModels.stream()
140
                    .filter(x -> x.getAuthId() == rbmTarget.getAuthId() && x.getWarehouseId() == rbmTarget.getWarehouseId())
141
                    .mapToDouble(MTDAchievedTargetModel::getAcheivedMonthlyTarget)
142
                    .sum();
143
 
144
            float remainingTarget = monthlyTarget - achievedSoFar;
145
 
33953 ranu 146
            float todayTarget = (remainingWorkingDaysCount > 0 && remainingTarget > 0) ? remainingTarget / remainingWorkingDaysCount : 0;
147
 
33926 ranu 148
                String warehouseName = ProfitMandiConstants.WAREHOUSE_MAP.getOrDefault(rbmTarget.getWarehouseId(), "Unknown");
33917 ranu 149
 
33926 ranu 150
                TodayAchievedMovementModel todayAchievedMovementModel = todayAchievedMovementModels.stream().filter(x -> x.getAuthId() == rbmTarget.getAuthId() && x.getWarehouseId() == rbmTarget.getWarehouseId()).findFirst().get();
33917 ranu 151
 
33926 ranu 152
            RbmTargets todayRbmTargets = todayRbmTargetsList.stream().filter(x -> x.getRbmAuthId() == rbmTarget.getAuthId() && x.getWarehouseId() == rbmTarget.getWarehouseId()).findFirst().get();
153
            LOGGER.info("todayRbmTargets {}", todayRbmTargets);
33917 ranu 154
 
155
                RbmArrViewModel viewModel = new RbmArrViewModel();
156
 
157
                viewModel.setAuthId(rbmTarget.getAuthId());
158
                viewModel.setRbmName(rbmTarget.getRbmName());
159
                viewModel.setWarehouseName(warehouseName);
160
                viewModel.setTodayTarget(Math.round(todayTarget));
161
                viewModel.setMonthlyTarget(Math.round(monthlyTarget));
162
                viewModel.setMtdAchievedTarget(Math.round(achievedSoFar));
33926 ranu 163
 
164
            viewModel.setTodayHidTarget(Math.round((todayRbmTargets.getHidTarget())));
165
            viewModel.setTodayFastMovingTarget(Math.round(todayRbmTargets.getFastMovingTarget()));
166
            viewModel.setTodaySlowMovingTarget(Math.round(todayRbmTargets.getSlowMovingTarget()));
167
            viewModel.setTodayEolTarget(Math.round(todayRbmTargets.getEolTarget()));
168
            viewModel.setTodayOtherMovingTarget(Math.round(todayRbmTargets.getOtherTarget()));
169
 
33917 ranu 170
                viewModel.setTodayAchievedHidTarget(Math.round(todayAchievedMovementModel.getHidBilled()));
171
                viewModel.setTodayAchievedFastMovingTarget(Math.round(todayAchievedMovementModel.getFastMovingBilled()));
172
                viewModel.setTodayAchievedSlowMovingTarget(Math.round(todayAchievedMovementModel.getSlowMovingBilled()));
173
                viewModel.setTodayAchievedEolTarget(Math.round(todayAchievedMovementModel.getEolBilled()));
174
                viewModel.setTodayAchievedOtherMovingTarget(Math.round(todayAchievedMovementModel.getOtherBilled()));
175
                viewModel.setTotalAchievedTarget(Math.round(todayAchievedMovementModel.getHidBilled() + todayAchievedMovementModel.getFastMovingBilled() + todayAchievedMovementModel.getSlowMovingBilled() + todayAchievedMovementModel.getEolBilled() + todayAchievedMovementModel.getOtherBilled()));
176
 
177
                rbmArrViewModels.add(viewModel);
178
 
179
        }
180
 
181
        LOGGER.info("rbmArrViewModels {}", rbmArrViewModels);
182
        return rbmArrViewModels;
183
    }
184
 
33926 ranu 185
    @Override
186
    public void setMovementWiseRbmTargets() {
187
        LocalDate todayDate = LocalDate.now();
33917 ranu 188
 
33926 ranu 189
        LocalDate startDateOfMonthDay1 = LocalDate.now().withDayOfMonth(1);
190
 
191
        List<WarehouseRbmTargetModel> warehouseRbmTargetModels = this.getWarehouseWiseRbmMonthlyTarget();
192
 
193
        List<MTDAchievedTargetModel> mtdAchievedTargetModels = getDateWiseAchievedTargetOfRbm(startDateOfMonthDay1, todayDate);
194
 
195
 
196
        int remainingWorkingDaysCount = getWorkingDaysCount(todayDate);
197
 
198
        List<WarehouseMobileStockByMovementModel> warehouseMobileStockByMovementModels = getWarehouseMobileStockByMovement();
199
 
200
        for (WarehouseRbmTargetModel rbmTarget : warehouseRbmTargetModels) {
201
 
202
            float monthlyTarget = rbmTarget.getMonthlyTarget();
203
            float achievedSoFar = (float) mtdAchievedTargetModels.stream()
204
                    .filter(x -> x.getAuthId() == rbmTarget.getAuthId() && x.getWarehouseId() == rbmTarget.getWarehouseId())
205
                    .mapToDouble(MTDAchievedTargetModel::getAcheivedMonthlyTarget)
206
                    .sum();
207
 
208
 
209
            float remainingTarget = monthlyTarget - achievedSoFar;
33953 ranu 210
            LOGGER.info("remainingTarget {}", remainingTarget);
33926 ranu 211
 
33953 ranu 212
            float todayTarget = (remainingWorkingDaysCount > 0 && remainingTarget > 0) ? remainingTarget / remainingWorkingDaysCount : 0;
213
            LOGGER.info("todayTarget {}", todayTarget);
214
 
33926 ranu 215
            // Get the warehouse stock data
216
            WarehouseMobileStockByMovementModel warehouseMobileStockByMovementModel = warehouseMobileStockByMovementModels.stream()
217
                    .filter(x -> x.getWarehouseId() == rbmTarget.getWarehouseId()).findFirst().orElse(null);
218
 
219
 
220
            if (warehouseMobileStockByMovementModel != null) {
221
 
222
                // Total stock value for this warehouse
223
                float totalStockValue = warehouseMobileStockByMovementModel.getTotalAvailabilityPrice();
224
 
225
                // Calculate target allocation based on stock value proportion
226
                float hidTarget = (warehouseMobileStockByMovementModel.getTotalHidCatalogPrice() / totalStockValue) * todayTarget;
227
                float fastMovingTarget = (warehouseMobileStockByMovementModel.getTotalFastMovingCatalogPrice() / totalStockValue) * todayTarget;
228
                float slowMovingTarget = (warehouseMobileStockByMovementModel.getTotalSlowMovingCatalogPrice() / totalStockValue) * todayTarget;
229
                float eolTarget = (warehouseMobileStockByMovementModel.getTotalEolCatalogPrice() / totalStockValue) * todayTarget;
230
                float otherTarget = (warehouseMobileStockByMovementModel.getTotalOtherCategoryCatalogPrice() / totalStockValue) * todayTarget;
231
 
232
                RbmTargets rbmTargets = new RbmTargets();
233
                rbmTargets.setWarehouseId(rbmTarget.getWarehouseId());
234
                rbmTargets.setRbmAuthId(rbmTarget.getAuthId());
235
                rbmTargets.setRbmName(rbmTarget.getRbmName());
236
                rbmTargets.setEolTarget(eolTarget);
237
                rbmTargets.setHidTarget(hidTarget);
238
                rbmTargets.setFastMovingTarget(fastMovingTarget);
239
                rbmTargets.setSlowMovingTarget(slowMovingTarget);
240
                rbmTargets.setOtherTarget(otherTarget);
241
                rbmTargets.setCreateTimestamp(LocalDateTime.now());
242
 
243
                rbmTargetsRepository.persist(rbmTargets);
244
 
245
            }
246
        }
247
 
248
    }
249
 
250
 
33985 ranu 251
    @Override
252
    public void setMovementWiseRbmAchievement() {
253
        LocalDate todayDate = LocalDate.now();
254
 
255
        List<TodayAchievedMovementModel> todayAchievedMovementModels = getTodayTargetByMovement(todayDate, todayDate.plusDays(1));
256
 
257
 
258
        for (TodayAchievedMovementModel achievement : todayAchievedMovementModels) {
259
 
260
            RbmAchievements rbmAchievements = new RbmAchievements();
261
 
262
            rbmAchievements.setRbmAuthId(achievement.getAuthId());
263
            rbmAchievements.setRbmName(achievement.getRbmName());
264
            rbmAchievements.setWarehouseId(achievement.getWarehouseId());
265
            rbmAchievements.setAchievedHidTarget(achievement.getHidBilled());
266
            rbmAchievements.setAchievedFastMovingTarget(achievement.getFastMovingBilled());
267
            rbmAchievements.setAchievedSlowMovingTarget(achievement.getSlowMovingBilled());
268
            rbmAchievements.setAchievedEolTarget(achievement.getEolBilled());
269
            rbmAchievements.setCreateTimestamp(LocalDateTime.now());
270
 
271
            rbmAchievementsRepository.persist(rbmAchievements);
272
 
273
        }
274
 
275
    }
276
 
277
 
33917 ranu 278
}