Subversion Repositories SmartDukaan

Rev

Rev 32868 | Rev 33119 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
27391 tejbeer 1
package com.spice.profitmandi.web.controller;
2
 
3
import com.google.gson.Gson;
29943 amit.gupta 4
import com.jcraft.jsch.*;
29900 amit.gupta 5
import com.spice.profitmandi.common.enumuration.MessageType;
27391 tejbeer 6
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
7
import com.spice.profitmandi.common.model.CustomRetailer;
27876 amit.gupta 8
import com.spice.profitmandi.common.model.ProfitMandiConstants;
29900 amit.gupta 9
import com.spice.profitmandi.common.model.SendNotificationModel;
27876 amit.gupta 10
import com.spice.profitmandi.common.util.FileUtil;
29904 amit.gupta 11
import com.spice.profitmandi.common.util.FormattingUtils;
27876 amit.gupta 12
import com.spice.profitmandi.common.web.util.ResponseSender;
27391 tejbeer 13
import com.spice.profitmandi.dao.entity.catalog.Offer;
14
import com.spice.profitmandi.dao.entity.fofo.PartnerType;
15
import com.spice.profitmandi.dao.enumuration.catalog.ItemCriteriaType;
30651 amit.gupta 16
import com.spice.profitmandi.dao.enumuration.catalog.OfferSchemeType;
27391 tejbeer 17
import com.spice.profitmandi.dao.model.CreateOfferRequest;
27876 amit.gupta 18
import com.spice.profitmandi.dao.model.OfferRowModel;
27391 tejbeer 19
import com.spice.profitmandi.dao.repository.catalog.ItemRepository;
20
import com.spice.profitmandi.dao.repository.catalog.OfferMarginRepository;
21
import com.spice.profitmandi.dao.repository.catalog.OfferPartnerRepository;
22
import com.spice.profitmandi.dao.repository.catalog.OfferRepository;
23
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
24
import com.spice.profitmandi.dao.repository.dtr.Mongo;
29926 amit.gupta 25
import com.spice.profitmandi.dao.repository.dtr.UserAccountRepository;
27391 tejbeer 26
import com.spice.profitmandi.dao.repository.fofo.PartnerTypeChangeService;
29900 amit.gupta 27
import com.spice.profitmandi.service.NotificationService;
29785 amit.gupta 28
import com.spice.profitmandi.service.authentication.RoleManager;
33043 amit.gupta 29
import com.spice.profitmandi.service.catalog.BrandsService;
27876 amit.gupta 30
import com.spice.profitmandi.service.offers.OfferService;
27391 tejbeer 31
import com.spice.profitmandi.service.user.RetailerService;
32855 amit.gupta 32
import com.spice.profitmandi.service.whatsapp.WhatsappMessageType;
27391 tejbeer 33
import com.spice.profitmandi.web.model.LoginDetails;
34
import com.spice.profitmandi.web.util.CookiesProcessor;
35
import com.spice.profitmandi.web.util.MVCResponseSender;
29943 amit.gupta 36
import org.apache.commons.io.FileUtils;
37
import org.apache.commons.io.output.ByteArrayOutputStream;
38
import org.apache.logging.log4j.LogManager;
39
import org.apache.logging.log4j.Logger;
40
import org.apache.velocity.app.VelocityEngine;
41
import org.springframework.beans.factory.annotation.Autowired;
32868 amit.gupta 42
import org.springframework.beans.factory.annotation.Value;
29943 amit.gupta 43
import org.springframework.cache.CacheManager;
44
import org.springframework.core.io.InputStreamResource;
45
import org.springframework.http.HttpHeaders;
46
import org.springframework.http.HttpStatus;
47
import org.springframework.http.ResponseEntity;
32204 amit.gupta 48
import org.springframework.mock.web.MockHttpServletRequest;
49
import org.springframework.mock.web.MockHttpServletResponse;
29943 amit.gupta 50
import org.springframework.stereotype.Controller;
51
import org.springframework.ui.Model;
52
import org.springframework.web.bind.annotation.*;
53
import org.springframework.web.multipart.MultipartFile;
32204 amit.gupta 54
import org.springframework.web.servlet.View;
55
import org.springframework.web.servlet.ViewResolver;
29943 amit.gupta 56
import org.xhtmlrenderer.swing.Java2DRenderer;
27391 tejbeer 57
 
