Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
22860 ashik.ali 1
package com.spice.profitmandi.web.controller;
2
 
31147 tejbeer 3
import com.google.gson.Gson;
33795 ranu 4
import com.spice.profitmandi.common.enumuration.OfferType;
29585 manish 5
import com.spice.profitmandi.common.enumuration.ReporticoProject;
22860 ashik.ali 6
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
31352 amit.gupta 7
import com.spice.profitmandi.common.model.*;
29585 manish 8
import com.spice.profitmandi.common.services.ReporticoService;
30326 amit.gupta 9
import com.spice.profitmandi.common.util.ExcelUtils;
10
import com.spice.profitmandi.common.util.FileUtil;
11
import com.spice.profitmandi.common.util.FormattingUtils;
23784 ashik.ali 12
import com.spice.profitmandi.common.web.util.ResponseSender;
31170 amit.gupta 13
import com.spice.profitmandi.dao.entity.catalog.*;
14
import com.spice.profitmandi.dao.entity.cs.Region;
15
import com.spice.profitmandi.dao.entity.fofo.*;
28795 tejbeer 16
import com.spice.profitmandi.dao.entity.transaction.PriceDrop;
17
import com.spice.profitmandi.dao.entity.transaction.PriceDropIMEI;
27389 amit.gupta 18
import com.spice.profitmandi.dao.enumuration.catalog.AmountType;
28491 amit.gupta 19
import com.spice.profitmandi.dao.enumuration.catalog.SchemeType;
29707 tejbeer 20
import com.spice.profitmandi.dao.enumuration.catalog.UpgradeOfferStatus;
29899 tejbeer 21
import com.spice.profitmandi.dao.enumuration.cs.EscalationType;
29585 manish 22
import com.spice.profitmandi.dao.enumuration.transaction.SchemePayoutStatus;
31170 amit.gupta 23
import com.spice.profitmandi.dao.model.*;
24
import com.spice.profitmandi.dao.repository.catalog.*;
29899 tejbeer 25
import com.spice.profitmandi.dao.repository.cs.CsService;
31170 amit.gupta 26
import com.spice.profitmandi.dao.repository.cs.RegionRepository;
26588 tejbeer 27
import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;
28
import com.spice.profitmandi.dao.repository.dtr.Mongo;
31170 amit.gupta 29
import com.spice.profitmandi.dao.repository.fofo.*;
28795 tejbeer 30
import com.spice.profitmandi.dao.repository.transaction.PriceDropIMEIRepository;
31
import com.spice.profitmandi.dao.repository.transaction.PriceDropRepository;
30768 amit.gupta 32
import com.spice.profitmandi.dao.repository.transaction.TransactionRepository;
23798 amit.gupta 33
import com.spice.profitmandi.service.authentication.RoleManager;
23020 ashik.ali 34
import com.spice.profitmandi.service.inventory.InventoryService;
27876 amit.gupta 35
import com.spice.profitmandi.service.offers.OfferService;
31147 tejbeer 36
import com.spice.profitmandi.service.offers.PartnerCriteria;
32331 amit.gupta 37
import com.spice.profitmandi.service.pricecircular.PriceCircularModel;
32232 amit.gupta 38
import com.spice.profitmandi.service.pricecircular.PriceCircularService;
22860 ashik.ali 39
import com.spice.profitmandi.service.scheme.SchemeService;
26588 tejbeer 40
import com.spice.profitmandi.service.user.RetailerService;
29585 manish 41
import com.spice.profitmandi.service.wallet.WalletService;
22860 ashik.ali 42
import com.spice.profitmandi.web.model.LoginDetails;
43
import com.spice.profitmandi.web.util.CookiesProcessor;
23570 amit.gupta 44
import com.spice.profitmandi.web.util.MVCResponseSender;
29585 manish 45
import in.shop2020.model.v1.order.WalletReferenceType;
31170 amit.gupta 46
import org.apache.commons.csv.CSVRecord;
47
import org.apache.commons.lang.StringUtils;
48
import org.apache.logging.log4j.LogManager;
49
import org.apache.logging.log4j.Logger;
50
import org.springframework.beans.factory.annotation.Autowired;
51
import org.springframework.beans.factory.annotation.Qualifier;
52
import org.springframework.core.io.InputStreamResource;
53
import org.springframework.http.HttpHeaders;
54
import org.springframework.http.HttpStatus;
55
import org.springframework.http.ResponseEntity;
56
import org.springframework.stereotype.Controller;
57
import org.springframework.ui.Model;
58
import org.springframework.web.bind.annotation.*;
59
import org.springframework.web.multipart.MultipartFile;
29585 manish 60
 
31170 amit.gupta 61
import javax.servlet.http.HttpServletRequest;
62
import javax.servlet.http.HttpServletResponse;
63
import javax.transaction.Transactional;
64
import java.io.ByteArrayInputStream;
65
import java.io.ByteArrayOutputStream;
66
import java.io.InputStream;
67
import java.time.*;
68
import java.time.format.DateTimeFormatter;
69
import java.util.*;
70
import java.util.stream.Collectors;
71
 
22860 ashik.ali 72
@Controller
25369 amit.gupta 73
@Transactional(rollbackOn = Throwable.class)
22860 ashik.ali 74
public class SchemeController {
31352 amit.gupta 75
    // LED TV
76
    private static final List<Integer> categoryIds = Arrays.asList(ProfitMandiConstants.MOBILE_CATEGORY_ID,
77
            ProfitMandiConstants.TABLET_CATEGORY_ID, 14202);
22860 ashik.ali 78
 
34317 amit.gupta 79
    private static List<SchemeType> EXCLUDE_EXTEND_SCHEMES = Arrays.asList(SchemeType.SELLOUT, SchemeType.SPECIAL_SUPPORT, SchemeType.SELLIN);
31387 amit.gupta 80
 
31352 amit.gupta 81
    private static final Logger LOGGER = LogManager.getLogger(SchemeController.class);
82
    @Autowired
83
    WalletService walletService;
84
    @Autowired
85
    PartnerDailyInvestmentRepository partnerDailyInvestmentRepository;
86
    @Autowired
87
    InventoryItemRepository inventoryItemRepository;
88
    @Autowired
89
    PriceDropIMEIRepository priceDropIMEIRepository;
90
    @Autowired
91
    PriceDropRepository priceDropRepository;
92
    @Autowired
93
    SchemeInOutRepository schemeInOutRepository;
34211 vikas.jang 94
    List<String> adminEmail = Arrays.asList("tarun.verma@smartdukaan.com", "neeraj.gupta@smartdukaan.com", "amit.gupta@smartdukaan.com", "vikas.jangra@smartdukaan.com", "deena.nath@smartdukaan.com");
31352 amit.gupta 95
    @Autowired
96
    SchemeRegionRepository schemeRegionRepository;
97
    @Autowired
98
    RegionRepository regionRepository;
99
    @Autowired
100
    TransactionRepository transactionRepository;
101
    @Autowired
102
    private SchemeService schemeService;
103
    @Autowired
104
    private OfferService offerService;
105
    @Autowired
106
    private StateGstRateRepository stateGstRateRepository;
107
    @Autowired
108
    private ItemRepository itemRepository;
109
    @Autowired
110
    private ReporticoService reporticoService;
111
    @Autowired
112
    private SchemeRepository schemeRepository;
113
    @Autowired
114
    private SchemeItemRepository schemeItemRepository;
115
    @Autowired
116
    private MVCResponseSender mvcResponseSender;
117
    @Autowired
118
    private CookiesProcessor cookiesProcessor;
119
    @Autowired
120
    @Qualifier("fofoInventoryService")
121
    private InventoryService inventoryService;
122
    @Autowired
123
    private TagListingRepository tagListingRepository;
124
    @Autowired
125
    private RoleManager roleManager;
126
    @Autowired
127
    private ResponseSender<?> responseSender;
128
    @Autowired
129
    private FofoStoreRepository fofoStoreRepository;
130
    @Autowired
131
    private OfferPayoutRepository offerPayoutRepository;
132
    @Autowired
133
    private RetailerService retailerService;
134
    @Autowired
135
    private Mongo mongoClient;
136
    @Autowired
137
    private PartnerTypeChangeService partnerTypeChangeService;
138
    @Autowired
139
    private CustomerOfferRepository customerOfferRepository;
140
    @Autowired
141
    private CustomerOfferItemRepository customerOfferItemRepository;
142
    @Autowired
143
    private SamsungUpgradeOfferRepository samsungUpgradeOfferRepository;
144
    @Autowired
145
    private CsService csService;
146
    @Autowired
147
    private CategoryRepository categoryRepository;
32232 amit.gupta 148
 
31352 amit.gupta 149
    @Autowired
32232 amit.gupta 150
    PriceCircularService priceCircularService;
33030 amit.gupta 151
    @Autowired
32299 jai.hind 152
    private FofoOrderRepository fofoOrderRepository;
33030 amit.gupta 153
    @Autowired
32299 jai.hind 154
    private PurchaseRepository purchaseRepository;
32232 amit.gupta 155
 
156
 
157
    @Autowired
31352 amit.gupta 158
    private Gson gson;
22860 ashik.ali 159
 
31352 amit.gupta 160
    private boolean getAccess(String emailId) {
27897 amit.gupta 161
 
31352 amit.gupta 162
        boolean fullAccesss = false;
163
        List<String> emails = csService
164
                .getAuthUserByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_CATEGORY, EscalationType.L3).stream()
165
                .map(x -> x.getEmailId()).collect(Collectors.toList());
23786 amit.gupta 166
 
31352 amit.gupta 167
        emails.addAll(
168
                csService.getAuthUserByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_CATEGORY, EscalationType.L2)
169
                        .stream().map(x -> x.getEmailId()).collect(Collectors.toList()));
27612 tejbeer 170
 
31352 amit.gupta 171
        if (adminEmail.contains(emailId)) {
172
            fullAccesss = true;
173
        }
29608 amit.gupta 174
 
31352 amit.gupta 175
        if (emails.contains(emailId)) {
176
            fullAccesss = false;
177
        }
27612 tejbeer 178
 
31352 amit.gupta 179
        return fullAccesss;
22860 ashik.ali 180
 
31352 amit.gupta 181
    }
23786 amit.gupta 182
 
31352 amit.gupta 183
    @RequestMapping(value = "/getBrandsByCategory", method = RequestMethod.GET)
184
    public String getTagListingItemsByBrand(HttpServletRequest request, @RequestParam int categoryId, Model model)
185
            throws Exception {
186
        Set<String> brands = inventoryService.getAllTagListingBrands(categoryId);
187
        model.addAttribute("brands", brands);
188
        model.addAttribute("categoryId", categoryId);
23786 amit.gupta 189
 
31352 amit.gupta 190
        return "tag-listing-brands";
191
    }
23786 amit.gupta 192
 
31352 amit.gupta 193
    @RequestMapping(value = "/schemes/update-schemes-page", method = RequestMethod.GET)
194
    public String updateShcemes(HttpServletRequest request) throws ProfitMandiBusinessException {
195
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
196
        if (!roleManager.isAdmin(loginDetails.getRoleIds())) {
197
            throw new ProfitMandiBusinessException("User", loginDetails.getEmailId(), "Unauthorised access");
198
        }
199
        return "update-schemes-page";
200
    }
33030 amit.gupta 201
 
32299 jai.hind 202
    @RequestMapping(value = "/schemes/process-sellout", method = RequestMethod.POST)
203
    public String processSellout(HttpServletRequest request, Model model, @RequestBody List<String> invoiceNumbers) throws Exception {
204
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
205
        if (!roleManager.isAdmin(loginDetails.getRoleIds())) {
206
            throw new ProfitMandiBusinessException("User", loginDetails.getEmailId(), "Unauthorised access");
207
        }
208
        for (String invoiceNumber : invoiceNumbers) {
209
            FofoOrder fofoOrder = fofoOrderRepository.selectByInvoiceNumber(invoiceNumber);
210
            schemeService.processSchemeOut(fofoOrder.getId(), fofoOrder.getFofoId());
211
        }
212
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
213
        return "response";
214
    }
23556 amit.gupta 215
 
32299 jai.hind 216
    @RequestMapping(value = "/schemes/process-sellin", method = RequestMethod.POST)
217
    public String processSellin(HttpServletRequest request, Model model, @RequestBody List<String> invoiceNumbers) throws Exception {
218
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
219
        if (!roleManager.isAdmin(loginDetails.getRoleIds())) {
220
            throw new ProfitMandiBusinessException("User", loginDetails.getEmailId(), "Unauthorised access");
221
        }
222
        for (String invoiceNumber : invoiceNumbers) {
223
            Purchase purchase = purchaseRepository.selectByPurchaseReference(invoiceNumber);
224
            schemeService.processSchemeIn(purchase.getId(), purchase.getFofoId());
225
        }
226
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
227
        return "response";
228
    }
229
 
31352 amit.gupta 230
    @RequestMapping(value = "/payMonthlyInvestment", method = RequestMethod.POST)
231
    public void payMonthlyInvestment(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
23914 govind 232
 
31352 amit.gupta 233
        LocalDate firstDateOfCurrentMonth = LocalDateTime.now().withDayOfMonth(1).toLocalDate();
234
        LocalDate startOfPreviousMonth = firstDateOfCurrentMonth.minusMonths(1);
235
        int referenceId = Integer.parseInt(FormattingUtils.getYearMonth(startOfPreviousMonth.atStartOfDay()));
236
        LocalDate lastOfPreviousMonth = firstDateOfCurrentMonth.minusDays(1);
237
        List<PartnerDailyInvestment> partnerDailyInvestments = partnerDailyInvestmentRepository
238
                .selectAll(startOfPreviousMonth, lastOfPreviousMonth);
239
        Map<Integer, Long> investmentMaintainedDaysMap = partnerDailyInvestments.stream()
240
                .filter(x -> x.getShortPercentage() <= 10)
241
                .collect(Collectors.groupingBy(x -> x.getFofoId(), Collectors.counting()));
242
        LOGGER.info("investmentMaintainedDaysMap {}", investmentMaintainedDaysMap);
243
        List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectAllPending(SchemeType.INVESTMENT,
244
                startOfPreviousMonth.atStartOfDay(), firstDateOfCurrentMonth.atStartOfDay());
23786 amit.gupta 245
 
31352 amit.gupta 246
        if (schemeInOuts.isEmpty()) {
247
            throw new ProfitMandiBusinessException("Investment Payout", "", "No data Found");
248
        }
23786 amit.gupta 249
 
31352 amit.gupta 250
        Map<Integer, List<SchemeInOut>> inventoryItemIdSchemeMap = schemeInOuts.stream()
251
                .collect(Collectors.groupingBy(x -> x.getInventoryItemId()));
252
        List<InventoryItem> inventoryItems = inventoryItemRepository.selectByIds(inventoryItemIdSchemeMap.keySet());
253
        Map<Integer, List<Integer>> retailerInventoryItemIdMap = inventoryItems.stream().collect(
254
                Collectors.groupingBy(x -> x.getFofoId(), Collectors.mapping(x -> x.getId(), Collectors.toList())));
255
        System.out.println("Fofo Id\tInvestment Maintained Days\tEligible payout");
256
        for (Map.Entry<Integer, List<Integer>> retailerEntry : retailerInventoryItemIdMap.entrySet()) {
257
            int fofoId = retailerEntry.getKey();
258
            long investmentMaintainedDays = investmentMaintainedDaysMap.get(fofoId) == null ? 0
259
                    : investmentMaintainedDaysMap.get(fofoId);
23786 amit.gupta 260
 
31352 amit.gupta 261
            List<SchemeInOut> schemeInouts = retailerEntry.getValue().stream().map(x -> inventoryItemIdSchemeMap.get(x))
262
                    .flatMap(List::stream)
263
                    .filter(x -> x.getStatus().equals(SchemePayoutStatus.PENDING) && x.getRolledBackTimestamp() == null)
264
                    .collect(Collectors.toList());
265
            float totalAmount = 0;
266
            LocalDateTime firstBillingDate = transactionRepository.getFirstBillingDate(fofoId);
267
            boolean sameYearMonth = firstBillingDate.getMonth() == startOfPreviousMonth.getMonth()
268
                    && firstBillingDate.getYear() == startOfPreviousMonth.getYear();
269
            for (SchemeInOut sio : schemeInouts) {
270
                if (sameYearMonth) {
271
                    sio.setStatusDescription("Investment payout fully disbursed for first month");
272
                    sio.setStatus(SchemePayoutStatus.CREDITED);
273
                    sio.setCreditTimestamp(LocalDateTime.now());
274
                    totalAmount += sio.getAmount();
275
                } else {
276
                    if (investmentMaintainedDays < 8) {
277
                        sio.setStatus(SchemePayoutStatus.REJECTED);
278
                        // sio.setRolledBackTimestamp(LocalDateTime.now());
279
                        sio.setStatusDescription(
280
                                "Investment maintained for " + investmentMaintainedDays + "(< 8) days");
281
                    } else if (investmentMaintainedDays < 12) {
282
                        sio.setStatus(SchemePayoutStatus.CREDITED);
283
                        sio.setAmount(sio.getAmount() / 2);
284
                        sio.setCreditTimestamp(LocalDateTime.now());
285
                        sio.setStatusDescription(
286
                                "Investment maintained for " + investmentMaintainedDays + "(< 12) days");
287
                        totalAmount += sio.getAmount();
288
                    } else {
289
                        sio.setStatus(SchemePayoutStatus.CREDITED);
290
                        sio.setCreditTimestamp(LocalDateTime.now());
291
                        totalAmount += sio.getAmount();
292
                    }
293
                }
294
            }
295
            if (totalAmount > 0) {
296
                String description = "Investment margin paid for "
297
                        + FormattingUtils.formatYearMonth(startOfPreviousMonth.atStartOfDay());
298
                if (investmentMaintainedDays < 12) {
299
                    description += ", as maintained for " + investmentMaintainedDays + "(< 12) days";
300
                }
301
                walletService.addAmountToWallet(fofoId, referenceId, WalletReferenceType.INVESTMENT_PAYOUT, description,
302
                        totalAmount, lastOfPreviousMonth.atTime(LocalTime.MAX));
303
            }
304
            // Its ok to process Margins Pending for activation
305
            schemeService.processActivation();
306
            System.out.printf("%d\t%d\t%f%n", fofoId, investmentMaintainedDays, totalAmount);
307
        }
30651 amit.gupta 308
 
31352 amit.gupta 309
    }
