Subversion Repositories SmartDukaan

Rev

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