29943 amit.gupta 58
import javax.imageio.ImageIO;
59
import javax.servlet.http.HttpServletRequest;
60
import javax.transaction.Transactional;
61
import java.awt.*;
62
import java.awt.image.BufferedImage;
63
import java.io.ByteArrayInputStream;
64
import java.io.File;
65
import java.io.FileNotFoundException;
66
import java.io.InputStream;
32868 amit.gupta 67
import java.time.*;
29943 amit.gupta 68
import java.util.List;
69
import java.util.*;
70
import java.util.stream.Collectors;
71
 
27391 tejbeer 72
@Controller
73
@Transactional(rollbackOn = Throwable.class)
74
public class OfferController {
32505 amit.gupta 75
    private static final Logger LOGGER = LogManager.getLogger(OfferController.class);
76
    private static final String IMAGE_REMOTE_DIR = "/var/www/dtrdashboard/uploads/campaigns/";
77
    private static final String IMAGE_STATIC_SERVER_URL = "https://images.smartdukaan.com/uploads/campaigns";
78
    @Autowired
79
    UserAccountRepository userAccountRepository;
80
    @Autowired
81
    RoleManager roleManager;
82
    @Autowired
83
    private OfferRepository offerRepository;
84
    @Autowired
85
    private OfferMarginRepository offerMarginRepository;
86
    @Autowired
87
    private FofoStoreRepository fofoStoreRepository;
88
    @Autowired
89
    private ResponseSender responseSender;
90
    @Autowired
91
    private ViewResolver viewResolver;
92
    @Autowired
93
    private OfferPartnerRepository offerPartnerRepository;
94
    @Autowired
95
    private ItemRepository itemRepository;
96
    @Autowired
97
    private MVCResponseSender mvcResponseSender;
98
    @Autowired
99
    private Gson gson;
100
    @Autowired
101
    private RetailerService retailerService;
102
    @Autowired
103
    private Mongo mongoClient;
104
    @Autowired
105
    private NotificationService notificationService;
106
    @Autowired
107
    private CookiesProcessor cookiesProcessor;
108
    @Autowired
109
    private OfferService offerService;
110
    @Autowired
111
    private CacheManager thirtyMinsTimeOutCacheManager;
112
    @Autowired
113
    private CacheManager oneDayCacheManager;
114
    @Autowired
115
    private PartnerTypeChangeService partnerTypeChangeService;
116
    @Autowired
117
    private com.spice.profitmandi.dao.repository.dtr.UserRepository dtrUserRepository;
118
    @Autowired
119
    private VelocityEngine velocityEngine;
27391 tejbeer 120
 
33043 amit.gupta 121
    @Autowired
122
    BrandsService brandsService;
123
 
32505 amit.gupta 124
    @RequestMapping(value = "/getCreateOffer", method = RequestMethod.GET)
125
    public String getCreateOffer(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
126
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
127
        List<Integer> fofoIds = fofoStoreRepository.selectActiveStores().stream().map(x -> x.getId())
128
                .collect(Collectors.toList());
27391 tejbeer 129
 
33043 amit.gupta 130
        Set<String> brands = brandsService.getBrands(loginDetails.getFofoId(), null, 3).stream().map(x->x.getName()).collect(Collectors.toSet());
32505 amit.gupta 131
        brands.addAll(itemRepository.selectAllBrands(ProfitMandiConstants.LED_CATEGORY_ID));
132
        //Lets allow demo
133
        brands.add("Live Demo");
27391 tejbeer 134
 
32505 amit.gupta 135
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
27876 amit.gupta 136
 
32505 amit.gupta 137
        Map<Integer, CustomRetailer> customRetailersMap = fofoIds.stream().map(x -> customRetailerMap.get(x))
138
                .filter(x -> x != null).collect(Collectors.toList()).stream()
139
                .collect(Collectors.toMap(x -> x.getPartnerId(), x -> x));
32204 amit.gupta 140
 
32505 amit.gupta 141
        model.addAttribute("customRetailersMap", customRetailersMap);
142
        model.addAttribute("itemCriteriaType", ItemCriteriaType.values());
143
        model.addAttribute("brands", brands);
144
        model.addAttribute("partnerCategories", PartnerType.values());
145
        model.addAttribute("warehouseRegion", ProfitMandiConstants.WAREHOUSE_MAP);
146
        return "scheme_offer";
27391 tejbeer 147
 
32505 amit.gupta 148
    }
29926 amit.gupta 149
 
32505 amit.gupta 150
    @RequestMapping(value = "/createOffer", method = RequestMethod.POST)
151
    public String createOffer(HttpServletRequest request, @RequestBody CreateOfferRequest createOfferRequest,
152
                              Model model) throws Exception {
153
        LOGGER.info("createOfferRequest [{}]", createOfferRequest);
154
        offerService.addOfferService(createOfferRequest);
32868 amit.gupta 155
        oneDayCacheManager.getCache("allOffers").evict(YearMonth.from(createOfferRequest.getStartDate()));
32505 amit.gupta 156
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
157
        return "response";
27391 tejbeer 158
 
32505 amit.gupta 159
    }
27391 tejbeer 160
 
32505 amit.gupta 161
    @RequestMapping(value = "/offers/published", method = RequestMethod.GET)
162
    public String getPublishedOffers(HttpServletRequest request, @RequestParam int fofoId, Model model)
163
            throws Exception {
164
        LOGGER.info("Published");
165
        offerService.getPublishedOffers(fofoId, YearMonth.from(LocalDateTime.now()));
166
        return "scheme_offer/published";
27391 tejbeer 167
 
32505 amit.gupta 168
    }
27391 tejbeer 169
 
32868 amit.gupta 170
    @Value("${prod}")
171
    private boolean isProd;
172
 
32505 amit.gupta 173
    @RequestMapping(value = "/offer/active/{offerId}", method = RequestMethod.GET)
174
    public String activateOffer(HttpServletRequest request, @PathVariable(name = "offerId") String offerIdsString,
175
                                Model model, @RequestParam(defaultValue = "true") boolean active)
176
            throws ProfitMandiBusinessException, Exception {
177
        List<Integer> offerIds = Arrays.stream(offerIdsString.split(",")).map(x -> Integer.parseInt(x))
178
                .collect(Collectors.toList());
179
        List<Offer> offers = offerRepository.selectAllByIds(offerIds);
32868 amit.gupta 180
 
181
        //Consider only offers that have opposite status
182
        offers = offers.stream().filter(x -> x.isActive() != active).collect(Collectors.toList());
183
 
184
        Set<YearMonth> yearMonthsToEvict = new HashSet<>();
32505 amit.gupta 185
        for (Offer offer : offers) {
32868 amit.gupta 186
            offer.setActive(active);
187
            yearMonthsToEvict.add(YearMonth.from(offer.getStartDate()));
32505 amit.gupta 188
        }
32868 amit.gupta 189
        //Evict caches
190
        for (YearMonth ymToEvict : yearMonthsToEvict) {
191
            oneDayCacheManager.getCache("catalog.published_yearmonth").evict(ymToEvict);
192
            oneDayCacheManager.getCache("allOffers").evict(ymToEvict);
32505 amit.gupta 193
        }
32868 amit.gupta 194
        if (active) {
195
            for (Offer offer : offers) {
32505 amit.gupta 196
                this.sendNotification(offer);
197
            }
198
        }
32868 amit.gupta 199
 
200
 
32505 amit.gupta 201
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
202
        return "response";
203
    }
27391 tejbeer 204
 
32505 amit.gupta 205
    @RequestMapping(value = "/offer/testimage/{offerId}", method = RequestMethod.GET)
206
    public String testOffer(HttpServletRequest request, @PathVariable int offerId, Model model,
207
                            @RequestParam(defaultValue = "true") boolean active) throws ProfitMandiBusinessException, Exception {
208
        Offer offer = offerRepository.selectById(offerId);
209
        // model.addAttribute("response1", mvcResponseSender.createResponseString(true));
210
        // return "response";
211
        CreateOfferRequest createOfferRequest = offerService.getCreateOfferRequest(offer);
212
        Map<String, Object> model1 = new HashMap<>();
213
        model1.put("offer", createOfferRequest);
214
        model1.put("lessThan", "<");
215
        String htmlContent = this.getContentFromTemplate("offer_margin_detail_notify", model1);
216
        model.addAttribute("response1", htmlContent);
217
        return "response";
218
    }
29900 amit.gupta 219
 
32505 amit.gupta 220
    private void sendNotification(Offer offer) throws Exception {
221
        if (!YearMonth.from(offer.getStartDate()).equals(YearMonth.now())) {
222
            return;
223
        }
224
        String fileName = "offer-" + offer.getId() + ".png";
32868 amit.gupta 225
        //String htmlFileName = fileName.replace("png", "html");
32505 amit.gupta 226
        CreateOfferRequest createOfferRequest = offerService.getCreateOfferRequest(offer);
227
        SendNotificationModel sendNotificationModel = new SendNotificationModel();
228
        sendNotificationModel.setCampaignName("SchemeOffer");
229
        sendNotificationModel.setTitle(offer.getName());
230
        sendNotificationModel.setMessage(createOfferRequest.getSchemeType().name() + " of select models, "
231
                + FormattingUtils.formatDateMonth(offer.getStartDate()) + " to "
232
                + FormattingUtils.formatDateMonth(offer.getEndDate()));
233
        sendNotificationModel.setType("url");
234
        String imageUrl = IMAGE_STATIC_SERVER_URL + "/" + "image" + LocalDate.now() + "/" + fileName;
235
        sendNotificationModel.setImageUrl(imageUrl);
236
        sendNotificationModel.setUrl("https://app.smartdukaan.com/pages/home/notifications");
237
        sendNotificationModel.setExpiresat(LocalDateTime.now().plusDays(1));
238
        sendNotificationModel.setMessageType(MessageType.scheme);
239
        Map<Integer, List<Offer>> offersMap = offerRepository.selectAllPublishedMapByPartner(YearMonth.now());
29900 amit.gupta 240
 
32505 amit.gupta 241
        Map<String, InputStream> fileStreamsMap = new HashMap<>();
242
        Map<String, Object> model = new HashMap<>();
243
        model.put("offer", createOfferRequest);
244
        String htmlContent = this.getContentFromTemplate("offer_margin_detail_notify", model);
245
        LOGGER.info("this.getContentFromTemplate {}", htmlContent);
246
        fileStreamsMap.put(fileName, this.getImageBuffer(htmlContent));
247
        // fileStreamsMap.put(htmlFileName, new
248
        // ByteArrayInputStream(htmlContent.getBytes()));
249
        List<Integer> fofoIds = null;
32868 amit.gupta 250
        if (isProd) {
251
            this.uploadFile(fileStreamsMap);
252
        }
29900 amit.gupta 253
 
33043 amit.gupta 254
        List<Integer> fofoIdSet = new ArrayList<>(offerRepository.getEligibleFofoIds(offer));
255
        LOGGER.info(fofoIdSet);
256
        List<Integer> userIds = userAccountRepository.selectUserIdsByRetailerIds(new ArrayList<>(fofoIdSet));
257
        sendNotificationModel.setUserIds(userIds);
258
        notificationService.sendNotification(sendNotificationModel);
259
        sendWhatsapp(offer, fofoIds, imageUrl);
260
 
32505 amit.gupta 261
    }
27876 amit.gupta 262
 
32505 amit.gupta 263
    private void sendWhatsapp(Offer offer, List<Integer> fofoIds, String imageUrl) throws Exception {
264
        if (fofoIds == null) {
265
            fofoIds = fofoStoreRepository.selectActiveStores().stream().map(x -> x.getId()).collect(Collectors.toList());
266
        }
267
        final List<Integer> finalFofoIds = fofoIds;
32532 amit.gupta 268
        //List<String> mobileNumbers = retailerService.getAllFofoRetailers().entrySet().stream().filter(x -> finalFofoIds.contains(x.getKey())).map(x -> x.getValue().getMobileNumber()).collect(Collectors.toList());
269
        List<String> mobileNumbers = new ArrayList<>();
270
        mobileNumbers.add("9911565032");
32505 amit.gupta 271
        String message = "%s\n" +
272
                "On %s of select models\n" +
273
                "From %s to %s\n" +
274
                "\n" +
275
                "Happy Selling\n" +
276
                "Team Smartdukaan";
32510 amit.gupta 277
        //TV's mobile
32505 amit.gupta 278
        for (String mobileNumber : mobileNumbers) {
32855 amit.gupta 279
            notificationService.sendWhatsappMediaMessage(String.format(message, offer.getName(),
280
                    offer.getSchemeType().toString(), FormattingUtils.formatDate(offer.getStartDate()),
281
                    FormattingUtils.formatDate(offer.getEndDate())), mobileNumber, imageUrl, "offer-" + offer.getId() + ".png", WhatsappMessageType.IMAGE);
32505 amit.gupta 282
        }
283
    }
27391 tejbeer 284
 
32505 amit.gupta 285
    private InputStream asInputStream(BufferedImage bi) throws Exception {
286
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
287
        ImageIO.write(bi, "png", baos);
288
        return new ByteArrayInputStream(baos.toByteArray());
27391 tejbeer 289
 
32505 amit.gupta 290
    }
27391 tejbeer 291
 
32505 amit.gupta 292
    private ChannelSftp setupJsch() throws JSchException {
293
        JSch jsch = new JSch();
294
        Session jschSession = jsch.getSession("root", "192.168.179.131");
295
        // Session jschSession = jsch.getSession("root", "173.255.254.24");
296
        LOGGER.info("getClass().getResource(\"id_rsa\") {}",
297
                getClass().getClassLoader().getResource("id_rsa").getPath());
298
        jsch.addIdentity(getClass().getClassLoader().getResource("id_rsa").getPath());
299
        // jschSession.setPassword("spic@2015static0");
300
        jschSession.setConfig("StrictHostKeyChecking", "no");
301
        jschSession.connect();
302
        return (ChannelSftp) jschSession.openChannel("sftp");
303
    }
30426 tejbeer 304
 
32505 amit.gupta 305
    private void fileUpload(ChannelSftp channelSftp, Map<String, InputStream> streamsFileMap, String destinationPath)
306
            throws SftpException, FileNotFoundException {
27391 tejbeer 307
 
32505 amit.gupta 308
        channelSftp.cd(destinationPath);
309
        String folderName = "image" + LocalDate.now();
27391 tejbeer 310
 
32505 amit.gupta 311
        channelSftp.cd(destinationPath);
312
        SftpATTRS attrs = null;
27391 tejbeer 313
 
32505 amit.gupta 314
        // check if the directory is already existing
315
        try {
316
            attrs = channelSftp.stat(folderName);
317
        } catch (Exception e) {
318
            System.out.println(destinationPath + "/" + folderName + " not found");
319
        }
27391 tejbeer 320
 
32505 amit.gupta 321
        // else create a directory
322
        if (attrs == null) {
323
            channelSftp.mkdir(folderName);
324
            channelSftp.chmod(0755, ".");
325
        }
326
        channelSftp.cd(folderName);
27391 tejbeer 327
 
32505 amit.gupta 328
        for (Map.Entry<String, InputStream> streamsFileEntry : streamsFileMap.entrySet()) {
329
            channelSftp.put(streamsFileEntry.getValue(), streamsFileEntry.getKey(), ChannelSftp.OVERWRITE);
330
        }
27391 tejbeer 331
 
32505 amit.gupta 332
    }
29926 amit.gupta 333
 
32505 amit.gupta 334
    private void uploadFile(Map<String, InputStream> fileStreamsMap) throws Exception {
335
        ChannelSftp channelSftp = setupJsch();
336
        channelSftp.connect();
337
        this.fileUpload(channelSftp, fileStreamsMap, IMAGE_REMOTE_DIR + "");
338
        channelSftp.exit();
339
    }
27391 tejbeer 340
 
32505 amit.gupta 341
    private InputStream getImageBuffer(String html) throws Exception {
29900 amit.gupta 342
 
32505 amit.gupta 343
        String fileName = "/tmp/" + Instant.now().toEpochMilli();
344
        FileUtils.writeStringToFile(new File(fileName), html, "UTF-8");
345
        String address = "file:" + fileName;
346
        Java2DRenderer renderer = new Java2DRenderer(address, 400);
347
        RenderingHints hints = new RenderingHints(RenderingHints.KEY_COLOR_RENDERING,
348
                RenderingHints.VALUE_COLOR_RENDER_QUALITY);
349
        hints.add(new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY));
350
        hints.add(new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON));