22860 ashik.ali 310
 
31352 amit.gupta 311
    @RequestMapping(value = "/evaluateActualInvestmentPayout", method = RequestMethod.GET)
312
    public ResponseEntity<?> evaluateActualInvestmentPayout(HttpServletRequest request, Model model) throws Exception {
29608 amit.gupta 313
 
31352 amit.gupta 314
        List<List<?>> rows = new ArrayList<>();
315
        LocalDate firstDateOfCurrentMonth = LocalDateTime.now().withDayOfMonth(1).toLocalDate();
316
        LocalDate startOfPreviousMonth = firstDateOfCurrentMonth.minusMonths(1);
317
        LocalDate lastOfPreviousMonth = firstDateOfCurrentMonth.minusDays(1);
318
        List<PartnerDailyInvestment> partnerDailyInvestments = partnerDailyInvestmentRepository
319
                .selectAll(startOfPreviousMonth, lastOfPreviousMonth);
320
        Map<Integer, Long> investmentMaintainedDaysMap = partnerDailyInvestments.stream()
321
                .filter(x -> x.getShortPercentage() <= 10)
322
                .collect(Collectors.groupingBy(x -> x.getFofoId(), Collectors.counting()));
323
        LOGGER.info("investmentMaintainedDaysMap {}", investmentMaintainedDaysMap);
324
        List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectAllPending(SchemeType.INVESTMENT,
325
                startOfPreviousMonth.atStartOfDay(), firstDateOfCurrentMonth.atStartOfDay());
326
        Map<Integer, List<SchemeInOut>> inventoryItemIdSchemeMap = schemeInOuts.stream()
327
                .collect(Collectors.groupingBy(x -> x.getInventoryItemId()));
328
        List<InventoryItem> inventoryItems = inventoryItemRepository.selectByIds(inventoryItemIdSchemeMap.keySet());
329
        Map<Integer, List<Integer>> retailerInventoryItemIdMap = inventoryItems.stream().collect(
330
                Collectors.groupingBy(x -> x.getFofoId(), Collectors.mapping(x -> x.getId(), Collectors.toList())));
331
        System.out.println("Fofo Id\tInvestment Maintained Days\tEligible payout");
332
        for (Map.Entry<Integer, List<Integer>> retailerEntry : retailerInventoryItemIdMap.entrySet()) {
333
            int fofoId = retailerEntry.getKey();
334
            List<SchemeInOut> schemeInouts = retailerEntry.getValue().stream().map(x -> inventoryItemIdSchemeMap.get(x))
335
                    .flatMap(List::stream).collect(Collectors.toList());
336
            double totalAmount = schemeInouts.stream().filter(x -> x.getRolledBackTimestamp() == null)
337
                    .collect(Collectors.summingDouble(x -> x.getAmount()));
338
            long investmentMaintainedDays = investmentMaintainedDaysMap.get(fofoId) == null ? 0
339
                    : investmentMaintainedDaysMap.get(fofoId);
340
            if (investmentMaintainedDays < 8) {
341
                totalAmount = 0;
342
            } else if (investmentMaintainedDays < 12) {
343
                totalAmount = totalAmount / 2;
344
            }
345
            System.out.printf("%d\t%d\t%f%n", fofoId, investmentMaintainedDays, totalAmount);
346
            CustomRetailer customRetailer = retailerService.getFofoRetailer(fofoId);
26588 tejbeer 347
 
31352 amit.gupta 348
            rows.add(Arrays.asList(fofoId, customRetailer.getBusinessName(), customRetailer.getCode(),
349
                    investmentMaintainedDays, totalAmount));
350
        }
29585 manish 351
 
31352 amit.gupta 352
        org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
353
                Arrays.asList("fofoId", "Name", "Code", "investmentMaintainedDays", "totalAmount"), rows);
26674 tejbeer 354
 
31352 amit.gupta 355
        final HttpHeaders headers = new HttpHeaders();
356
        headers.set("Content-Type", "text/csv");
357
        headers.set("Content-disposition", "inline; filename=investmentMaintainedDays.csv");
358
        headers.setContentLength(baos.toByteArray().length);
28795 tejbeer 359
 
31352 amit.gupta 360
        final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
361
        final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
28795 tejbeer 362
 
31352 amit.gupta 363
        return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
28795 tejbeer 364
 
31352 amit.gupta 365
    }
28795 tejbeer 366
 
31352 amit.gupta 367
    @RequestMapping(value = "/processInvestmentDryRun", method = RequestMethod.GET)
368
    public ResponseEntity<?> processInvestmentDryRun(HttpServletRequest request, Model model) throws Exception {
29707 tejbeer 369
 
31352 amit.gupta 370
        LocalDate firstDateOfCurrentMonth = LocalDateTime.now().withDayOfMonth(1).toLocalDate();
371
        LocalDate startOfPreviousMonth = firstDateOfCurrentMonth.minusMonths(1);
372
        LocalDate lastOfPreviousMonth = firstDateOfCurrentMonth.minusDays(1);
373
        List<List<?>> rows = new ArrayList<>();
29707 tejbeer 374
 
31352 amit.gupta 375
        Map<String, String> params = new HashMap<>();
29707 tejbeer 376
 
31352 amit.gupta 377
        params.put("MANUAL_datesBetween_FROMDATE", startOfPreviousMonth.toString());
378
        params.put("MANUAL_datesBetween_TODATE", lastOfPreviousMonth.toString());
29899 tejbeer 379
 
31352 amit.gupta 380
        params.put("type", "INVESTMENT");
30494 amit.gupta 381
 
31352 amit.gupta 382
        List<EvaluateSchemeInvestmentPayoutModel> evaluateSchemeInvestmentPayouts = reporticoService.getReports(
383
                EvaluateSchemeInvestmentPayoutModel.class, ReporticoProject.FOCO, "schemepayout.xml", params);
31147 tejbeer 384
 
31352 amit.gupta 385
        int referenceId = Integer.parseInt(FormattingUtils.getYearMonth(startOfPreviousMonth.atStartOfDay()));
386
        List<PartnerDailyInvestment> partnerDailyInvestments = partnerDailyInvestmentRepository
387
                .selectAll(startOfPreviousMonth, lastOfPreviousMonth);
388
        Map<Integer, Long> investmentMaintainedDaysMap = partnerDailyInvestments.stream()
389
                .filter(x -> x.getShortPercentage() <= 10)
390
                .collect(Collectors.groupingBy(x -> x.getFofoId(), Collectors.counting()));
29899 tejbeer 391
 
31352 amit.gupta 392
        for (EvaluateSchemeInvestmentPayoutModel esip : evaluateSchemeInvestmentPayouts) {
29608 amit.gupta 393
 
31352 amit.gupta 394
            long investmentMaintainedDays = investmentMaintainedDaysMap.get(esip.getFofoId()) == null ? 0
395
                    : investmentMaintainedDaysMap.get(esip.getFofoId());
29899 tejbeer 396
 
31352 amit.gupta 397
            esip.setInvestmentDays(investmentMaintainedDays);
29899 tejbeer 398
 
31383 amit.gupta 399
            float processAmount = esip.getPaidAmount();
31379 amit.gupta 400
            if (investmentMaintainedDays < 8) {
401
                processAmount = 0;
402
            } else if (investmentMaintainedDays < 12) {
403
                processAmount = processAmount / 2;
404
            }
29899 tejbeer 405
 
31352 amit.gupta 406
            esip.setProcessAmount(processAmount);
29899 tejbeer 407
 
31352 amit.gupta 408
            rows.add(Arrays.asList(esip.getCode(), esip.getStoreName(), esip.getFofoId(), esip.getItemId(),
409
                    esip.getBrand(), esip.getModelName(), esip.getModelNumber(), esip.getColor(), esip.getSchemeInDp(),
410
                    esip.getSchemeOutDp(), esip.getSchemeId(), esip.getName(), esip.getType(), esip.getPartnerType(),
411
                    esip.getAmountType(), esip.getAmount(), esip.getPurchaseInvoice(), esip.getSaleInovoice(),
412
                    esip.getPaidAmount(), esip.getCreateTimestamp(), esip.getRolledBackTimestamp(),
413
                    esip.getSerialNumber(), esip.getInRef(), esip.getOutRef(), esip.getBusinessDate(), esip.getStatus(),
414
                    esip.getDescription(), esip.getProcessAmount(), esip.getInvestmentDays()));
415
        }
29899 tejbeer 416
 
31352 amit.gupta 417
        org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil
418
                .getCSVByteStream(Arrays.asList("Code", "Store Name", "Fofo Id", "Item Id", "Brand", "Model Name",
419
                        "Model Number", "Color", "Scheme In Dp", "Scheme Out Dp", "Scheme Id", "Name", "Type",
420
                        "Partner Type", "Amount Type", "Amount", "Purchase Invoice", "Sale Inovoice", "Paid Amount",
421
                        "Create Timestamp", "Rolled Back Timestamp", "Serial Number", "In Ref", "Out Ref",
422
                        "Business Date", "Status", "Description", "Process Amount", "Investment Days"), rows);
29899 tejbeer 423
 
31352 amit.gupta 424
        final HttpHeaders headers = new HttpHeaders();
425
        headers.set("Content-Type", "text/csv");
426
        headers.set("Content-disposition", "inline; filename=schemePayout.csv");
427
        headers.setContentLength(baos.toByteArray().length);
29899 tejbeer 428
 
31352 amit.gupta 429
        final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
430
        final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
23914 govind 431
 
31352 amit.gupta 432
        return new ResponseEntity<>(inputStreamResource, headers, HttpStatus.OK);
30494 amit.gupta 433
 
31352 amit.gupta 434
    }
30494 amit.gupta 435
 
31352 amit.gupta 436
    @RequestMapping(value = "/schemes/update", method = RequestMethod.POST)
437
    public String updateShcemes(HttpServletRequest request, @RequestBody SchemeItems schemeItems, Model model)
438
            throws Exception {
439
        for (int schemeId : schemeItems.getSchemeIds()) {
440
            if (schemeRepository.selectById(schemeId) != null)
441
                for (int catalogId : schemeItems.getCatalogIds()) {
442
                    if (tagListingRepository.selectAllByCatalogIds(Arrays.asList(catalogId)).size() > 0) {
443
                        SchemeItem si = new SchemeItem();
444
                        si.setCatalogId(catalogId);
445
                        si.setSchemeId(schemeId);
446
                        si.setCreateTimestamp(LocalDateTime.now());
447
                        try {
448
                            schemeItemRepository.persist(si);
449
                        } catch (Exception e) {
450
                            LOGGER.info("Scheme aleady exist");
451
                        }
452
                        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
453
                    } else {
31520 amit.gupta 454
                        LOGGER.info("Invalid catalog Id - {}", catalogId);
31352 amit.gupta 455
                    }
456
                }
457
        }
458
        return "response";
459
    }
29608 amit.gupta 460
 
31352 amit.gupta 461
    @RequestMapping(value = "/addItemToScheme", method = RequestMethod.POST)
462
    public String updateScheme(HttpServletRequest request, @RequestBody SchemeItems schemeItems, Model model)
463
            throws Exception {
464
        for (int schemeId : schemeItems.getSchemeIds()) {
465
            List<Integer> catalogIds = schemeItemRepository.selectCatalogIdsBySchemeId(schemeId);
466
            if (schemeRepository.selectById(schemeId) != null)
467
                for (int catalogId : schemeItems.getCatalogIds()) {
468
                    if (!(catalogIds.contains(catalogId))) {
469
                        SchemeItem si = new SchemeItem();
470
                        si.setCatalogId(catalogId);
471
                        si.setSchemeId(schemeId);
472
                        si.setCreateTimestamp(LocalDateTime.now());
473
                        try {
474
                            schemeItemRepository.persist(si);
475
                        } catch (Exception e) {
476
                            LOGGER.info("Scheme already exist");
477
                        }
478
                        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
479
                    } else {
480
                        throw new ProfitMandiBusinessException("Catalog exist for scheme",
481
                                "SchemeId= " + schemeId + ", CatalogId= " + catalogId, "Catalog exist for scheme");
482
                    }
483
                }
484
        }
485
        return "response";
486
    }
30768 amit.gupta 487
 
31352 amit.gupta 488
    @RequestMapping(value = "/createScheme", method = RequestMethod.GET)
