Subversion Repositories SmartDukaan

Rev

Rev 36936 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
34468 vikas.jang 1
package com.spice.profitmandi.dao.service;
2
 
34545 vikas.jang 3
import com.spice.profitmandi.common.enumuration.MessageType;
34568 vikas.jang 4
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
5
import com.spice.profitmandi.common.model.CustomRetailer;
34468 vikas.jang 6
import com.spice.profitmandi.common.model.ProfitMandiConstants;
34545 vikas.jang 7
import com.spice.profitmandi.common.model.SendNotificationModel;
34492 vikas.jang 8
import com.spice.profitmandi.common.util.StringUtils;
34468 vikas.jang 9
import com.spice.profitmandi.common.util.Utils;
10
import com.spice.profitmandi.dao.entity.auth.AuthUser;
11
import com.spice.profitmandi.dao.entity.catalog.Bid;
12
import com.spice.profitmandi.dao.entity.catalog.Liquidation;
34492 vikas.jang 13
import com.spice.profitmandi.dao.entity.user.User;
34468 vikas.jang 14
import com.spice.profitmandi.dao.enumuration.cs.EscalationType;
15
import com.spice.profitmandi.dao.repository.auth.AuthRepository;
16
import com.spice.profitmandi.dao.repository.catalog.BidRepository;
17
import com.spice.profitmandi.dao.repository.catalog.LiquidationRepository;
18
import com.spice.profitmandi.dao.repository.cs.CsService;
34545 vikas.jang 19
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
20
import com.spice.profitmandi.dao.repository.dtr.UserAccountRepository;
34492 vikas.jang 21
import com.spice.profitmandi.dao.repository.user.UserRepository;
34468 vikas.jang 22
import com.spice.profitmandi.service.AuthService;
35963 amit 23
import com.spice.profitmandi.service.mail.MailOutboxService;
34468 vikas.jang 24
import com.spice.profitmandi.service.NotificationService;
34568 vikas.jang 25
import com.spice.profitmandi.service.user.RetailerService;
34637 vikas.jang 26
import com.spice.profitmandi.service.wallet.WalletService;
34545 vikas.jang 27
import com.spice.profitmandi.service.whatsapp.WhatsappMessageType;
34637 vikas.jang 28
import in.shop2020.model.v1.order.WalletReferenceType;
34468 vikas.jang 29
import org.apache.logging.log4j.LogManager;
30
import org.apache.logging.log4j.Logger;
31
import org.springframework.beans.factory.annotation.Autowired;
32
import org.springframework.mail.javamail.JavaMailSender;
33
import org.springframework.stereotype.Component;
34
 
34545 vikas.jang 35
import java.time.LocalDateTime;
36
import java.util.Arrays;
37
import java.util.Collections;
34468 vikas.jang 38
import java.util.List;
34545 vikas.jang 39
import java.util.Map;
34468 vikas.jang 40
 
34545 vikas.jang 41
import static java.util.stream.Collectors.toList;
42
 