351
        hints.add(new RenderingHints(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC));
352
        renderer.setRenderingHints(hints);
353
        BufferedImage img = renderer.getImage();
354
        ByteArrayOutputStream os = new ByteArrayOutputStream();
355
        ImageIO.write(img, "png", os);
356
        return new ByteArrayInputStream(os.toByteArray());
357
    }
29926 amit.gupta 358
 
32505 amit.gupta 359
    private String getContentFromTemplate(String template, Map<String, Object> model) throws Exception {
360
        View resolvedView = viewResolver.resolveViewName(template, Locale.US);
361
        MockHttpServletResponse mockResp = new MockHttpServletResponse();
362
        MockHttpServletRequest req = new MockHttpServletRequest();
363
        LOGGER.info("Resolved view ->  {}, {}, {}, {}", resolvedView, model, req, mockResp);
364
        resolvedView.render(model, req, mockResp);
365
        return mockResp.getContentAsString();
366
    }
29926 amit.gupta 367
 
32505 amit.gupta 368
    @RequestMapping(value = "/offerHistory", method = RequestMethod.GET)
369
    public String getPaginatedOffers(HttpServletRequest request, @RequestParam YearMonth yearMonth, Model model)
370
            throws ProfitMandiBusinessException {
30017 amit.gupta 371
 
32505 amit.gupta 372
        List<CreateOfferRequest> publishedOffers = offerService.getAllOffers(yearMonth).values().stream()
373
                .sorted(Comparator.comparing(CreateOfferRequest::getId).reversed()).collect(Collectors.toList());
374
        model.addAttribute("offers", publishedOffers);
375
        model.addAttribute("yearMonth", yearMonth);
376
        model.addAttribute("currentMonth", yearMonth.equals(YearMonth.now()));
29926 amit.gupta 377
 
32505 amit.gupta 378
        return "offer_history";
379
    }