489
    public String createScheme(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
490
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
29608 amit.gupta 491
 
31352 amit.gupta 492
        LocalDate currentdate = LocalDate.now();
493
        Month month = currentdate.getMonth().minus(1);
494
        model.addAttribute("month", month);
29608 amit.gupta 495
 
31352 amit.gupta 496
        // Map<Integer, String> itemIdItemDescriptionMap =
497
        // inventoryService.getAllItemIdItemDescriptionMap();
498
        // model.addAttribute("itemIdItemDescriptionMap", itemIdItemDescriptionMap);
499
        // List<Category> categories = inventoryService.getAllCategories();
500
        List<Category> categories = categoryRepository.selectByIds(categoryIds);
501
        categories = categories.stream().sorted(Comparator.comparing(Category::getId)).collect(Collectors.toList());
502
        // Set<String> brands =
503
        // inventoryService.getAllTagListingBrands(ProfitMandiConstants.MOBILE_CATEGORY_ID);
504
        // brands.addAll(inventoryService.getAllTagListingBrands(14206));
29608 amit.gupta 505
 
31352 amit.gupta 506
        boolean fullAccesss = this.getAccess(loginDetails.getEmailId());
25256 amit.gupta 507
 
31352 amit.gupta 508
        List<Region> regionList = regionRepository.selectAll();
29608 amit.gupta 509
 
34317 amit.gupta 510
        List<SchemeType> schemeTypes = fullAccesss ? Arrays.stream(SchemeType.values()).collect(Collectors.toList()) : SchemeType.RESTRICTED_SCHEMES_TYPES;
511
        model.addAttribute("schemeTypes", schemeTypes);
31352 amit.gupta 512
        model.addAttribute("regionList", regionList);
29608 amit.gupta 513
 
31352 amit.gupta 514
        model.addAttribute("categories", categories);
515
        model.addAttribute("retailerTypes", PartnerType.values());
516
        return "create-scheme";
517
    }
29663 manish 518
 
31352 amit.gupta 519
    @RequestMapping(value = "/extendAllSchemes", method = RequestMethod.POST)
520
    public String extendAllScheme(HttpServletRequest request, @RequestBody LocalDateTime extendDatetime, Model model)
521
            throws Exception {
522
        List<Scheme> schemes = schemeRepository.selectActiveAll();
31387 amit.gupta 523
        //Filter scheme types ACTIVATION/SPECIAL SUPPORT/SELLOUT from extending
524
        schemes = schemes.stream().filter(x -> !EXCLUDE_EXTEND_SCHEMES.contains(x.getType())).collect(Collectors.toList());
31352 amit.gupta 525
        if (schemes.size() > 0) {
526
            for (Scheme scheme : schemes) {
527
                if (scheme.getExpireTimestamp() == null) {
528
                    scheme.setEndDateTime(extendDatetime);
529
                    schemeRepository.persist(scheme);
530
                }
531
            }
532
            model.addAttribute("response1", mvcResponseSender.createResponseString(true));
533
            return "response";
534
        }
535
        model.addAttribute("response1", mvcResponseSender.createResponseString(false));
536
        return "response";
537
    }
29608 amit.gupta 538
 
31352 amit.gupta 539
    @RequestMapping(value = "/getCatalogDescriptionByBrands", method = RequestMethod.GET)
540
    public String getTagListingItemsByBrand(HttpServletRequest request, @RequestParam int categoryId,
541
                                            @RequestParam List<String> brands, Model model) throws Exception {
542
        Map<Integer, String> catalogIdItemDescriptionMap = inventoryService.getModelDescriptionMap(categoryId, brands);
543
        model.addAttribute("catalogIdItemDescriptionMap", catalogIdItemDescriptionMap);
544
        // model.addAttribute("brands", inventoryService.getAllBrands());
29585 manish 545
 
31352 amit.gupta 546
        return "tag-listing-items-description";
547
    }
29663 manish 548
 
31352 amit.gupta 549
    @RequestMapping(value = "/createScheme", method = RequestMethod.POST)
550
    public String createScheme(HttpServletRequest request, @RequestBody CreateSchemeRequest createSchemeRequest,
551
                               Model model) throws ProfitMandiBusinessException {
552
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
553
        LOGGER.info("CreateSchemeRequest {}", createSchemeRequest);
554
        schemeService.saveScheme(loginDetails.getFofoId(), createSchemeRequest);
555
        return getDefaultSchemes(request, model);
556
    }
29663 manish 557
 
31352 amit.gupta 558
    private String getDefaultSchemes(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
559
        return getSchemes(request, 0, null, 30, 0, 0, PartnerType.ALL, "", model);
560
    }
29663 manish 561
 
31352 amit.gupta 562
    private List<Scheme> setSchemeAmountModel(List<Scheme> schemes) {
563
        for (Scheme scheme : schemes) {
564
            if (scheme.getAmountType().equals(AmountType.PERCENTAGE)) {
565
                scheme.setAmountModel(scheme.getAmount() + "%");
566
            } else {
567
                scheme.setAmountModel(scheme.getAmount() + "");
568
            }
569
        }
570
        return schemes;
571
    }
29663 manish 572
 
31352 amit.gupta 573
    // Show 20 recents
29663 manish 574
 
31352 amit.gupta 575
    @RequestMapping(value = "/schemes/delete", method = RequestMethod.DELETE)
576
    public String deleteShcemes(HttpServletRequest request,
577
                                @RequestParam(name = "schemeId", required = false, defaultValue = "0") int schemeId,
578
                                @RequestParam(name = "catalogId", required = false, defaultValue = "0") int catalogId, Model model)
579
            throws Exception {
580
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
581
        if (schemeId > 0 && catalogId > 0) {
582
            schemeItemRepository.deleteByCatalogIdsAndSchemeIds(catalogId, schemeId);
29608 amit.gupta 583
 
31352 amit.gupta 584
            model.addAttribute("response1", mvcResponseSender.createResponseString(true));
29585 manish 585
 
31352 amit.gupta 586
            model.addAttribute("roleType", roleManager.isAdmin(loginDetails.getRoleIds()));
29585 manish 587
 
31352 amit.gupta 588
        }
589
        return "response";
590
    }
29585 manish 591
 
31352 amit.gupta 592
    @RequestMapping(value = "/extendSchemeById", method = RequestMethod.POST)
593
    public String extendSchemeById(HttpServletRequest request,
29585 manish 594
 
31352 amit.gupta 595
                                   @RequestParam(name = ProfitMandiConstants.SCHEME_ID) int schemeId,
596
                                   @RequestBody LocalDateTime extendDatetime, Model model) throws Exception {
597
        Scheme scheme = schemeRepository.selectById(schemeId);
598
        if ((!(scheme.getActiveTimestamp() == null)) && scheme.getExpireTimestamp() == null) {
599
            scheme.setEndDateTime(extendDatetime);
600
            schemeRepository.persist(scheme);
601
            model.addAttribute("response1", mvcResponseSender.createResponseString(true));
602
            return "response";
603
        }
604
        model.addAttribute("response1", mvcResponseSender.createResponseString(false));
605
        return "response";
606
    }
29608 amit.gupta 607
 
31762 tejbeer 608
    @RequestMapping(value = "/getSchemesByImei", method = RequestMethod.GET)
33182 shampa 609
    public String getSchemesByImei(HttpServletRequest request,
610
                                   @RequestParam (defaultValue = "") String searchImei, Model model) throws ProfitMandiBusinessException {
31762 tejbeer 611
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
612
        if (org.apache.commons.lang3.StringUtils.isNotEmpty(searchImei)) {
613
 
614
            List<Scheme> schemes = null;
615
            List<SchemeInOut> schemeInOuts = null;
616
 
617
            InventoryItem inventoryItem = inventoryItemRepository.selectBySerialNumber(searchImei);
618
            int fofoId = inventoryItem.getFofoId();
33306 amit.gupta 619
           List<ItemPurchaseSummaryModel> itemPurchaseSummaryModels = inventoryItemRepository.selectPurchaseSummary(new ArrayList<>(Arrays.asList(inventoryItem.getId())));
31762 tejbeer 620
 
33182 shampa 621
            List<FofoOrder> fofoOrders=fofoOrderRepository.selectByFofoIdAndSerialNumber(fofoId, searchImei ,null, null, 0, 0);
622
            LOGGER.info("fofoOrder {}", fofoOrders);
623
            List<FofoOrder> filterOrders = fofoOrders.stream().filter(x -> x.getCancelledTimestamp() == null).collect(Collectors.toList());
31762 tejbeer 624
            CustomRetailer customRetailer = retailerService.getFofoRetailer(fofoId);
625
            Item item = itemRepository.selectById(inventoryItem.getItemId());
626
            Map<Integer, Scheme> schemeMap = new HashMap<>();
627
            double netEarnings = 0;
628
            if (inventoryItem != null) {
629
                // Offer payout
630
                List<OfferPayout> offerPayouts = offerPayoutRepository.selectAllBySerialNumber(fofoId, searchImei);
33030 amit.gupta 631
                Map<Integer, CreateOfferRequest> offerRequestMap = offerPayouts.stream().map(x -> x.getOfferId())
33248 ranu 632
                        .distinct().map(offerId -> {
633
                            try {
634
                                return offerService.getOffer(fofoId, offerId.intValue());
635
                            } catch (ProfitMandiBusinessException e) {
636
                                throw new RuntimeException(e);
637
                            }
638
                        }).collect(Collectors.toMap(x -> x.getId(), x -> x));
31762 tejbeer 639
 
640
                schemeInOuts = schemeInOutRepository.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItem.getId())));
33182 shampa 641
                ActivatedImei activatedImei = activatedImeiRepository.selectBySerialNumber(searchImei);
31762 tejbeer 642
 
643
                if (!schemeInOuts.isEmpty()) {
644
                    netEarnings += schemeInOuts.stream().filter(x -> x.getStatus().equals(SchemePayoutStatus.CREDITED)).collect(Collectors.summingDouble(x -> x.getAmount()));
645
                    List<Integer> schemeIds = schemeInOuts.stream().map(x -> x.getSchemeId()).collect(Collectors.toList());
646
 
647
                    schemes = schemeRepository.selectBySchemeIds(schemeIds);
648
                    for (Scheme scheme : schemes) {
649
                        if (scheme.getAmountType().equals(AmountType.PERCENTAGE)) {
650
                            scheme.setAmountModel(scheme.getAmount() + "%");
651
                        } else {
652
                            scheme.setAmountModel(scheme.getAmount() + "");
653
                        }
654
                    }
655
 
656
                    schemeMap = schemes.stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
657
                }
33182 shampa 658
                List<PriceDropIMEI> priceDropImeis = priceDropIMEIRepository.selectByFofoIdImei(fofoId, searchImei);
31762 tejbeer 659
                if (priceDropImeis.size() > 0) {
660
 
661
                    for (PriceDropIMEI priceDropIMEI : priceDropImeis) {
662
                        int priceDropId = priceDropIMEI.getPriceDropId();
663
                        PriceDrop pd = priceDropRepository.selectById(priceDropId);
664
                        priceDropIMEI.setPriceDrop(pd);
665
                    }
666
                    model.addAttribute("priceDropImeis", priceDropImeis);
667
                }
668
                netEarnings += offerPayouts.stream().collect(Collectors.summingDouble(x -> x.getAmount()));
669
                model.addAttribute("offerPayouts", offerPayouts);
670
                model.addAttribute("offerRequestMap", offerRequestMap);
671
                model.addAttribute("inventoryItem", inventoryItem);
33306 amit.gupta 672
                model.addAttribute("itemPurchaseSummaryModels", itemPurchaseSummaryModels);
33182 shampa 673
                model.addAttribute("fofoOrders", filterOrders);
674
                model.addAttribute("activatedImei", activatedImei);
31762 tejbeer 675
 
33182 shampa 676
 
677
 
31762 tejbeer 678
            }
32331 amit.gupta 679
            LOGGER.info("Net Earnings {}", netEarnings);
31762 tejbeer 680
            model.addAttribute("netEarnings", netEarnings);
681
            model.addAttribute("fofoId", fofoId);
682
            model.addAttribute("schemeMap", schemeMap);
683
            model.addAttribute("item", item);
684
            model.addAttribute("schemeInOut", schemeInOuts);
685
            model.addAttribute("schemes", schemes);
686
            model.addAttribute("customRetailer", customRetailer);
33182 shampa 687
            model.addAttribute("searchImei", searchImei);
31762 tejbeer 688
        }
689
        return "scheme-imei-history";
690
    }
691
 
32232 amit.gupta 692
 
693
    @Autowired
694
    PriceDropController priceDropController;
695
 
33182 shampa 696
    @Autowired
697
    ActivatedImeiRepository activatedImeiRepository;
698
 
31352 amit.gupta 699
    @RequestMapping(value = "/getSchemes", method = RequestMethod.GET)
700
    public String getSchemes(HttpServletRequest request, @RequestParam(name = "offset", defaultValue = "0") int offset,
701
                             @RequestParam(required = false) LocalDate date,
702
                             @RequestParam(name = "limit", required = false, defaultValue = "30") int limit,
703
                             @RequestParam(name = "searchModel", required = false, defaultValue = "0") int searchModel,
704
                             @RequestParam(name = "searchScheme", required = false, defaultValue = "0") int searchScheme,
705
                             @RequestParam(name = "partnerType", required = false, defaultValue = "ALL") PartnerType partnerType,
706
                             @RequestParam(name = "searchImei", required = false, defaultValue = "") String searchImei, Model model)