34468 vikas.jang 43
@Component
44
public class BidServiceImpl implements BidService {
45
    private static final Logger LOGGER = LogManager.getLogger(BidServiceImpl.class);
46
    @Autowired
47
    AuthRepository authRepository;
48
    @Autowired
49
    AuthService authService;
50
    @Autowired
36399 amit 51
    JavaMailSender gmailRelaySender;
34468 vikas.jang 52
    @Autowired
35963 amit 53
    MailOutboxService mailOutboxService;
54
    @Autowired
34468 vikas.jang 55
    UserRepository userRepository;
56
    @Autowired
57
    CsService csService;
58
    @Autowired
59
    BidRepository bidRepository;
60
    @Autowired
61
    LiquidationRepository liquidationRepository;
62
    @Autowired
63
    NotificationService notificationService;
34545 vikas.jang 64
    @Autowired
65
    private UserAccountRepository userAccountRepository;
66
    @Autowired
67
    private FofoStoreRepository fofoStoreRepository;
34568 vikas.jang 68
    @Autowired
69
    private RetailerService retailerService;
34637 vikas.jang 70
    @Autowired
71
    private WalletService walletService;
34468 vikas.jang 72
 
73
    @Override
34592 vikas.jang 74
    public ProfitMandiConstants.BID_ENUM sendMailToRBM(double netAmountInHand, double totalPayableAmount, int fofoId) throws Exception {
34468 vikas.jang 75
        User user = userRepository.selectById(fofoId);
76
        int rbmId = csService.getAuthUserId(ProfitMandiConstants.TICKET_CATEGORY_RBM, EscalationType.L1, fofoId);
77
        AuthUser authUser = authRepository.selectById(rbmId);
34575 vikas.jang 78
        String[] emailTo;
79
        String[] ccTo;
80
        if (authUser == null){
36936 vikas 81
            emailTo = new String[] { "sdtech@smartdukaan.com", "mohit.gulati@smartdukaan.com", "sourcing@smartdukaan.com" };
34575 vikas.jang 82
            ccTo = new String[]{};
83
        } else {
34637 vikas.jang 84
            emailTo = new String[] { user.getEmailId(), "sdtech@smartdukaan.com", "sourcing@smartdukaan.com" };
34575 vikas.jang 85
            ccTo = new String[]{authUser.getEmailId()};
86
        }
34468 vikas.jang 87
 
88
        String subject = "Dispatch On Hold(Bidding)";
89
        String message = String.format(
34575 vikas.jang 90
                "Dear %s,<br>"
91
                    + "This is to inform you that the material for %s, valued at Rs.%s, <br>"
92
                    + "is on hold until the payment against the stock is received. Kindly <br>"
93
                    + "top up your wallet with an amount of Rs.%s to proceed with the dispatch.",
94
                user.getName(), user.getName(), totalPayableAmount, (totalPayableAmount - netAmountInHand)
34468 vikas.jang 95
        );
96
 
35963 amit 97
        mailOutboxService.queueMail(emailTo, ccTo, subject, message, "BidServiceImpl.sendMailToRBM");
34592 vikas.jang 98
        return ProfitMandiConstants.BID_ENUM.PROCESSING;
34468 vikas.jang 99
    }
100
 
101
    @Override
102
    public void sendSummaryMailToUserAndManagers(int userId, List<Bid> bids, Liquidation liquidation) throws Exception {
34571 vikas.jang 103
        if (bids.size() > 0) {
104
            String content = this.generateContent(bids, liquidation, ProfitMandiConstants.BID_ENUM.CLOSED);
105
            AuthUser authUser = authRepository.selectById(userId);
34575 vikas.jang 106
            String[] emailTo = {authUser.getEmailId(), "sourcing@smartdukaan.com", "sdtech@smartdukaan.com"};
34468 vikas.jang 107
 
34571 vikas.jang 108
            String[] ccTo = authService.getAllManagers(userId).stream().map(AuthUser::getEmailId).toArray(String[]::new);
109
            String subject = "Liquidation Report";
34586 vikas.jang 110
            String message = "Dear Team,<br><br>"
111
                    + "Liquidation has been completed. Here is the summary:<br><br>"
34571 vikas.jang 112
                    + content;
34468 vikas.jang 113
 
35963 amit 114
            mailOutboxService.queueMail(emailTo, ccTo, subject, message, "BidServiceImpl.sendSummaryMailToUserAndManagers");
34571 vikas.jang 115
        }
34468 vikas.jang 116
    }
117
 
118
    @Override
34545 vikas.jang 119
    public void notifyPartner(int fofoId, Bid bid, ProfitMandiConstants.BID_ENUM status) throws Exception {
120
        User user = userRepository.selectById(fofoId);
34576 vikas.jang 121
        LOGGER.info("user: {}",user);
34492 vikas.jang 122
        List<Bid> topBid = bidRepository.selectBidByLiquidationId(bid.getLiquidationId());
123
        String message = this.generateWhatsAppBidMessage(user.getName(), bid, topBid.get(0).getBiddingAmount(), status);
34576 vikas.jang 124
        LOGGER.info("sendPushNotification: {}",topBid.get(0));
34545 vikas.jang 125
        this.sendPushNotification(message, "Bid Update!", Arrays.asList(fofoId));
126
        //String mobile = user.getMobileNumber();
127
        //notificationService.sendWhatsappMessage(message, "Bid Update!", mobile);
34468 vikas.jang 128
    }
129
 
34545 vikas.jang 130
    @Override
37409 vikas 131
    public void biddingLiveNotification(String message, List<String> lots, String mediaURL) throws Exception {
34545 vikas.jang 132
        this.sendPushNotification(message, "Bidding Live Now!", Collections.emptyList());
133
        //List<String> mobiles = Arrays.asList("7619985051","8529003611","7082253510","7903840919","9667014826");
37409 vikas 134
        // The push keeps the formatted text; WhatsApp gets one line per lot, which is all its template
135
        // slots can hold. A null mediaURL now fails loudly rather than silently downgrading to text —
136
        // the approved template has an image header, so there is nothing to downgrade to.
137
        notificationService.sendBiddingLive("8529003611", lots, mediaURL);
34545 vikas.jang 138
    }
139
 
140
    @Override
141
    public void sendPushNotification(String message, String title, List<Integer> fofoIds) throws Exception {
34576 vikas.jang 142
        LOGGER.info("fofoIds stating: {}",fofoIds);
34545 vikas.jang 143
        SendNotificationModel sendNotificationModel = new SendNotificationModel();
144
        sendNotificationModel.setCampaignName(title);
145
        sendNotificationModel.setMessage(message);
146
        sendNotificationModel.setType("url");
147
        sendNotificationModel.setTitle(title);
34902 vikas 148
        sendNotificationModel.setUrl("https://smartdukaan.com/pages/home/clearance");
34545 vikas.jang 149
        sendNotificationModel.setExpiresat(LocalDateTime.now().plusHours(6));
150
        sendNotificationModel.setMessageType(MessageType.notification);
151
        List<Integer> userIds;
152
        if (fofoIds.size() > 0) {
153
            userIds = userAccountRepository.selectUserIdsByRetailerIds(fofoIds); //Arrays.asList(171912487)
154
        } else {
155
            fofoIds = fofoStoreRepository.selectActiveStores().stream().map(x->x.getId()).collect(toList());
156
            userIds = userAccountRepository.selectUserIdsByRetailerIds(fofoIds);
157
        }
34576 vikas.jang 158
        LOGGER.info("fofoIds: {}",fofoIds);
34545 vikas.jang 159
 
160
        sendNotificationModel.setUserIds(userIds);
161
        notificationService.sendNotification(sendNotificationModel);
34550 vikas.jang 162
        notificationService.sendNotificationToSystemUsers(sendNotificationModel);
34545 vikas.jang 163
    }
164
 
34568 vikas.jang 165
    private String generateContent(List<Bid> bids, Liquidation liquidation, ProfitMandiConstants.BID_ENUM status) throws ProfitMandiBusinessException {
166
        Map<Integer, CustomRetailer> retailers = retailerService.getAllFofoRetailers();
34468 vikas.jang 167
        StringBuilder sb = new StringBuilder();
168
        sb.append("<h4>Bidding Summary</h3>");
169
        sb.append("<p><strong>Liquidation ID:</strong> ").append(liquidation.getId()).append("</p>");
170
        sb.append("<p><strong>Catalog ID:</strong> ").append(liquidation.getCatalogId()).append("</p>");
171
        sb.append("<p><strong>Total Quantity Available:</strong> ").append(liquidation.getQuantity()).append("</p>");
172
        sb.append("<p><strong>End Date:</strong> ").append(liquidation.getEndDate()).append("</p>");
173
 
174
        sb.append("<table border='1' cellpadding='5' cellspacing='0' style='border-collapse: collapse;'>");
175
        sb.append("<thead>");
176
        sb.append("<tr>")
34568 vikas.jang 177
                .append("<th>Bidder</th>")
34468 vikas.jang 178
                .append("<th>Item Name</th>")
179
                .append("<th>Bid Amount</th>")
180
                .append("<th>Quantity</th>")
181
                .append("<th>Status</th>")
182
                .append("<th>Bid Time</th>")
183
                .append("</tr>");
184
        sb.append("</thead>");
185
        sb.append("<tbody>");
186
 
187
        for (Bid bid : bids) {
188
            sb.append("<tr>")
34568 vikas.jang 189
                    .append("<td>").append(retailers.get(bid.getFofoId()).getDisplayName()).append("</td>")
34468 vikas.jang 190
                    .append("<td>").append(bid.getItemName() != null ? bid.getItemName() : "-").append("</td>")
191
                    .append("<td>").append(bid.getBiddingAmount()).append("</td>")
192
                    .append("<td>").append(bid.getQuantity()).append("</td>")
193
                    .append("<td>").append(bid.getStatus().name()).append("</td>")
194
                    .append("<td>").append(bid.getCreatedAt()).append("</td>")
195
                    .append("</tr>");
196
        }
197
 
198
        sb.append("</tbody>");
199
        sb.append("</table>");
200
 
201
        return sb.toString();
202
    }
203
 
34592 vikas.jang 204
    public ProfitMandiConstants.BID_ENUM cancelYesterdayProcessBid(Bid bid) throws Exception {
34576 vikas.jang 205
        LOGGER.info("Cancelling the bid of: {}",bid);
34468 vikas.jang 206
        bid.setStatus(ProfitMandiConstants.BID_ENUM.CANCELLED);
207
        Liquidation liquidation = liquidationRepository.selectLiquidationById(bid.getLiquidationId());
208
        List<Bid> bids = bidRepository.selectBidByLiquidationId(bid.getLiquidationId());
209
        this.sendSummaryMailToUserAndManagers(liquidation.getCreatedBy(), bids, liquidation);
34492 vikas.jang 210
        this.notifyPartner(bid.getFofoId(), bid, ProfitMandiConstants.BID_ENUM.CANCELLED);
34592 vikas.jang 211
        return bid.getStatus();
34468 vikas.jang 212
    }
213
 
34492 vikas.jang 214
    private String generateWhatsAppBidMessage(String fofoName, Bid bidData, double topBidAmount, ProfitMandiConstants.BID_ENUM status) {
215
        String bidTime = StringUtils.toLocalDateTime(String.valueOf(bidData.getCreatedAt()));
216
        String bidAmount = String.format("%.2f", bidData.getBiddingAmount());
34468 vikas.jang 217
 
34492 vikas.jang 218
        String message = "";
34468 vikas.jang 219
 
34492 vikas.jang 220
        if (status.equals(ProfitMandiConstants.BID_ENUM.CLOSED)) {
34545 vikas.jang 221
            message = "Congratulations! %s,\n"+
34492 vikas.jang 222
                    "\n"+
34545 vikas.jang 223
                    "Your bid for %s has been confirmed!\n"+
34492 vikas.jang 224
                    "\n"+
34545 vikas.jang 225
                    "Bid Details:\n"+
226
                    "Bid Amount: Rs. %s\n"+
227
                    "Quantity: %s\n"+
228
                    "Bid Time: %s\n"+
34492 vikas.jang 229
                    "\n"+
230
                    "Thank you for participating. We'll dispatch your order soon.";
231
            message = String.format(message, fofoName, bidData.getItemName(), bidAmount, bidData.getQuantity(), bidTime);
34468 vikas.jang 232
        }
34492 vikas.jang 233
        else if (status.equals(ProfitMandiConstants.BID_ENUM.CANCELLED)) {
34545 vikas.jang 234
            message = "Hi %s,\n"+
34492 vikas.jang 235
                    "\n"+
34545 vikas.jang 236
                    "We regret to inform you that your bid for %s was not selected this time.\n"+
34492 vikas.jang 237
                    "\n"+
34545 vikas.jang 238
                    "Bid Details:\n"+
239
                    "Bid Amount: Rs. %s\n"+
240
                    "Quantity: %s\n"+
241
                    "Bid Time: %s\n"+
34492 vikas.jang 242
                    "\n"+
34576 vikas.jang 243
                    "Qualified Bid Amount: Rs. %s\n"+
34492 vikas.jang 244
                    "Thank you for your participation. Stay tuned for more opportunities!";
245
            message = String.format(message, fofoName, bidData.getItemName(), bidAmount, bidData.getQuantity(), bidTime, String.format("%.2f", topBidAmount));
246
        }
247
        else if (status.equals(ProfitMandiConstants.BID_ENUM.PENDING)) {
34545 vikas.jang 248
            message = "Hi %s,\n"+
34492 vikas.jang 249
                    "\n"+
34545 vikas.jang 250
                    "Your bid for %s has been placed successfully.\n"+
34492 vikas.jang 251
                    "\n"+
34545 vikas.jang 252
                    "Bid Details:\n"+
253
                    "Bid Amount: Rs. %s\n"+
254
                    "Quantity: %s\n"+
255
                    "Time: %s\n"+
34492 vikas.jang 256
                    "\n"+
34545 vikas.jang 257
                    "We will keep you updated. You will be notified once the bidding period ends.";
258
            message = String.format(message, fofoName.trim(), bidData.getItemName().trim(), bidAmount, bidData.getQuantity(), bidTime);
34492 vikas.jang 259
        }
260
        else if (status.equals(ProfitMandiConstants.BID_ENUM.UPDATE)) {
34545 vikas.jang 261
            message = "Hi %s,\n"+
262
                    "A higher bid has been placed for %s. Don't miss your chance!\n"+
34492 vikas.jang 263
                    "\n"+
34545 vikas.jang 264
                    "Your Bid Details:\n"+
265
                    "Bid Amount: Rs. %s\n"+
266
                    "Quantity: %s\n"+
267
                    "Bid Time: %s\n"+
34492 vikas.jang 268
                    "\n"+
34545 vikas.jang 269
                    "Another user has placed a higher bid of %s.\n"+
34492 vikas.jang 270
                    "Update your bid before the bidding ends to stay ahead in the race!";
271
            message = String.format(message, fofoName, bidData.getItemName(), bidAmount, bidData.getQuantity(), bidTime, String.format("%.2f", topBidAmount));
272
        }
34468 vikas.jang 273
 
34492 vikas.jang 274
        return message;
34468 vikas.jang 275
    }
34492 vikas.jang 276
 
34586 vikas.jang 277
    public void sendLiquidationReport(List<Map<String, Object>> liquidations) throws Exception {
278
        Map<Integer, CustomRetailer> retailers = retailerService.getAllFofoRetailers();
279
        StringBuilder sb = new StringBuilder();
280
        sb.append("<h4>Bidding Summary</h3>");
281
        sb.append("<table border='1' cellpadding='5' cellspacing='0' style='border-collapse: collapse;'>");
282
        sb.append("<thead>");
283
        for (Map<String, Object> liquidation : liquidations) {
284
            sb.append("<tr style='background-color: red; color: white;'>")
285
                    .append("<th>Liquidation ID</th>")
286
                    .append("<th>Item Name</th>")
287
                    .append("<th>Bidding Price</th>")
288
                    .append("<th>Stock Qty</th>")
289
                    .append("<th>End Time</th>")
290
                    .append("</tr>");
291
            sb.append("<tr>")
292
                    .append("<td>").append(liquidation.get("id")).append("</td>")
293
                    .append("<td>").append(liquidation.get("catalog")).append("</td>")
294
                    .append("<td>").append(liquidation.get("basePrice")).append("</td>")
295
                    .append("<td>").append(liquidation.get("openingStock")).append("/").append(liquidation.get("closingStock")).append("</td>")
296
                    .append("<td>").append(liquidation.get("endDate")).append("</td>")
297
                    .append("</tr>");
298
            sb.append("<tr style='background-color: black; color: white;'>")
299
                    .append("<th>Bidder</th>")
300
                    .append("<th>Bid Amount</th>")
301
                    .append("<th>Quantity</th>")
302
                    .append("<th>Status</th>")
303
                    .append("<th>Bid Time</th>")
304
                    .append("</tr>");
305
            sb.append("</thead>");
306
            sb.append("<tbody>");
307
 
308
            @SuppressWarnings("unchecked")
309
            List<Bid> bids = (List<Bid>) liquidation.get("bids");
310
            if (bids.size() > 0) {
311
                for (Bid bid : bids) {
312
                    sb.append("<tr>")
313
                            .append("<td>").append(retailers.get(bid.getFofoId()).getDisplayName()).append("</td>")
314
                            .append("<td>").append(bid.getBiddingAmount()).append("</td>")
315
                            .append("<td>").append(bid.getQuantity()).append("</td>")
316
                            .append("<td>").append(bid.getStatus().name()).append("</td>")
317
                            .append("<td>").append(StringUtils.toLocalDateTime(String.valueOf(bid.getCreatedAt()))).append("</td>")
318
                            .append("</tr>");
319
                }
320
            } else {
321
                sb.append("<tr>").append("<td colspan='5' style='text-align: center;'>No Bids</td>");
322
            }
323
 
324
            sb.append("</tbody>");
325
        }
326
        sb.append("</table>");
327
 
328
        String[] emailTo = {"sdtech@smartdukaan.com", "sourcing@smartdukaan.com", "tarun.verma@smartdukaan.com"};
329
 
330
        String subject = "Liquidation Report";
331
        String message = "Dear Team,<br><br>"
332
                + "<h3>Liquidation has been completed. Here is the summary:</h3><br><br>"
333
                + sb.toString();
334
 
35963 amit 335
        mailOutboxService.queueMail(emailTo, null, subject, message, "BidServiceImpl.sendLiquidationReport");
34586 vikas.jang 336
    }
337
 
34637 vikas.jang 338
    public void refundBidAmountToWallet(Bid bid, ProfitMandiConstants.BID_ENUM finalBidStatus) throws ProfitMandiBusinessException {
339
        if (finalBidStatus.equals(ProfitMandiConstants.BID_ENUM.CLOSED) || finalBidStatus.equals(ProfitMandiConstants.BID_ENUM.CANCELLED)){
340
            String reason = "Amount refunded advance security for "+bid.getItemName()+" bid";
341
            walletService.addAmountToWallet(bid.getFofoId(),bid.getId(), WalletReferenceType.ADVANCE_REVERSAL,reason,ProfitMandiConstants.BID_CHARGES,LocalDateTime.now());
342
        }
343
    }
344
 
34468 vikas.jang 345
}