30723 amit.gupta 380
 
32505 amit.gupta 381
    @RequestMapping(value = "/offer-details", method = RequestMethod.GET)
382
    public String schemeDetails(HttpServletRequest request, @RequestParam int offerId, Model model)
383
            throws ProfitMandiBusinessException {
384
        CreateOfferRequest createOfferRequest = offerService.getOffer(0, offerId);
29900 amit.gupta 385
 
32505 amit.gupta 386
        model.addAttribute("offer", createOfferRequest);
387
        return "offer-details";
388
    }
29926 amit.gupta 389
 
32505 amit.gupta 390
    @RequestMapping(value = "/offer/process/{offerId}", method = RequestMethod.GET)
391
    public ResponseEntity<?> processOfferRequest(HttpServletRequest request, @PathVariable int offerId, Model model)
392
            throws Exception {
393
        CreateOfferRequest createOfferRequest = offerService.getOffer(0, offerId);
394
        if (!createOfferRequest.isActive()) {
395
            throw new ProfitMandiBusinessException("Offer not active", "Offer not active", "Offer not active");
396
        }
397
        if (createOfferRequest.getSchemeType().equals(OfferSchemeType.SELLIN)) {
398
            offerService.processSellin(createOfferRequest);
399
        } else if (createOfferRequest.getSchemeType().equals(OfferSchemeType.ACTIVATION)) {
400
            offerService.processActivationtOffer(createOfferRequest);
401
        }
402
        return responseSender.ok(true);
403
    }