707
            throws ProfitMandiBusinessException {
708
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
709
        boolean isAdmin = roleManager.isAdmin(loginDetails.getRoleIds());
710
        if (date != null) {
711
            date = date.isAfter(LocalDate.now()) ? LocalDate.now() : date;
712
        } else if (!isAdmin) {
713
            date = LocalDate.now();
714
        }
29608 amit.gupta 715
 
31352 amit.gupta 716
        List<Scheme> schemes = null;
717
        List<SchemeInOut> schemeInOuts = null;
29608 amit.gupta 718
 
31352 amit.gupta 719
        boolean fullAccess = this.getAccess(loginDetails.getEmailId());
29608 amit.gupta 720
 
31352 amit.gupta 721
        model.addAttribute("fullAccess", fullAccess);
722
        model.addAttribute("searchImei", searchImei);
723
        model.addAttribute("isAdmin", isAdmin);
724
        model.addAttribute("searchModel", searchModel);
725
        model.addAttribute("searchScheme", searchScheme);
726
        model.addAttribute("partnerType", partnerType);
727
        model.addAttribute("date", date);
29608 amit.gupta 728
 
31352 amit.gupta 729
        final LocalDate date1 = date;
730
        if (searchScheme > 0) {
731
            schemes = Arrays.asList(schemeRepository.selectById(searchScheme));
732
            this.setSchemeAmountModel(schemes);
733
            if (schemes.size() > 0) {
734
                model.addAttribute("schemes", schemes);
735
                List<SchemeRegion> schemeRegionList = schemeRegionRepository.selectAllBySchemeIds(schemes.stream().map(x -> x.getId()).collect(Collectors.toList()));
736
                Map<Integer, String> schemeRegionMap = schemeRegionList.stream().collect(Collectors.groupingBy(x -> x.getSchemeId(), Collectors.mapping(y -> regionRepository.selectById(y.getRegionId()).getName(), Collectors.joining(","))));
737
                model.addAttribute("schemeRegionMap", schemeRegionMap);
738
                return "schemes";
739
            } else {
740
                throw new ProfitMandiBusinessException("SchemeId", searchScheme, "SchemeId Not Found");
741
            }
742
        } else if (searchModel > 0) {
743
            Item item = itemRepository.selectAllByCatalogItemId(searchModel).get(0);
744
            TagListing tagListing = tagListingRepository.selectByItemId(item.getId());
32331 amit.gupta 745
            LOGGER.info("tagListing {}", tagListing);
31352 amit.gupta 746
            if (tagListing != null) {
747
                model.addAttribute("dp", tagListing.getSellingPrice());
748
                model.addAttribute("mop", tagListing.getMop());
749
            }
750
            model.addAttribute("modelName", item.getItemDescriptionNoColor());
751
            if (isAdmin) {
752
                schemes = schemeService
753
                        .selectSchemeByPartnerType(partnerType, date, searchModel, isAdmin, offset, limit).stream()
754
                        .filter(x -> x.getId() != 411 && x.getId() != 612).collect(Collectors.toList());
755
                this.setSchemeAmountModel(schemes);
756
                model.addAttribute("schemes", schemes);
757
                List<SchemeRegion> schemeRegionList = schemeRegionRepository.selectAllBySchemeIds(schemes.stream().map(x -> x.getId()).collect(Collectors.toList()));
31482 amit.gupta 758
                Map<Integer, String> schemeRegionMap = schemeRegionList.stream().collect(Collectors.groupingBy(x -> x.getSchemeId(), Collectors.mapping(y -> regionRepository.selectById(y.getRegionId()).getName(), Collectors.joining(" ,"))));
31352 amit.gupta 759
                model.addAttribute("schemeRegionMap", schemeRegionMap);
760
                return "schemes";
761
            } else {
32331 amit.gupta 762
                PriceCircularModel priceCircularModel = priceCircularService.getPriceCircularByOffer(loginDetails.getFofoId(), Arrays.asList(searchModel), date);
32905 shampa 763
                FofoStore fs = fofoStoreRepository.selectByRetailerId(loginDetails.getFofoId());
33030 amit.gupta 764
                priceDropController.getPriceCircularView(priceCircularModel, model, fs.getCode());
31352 amit.gupta 765
            }
29608 amit.gupta 766
 
31352 amit.gupta 767
        } else if (org.apache.commons.lang3.StringUtils.isNotEmpty(searchImei)) {
29608 amit.gupta 768
 
31352 amit.gupta 769
            LOGGER.info("searchImei" + searchImei);
29608 amit.gupta 770
 
31352 amit.gupta 771
            InventoryItem inventoryItem = inventoryItemRepository.selectBySerialNumberFofoId(searchImei,
772
                    loginDetails.getFofoId());
773
            Item item = itemRepository.selectById(inventoryItem.getItemId());
774
            Map<Integer, Scheme> schemeMap = new HashMap<>();
775
            double netEarnings = 0;
776
            if (inventoryItem != null) {
32331 amit.gupta 777
                /*date = inventoryItem.getCreateTimestamp().toLocalDate();
778
                PriceCircularModel priceCircularModel = priceCircularService.getPriceCircularByOffer(loginDetails.getFofoId(), Arrays.asList(item.getCatalogItemId()), date);
779
                priceDropController.getPriceCircularView(priceCircularModel, model);*/
31352 amit.gupta 780
                // Offer payout
781
                List<OfferPayout> offerPayouts = offerPayoutRepository.selectAllBySerialNumber(loginDetails.getFofoId(),
782
                        searchImei);
783
                Map<Integer, CreateOfferRequest> offerRequestMap = offerPayouts.stream()
33248 ranu 784
                        .map(x -> {
785
                            try {
786
                                return offerService.getOffer(loginDetails.getFofoId(), (int) x.getOfferId());
787
                            } catch (ProfitMandiBusinessException e) {
788
                                throw new RuntimeException(e);
789
                            }
790
                        })
31352 amit.gupta 791
                        .collect(Collectors.toMap(x -> x.getId(), x -> x));
29608 amit.gupta 792
 
31352 amit.gupta 793
                schemeInOuts = schemeInOutRepository
794
                        .selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItem.getId())));
25256 amit.gupta 795
 
31352 amit.gupta 796
                if (!schemeInOuts.isEmpty()) {
797
                    netEarnings += schemeInOuts.stream().filter(x -> x.getStatus().equals(SchemePayoutStatus.CREDITED))
798
                            .collect(Collectors.summingDouble(x -> x.getAmount()));
799
                    List<Integer> schemeIds = schemeInOuts.stream().map(x -> x.getSchemeId())
800
                            .collect(Collectors.toList());
23914 govind 801
 
31352 amit.gupta 802
                    schemes = schemeRepository.selectBySchemeIds(schemeIds);
803
                    for (Scheme scheme : schemes) {
804
                        if (scheme.getAmountType().equals(AmountType.PERCENTAGE)) {
805
                            scheme.setAmountModel(scheme.getAmount() + "%");
806
                        } else {
807
                            scheme.setAmountModel(scheme.getAmount() + "");
808
                        }
809
                    }
23914 govind 810
 
31352 amit.gupta 811
                    schemeMap = schemes.stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
812
                }
32331 amit.gupta 813
                netEarnings += offerPayouts.stream().collect(Collectors.summingDouble(x -> x.getAmount()));
814
 
31352 amit.gupta 815
                List<PriceDropIMEI> priceDropImeis = priceDropIMEIRepository
816
                        .selectByFofoIdImei(loginDetails.getFofoId(), searchImei);
817
                if (priceDropImeis.size() > 0) {
23914 govind 818
 
31352 amit.gupta 819
                    for (PriceDropIMEI priceDropIMEI : priceDropImeis) {
820
                        int priceDropId = priceDropIMEI.getPriceDropId();
821
                        PriceDrop pd = priceDropRepository.selectById(priceDropId);
822
                        priceDropIMEI.setPriceDrop(pd);
823
                    }
824
                    model.addAttribute("priceDropImeis", priceDropImeis);
825
                }
32331 amit.gupta 826
 
31352 amit.gupta 827
                model.addAttribute("offerPayouts", offerPayouts);
828
                model.addAttribute("offerRequestMap", offerRequestMap);
829
                model.addAttribute("inventoryItem", inventoryItem);
23914 govind 830
 
31352 amit.gupta 831
            }
32331 amit.gupta 832
            model.addAttribute("netEarnings", netEarnings);
31352 amit.gupta 833
            model.addAttribute("schemeMap", schemeMap);
834
            model.addAttribute("item", item);
835
            model.addAttribute("schemeInOut", schemeInOuts);
836
        }
31170 amit.gupta 837
 
31352 amit.gupta 838
        if (isAdmin) {
839
            schemes = schemeRepository.selectAll(0, 100);
840
            this.setSchemeAmountModel(schemes);
841
            List<SchemeRegion> schemeRegionList = schemeRegionRepository.selectAllBySchemeIds(schemes.stream().map(x -> x.getId()).collect(Collectors.toList()));
842
            Map<Integer, String> schemeRegionMap = schemeRegionList.stream().collect(Collectors.groupingBy(x -> x.getSchemeId(), Collectors.mapping(y -> regionRepository.selectById(y.getRegionId()).getName(), Collectors.joining(","))));
843
            model.addAttribute("schemes", schemes);
844
            model.addAttribute("schemeRegionMap", schemeRegionMap);
31170 amit.gupta 845
 
31352 amit.gupta 846
            return "schemes";
847
        } else {
848
            FofoStore fs = fofoStoreRepository.selectByRetailerId(loginDetails.getFofoId());
849
            model.addAttribute("partnerCode", fs.getCode());
850
            model.addAttribute("fofoId", fs.getId());
851
            return "schemes-partner";
852
        }
23914 govind 853
 
31352 amit.gupta 854
    }
23786 amit.gupta 855
 
31352 amit.gupta 856
    private int getNlc(Item item, int fofoId, List<Scheme> schemes, TagListing tagListing) {
31505 amit.gupta 857
        /*if (item.getBrand().equals("Vivo") && fofoStoreRepository.getWarehousePartnerMap().get(7720).stream()
31352 amit.gupta 858
                .filter(x -> x.getId() == fofoId).count() > 0) {
859
            schemes = schemes.stream().filter(x -> !x.getType().equals(SchemeType.INVESTMENT))
860
                    .collect(Collectors.toList());
31505 amit.gupta 861
        }*/
31352 amit.gupta 862
        float nlc = tagListing.getSellingPrice();
863
        for (Scheme scheme : schemes) {
864
            if (scheme.getAmountType().equals(AmountType.PERCENTAGE)) {
865
                if (tagListing != null) {
866
                    float amount = tagListing.getSellingPrice() * scheme.getAmount() / 100;
867
                    scheme.setAmountModel(FormattingUtils.formatDecimal(amount) + " (" + scheme.getAmount() + "%)");
868
                    nlc -= amount;
869
                } else {
870
                    scheme.setAmountModel(scheme.getAmount() + "%");
871
                }
872
            } else {
873
                scheme.setAmountModel(scheme.getAmount() + "");
874
                nlc -= scheme.getAmount();
875
            }
876
        }
23819 govind 877
 
31352 amit.gupta 878
        return Math.round(nlc);
23914 govind 879
 
31352 amit.gupta 880
    }
29899 tejbeer 881
 
31352 amit.gupta 882
    @RequestMapping(value = "/getLastMonthCreditIncome", method = RequestMethod.GET)
883
    public String getLastMonthCreditIncome(HttpServletRequest request, Model model) throws Exception {
30122 amit.gupta 884
 
31352 amit.gupta 885
        String status = "CREDITED";
886
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
23786 amit.gupta 887
 
31352 amit.gupta 888
        LocalDateTime currentStartMonth = LocalDate.now().atStartOfDay().withDayOfMonth(1);
889
        LocalDateTime currentDate = LocalDate.now().atStartOfDay();
31170 amit.gupta 890
 
31352 amit.gupta 891
        YearMonth yearMonth = YearMonth.now();
892
        LOGGER.info("yearMonth" + yearMonth);
31170 amit.gupta 893
 
31352 amit.gupta 894
        boolean partnerType = partnerTypeChangeService.isPartnerTypeUpgraded(loginDetails.getFofoId(), yearMonth);
31170 amit.gupta 895
 
31352 amit.gupta 896
        LOGGER.info("partnerType" + partnerType);
31170 amit.gupta 897
 
31352 amit.gupta 898
        Map<String, Double> lastMonthCategoryUpgradeMarginMap = new HashMap<>();
31170 amit.gupta 899
 
31352 amit.gupta 900
        if (partnerType) {
901
            lastMonthCategoryUpgradeMarginMap = schemeInOutRepository
902
                    .selectLastMonthCategoryUpgradeMarginByBrand(loginDetails.getFofoId(), currentStartMonth,
903
                            currentDate)
904
                    .stream().collect(Collectors.toMap(x -> x.getBrand(), x -> x.getAmount()));
905
        }
906
        List<LastMonthCreditedIncomeModel> lastMonthCreditedIncomeModels = schemeInOutRepository
907
                .selectLastMonthCreditedIncomeByFofoId(loginDetails.getFofoId(), currentStartMonth, currentDate);
31170 amit.gupta 908
 
31352 amit.gupta 909
        List<LastMonthCreditedIncomeModel> lastMonthPurchaseInMargins = schemeInOutRepository
910
                .selectLastMonthPurchaseInMarginByFofoId(loginDetails.getFofoId(), currentStartMonth, currentDate);
31170 amit.gupta 911
 
31352 amit.gupta 912
        List<LastMonthCreditedIncomeModel> lastMonthFrontEndIncomes = schemeInOutRepository
913
                .selectFrontIncomeByBrand(loginDetails.getFofoId(), currentStartMonth, currentDate);
26802 tejbeer 914
 
31352 amit.gupta 915
        Map<String, LastMonthCreditedIncomeModel> lastMonthPendingIncomeMap = schemeInOutRepository
916
                .selectLastMonthPendingIncomeByFofoId(loginDetails.getFofoId(), currentStartMonth, currentDate).stream()
917
                .collect(Collectors.toMap(x -> x.getBrand(), x -> x));
28796 tejbeer 918
 
31352 amit.gupta 919
        Map<String, LastMonthCreditedIncomeModel> lastMonthPurchaseInMarginMap = new HashMap<>();
29608 amit.gupta 920
 
31352 amit.gupta 921
        lastMonthPurchaseInMarginMap = lastMonthPurchaseInMargins.stream()
922
                .collect(Collectors.toMap(x -> x.getBrand(), x -> x));
29608 amit.gupta 923
 
31352 amit.gupta 924
        Map<String, LastMonthCreditedIncomeModel> lastMonthSaleMarginMap = lastMonthCreditedIncomeModels.stream()
925
                .collect(Collectors.toMap(x -> x.getBrand(), x -> x));
30274 amit.gupta 926
 
31352 amit.gupta 927
        lastMonthFrontEndIncomes.stream().forEach(x -> {
928
            if (lastMonthSaleMarginMap.containsKey(x.getBrand())) {
929
                x.setAmount(lastMonthSaleMarginMap.get(x.getBrand()).getAmount() + x.getAmount());
930
                lastMonthSaleMarginMap.put(x.getBrand(), x);
931
            } else {
932
                lastMonthSaleMarginMap.put(x.getBrand(), x);
933
            }
30274 amit.gupta 934
 
31352 amit.gupta 935
        });
936
        Map<String, Float> totalAmountMap = lastMonthSaleMarginMap.entrySet().stream()
937
                .collect(Collectors.toMap(x -> x.getKey(), x -> x.getValue().getAmount()));
30274 amit.gupta 938
 
31352 amit.gupta 939
        Set<String> keySet = new HashSet<>();
940
        keySet.addAll(lastMonthPurchaseInMarginMap.keySet());
941
        keySet.addAll(lastMonthSaleMarginMap.keySet());
942
        keySet.addAll(lastMonthPendingIncomeMap.keySet());
28795 tejbeer 943
 
31352 amit.gupta 944
        lastMonthPurchaseInMarginMap.entrySet().stream().forEach(x -> {
945
            String brand = x.getKey();
946
            float amount = x.getValue().getAmount();
947
            if (!totalAmountMap.containsKey(brand)) {
948
                totalAmountMap.put(brand, 0f);
949
            }
950
            totalAmountMap.put(brand, totalAmountMap.get(brand) + amount);
30253 amit.gupta 951
 
31352 amit.gupta 952
        });
30122 amit.gupta 953
 
31352 amit.gupta 954
        lastMonthPendingIncomeMap.entrySet().stream().forEach(x -> {
955
            String brand = x.getKey();
956
            float amount = x.getValue().getAmount();
957
            if (!totalAmountMap.containsKey(brand)) {
958
                totalAmountMap.put(brand, 0f);
959
            }
960
            totalAmountMap.put(brand, totalAmountMap.get(brand) + amount);
28795 tejbeer 961
 
31352 amit.gupta 962
        });
28795 tejbeer 963
 
964
 
31352 amit.gupta 965
        Map<Integer, String> monthValueMap = new HashMap<>();
966
        for (int i = 0; i <= 5; i++) {
967
            LocalDateTime startOfMonth = LocalDateTime.now().withDayOfMonth(1).minusMonths(i);
968
            monthValueMap.put(i, startOfMonth.format(DateTimeFormatter.ofPattern("MMM''uu")));
969
        }
970
        model.addAttribute("month", 0);
971
        model.addAttribute("monthValueMap", monthValueMap);
972
        model.addAttribute("keySet", keySet);
973
        model.addAttribute("lastMonthPendingIncomeMap", lastMonthPendingIncomeMap);
28795 tejbeer 974
 
31352 amit.gupta 975
        model.addAttribute("lastMonthCategoryUpgradeMarginMap", lastMonthCategoryUpgradeMarginMap);
976
        model.addAttribute("lastMonthPurchaseInMarginMap", lastMonthPurchaseInMarginMap);
977
        model.addAttribute("lastMonthSaleMarginMap", lastMonthSaleMarginMap);
978
        model.addAttribute("status", status);
979
        model.addAttribute("totalAmountMap", totalAmountMap);
28795 tejbeer 980
 
31352 amit.gupta 981
        return "last-month-credited-income";
982
    }
30651 amit.gupta 983
 
31352 amit.gupta 984
    @RequestMapping(value = "/getLastMonthPendingIncome", method = RequestMethod.GET)
985
    public String getLastMonthPendingIncome(HttpServletRequest request, Model model) throws Exception {
30651 amit.gupta 986
 
31352 amit.gupta 987
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
28795 tejbeer 988
 
31352 amit.gupta 989
        LocalDateTime currentStartMonth = LocalDate.now().atStartOfDay().withDayOfMonth(1);
990
        LocalDateTime currentDate = LocalDate.now().atStartOfDay();
991
        String status = "PENDING";
31170 amit.gupta 992
 
31352 amit.gupta 993
        LOGGER.info("currentStartMonth" + currentStartMonth);
994
        LOGGER.info("currentDate" + currentDate);
28795 tejbeer 995
 
31352 amit.gupta 996
        List<LastMonthCreditedIncomeModel> lastMonthPendingIncomeModels = schemeInOutRepository
997
                .selectLastMonthPendingIncomeByFofoId(loginDetails.getFofoId(), currentStartMonth, currentDate);
29899 tejbeer 998
 
31352 amit.gupta 999
        Map<String, LastMonthCreditedIncomeModel> lastMonthMarginMap = new HashMap<>();
23786 amit.gupta 1000
 
31352 amit.gupta 1001
        for (LastMonthCreditedIncomeModel lastMonthPendingIncomeModel : lastMonthPendingIncomeModels) {
28795 tejbeer 1002
 
31352 amit.gupta 1003
            lastMonthMarginMap.put(lastMonthPendingIncomeModel.getBrand(), lastMonthPendingIncomeModel);
1004
        }
1005
        LOGGER.info("lastMonthPendingIncomeModel" + lastMonthPendingIncomeModels);
1006
        LOGGER.info("lastMonthMarginMap" + lastMonthMarginMap);
1007
        model.addAttribute("lastMonthCreditedIncomeModels", lastMonthPendingIncomeModels);
1008
        model.addAttribute("lastMonthMarginMap", lastMonthMarginMap);
1009
        model.addAttribute("status", status);
28795 tejbeer 1010
 
31352 amit.gupta 1011
        return "last-month-credited-income";
1012
    }
28795 tejbeer 1013
 
31352 amit.gupta 1014
    @RequestMapping(value = "/getLastMonthImeiWiseIncome", method = RequestMethod.GET)
1015
    public String getLastMonthImeiWiseIncome(HttpServletRequest request,
1016
                                             @RequestParam(name = "catalogItemId", required = false, defaultValue = "") int catalogItemId,
1017
                                             @RequestParam(name = "month", required = false, defaultValue = "") int month, Model model)
1018
            throws Exception {
30053 manish 1019
 
31352 amit.gupta 1020
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
30053 manish 1021
 
31352 amit.gupta 1022
        LocalDateTime lastMonthStart = LocalDate.now().minusMonths(month).withDayOfMonth(1).atStartOfDay();
1023
        LocalDateTime lastMonthEnd = lastMonthStart.plusMonths(1);
30053 manish 1024
 
31352 amit.gupta 1025
        HashSet<String> allImeiSet = new LinkedHashSet<>();
1026
        HashSet<String> purchaseSet = new LinkedHashSet<>();
1027
        HashSet<String> saleSet = new LinkedHashSet<>();
30053 manish 1028
 
31352 amit.gupta 1029
        List<LastMonthFrontEndImeiModel> lmfi = schemeInOutRepository
1030
                .selectLastMonthFrontEndImei(loginDetails.getFofoId(), catalogItemId, lastMonthStart, lastMonthEnd);
1031
        List<LastMonthImeiModel> lmpi = schemeInOutRepository.selectLastMonthPurchaseInImei(loginDetails.getFofoId(),
1032
                catalogItemId, lastMonthStart, lastMonthEnd);
1033
        List<LastMonthImeiModel> lmci = schemeInOutRepository.selectLastMonthCreditedImei(loginDetails.getFofoId(),
1034
                catalogItemId, lastMonthStart, lastMonthEnd);
30053 manish 1035
 
31352 amit.gupta 1036
        List<OfferPayoutImeiIncomeModel> offerPayoutImeiIncomeModels = offerPayoutRepository.getTotalPayoutsByPartnerPeriod(YearMonth.of(lastMonthStart.getYear(),
1037
                lastMonthStart.getMonth()), loginDetails.getFofoId(), null, catalogItemId);
30053 manish 1038
 
31352 amit.gupta 1039
        LOGGER.info("lmci {}", lmci);
30053 manish 1040
 
31352 amit.gupta 1041
        Map<String, Double> lastmonthCategoryUpgradeMargin = schemeInOutRepository
1042
                .selectLastMonthCategoryUpgradeMarginByImei(loginDetails.getFofoId(), catalogItemId, lastMonthStart,
1043
                        lastMonthEnd)
1044
                .stream().collect(Collectors.toMap(x -> x.getBrand(), x -> x.getAmount()));
30053 manish 1045
 
31352 amit.gupta 1046
        allImeiSet.addAll(lmpi.stream().map(x -> x.getImei()).collect(Collectors.toList()));
1047
        allImeiSet.addAll(lmci.stream().map(x -> x.getImei()).collect(Collectors.toList()));
1048
        allImeiSet.addAll(lmfi.stream().map(x -> x.getImei()).collect(Collectors.toList()));
1049
        allImeiSet.addAll(offerPayoutImeiIncomeModels.stream().map(x -> x.getImei()).collect(Collectors.toList()));
30053 manish 1050
 
31352 amit.gupta 1051
        List<String> allImeiList = new ArrayList<>(allImeiSet);
30053 manish 1052
 
31352 amit.gupta 1053
        LOGGER.info("allImeiList" + allImeiList);
1054
        LOGGER.info("lmcm" + lastmonthCategoryUpgradeMargin);
30253 amit.gupta 1055
 
31352 amit.gupta 1056
        List<LastMonthFrontEndImeiModel> lastMonthFrontEndImeis = schemeInOutRepository
1057
                .selectLastMonthFrontEndByImei(loginDetails.getFofoId(), allImeiList);
31379 amit.gupta 1058
        Map<String, LastMonthFrontEndImeiModel> soldMap = lastMonthFrontEndImeis.stream().collect(Collectors.toMap(x -> x.getImei(), x -> x));
30053 manish 1059
 
31379 amit.gupta 1060
 
31352 amit.gupta 1061
        List<LastMonthImeiModel> lastMonthPurchaseInImeis = schemeInOutRepository
1062
                .selectLastMonthPurchaseInByImei(loginDetails.getFofoId(), allImeiList);
30053 manish 1063
 
31352 amit.gupta 1064
        List<LastMonthImeiModel> lastMonthCreditedImeis = schemeInOutRepository
1065
                .selectLastMonthCreditedByImei(loginDetails.getFofoId(), allImeiList);
1066
        List<OfferPayoutImeiIncomeModel> allOfferPayoutImeiIncomeModels = offerPayoutRepository.getTotalPayoutsByImei(allImeiList);
30053 manish 1067
 
31352 amit.gupta 1068
        //Map<String, OfferPayoutImeiIncomeModel> imeisOfferPayoutMap = allOfferPayoutImeiIncomeModels.stream().collect(Collectors.toMap(x->x.getImei(), x->x));
1069
        Map<String, Double> imeiWisePendingSaleAmount = lastMonthCreditedImeis.stream()
1070
                .filter(x -> x.getStatus().equals(SchemePayoutStatus.PENDING)).collect(Collectors
1071
                        .groupingBy(x -> x.getImei(), Collectors.summingDouble(x -> x.getPendingSaleAmount())));
30053 manish 1072
 
31352 amit.gupta 1073
        allOfferPayoutImeiIncomeModels.stream().forEach(x -> {
1074
            if (x.getSaleDate() != null) {
1075
                LastMonthImeiModel lastMonthImeiModel = new LastMonthImeiModel(x.getImei(), (float) x.getSalePayout(),
1076
                        0, "Addnl Margin", x.getSaleDate(), SchemePayoutStatus.CREDITED);
1077
                lastMonthCreditedImeis.add(lastMonthImeiModel);
1078
            }
1079
            if (x.getGrnDate() != null) {
1080
                LastMonthImeiModel lastMonthImeiModel = new LastMonthImeiModel(x.getImei(), (float) x.getPurchasePayout(),
1081
                        0, "Booster Payout", x.getGrnDate(), SchemePayoutStatus.CREDITED);
1082
                lastMonthPurchaseInImeis.add(lastMonthImeiModel);
1083
            }
1084
        });
30053 manish 1085
 
31352 amit.gupta 1086
        Map<String, Map<String, Double>> lastMonthPurchaseInMapPairMap = lastMonthPurchaseInImeis.stream()
1087
                .collect(Collectors.groupingBy(x -> x.getImei(),
1088
                        Collectors.groupingBy(x -> x.getDescription(), Collectors.summingDouble(x -> x.getAmount()))));
1089
        Map<String, LocalDate> imeiPurchaseDateMap = lastMonthPurchaseInImeis.stream().collect(Collectors.toMap(x -> x.getImei(), x -> x.getCreateTimeStamp().toLocalDate(), (x, y) -> x));
32236 amit.gupta 1090
        LOGGER.info("Last month front end imeis - {}", lastMonthFrontEndImeis);
32232 amit.gupta 1091
        Map<String, LocalDate> imeiSaleDateMap = lastMonthFrontEndImeis.stream().collect(Collectors.toMap(x -> x.getImei(), x -> x.getCreated()));
31352 amit.gupta 1092
        Map<String, Map<String, Double>> lastMonthCreditedMapPairMap = lastMonthCreditedImeis.stream()
1093
                .collect(Collectors.groupingBy(x -> x.getImei(),
1094
                        Collectors.groupingBy(x -> x.getDescription(), Collectors.summingDouble(x -> x.getAmount()))));
30053 manish 1095
 
31352 amit.gupta 1096
        // descriptionSet.add("")
1097
        purchaseSet.addAll(lastMonthPurchaseInImeis.stream().map(x -> x.getDescription()).collect(Collectors.toList()));
1098
        saleSet.addAll(lastMonthCreditedImeis.stream().map(x -> x.getDescription()).collect(Collectors.toList()));
30053 manish 1099
 
31352 amit.gupta 1100
        List<String> purchaseList = new ArrayList<>(purchaseSet);
1101
        List<String> saleList = new ArrayList<>(saleSet);
30253 amit.gupta 1102
 
31352 amit.gupta 1103
        Map<String, ImeiWiseIncomePairAndMapModel> imeiWiseIncomeMapOfMap = new HashMap<>();
30053 manish 1104
 
31352 amit.gupta 1105
        for (Map.Entry<String, Map<String, Double>> entry : lastMonthPurchaseInMapPairMap.entrySet()) {
30235 tejbeer 1106
 
31352 amit.gupta 1107
            String imei = entry.getKey();
1108
            ImeiWiseIncomePairAndMapModel modelImeiMap = new ImeiWiseIncomePairAndMapModel(imei,
1109
                    imeiPurchaseDateMap.get(imei), null);
1110
            imeiWiseIncomeMapOfMap.put(imei, modelImeiMap);
1111
            double totalAmount = entry.getValue().entrySet().stream()
1112
                    .collect(Collectors.summingDouble(x -> x.getValue()));
1113
            imeiWiseIncomeMapOfMap.get(imei).setTotalIncome(totalAmount);
1114
        }
31283 amit.gupta 1115
 
31352 amit.gupta 1116
        for (Map.Entry<String, Map<String, Double>> entry : lastMonthCreditedMapPairMap.entrySet()) {
1117
            Map<String, Double> descriptionAmountMap = entry.getValue();
1118
            if (!imeiWiseIncomeMapOfMap.containsKey(entry.getKey())) {
32232 amit.gupta 1119
                imeiWiseIncomeMapOfMap.put(entry.getKey(), new ImeiWiseIncomePairAndMapModel(entry.getKey(), null, null));
31352 amit.gupta 1120
            }
32232 amit.gupta 1121
            ImeiWiseIncomePairAndMapModel modelImeiMap = imeiWiseIncomeMapOfMap.get(entry.getKey());
1122
            ;
1123
            modelImeiMap.setSaleDate(imeiSaleDateMap.get(entry.getKey()));
30053 manish 1124
 
31352 amit.gupta 1125
            double totalAmount = descriptionAmountMap.entrySet().stream()
1126
                    .collect(Collectors.summingDouble(x -> x.getValue()));
1127
            imeiWiseIncomeMapOfMap.get(entry.getKey())
1128
                    .setTotalIncome(totalAmount + imeiWiseIncomeMapOfMap.get(entry.getKey()).getTotalIncome());
1129
        }
30053 manish 1130
 
31352 amit.gupta 1131
        //Imeis for pending activation
1132
        lastMonthCreditedImeis.stream().filter(x -> x.getStatus().equals(SchemePayoutStatus.PENDING)).forEach(x -> {
1133
            if (!imeiWiseIncomeMapOfMap.containsKey(x.getImei())) {
32232 amit.gupta 1134
                imeiWiseIncomeMapOfMap.put(x.getImei(), new ImeiWiseIncomePairAndMapModel(x.getImei()));
31352 amit.gupta 1135
            }
1136
            ImeiWiseIncomePairAndMapModel imeiWiseIncomePairAndMapModel = imeiWiseIncomeMapOfMap
1137
                    .get(x.getImei());
1138
            imeiWiseIncomePairAndMapModel.setSaleDate(x.getCreateTimeStamp().toLocalDate());
1139
            imeiWiseIncomePairAndMapModel.setTotalIncome(x.getPendingSaleAmount() + imeiWiseIncomePairAndMapModel.getTotalIncome());
1140
        });
30053 manish 1141
 
31379 amit.gupta 1142
        lastMonthFrontEndImeis.stream().forEach(lastMonthFrontEndImeiModel -> {
32232 amit.gupta 1143
            if (!imeiWiseIncomeMapOfMap.containsKey(lastMonthFrontEndImeiModel.getImei())) {
1144
                imeiWiseIncomeMapOfMap.put(lastMonthFrontEndImeiModel.getImei(), new ImeiWiseIncomePairAndMapModel(lastMonthFrontEndImeiModel.getImei()));
31379 amit.gupta 1145
            }
32232 amit.gupta 1146
            ImeiWiseIncomePairAndMapModel imeiWiseIncomePairAndMapModel = imeiWiseIncomeMapOfMap
1147
                    .get(lastMonthFrontEndImeiModel.getImei());
1148
            lastMonthFrontEndImeiModel.setNlc(lastMonthFrontEndImeiModel.getDp()
1149
                    - (float) imeiWiseIncomeMapOfMap.get(lastMonthFrontEndImeiModel.getImei()).getTotalIncome());
1150
            lastMonthFrontEndImeiModel.setNetIncome(lastMonthFrontEndImeiModel.getSellingPrice() - lastMonthFrontEndImeiModel.getNlc());
1151
            imeiWiseIncomePairAndMapModel.setSaleDate(lastMonthFrontEndImeiModel.getCreated());
31379 amit.gupta 1152
        });
1153
 
31352 amit.gupta 1154
        model.addAttribute("imeiWisePendingSaleAmount", imeiWisePendingSaleAmount);
1155
        model.addAttribute("month", month);
1156
        model.addAttribute("purchaseList", purchaseList);
1157
        model.addAttribute("saleList", saleList);
1158
        model.addAttribute("lastMonthPurchaseInMapPairMap", lastMonthPurchaseInMapPairMap);
1159
        model.addAttribute("lastMonthCreditedMapPairMap", lastMonthCreditedMapPairMap);
1160
        model.addAttribute("imeiWiseIncomeMapOfMap", imeiWiseIncomeMapOfMap);
1161
        model.addAttribute("lastmonthCategoryUpgradeMargin", lastmonthCategoryUpgradeMargin);
31379 amit.gupta 1162
        model.addAttribute("soldMap", soldMap);
31352 amit.gupta 1163
        model.addAttribute("allOfferPayoutImeiIncomeModels", allOfferPayoutImeiIncomeModels);
1164
        //model.addAttribute("iimeiSaleDateMap", imeiSaleDateMap);
1165
        //model.addAttribute("imeiPurchaseDateMap", imeiPurchaseDateMap);
30053 manish 1166
 
31352 amit.gupta 1167
        return "last-month-imei-wise-income";
1168
    }