29926 amit.gupta 404
 
32505 amit.gupta 405
    @RequestMapping(value = "/offerDownload", method = RequestMethod.GET)
406
    public ResponseEntity<?> dowloadOfferSummary(HttpServletRequest request, @RequestParam int offerId, Model model)
407
            throws Exception {
408
        List<List<?>> listOfRows = new ArrayList<>();
409
        final HttpHeaders headers = new HttpHeaders();
410
        headers.set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
411
        headers.set("Content-disposition", "inline; filename=offer-" + offerId + ".csv");
412
        CreateOfferRequest createOfferRequest = offerService.getOffer(0, offerId);
413
        Collection<OfferRowModel> offerRowModels = offerRepository.getOfferRows(createOfferRequest);
414
        ByteArrayOutputStream baos = null;
415
        if (createOfferRequest.getSchemeType().equals(OfferSchemeType.SELLIN)) {
416
            for (OfferRowModel offerRowModel : offerRowModels) {
417
                CustomRetailer customRetailer = retailerService.getFofoRetailer(offerRowModel.getFofoId());
418
                listOfRows.add(Arrays.asList(createOfferRequest.getId(), createOfferRequest.getName(),
419
                        createOfferRequest.getTargetType(), createOfferRequest.getSchemeType(),
420
                        createOfferRequest.getBrandShareTerms(), createOfferRequest.getSellinPercentage(),
421
                        "--", createOfferRequest.getItemCriteriaString(),
422
                        createOfferRequest.getStartDate(), createOfferRequest.getEndDate(),
423
                        createOfferRequest.getCreatedOn(), customRetailer.getPartnerId(), customRetailer.getBusinessName(),
424
                        customRetailer.getCode(), offerRowModel.getTotalBasePurchaseValue(), offerRowModel.getAchievedTarget(),
425
                        offerRowModel.getPayoutPurchaseValue(), offerRowModel.getPayout(), offerRowModel.getPayoutType(), offerRowModel.getFinalPayout(), String.join(", ", offerRowModel.getEligibleImeis())));
426
            }
427
            baos = FileUtil.getCSVByteStream(
428
                    Arrays.asList("Id", "Name", "Target Type", "Scheme Type", "Brand %", "Sellin %", "Partner Criteria",
429
                            "Item Criteria", "Start", "End", "Created", "Partner Id", "Partner Name", "Partner Code",
430
                            "Base Purchase", "Achieved Target", "Eligible Purchase", "Slab Amount", "Slab Amount Type", "Payout Value(Rs.)",
431
                            "Eligible IMEIs", "Billing Pending Imeis"
432
                    ), listOfRows);
433
        } else {
434
            for (OfferRowModel offerRowModel : offerRowModels) {
435
                CustomRetailer customRetailer = retailerService.getFofoRetailer(offerRowModel.getFofoId());
436
                listOfRows.add(Arrays.asList(createOfferRequest.getId(), createOfferRequest.getName(),
437
                        createOfferRequest.getTargetType(), createOfferRequest.getSchemeType(),
438
                        createOfferRequest.getBrandShareTerms(), createOfferRequest.getSellinPercentage(),
439
                        createOfferRequest.getPartnerCriteriaString(), createOfferRequest.getItemCriteriaString(),
440
                        createOfferRequest.getStartDate(), createOfferRequest.getEndDate(),
441
                        createOfferRequest.getCreatedOn(), customRetailer.getPartnerId(), customRetailer.getBusinessName(),
442
                        customRetailer.getCode(),
29900 amit.gupta 443
 
32505 amit.gupta 444
                        offerRowModel.getTotalSale(),
445
                        offerRowModel.getEligibleSale(),
446
                        offerRowModel.getPayoutTargetAchieved(),
447
                        offerRowModel.getPayoutValue(),
448
                        offerRowModel.getPayoutType(),
449
                        offerRowModel.getPayoutValueDp(), offerRowModel.getFinalPayout(),
450
                        String.join(", ", offerRowModel.getEligibleImeis()),
451
                        String.join(", ", offerRowModel.getBaseCriteria()))
452
                );
453
            }
454
            baos = FileUtil.getCSVByteStream(
455
                    Arrays.asList("Id", "Name", "Target Type", "Scheme Type", "Brand %", "Sellin %", "Partner Criteria",
456
                            "Item Criteria", "Start", "End", "Created", "Partner Id", "Partner Name", "Partner Code",
29900 amit.gupta 457
 
32505 amit.gupta 458
                            "Total Value",
459
                            "Eligible Value",
460
                            "Payout Target Achieved", "Payout Amount", "Payout Amount Type",
461
                            "Payout Value DP", "Amount to be credited", "Eligible Activated Imeis"
462
                    ), listOfRows);
463
        }
464
        final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
465
        final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
466
        return new ResponseEntity<>(inputStreamResource, headers, HttpStatus.OK);
467
    }
29900 amit.gupta 468
 
32505 amit.gupta 469
    @RequestMapping(value = "/offerById", method = RequestMethod.GET)
470
    public String offerById(HttpServletRequest request, int offerId, Model model) throws ProfitMandiBusinessException {
471
        Offer offer = offerRepository.selectById(offerId);
29900 amit.gupta 472
 
32505 amit.gupta 473
        model.addAttribute("offer", offer);
29900 amit.gupta 474
 
32505 amit.gupta 475
        return "offer-edit";
29900 amit.gupta 476
 
32505 amit.gupta 477
    }
29900 amit.gupta 478
 
32505 amit.gupta 479
    @RequestMapping(value = "/published-offers/{yearMonth}", method = RequestMethod.GET)
480
    public String publishedOffersOnMonthBefore(HttpServletRequest request, @PathVariable int yearMonth, Model model)
481
            throws ProfitMandiBusinessException {
482
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
483
        int fofoId = loginDetails.getFofoId();
484
        List<CreateOfferRequest> createOffers = offerService.getPublishedOffers(fofoId,
485
                YearMonth.from(LocalDate.now()).minusMonths(yearMonth));
29900 amit.gupta 486
 
32505 amit.gupta 487
        model.addAttribute("publishedOffers", createOffers);
29926 amit.gupta 488
 
32505 amit.gupta 489
        return "published-offers";
490
    }