30053 manish 1169
 
31352 amit.gupta 1170
    @RequestMapping(value = "/brandWiseIncome", method = RequestMethod.GET)
1171
    public String getBrandWiseIncome(HttpServletRequest request,
1172
                                     @RequestParam(name = "brand", required = false, defaultValue = "") String brand,
32232 amit.gupta 1173
                                     @RequestParam(name = "month", required = false, defaultValue = "") int month,
1174
                                     Model model)
31352 amit.gupta 1175
            throws ProfitMandiBusinessException {
1176
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1177
        LOGGER.info("loginDetails {}", loginDetails);
1178
        LOGGER.info("brand" + brand);
1179
        LOGGER.info("month {}", month);
30053 manish 1180
 
31352 amit.gupta 1181
        LocalDateTime monthStart = LocalDate.now().minusMonths(month).withDayOfMonth(1).atStartOfDay();
1182
        LocalDateTime monthEnd = monthStart.plusMonths(1);
30053 manish 1183
 
31352 amit.gupta 1184
        List<OfferPayoutImeiIncomeModel> offerPayoutImeiIncomeModels = offerPayoutRepository.getTotalPayoutsByPartnerPeriod(
1185
                YearMonth.of(monthStart.getYear(), monthStart.getMonth()), loginDetails.getFofoId(), brand, null);
32232 amit.gupta 1186
        LOGGER.info("offerPayoutImeiIncomeModels - {}", offerPayoutImeiIncomeModels);
1187
        Map<Integer, Double> additionalPurchasePayout = offerPayoutImeiIncomeModels.stream().filter(x -> x.getPurchasePayout() > 0).collect(Collectors.groupingBy(x -> x.getCatalogId(), Collectors.summingDouble(x -> x.getPurchasePayout())));
1188
        Map<Integer, Integer> additionalPurchaseQty = offerPayoutImeiIncomeModels.stream().filter(x -> x.getPurchasePayout() > 0).collect(Collectors.groupingBy(x -> x.getCatalogId(), Collectors.summingInt(x -> 1)));
1189
        Map<Integer, Double> additionalSalePayoutMap = offerPayoutImeiIncomeModels.stream().filter(x -> x.getSalePayout() > 0).collect(Collectors.groupingBy(x -> x.getCatalogId(), Collectors.summingDouble(x -> x.getSalePayout())));
1190
        Map<Integer, Integer> additionalSaleQty = offerPayoutImeiIncomeModels.stream().filter(x -> x.getSalePayout() > 0).collect(Collectors.groupingBy(x -> x.getCatalogId(), Collectors.summingInt(x -> 1)));
30053 manish 1191
 
32232 amit.gupta 1192
        Set<Integer> allCatalogIds = offerPayoutImeiIncomeModels.stream().map(x -> x.getCatalogId()).collect(Collectors.toSet());
31352 amit.gupta 1193
        boolean partnerTypeUpgraded = partnerTypeChangeService.isPartnerTypeUpgraded(loginDetails.getFofoId(),
1194
                YearMonth.now());
30053 manish 1195
 
31352 amit.gupta 1196
        LOGGER.info("partnerType" + partnerTypeUpgraded);
30053 manish 1197
 
31352 amit.gupta 1198
        Map<String, Double> categoryUpgradeBrandModelMap = null;
1199
        if (partnerTypeUpgraded) {
1200
            categoryUpgradeBrandModelMap = schemeInOutRepository
1201
                    .selectLastMonthCategoryUpgradeMarginByBrandModel(loginDetails.getFofoId(), brand, monthStart,
1202
                            monthEnd)
1203
                    .stream().collect(Collectors.toMap(x -> x.getBrand(), x -> x.getAmount()));
1204
        }
30053 manish 1205
 
31352 amit.gupta 1206
        List<LastMonthFrontEndBrandWiseIncome> modelWiseSalesMargins = schemeInOutRepository
1207
                .selectFrontIncomeBrandWise(loginDetails.getFofoId(), brand, monthStart, monthEnd);
32232 amit.gupta 1208
        Map<Integer, LastMonthFrontEndBrandWiseIncome> modelWiseSalesMarginsMap = modelWiseSalesMargins.stream().collect(Collectors.toMap(x -> x.getCatalogItemId(), x -> x));
30053 manish 1209
 
32232 amit.gupta 1210
 
31352 amit.gupta 1211
        List<LastMonthBrandWiseIncomeModel> modelWiseSchemeOutMargins = schemeInOutRepository
1212
                .selectLastMonthBrandWiseIncome(loginDetails.getFofoId(), brand, monthStart, monthEnd);
1213
        Map<Integer, LastMonthBrandWiseIncomeModel> modelWiseSchemeOutMarginsMap = modelWiseSchemeOutMargins.stream()
1214
                .collect(Collectors.toMap(x -> x.getCatalogItemId(), x -> x));
30053 manish 1215
 
31352 amit.gupta 1216
        List<LastMonthBrandWiseIncomeModel> modelWiseSchemeInMargins = schemeInOutRepository
1217
                .selectLastMonthPurchaseBrandWiseIncome(loginDetails.getFofoId(), brand, monthStart, monthEnd);
1218
        Map<Integer, LastMonthBrandWiseIncomeModel> modelWiseSchemeInMarginsMap = modelWiseSchemeInMargins.stream()
1219
                .collect(Collectors.toMap(x -> x.getCatalogItemId(), x -> x));
30053 manish 1220
 
32232 amit.gupta 1221
        allCatalogIds.addAll(modelWiseSalesMargins.stream().map(x -> x.getCatalogItemId()).collect(Collectors.toSet()));
1222
        allCatalogIds.addAll(modelWiseSchemeInMargins.stream().map(x -> x.getCatalogItemId()).collect(Collectors.toSet()));
1223
        allCatalogIds.addAll(modelWiseSchemeOutMargins.stream().map(x -> x.getCatalogItemId()).collect(Collectors.toSet()));
30053 manish 1224
 
32232 amit.gupta 1225
        Map<Integer, String> modelNameMap = itemRepository.selectAllByCatalogIds(allCatalogIds).stream().collect(Collectors.toMap(x -> x.getCatalogItemId(), x -> x.getModel(), (u, v) -> u));
1226
        Map<Integer, Double> modelIncomeMap = new HashMap<>();
1227
        Map<Integer, Integer> modelPurchaseQtyMap = new HashMap<>();
1228
        Map<Integer, Integer> modelSaleQtyMap = new HashMap<>();
1229
        for (int catalogItemId : modelNameMap.keySet()) {
1230
            int saleQty = 0;
1231
            int purchaseQty = 0;
1232
            double income = 0;
30253 amit.gupta 1233
 
32232 amit.gupta 1234
            if (modelWiseSchemeInMarginsMap.containsKey(catalogItemId)) {
1235
                income += modelWiseSchemeInMarginsMap.get(catalogItemId).getAmount() + modelWiseSchemeInMarginsMap.get(catalogItemId).getPendingSaleAmount();
1236
                purchaseQty += modelWiseSchemeInMarginsMap.get(catalogItemId).getQty();
31352 amit.gupta 1237
            }
32232 amit.gupta 1238
            if (modelWiseSchemeOutMarginsMap.containsKey(catalogItemId)) {
1239
                income += modelWiseSchemeOutMarginsMap.get(catalogItemId).getAmount() + modelWiseSchemeOutMarginsMap.get(catalogItemId).getPendingSaleAmount();
31352 amit.gupta 1240
            }
32232 amit.gupta 1241
            if (additionalSalePayoutMap.containsKey(catalogItemId)) {
1242
                income += additionalSalePayoutMap.get(catalogItemId);
31352 amit.gupta 1243
            }
32232 amit.gupta 1244
            if (additionalPurchasePayout.containsKey(catalogItemId)) {
1245
                income += additionalPurchasePayout.get(catalogItemId);
1246
            }
1247
            if (modelWiseSalesMarginsMap.containsKey(catalogItemId)) {
1248
                income += modelWiseSalesMarginsMap.get(catalogItemId).getAmount();
1249
                saleQty = (int) modelWiseSalesMarginsMap.get(catalogItemId).getQty();
1250
            }
1251
            if (additionalPurchaseQty.containsKey(catalogItemId)) {
1252
                purchaseQty = Math.max(additionalPurchaseQty.get(catalogItemId), purchaseQty);
30253 amit.gupta 1253
 
31352 amit.gupta 1254
            }
32232 amit.gupta 1255
            modelIncomeMap.put(catalogItemId, income);
1256
            modelSaleQtyMap.put(catalogItemId, saleQty);
1257
            modelPurchaseQtyMap.put(catalogItemId, purchaseQty);
30253 amit.gupta 1258
 
32232 amit.gupta 1259
        }
30253 amit.gupta 1260
 
31352 amit.gupta 1261
        model.addAttribute("month", month);
32232 amit.gupta 1262
        model.addAttribute("modelWiseSalesMarginsMap", modelWiseSalesMarginsMap);
31352 amit.gupta 1263
        model.addAttribute("modelWiseSchemeOutMarginsMap", modelWiseSchemeOutMarginsMap);
1264
        model.addAttribute("modelWiseSchemeInMarginsMap", modelWiseSchemeInMarginsMap);
1265
        model.addAttribute("modelNameMap", modelNameMap);
32232 amit.gupta 1266
        model.addAttribute("modelPurchaseQtyMap", modelPurchaseQtyMap);
1267
        model.addAttribute("modelSaleQtyMap", modelSaleQtyMap);
1268
        model.addAttribute("modelIncomeMap", modelIncomeMap);
31352 amit.gupta 1269
        model.addAttribute("categoryUpgradeBrandModelMap", categoryUpgradeBrandModelMap);
1270
        model.addAttribute("additionalPurchasePayoutMap", additionalPurchasePayout);
32232 amit.gupta 1271
        model.addAttribute("additionalSalePayoutMap", additionalSalePayoutMap);
30253 amit.gupta 1272
 
31352 amit.gupta 1273
        return "monthly-brand-wise-income";
30053 manish 1274
 
31352 amit.gupta 1275
    }
30053 manish 1276
 
31352 amit.gupta 1277
    @RequestMapping(value = "/monthWisePartnerIncome/{yearMonth}", method = RequestMethod.GET)
1278
    public String publishedOffersOnMonthBefore(HttpServletRequest request, @PathVariable int yearMonth, Model model)
1279
            throws ProfitMandiBusinessException {
1280
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
30253 amit.gupta 1281
 
31352 amit.gupta 1282
        LocalDateTime startOfMonth = LocalDate.now().minusMonths(yearMonth).withDayOfMonth(1).atStartOfDay();
1283
        LocalDateTime lastMonthEnd = startOfMonth.plusMonths(1);
30253 amit.gupta 1284
 
31352 amit.gupta 1285
        YearMonth monthYear = YearMonth.now();
30053 manish 1286
 
31352 amit.gupta 1287
        boolean partnerType = partnerTypeChangeService.isPartnerTypeUpgraded(loginDetails.getFofoId(), monthYear);
30053 manish 1288
 
31352 amit.gupta 1289
        LOGGER.info("partnerType" + partnerType);
30053 manish 1290
 
31352 amit.gupta 1291
        Map<String, Double> lastMonthCategoryUpgradeMarginMap = new HashMap<>();
30053 manish 1292
 
31352 amit.gupta 1293
        if (partnerType) {
1294
            lastMonthCategoryUpgradeMarginMap = schemeInOutRepository
1295
                    .selectLastMonthCategoryUpgradeMarginByBrand(loginDetails.getFofoId(), startOfMonth,
1296
                            lastMonthEnd)
1297
                    .stream().collect(Collectors.toMap(x -> x.getBrand(), x -> x.getAmount()));
1298
        }
30053 manish 1299
 
31352 amit.gupta 1300
        List<LastMonthCreditedIncomeModel> lastMonthPendingIncomeModels = schemeInOutRepository
1301
                .selectLastMonthPendingIncomeByFofoId(loginDetails.getFofoId(), startOfMonth, lastMonthEnd);
30053 manish 1302
 
31352 amit.gupta 1303
        List<LastMonthCreditedIncomeModel> lastMonthCreditedIncomeModels = schemeInOutRepository
1304
                .selectLastMonthCreditedIncomeByFofoId(loginDetails.getFofoId(), startOfMonth, lastMonthEnd);
30235 tejbeer 1305
 
31352 amit.gupta 1306
        List<LastMonthCreditedIncomeModel> lastMonthPurchaseInMargins = schemeInOutRepository
1307
                .selectLastMonthPurchaseInMarginByFofoId(loginDetails.getFofoId(), startOfMonth, lastMonthEnd);
30235 tejbeer 1308
 
31352 amit.gupta 1309
        List<LastMonthCreditedIncomeModel> lastMonthFrontEndIncomes = schemeInOutRepository
1310
                .selectFrontIncomeByBrand(loginDetails.getFofoId(), startOfMonth, lastMonthEnd);
32232 amit.gupta 1311
        Map<String, LastMonthCreditedIncomeModel> lastMonthFrontEndIncomeMap = lastMonthFrontEndIncomes.stream().collect(Collectors.toMap(x -> x.getBrand(), x -> x));
30235 tejbeer 1312
 
31352 amit.gupta 1313
        List<OfferPayoutImeiIncomeModel> offerPayoutImeiIncomeModels = offerPayoutRepository.getTotalPayoutsByPartnerPeriod(
1314
                YearMonth.of(startOfMonth.getYear(), startOfMonth.getMonth()), loginDetails.getFofoId(), null, null);
30235 tejbeer 1315
 
31352 amit.gupta 1316
        Map<String, Double> additionalPurchasePayout = offerPayoutImeiIncomeModels.stream().collect(Collectors.groupingBy(OfferPayoutImeiIncomeModel::getBrand, Collectors.summingDouble(OfferPayoutImeiIncomeModel::getPurchasePayout)));
1317
        Map<String, Double> additionSalePayout = offerPayoutImeiIncomeModels.stream().collect(Collectors.groupingBy(OfferPayoutImeiIncomeModel::getBrand, Collectors.summingDouble(OfferPayoutImeiIncomeModel::getSalePayout)));
30235 tejbeer 1318
 
1319
 
31352 amit.gupta 1320
        Map<String, LastMonthCreditedIncomeModel> lastMonthPurchaseInMarginMap = lastMonthPurchaseInMargins.stream()
1321
                .collect(Collectors.toMap(x -> x.getBrand(), x -> x));
30053 manish 1322
 
31352 amit.gupta 1323
        Map<String, LastMonthCreditedIncomeModel> lastMonthSaleMarginMap = lastMonthCreditedIncomeModels.stream()
1324
                .collect(Collectors.toMap(x -> x.getBrand(), x -> x));
30053 manish 1325
 
1326
 
31352 amit.gupta 1327
        Map<String, LastMonthCreditedIncomeModel> lastMonthPendingIncomeMap = lastMonthPendingIncomeModels.stream()
1328
                .collect(Collectors.toMap(x -> x.getBrand(), x -> x));
30053 manish 1329
 
31352 amit.gupta 1330
        Map<String, Float> totalAmountMap = lastMonthSaleMarginMap.entrySet().stream()
1331
                .collect(Collectors.toMap(x -> x.getKey(), x -> x.getValue().getAmount()));
1332
        Set<String> brandSet = new HashSet<>();
1333
        brandSet.addAll(lastMonthPurchaseInMarginMap.keySet());
1334
        brandSet.addAll(lastMonthSaleMarginMap.keySet());
1335
        brandSet.addAll(lastMonthPendingIncomeMap.keySet());
1336
        brandSet.addAll(additionalPurchasePayout.keySet());
1337
        brandSet.addAll(additionSalePayout.keySet());
33313 amit.gupta 1338
        brandSet.addAll(lastMonthFrontEndIncomeMap.keySet());
31352 amit.gupta 1339
        brandSet.stream().forEach(brand -> {
1340
            totalAmountMap.put(brand,
1341
                    (lastMonthSaleMarginMap.get(brand) == null ? 0 : lastMonthSaleMarginMap.get(brand).getAmount()) +
1342
                            (lastMonthPurchaseInMarginMap.get(brand) == null ? 0 : lastMonthPurchaseInMarginMap.get(brand).getAmount()) +
1343
                            (lastMonthPendingIncomeMap.get(brand) == null ? 0 : lastMonthPendingIncomeMap.get(brand).getAmount()) +
1344
                            (additionalPurchasePayout.get(brand) == null ? 0 : additionalPurchasePayout.get(brand).longValue()) +
32232 amit.gupta 1345
                            (additionSalePayout.get(brand) == null ? 0 : additionSalePayout.get(brand).longValue()) +
1346
                            (lastMonthFrontEndIncomeMap.get(brand) == null ? 0 : lastMonthFrontEndIncomeMap.get(brand).getAmount())
31352 amit.gupta 1347
            );
1348
        });
30053 manish 1349
 
31352 amit.gupta 1350
        Map<Integer, String> monthValueMap = new HashMap<>();
1351
        for (int i = 0; i <= 5; i++) {
1352
            LocalDateTime monthStart = LocalDateTime.now().withDayOfMonth(1).minusMonths(i);
1353
            monthValueMap.put(i, monthStart.format(DateTimeFormatter.ofPattern("MMM''uu")));
1354
        }
1355
        model.addAttribute("monthValueMap", monthValueMap);
30053 manish 1356
 
32232 amit.gupta 1357
        model.addAttribute("brandSet", brandSet);
31352 amit.gupta 1358
        model.addAttribute("lastMonthPurchaseInMarginMap", lastMonthPurchaseInMarginMap);
1359
        model.addAttribute("lastMonthSaleMarginMap", lastMonthSaleMarginMap);
1360
        model.addAttribute("lastMonthPendingIncomeMap", lastMonthPendingIncomeMap);
1361
        model.addAttribute("additionalPurchasePayoutMap", additionalPurchasePayout);
1362
        model.addAttribute("additionalSalePayoutMap", additionSalePayout);
32232 amit.gupta 1363
        model.addAttribute("lastMonthFrontEndIncomeMap", lastMonthFrontEndIncomeMap);
30053 manish 1364
 
31352 amit.gupta 1365
        model.addAttribute("totalAmountMap", totalAmountMap);
1366
        model.addAttribute("month", yearMonth);
1367
        model.addAttribute("lastMonthCategoryUpgradeMarginMap", lastMonthCategoryUpgradeMarginMap);
1368
        LOGGER.info("totalAmountMap {}", totalAmountMap);
1369
        LOGGER.info("lastMonthSaleMarginMap {}", lastMonthSaleMarginMap);
30253 amit.gupta 1370
 
31352 amit.gupta 1371
        return "last-month-credited-income";
1372
    }