29926 amit.gupta 491
 
32505 amit.gupta 492
    @PostMapping(value = "/offers/upload")
493
    public String uploadOffers(HttpServletRequest request, @RequestPart("file") MultipartFile targetFile, Model model)
494
            throws Exception {
495
        offerService.createOffers(targetFile.getInputStream());
496
        model.addAttribute("response1", true);
497
        return "response";
498
    }
29926 amit.gupta 499
 
32505 amit.gupta 500
    @RequestMapping(value = "/getOfferMargins", method = RequestMethod.GET)
501
    public String getOfferMargins(HttpServletRequest request,
502
                                  @RequestParam(name = "offerId", defaultValue = "0") int offerId, Model model) throws Exception {
503
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
504
        boolean isAdmin = roleManager.isAdmin(loginDetails.getRoleIds());
505
        CreateOfferRequest createOfferRequest = offerService.getOffer(isAdmin ? 0 : loginDetails.getFofoId(), offerId);
29900 amit.gupta 506
 
32505 amit.gupta 507
        model.addAttribute("offer", createOfferRequest);
29900 amit.gupta 508
 
32505 amit.gupta 509
        return "offer_margin_detail_partner";
30470 amit.gupta 510
 
32505 amit.gupta 511
    }
29900 amit.gupta 512
 
27895 amit.gupta 513
}