30253 amit.gupta 1373
 
31352 amit.gupta 1374
    @RequestMapping(value = "/schemes/downloadPage", method = RequestMethod.GET)
1375
    public String downloadPage(HttpServletRequest request, Model model) {
1376
        return "schemes-download";
1377
    }
30253 amit.gupta 1378
 
31352 amit.gupta 1379
    @RequestMapping(value = "/schemes/download", method = RequestMethod.GET)
1380
    public ResponseEntity<?> downloadInventoryItemAgingByInterval(HttpServletRequest request,
1381
                                                                  @RequestParam LocalDateTime startDateTime, @RequestParam LocalDateTime endDateTime)
1382
            throws ProfitMandiBusinessException {
30253 amit.gupta 1383
 
31352 amit.gupta 1384
        List<SchemeModel> schemeModels = schemeService.getAllSchemeModels(startDateTime, endDateTime);
31334 amit.gupta 1385
 
31352 amit.gupta 1386
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
1387
        ExcelUtils.writeSchemeModels(schemeModels, byteArrayOutputStream);
30253 amit.gupta 1388
 
31352 amit.gupta 1389
        final HttpHeaders headers = new HttpHeaders();
1390
        headers.set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
1391
        headers.set("Content-disposition", "inline; filename=SchemesReport.xlsx");
1392
        headers.setContentLength(byteArrayOutputStream.toByteArray().length);
1393
        final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
1394
        final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
1395
        return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
1396
    }
30053 manish 1397
 
31352 amit.gupta 1398
    @RequestMapping(value = "/getSchemeById", method = RequestMethod.GET)
1399
    public String getSchemeById(HttpServletRequest request,
1400
                                @RequestParam(name = ProfitMandiConstants.SCHEME_ID) int schemeId, Model model)
1401
            throws ProfitMandiBusinessException {
1402
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
30053 manish 1403
 
31352 amit.gupta 1404
        boolean fullAccess = this.getAccess(loginDetails.getEmailId());
1405
        Scheme scheme = schemeService.getSchemeById(schemeId);
1406
        model.addAttribute("fullAccess", fullAccess);
1407
        model.addAttribute("scheme", scheme);
1408
        model.addAttribute("isAdmin", roleManager.isAdmin(loginDetails.getRoleIds()));
1409
        return "scheme-details";
1410
    }
30053 manish 1411
 
31352 amit.gupta 1412
    @RequestMapping(value = "/activeSchemeById", method = RequestMethod.PUT)
1413
    public String activeSchemeById(@RequestParam(name = ProfitMandiConstants.SCHEME_ID) int schemeId,
1414
                                   @RequestParam(name = "offset", defaultValue = "0") int offset,
1415
                                   @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
1416
            throws ProfitMandiBusinessException {
1417
        schemeService.activeSchemeById(schemeId);
1418
        List<Scheme> schemes = schemeRepository.selectAll(offset, limit);
1419
        for (Scheme scheme : schemes) {
1420
            if (scheme.getAmountType().equals(AmountType.PERCENTAGE)) {
1421
                scheme.setAmountModel(scheme.getAmount() + "%");
1422
            } else {
1423
                scheme.setAmountModel(scheme.getAmount() + "");
1424
            }
1425
        }
1426
        return "schemes";
1427
    }
30053 manish 1428
 
31352 amit.gupta 1429
    @RequestMapping(value = "/expireSchemeById", method = RequestMethod.PUT)
1430
    public String expireSchemeById(HttpServletRequest request,
1431
                                   @RequestParam(name = ProfitMandiConstants.SCHEME_ID) int schemeId,
1432
                                   @RequestParam(name = ProfitMandiConstants.EXPIRE_TIMESTAMP) LocalDateTime expiryTimestamp, Model model)
1433
            throws ProfitMandiBusinessException {
1434
        schemeService.expireSchemeById(schemeId, expiryTimestamp);
1435
        return getDefaultSchemes(request, model);
1436
    }
30053 manish 1437
 
31352 amit.gupta 1438
    @RequestMapping(value = "/getSchemesJson", method = RequestMethod.GET)
1439
    public ResponseEntity<?> getSchemesJson(HttpServletRequest request,
1440
                                            @RequestParam(name = "offset", defaultValue = "0") int offset,
1441
                                            @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
1442
            throws ProfitMandiBusinessException {
1443
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1444
        return responseSender.ok(schemeService.getSchemes(loginDetails.getRoleIds(), offset, limit));
1445
    }
30053 manish 1446
 
31352 amit.gupta 1447
    @RequestMapping(value = "/getCustomerOffer", method = RequestMethod.GET)
1448
    public String getCustomerOffer(HttpServletRequest request,
33795 ranu 1449
                                   @RequestParam(name = "searchModel", required = false, defaultValue = "0") int searchModel, @RequestParam(name = "startDate", required = false) LocalDateTime startDate, @RequestParam(name = "endDate", required = false) LocalDateTime endDate, Model model)
31352 amit.gupta 1450
            throws ProfitMandiBusinessException {
1451
        List<CustomerOffer> customerOffers = null;
1452
        if (searchModel > 0) {
30053 manish 1453
 
31352 amit.gupta 1454
            Item item = itemRepository.selectAllByCatalogItemId(searchModel).get(0);
1455
            customerOffers = customerOfferRepository.selectActiveOfferByModel(searchModel, LocalDate.now());
1456
            model.addAttribute("modelName", item.getItemDescriptionNoColor());
33795 ranu 1457
        } else if (startDate != null && endDate != null) {
1458
            customerOffers = customerOfferRepository.selectOffersByDates(startDate, endDate);
31352 amit.gupta 1459
        } else {
33795 ranu 1460
            if (startDate == null) {
1461
                startDate = LocalDateTime.now().minusMonths(1);  // One month ago from today
1462
            }
1463
            if (endDate == null) {
1464
                endDate = LocalDateTime.now();  // Current date and time
1465
            }
1466
            customerOffers = customerOfferRepository.selectOffersByDates(startDate, endDate);
31352 amit.gupta 1467
        }
30053 manish 1468
 
31352 amit.gupta 1469
        LOGGER.info("customerOffers" + customerOffers);
30053 manish 1470
 
31352 amit.gupta 1471
        for (CustomerOffer customerOffer : customerOffers) {
30053 manish 1472
 
31352 amit.gupta 1473
            LOGGER.info("ss" + searchModel);
30053 manish 1474
 
31352 amit.gupta 1475
            if (!StringUtils.isEmpty(customerOffer.getPartnerCriteria())) {
33030 amit.gupta 1476
                String partnerCriteria = offerService.getPartnerCriteriaString(gson.fromJson(customerOffer.getPartnerCriteria(), PartnerCriteria.class));
31352 amit.gupta 1477
                customerOffer.setPartnerCriteriaString(partnerCriteria);
1478
            }
30053 manish 1479
 
31352 amit.gupta 1480
        }
30053 manish 1481
 
31352 amit.gupta 1482
        List<Integer> fofoIds = fofoStoreRepository.selectActiveStores().stream().map(x -> x.getId())
1483
                .collect(Collectors.toList());
31281 amit.gupta 1484
 
31352 amit.gupta 1485
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
30053 manish 1486
 
31352 amit.gupta 1487
        Map<Integer, CustomRetailer> customRetailersMap = fofoIds.stream().map(x -> customRetailerMap.get(x))
1488
                .filter(x -> x != null).collect(Collectors.toList()).stream()
1489
                .collect(Collectors.toMap(x -> x.getPartnerId(), x -> x));
30053 manish 1490
 
31352 amit.gupta 1491
        model.addAttribute("customRetailersMap", customRetailersMap);
1492
        model.addAttribute("warehouseRegion", ProfitMandiConstants.WAREHOUSE_MAP);
1493
        model.addAttribute("searchModel", searchModel);
30053 manish 1494
 
31352 amit.gupta 1495
        model.addAttribute("customerOffers", customerOffers);
1496
        return "customer-offer";
30053 manish 1497
 
31352 amit.gupta 1498
    }
30053 manish 1499
 
31352 amit.gupta 1500
    @RequestMapping(value = "/createCustomerOffer", method = RequestMethod.POST)
1501
    public String createCustomerOffer(HttpServletRequest request, @RequestBody CustomerOfferModel customerOfferModel,
1502
                                      Model model) throws Exception {
30053 manish 1503
 
31352 amit.gupta 1504
        CustomerOffer co = new CustomerOffer();
1505
        co.setOfferName(customerOfferModel.getOfferName());
1506
        co.setStartDate(customerOfferModel.getStartDate());
1507
        co.setEndDate(customerOfferModel.getEndDate());
1508
        co.setPartnerCriteria(gson.toJson(customerOfferModel.getPartnerCriteria()));
1509
        co.setCreatedTimestamp(LocalDateTime.now());
1510
        co.setUpdatedTimestamp(LocalDateTime.now());
1511
        customerOfferRepository.persist(co);
31281 amit.gupta 1512
 
31352 amit.gupta 1513
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
31281 amit.gupta 1514
 
31352 amit.gupta 1515
        return "response";
30053 manish 1516
 
31352 amit.gupta 1517
    }
30053 manish 1518
 
31352 amit.gupta 1519
    @RequestMapping(value = "/customerOffer/downloadTemplate", method = RequestMethod.GET)
1520
    public ResponseEntity<?> downloadCustomerOfferTemplate(HttpServletRequest request) throws Exception {
1521
        List<List<?>> rows = new ArrayList<>();
30053 manish 1522
 
31352 amit.gupta 1523
        org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil.getCSVByteStream(Arrays.asList("id",
33795 ranu 1524
                        "Catalog Id", "Scheme Payout", "Dealer Payout", "Start Date (dd-mm-yyyy)", "End Date (dd-mm-yyyy)", "Offer Type"),
31352 amit.gupta 1525
                rows);
30053 manish 1526
 
31352 amit.gupta 1527
        final HttpHeaders headers = new HttpHeaders();
1528
        headers.set("Content-Type", "text/csv");
1529
        headers.set("Content-disposition", "inline; filename=customer-offer-template.csv");
1530
        headers.setContentLength(baos.toByteArray().length);
30053 manish 1531
 
31352 amit.gupta 1532
        final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
1533
        final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
1534
        return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
30053 manish 1535
 
31352 amit.gupta 1536
    }
30053 manish 1537
 
31352 amit.gupta 1538
    @RequestMapping(value = "/customerOfferItem/upload", method = RequestMethod.POST)
1539
    public String uploadCustomerOfferItem(HttpServletRequest request, Model model, @RequestParam int offerId,
1540
                                          HttpServletResponse response, @RequestPart MultipartFile file) throws Throwable {
23786 amit.gupta 1541
 
31352 amit.gupta 1542
        List<CSVRecord> records = FileUtil.readFile(file);
1543
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
23914 govind 1544
 
31352 amit.gupta 1545
        CustomerOffer customerOffer = customerOfferRepository.selectById(offerId);
1546
        List<Integer> catalogIds = new ArrayList<>();
1547
        for (CSVRecord record : records) {
23786 amit.gupta 1548
 
31352 amit.gupta 1549
            CustomerOfferItem coi = customerOfferItemRepository.selectById(Integer.parseInt(record.get(0)));
23786 amit.gupta 1550
 
31352 amit.gupta 1551
            if (coi == null) {
1552
                coi = new CustomerOfferItem();
1553
                coi.setCatalogId(Integer.parseInt(record.get(1)));
1554
                coi.setSchemePayout(Integer.parseInt(record.get(2)));
1555
                coi.setDealerPayout(Integer.parseInt(record.get(3)));
33795 ranu 1556
                coi.setOfferType(OfferType.valueOf(record.get(6)));
31352 amit.gupta 1557
                coi.setCustomerOfferId(offerId);
1558
                coi.setCreatedTimestamp(LocalDateTime.now());
23786 amit.gupta 1559
 
31352 amit.gupta 1560
                customerOfferItemRepository.persist(coi);
29899 tejbeer 1561
 
31352 amit.gupta 1562
            }
1563
            coi.setSchemePayout(Integer.parseInt(record.get(2)));
1564
            coi.setDealerPayout(Integer.parseInt(record.get(3)));
33795 ranu 1565
            coi.setOfferType(OfferType.valueOf(record.get(6)));
31352 amit.gupta 1566
            coi.setCustomerOfferId(offerId);
1567
            coi.setUpdatedTimestamp(LocalDateTime.now());
23786 amit.gupta 1568
 
31352 amit.gupta 1569
            LOGGER.info(record.get(4));
23786 amit.gupta 1570
 
31352 amit.gupta 1571
            LocalDate startDate = LocalDate.parse(record.get(4), formatter);
1572
            LocalDate endDate = LocalDate.parse(record.get(5), formatter);
23786 amit.gupta 1573
 
31352 amit.gupta 1574
            if ((startDate.equals(customerOffer.getStartDate().toLocalDate())
1575
                    || startDate.isAfter(customerOffer.getStartDate().toLocalDate()))
1576
                    && (startDate.isEqual(customerOffer.getEndDate().toLocalDate())
1577
                    || startDate.isBefore(customerOffer.getEndDate().toLocalDate()))) {
1578
                coi.setStartDate(startDate);
26802 tejbeer 1579
 
31352 amit.gupta 1580
            } else {
29707 tejbeer 1581
 
31352 amit.gupta 1582
                catalogIds.add(coi.getCatalogId());
1583
            }
29707 tejbeer 1584
 
31352 amit.gupta 1585
            if ((endDate.equals(customerOffer.getStartDate().toLocalDate())
1586
                    || endDate.isAfter(customerOffer.getStartDate().toLocalDate()))
1587
                    && (endDate.isEqual(customerOffer.getEndDate().toLocalDate())
1588
                    || endDate.isBefore(customerOffer.getEndDate().toLocalDate()))) {
31147 tejbeer 1589
 
31352 amit.gupta 1590
                coi.setEndDate(endDate);
31147 tejbeer 1591
 
31352 amit.gupta 1592
            } else {
1593
                catalogIds.add(coi.getCatalogId());
1594
            }
31147 tejbeer 1595
 
31352 amit.gupta 1596
        }
31147 tejbeer 1597
 
31352 amit.gupta 1598
        if (!catalogIds.isEmpty()) {
1599
            throw new ProfitMandiBusinessException("Please set accurate start and end date", catalogIds,
1600
                    "Please set accurate start and end date");
1601
        }
1602
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
31147 tejbeer 1603
 
31352 amit.gupta 1604
        return "response";
31147 tejbeer 1605
 
31352 amit.gupta 1606
    }
31147 tejbeer 1607
 
31352 amit.gupta 1608
    @RequestMapping(value = "/addCustomerOfferItem", method = RequestMethod.POST)
1609
    public String addCustomerOfferItem(HttpServletRequest request,
1610
                                       @RequestBody CustomerOfferItemModel customerOfferItemModel, Model model) throws Throwable {
31147 tejbeer 1611
 
31352 amit.gupta 1612
        CustomerOffer customerOffer = customerOfferRepository.selectById(customerOfferItemModel.getOfferId());
31147 tejbeer 1613
 
31352 amit.gupta 1614
        if (!(customerOffer.getEndDate().toLocalDate().equals(LocalDate.now()))
1615
                && customerOffer.getEndDate().isBefore(LocalDateTime.now())) {
1616
            throw new ProfitMandiBusinessException("Catalog Id", customerOffer.getOfferName(), "Offer is Expired");
29707 tejbeer 1617
 
31352 amit.gupta 1618
        }
29707 tejbeer 1619
 
31352 amit.gupta 1620
        List<CustomerOfferItem> customerOfferItems = customerOfferItemRepository
1621
                .selectByOfferAndCatalogId(customerOfferItemModel.getOfferId(), customerOfferItemModel.getCatalogId());
29707 tejbeer 1622
 
31352 amit.gupta 1623
        if (!customerOfferItems.isEmpty()) {
29707 tejbeer 1624
 
31352 amit.gupta 1625
            for (CustomerOfferItem coi : customerOfferItems) {
1626
                if (!(coi.getEndDate().equals(LocalDate.now())) && coi.getEndDate().isAfter(LocalDate.now())) {
1627
                    throw new ProfitMandiBusinessException("Catalog Id", coi.getCatalogId(), "Item is already exist.");
1628
                }
1629
            }
29707 tejbeer 1630
 
31352 amit.gupta 1631
        }
29707 tejbeer 1632
 
31352 amit.gupta 1633
        LocalDate startDate = customerOfferItemModel.getStartDate().toLocalDate();
1634
        LocalDate endDate = customerOfferItemModel.getEndDate().toLocalDate();
1635
        CustomerOfferItem coi = new CustomerOfferItem();
1636
        coi.setCatalogId(customerOfferItemModel.getCatalogId());
1637
        coi.setSchemePayout(customerOfferItemModel.getSchemePayout());
1638
        coi.setDealerPayout(customerOfferItemModel.getDealerPayout());
33795 ranu 1639
        coi.setOfferType(customerOfferItemModel.getOfferType());
31352 amit.gupta 1640
        coi.setCustomerOfferId(customerOfferItemModel.getOfferId());
1641
        coi.setUpdatedTimestamp(LocalDateTime.now());
1642
        coi.setCreatedTimestamp(LocalDateTime.now());
29707 tejbeer 1643
 
31352 amit.gupta 1644
        if ((startDate.equals(customerOffer.getStartDate().toLocalDate())
1645
                || startDate.isAfter(customerOffer.getStartDate().toLocalDate()))
1646
                && (startDate.isEqual(customerOffer.getEndDate().toLocalDate())
1647
                || startDate.isBefore(customerOffer.getEndDate().toLocalDate()))) {
29707 tejbeer 1648
 
31352 amit.gupta 1649
            coi.setStartDate(startDate);
29707 tejbeer 1650
 
31352 amit.gupta 1651
        } else {
29707 tejbeer 1652
 
31352 amit.gupta 1653
            throw new ProfitMandiBusinessException("Catalog Id", customerOffer.getOfferName(),
1654
                    "Please select accurate duration between " + customerOffer.getStartDate().toLocalDate() + " - "
1655
                            + customerOffer.getEndDate());
29707 tejbeer 1656
 
31352 amit.gupta 1657
        }
29707 tejbeer 1658
 
31352 amit.gupta 1659
        if ((endDate.equals(customerOffer.getStartDate().toLocalDate())
1660
                || endDate.isAfter(customerOffer.getStartDate().toLocalDate()))
1661
                && (endDate.isEqual(customerOffer.getEndDate().toLocalDate())
1662
                || endDate.isBefore(customerOffer.getEndDate().toLocalDate()))) {
29707 tejbeer 1663
 
31352 amit.gupta 1664
            coi.setEndDate(endDate);
29707 tejbeer 1665
 
31352 amit.gupta 1666
        } else {
1667
            throw new ProfitMandiBusinessException("Catalog Id", customerOffer.getOfferName(),
1668
                    "Please select accurate duration between " + customerOffer.getStartDate().toLocalDate() + " - "
1669
                            + customerOffer.getEndDate());
1670
        }
31147 tejbeer 1671
 
31352 amit.gupta 1672
        customerOfferItemRepository.persist(coi);
31147 tejbeer 1673
 
31352 amit.gupta 1674
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
31147 tejbeer 1675
 
31352 amit.gupta 1676
        return "response";
29707 tejbeer 1677
 
31352 amit.gupta 1678
    }
31147 tejbeer 1679
 
31352 amit.gupta 1680
    @RequestMapping(value = "/customerOfferItem/download", method = RequestMethod.GET)
1681
    public ResponseEntity<?> downloadOfferItem(HttpServletRequest request, @RequestParam int offerId) throws Exception {
31147 tejbeer 1682
 
31352 amit.gupta 1683
        List<CustomerOfferItem> cois = customerOfferItemRepository.selectByOfferId(offerId);
1684
        List<List<?>> rows = new ArrayList<>();
1685
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
31147 tejbeer 1686
 
31352 amit.gupta 1687
        for (CustomerOfferItem coi : cois) {
1688
            rows.add(Arrays.asList(coi.getId(), coi.getCatalogId(), coi.getSchemePayout(), coi.getDealerPayout(),
33795 ranu 1689
                    coi.getStartDate().format(formatter), coi.getEndDate().format(formatter), coi.getOfferType()));
31147 tejbeer 1690
 
31352 amit.gupta 1691
        }
31147 tejbeer 1692
 
31352 amit.gupta 1693
        org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
33795 ranu 1694
                Arrays.asList("id", "Catalog Id", "Scheme Payout", "Dealer Payout", "Start Date", "End Date", "Offer Type"), rows);
29707 tejbeer 1695
 
31352 amit.gupta 1696
        final HttpHeaders headers = new HttpHeaders();
1697
        headers.set("Content-Type", "text/csv");
1698
        headers.set("Content-disposition", "inline; filename=customer-offer-template.csv");
1699
        headers.setContentLength(baos.toByteArray().length);
31147 tejbeer 1700
 
31352 amit.gupta 1701
        final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
1702
        final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
1703
        return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
31147 tejbeer 1704
 
31352 amit.gupta 1705
    }
31147 tejbeer 1706
 
31352 amit.gupta 1707
    @RequestMapping(value = "/getCustomerOfferItem", method = RequestMethod.GET)
1708
    public String getCustomerOfferItem(HttpServletRequest request, @RequestParam int offerId, Model model)
1709
            throws Exception {
29707 tejbeer 1710
 
31352 amit.gupta 1711
        List<CustomerOfferItem> customerOfferItems = customerOfferItemRepository.selectByOfferId(offerId);
1712
        List<Integer> catalogIds = customerOfferItems.stream().map(x -> x.getCatalogId()).collect(Collectors.toList());
29707 tejbeer 1713
 
31352 amit.gupta 1714
        Map<Integer, List<Item>> catalogItemMap = itemRepository.selectAllByCatalogIds(new HashSet<>(catalogIds))
1715
                .stream().collect(Collectors.groupingBy(x -> x.getCatalogItemId()));
29707 tejbeer 1716
 
33795 ranu 1717
        List<OfferType> offerTypes = Arrays.asList(OfferType.values());
1718
 
31352 amit.gupta 1719
        model.addAttribute("catalogItemMap", catalogItemMap);
29707 tejbeer 1720
 
31352 amit.gupta 1721
        model.addAttribute("offerId", offerId);
31147 tejbeer 1722
 
31352 amit.gupta 1723
        model.addAttribute("customerOfferItems", customerOfferItems);
33795 ranu 1724
 
1725
        model.addAttribute("offerTypes", offerTypes);
1726
 
31352 amit.gupta 1727
        return "customer-offer-item";
31147 tejbeer 1728
 
31352 amit.gupta 1729
    }
31147 tejbeer 1730
 
31352 amit.gupta 1731
    @RequestMapping(value = "/expiredCustomerOfferItem", method = RequestMethod.POST)
1732
    public String expiredCustomerOfferItem(HttpServletRequest request, @RequestParam int id,
1733
                                           @RequestParam LocalDateTime endDate, Model model) throws Exception {
31147 tejbeer 1734
 
31352 amit.gupta 1735
        CustomerOfferItem customerOfferItem = customerOfferItemRepository.selectById(id);
31147 tejbeer 1736
 
31352 amit.gupta 1737
        CustomerOffer customerOffer = customerOfferRepository.selectById(customerOfferItem.getCustomerOfferId());
31147 tejbeer 1738
 
31352 amit.gupta 1739
        if ((endDate.toLocalDate().equals(customerOffer.getStartDate().toLocalDate())
1740
                || endDate.toLocalDate().isAfter(customerOffer.getStartDate().toLocalDate()))
1741
                && (endDate.toLocalDate().isEqual(customerOffer.getEndDate().toLocalDate())
1742
                || endDate.toLocalDate().isBefore(customerOffer.getEndDate().toLocalDate()))) {
31147 tejbeer 1743
 
31352 amit.gupta 1744
            customerOfferItem.setEndDate(endDate.toLocalDate());
31147 tejbeer 1745
 
31352 amit.gupta 1746
        } else {
1747
            throw new ProfitMandiBusinessException("Date", customerOffer.getOfferName(),
1748
                    "customer offer expired on " + customerOffer.getEndDate());
1749
        }
1750
        Map<Integer, List<Item>> catalogItemMap = itemRepository
1751
                .selectAllByCatalogItemId(customerOfferItem.getCatalogId()).stream()
1752
                .collect(Collectors.groupingBy(x -> x.getCatalogItemId()));
1753
        model.addAttribute("catalogItemMap", catalogItemMap);
31147 tejbeer 1754
 
31352 amit.gupta 1755
        model.addAttribute("coi", customerOfferItem);
31147 tejbeer 1756
 
31352 amit.gupta 1757
        return "customer-offer-item-index";
31147 tejbeer 1758
 
31352 amit.gupta 1759
    }
31147 tejbeer 1760
 
31352 amit.gupta 1761
    @RequestMapping(value = "/extendCustomerOffer", method = RequestMethod.POST)
1762
    public String extendCustomerOffer(HttpServletRequest request, @RequestParam int id,
1763
                                      @RequestParam LocalDateTime endDate, Model model) throws ProfitMandiBusinessException {
31147 tejbeer 1764
 
31352 amit.gupta 1765
        CustomerOffer co = customerOfferRepository.selectById(id);
1766
        co.setEndDate(endDate);
1767
        co.setUpdatedTimestamp(LocalDateTime.now());
31147 tejbeer 1768
 
31352 amit.gupta 1769
        model.addAttribute("co", co);
31147 tejbeer 1770
 
31352 amit.gupta 1771
        return "customer-index-offer";
31147 tejbeer 1772
 
31352 amit.gupta 1773
    }
31147 tejbeer 1774
 
31352 amit.gupta 1775
    @RequestMapping(value = "/getSamsungUpgradeOffer", method = RequestMethod.GET)
1776
    public String getSamsungUpgradeOffer(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
31147 tejbeer 1777
 
31352 amit.gupta 1778
        List<UpgradeOfferStatus> uos = UpgradeOfferStatus.offerStatus;
1779
        List<SamsungUpgradeOffer> samsungUpgradeOffers = samsungUpgradeOfferRepository.selectByStatus(
1780
                uos.stream().filter(x -> !x.equals(UpgradeOfferStatus.rejected)).collect(Collectors.toList()));
31147 tejbeer 1781
 
31352 amit.gupta 1782
        model.addAttribute("samsungUpgradeOffers", samsungUpgradeOffers);
1783
        return "samsung-upgrade-offer";
31147 tejbeer 1784
 
31352 amit.gupta 1785
    }
31147 tejbeer 1786
 
31352 amit.gupta 1787
    @RequestMapping(value = "/approveSamsungUpgradeOffer", method = RequestMethod.POST)
1788
    public String approveSamsungUpgradeOffer(HttpServletRequest request, @RequestParam int id, Model model)
1789
            throws ProfitMandiBusinessException {
29707 tejbeer 1790
 
31352 amit.gupta 1791
        SamsungUpgradeOffer suo = samsungUpgradeOfferRepository.selectById(id);
1792
        suo.setStatus(UpgradeOfferStatus.approved);
1793
        suo.setApprovedTimestamp(LocalDateTime.now());
1794
        model.addAttribute("suo", suo);
1795
        return "samsung-upgrade-offer-index";
29707 tejbeer 1796
 
31352 amit.gupta 1797
    }
29707 tejbeer 1798
 
31352 amit.gupta 1799
    @RequestMapping(value = "/rejectSamsungUpgradeOffer", method = RequestMethod.POST)
1800
    public String rejectSamsungUpgradeOffer(HttpServletRequest request, @RequestParam int id, Model model)
1801
            throws ProfitMandiBusinessException {
29707 tejbeer 1802
 
31352 amit.gupta 1803
        SamsungUpgradeOffer suo = samsungUpgradeOfferRepository.selectById(id);
1804
        suo.setStatus(UpgradeOfferStatus.rejected);
29707 tejbeer 1805
 
31352 amit.gupta 1806
        model.addAttribute("suo", suo);
1807
        return "samsung-upgrade-offer-index";
29707 tejbeer 1808
 
31352 amit.gupta 1809
    }
29707 tejbeer 1810
 
22860 ashik.ali 1811
}