Subversion Repositories SmartDukaan

Rev

Rev 35848 | 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;
35771 ranu 57
import org.springframework.transaction.annotation.Transactional;
31170 amit.gupta 58
import org.springframework.ui.Model;
59
import org.springframework.web.bind.annotation.*;
60
import org.springframework.web.multipart.MultipartFile;
29585 manish 61
 
31170 amit.gupta 62
import javax.servlet.http.HttpServletRequest;
63
import javax.servlet.http.HttpServletResponse;
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
35458 amit 73
@Transactional(rollbackFor = 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()
35848 amit 240
                .filter(x -> x.getShortPercentage() <= ProfitMandiConstants.OK_INVESTMENT_SHORT_PERCENTAGE)
31352 amit.gupta 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()
35848 amit 321
                .filter(x -> x.getShortPercentage() <= ProfitMandiConstants.OK_INVESTMENT_SHORT_PERCENTAGE)
31352 amit.gupta 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()
35848 amit 389
                .filter(x -> x.getShortPercentage() <= ProfitMandiConstants.OK_INVESTMENT_SHORT_PERCENTAGE)
31352 amit.gupta 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,
35771 ranu 610
                                   @RequestParam(defaultValue = "") String searchImei,
611
                                   @RequestParam(defaultValue = "false") boolean modal, Model model) throws ProfitMandiBusinessException {
31762 tejbeer 612
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
613
        if (org.apache.commons.lang3.StringUtils.isNotEmpty(searchImei)) {
614
 
615
            List<Scheme> schemes = null;
616
            List<SchemeInOut> schemeInOuts = null;
617
 
618
            InventoryItem inventoryItem = inventoryItemRepository.selectBySerialNumber(searchImei);
619
            int fofoId = inventoryItem.getFofoId();
33306 amit.gupta 620
           List<ItemPurchaseSummaryModel> itemPurchaseSummaryModels = inventoryItemRepository.selectPurchaseSummary(new ArrayList<>(Arrays.asList(inventoryItem.getId())));
31762 tejbeer 621
 
33182 shampa 622
            List<FofoOrder> fofoOrders=fofoOrderRepository.selectByFofoIdAndSerialNumber(fofoId, searchImei ,null, null, 0, 0);
35938 amit 623
            LOGGER.info("fofoOrder count: {}", fofoOrders.size());
33182 shampa 624
            List<FofoOrder> filterOrders = fofoOrders.stream().filter(x -> x.getCancelledTimestamp() == null).collect(Collectors.toList());
31762 tejbeer 625
            CustomRetailer customRetailer = retailerService.getFofoRetailer(fofoId);
626
            Item item = itemRepository.selectById(inventoryItem.getItemId());
627
            Map<Integer, Scheme> schemeMap = new HashMap<>();
628
            double netEarnings = 0;
629
            if (inventoryItem != null) {
630
                // Offer payout
631
                List<OfferPayout> offerPayouts = offerPayoutRepository.selectAllBySerialNumber(fofoId, searchImei);
33030 amit.gupta 632
                Map<Integer, CreateOfferRequest> offerRequestMap = offerPayouts.stream().map(x -> x.getOfferId())
33248 ranu 633
                        .distinct().map(offerId -> {
634
                            try {
635
                                return offerService.getOffer(fofoId, offerId.intValue());
636
                            } catch (ProfitMandiBusinessException e) {
637
                                throw new RuntimeException(e);
638
                            }
639
                        }).collect(Collectors.toMap(x -> x.getId(), x -> x));
31762 tejbeer 640
 
641
                schemeInOuts = schemeInOutRepository.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItem.getId())));
33182 shampa 642
                ActivatedImei activatedImei = activatedImeiRepository.selectBySerialNumber(searchImei);
31762 tejbeer 643
 
644
                if (!schemeInOuts.isEmpty()) {
645
                    netEarnings += schemeInOuts.stream().filter(x -> x.getStatus().equals(SchemePayoutStatus.CREDITED)).collect(Collectors.summingDouble(x -> x.getAmount()));
646
                    List<Integer> schemeIds = schemeInOuts.stream().map(x -> x.getSchemeId()).collect(Collectors.toList());
647
 
648
                    schemes = schemeRepository.selectBySchemeIds(schemeIds);
649
                    for (Scheme scheme : schemes) {
650
                        if (scheme.getAmountType().equals(AmountType.PERCENTAGE)) {
651
                            scheme.setAmountModel(scheme.getAmount() + "%");
652
                        } else {
653
                            scheme.setAmountModel(scheme.getAmount() + "");
654
                        }
655
                    }
656
 
657
                    schemeMap = schemes.stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
658
                }
33182 shampa 659
                List<PriceDropIMEI> priceDropImeis = priceDropIMEIRepository.selectByFofoIdImei(fofoId, searchImei);
31762 tejbeer 660
                if (priceDropImeis.size() > 0) {
35938 amit 661
                    List<Integer> priceDropIds = priceDropImeis.stream().map(PriceDropIMEI::getPriceDropId).distinct().collect(Collectors.toList());
662
                    List<PriceDrop> priceDrops = priceDropRepository.selectByIds(priceDropIds);
663
                    Map<Integer, PriceDrop> priceDropMap = priceDrops.stream().collect(Collectors.toMap(PriceDrop::getId, x -> x));
31762 tejbeer 664
                    for (PriceDropIMEI priceDropIMEI : priceDropImeis) {
35938 amit 665
                        priceDropIMEI.setPriceDrop(priceDropMap.get(priceDropIMEI.getPriceDropId()));
31762 tejbeer 666
                    }
667
                    model.addAttribute("priceDropImeis", priceDropImeis);
668
                }
669
                netEarnings += offerPayouts.stream().collect(Collectors.summingDouble(x -> x.getAmount()));
670
                model.addAttribute("offerPayouts", offerPayouts);
671
                model.addAttribute("offerRequestMap", offerRequestMap);
672
                model.addAttribute("inventoryItem", inventoryItem);
33306 amit.gupta 673
                model.addAttribute("itemPurchaseSummaryModels", itemPurchaseSummaryModels);
33182 shampa 674
                model.addAttribute("fofoOrders", filterOrders);
675
                model.addAttribute("activatedImei", activatedImei);
31762 tejbeer 676
 
33182 shampa 677
 
678
 
31762 tejbeer 679
            }
32331 amit.gupta 680
            LOGGER.info("Net Earnings {}", netEarnings);
31762 tejbeer 681
            model.addAttribute("netEarnings", netEarnings);
682
            model.addAttribute("fofoId", fofoId);
683
            model.addAttribute("schemeMap", schemeMap);
684
            model.addAttribute("item", item);
685
            model.addAttribute("schemeInOut", schemeInOuts);
686
            model.addAttribute("schemes", schemes);
687
            model.addAttribute("customRetailer", customRetailer);
33182 shampa 688
            model.addAttribute("searchImei", searchImei);
35775 ranu 689
            // Return IMEI results only when modal and searchImei provided
690
            if (modal) {
691
                return "scheme-imei-results-modal";
692
            }
31762 tejbeer 693
        }
35771 ranu 694
        if (modal) {
695
            return "scheme-imei-history-modal";
696
        }
31762 tejbeer 697
        return "scheme-imei-history";
698
    }
699
 
35775 ranu 700
    /**
701
     * New endpoint for modal IMEI-wise margin search
702
     * Returns shell when searchImei is empty, results when searchImei is provided
703
     */
704
    @RequestMapping(value = "/getImeiMarginModal", method = RequestMethod.GET)
705
    public String getImeiMarginModal(HttpServletRequest request,
706
                                     @RequestParam(defaultValue = "") String searchImei,
707
                                     @RequestParam(name = "fofoId") int fofoId,
708
                                     Model model) throws ProfitMandiBusinessException {
32232 amit.gupta 709
 
35775 ranu 710
        if (org.apache.commons.lang3.StringUtils.isEmpty(searchImei)) {
711
            // Return empty shell with search boxes
712
            return "scheme-imei-history-modal";
713
        }
714
 
715
        // Fetch IMEI margin data
716
        List<Scheme> schemes = null;
717
        List<SchemeInOut> schemeInOuts = null;
718
 
719
        InventoryItem inventoryItem = inventoryItemRepository.selectBySerialNumber(searchImei);
720
        if (inventoryItem == null) {
721
            model.addAttribute("searchImei", searchImei);
722
            return "scheme-imei-results-modal";
723
        }
724
 
725
        int itemFofoId = inventoryItem.getFofoId();
726
        List<ItemPurchaseSummaryModel> itemPurchaseSummaryModels = inventoryItemRepository.selectPurchaseSummary(new ArrayList<>(Arrays.asList(inventoryItem.getId())));
727
 
728
        List<FofoOrder> fofoOrders = fofoOrderRepository.selectByFofoIdAndSerialNumber(itemFofoId, searchImei, null, null, 0, 0);
729
        List<FofoOrder> filterOrders = fofoOrders.stream().filter(x -> x.getCancelledTimestamp() == null).collect(Collectors.toList());
730
        CustomRetailer customRetailer = retailerService.getFofoRetailer(itemFofoId);
731
        Item item = itemRepository.selectById(inventoryItem.getItemId());
732
        Map<Integer, Scheme> schemeMap = new HashMap<>();
733
        double netEarnings = 0;
734
 
735
        // Offer payout
736
        List<OfferPayout> offerPayouts = offerPayoutRepository.selectAllBySerialNumber(itemFofoId, searchImei);
737
        Map<Integer, CreateOfferRequest> offerRequestMap = offerPayouts.stream().map(x -> x.getOfferId())
738
                .distinct().map(offerId -> {
739
                    try {
740
                        return offerService.getOffer(itemFofoId, offerId.intValue());
741
                    } catch (ProfitMandiBusinessException e) {
742
                        throw new RuntimeException(e);
743
                    }
744
                }).collect(Collectors.toMap(x -> x.getId(), x -> x));
745
 
746
        schemeInOuts = schemeInOutRepository.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItem.getId())));
747
        ActivatedImei activatedImei = activatedImeiRepository.selectBySerialNumber(searchImei);
748
 
749
        if (!schemeInOuts.isEmpty()) {
750
            netEarnings += schemeInOuts.stream().filter(x -> x.getStatus().equals(SchemePayoutStatus.CREDITED)).collect(Collectors.summingDouble(x -> x.getAmount()));
751
            List<Integer> schemeIds = schemeInOuts.stream().map(x -> x.getSchemeId()).collect(Collectors.toList());
752
 
753
            schemes = schemeRepository.selectBySchemeIds(schemeIds);
754
            for (Scheme scheme : schemes) {
755
                if (scheme.getAmountType().equals(AmountType.PERCENTAGE)) {
756
                    scheme.setAmountModel(scheme.getAmount() + "%");
757
                } else {
758
                    scheme.setAmountModel(scheme.getAmount() + "");
759
                }
760
            }
761
            schemeMap = schemes.stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
762
        }
763
 
764
        List<PriceDropIMEI> priceDropImeis = priceDropIMEIRepository.selectByFofoIdImei(itemFofoId, searchImei);
765
        if (priceDropImeis.size() > 0) {
35938 amit 766
            List<Integer> priceDropIds = priceDropImeis.stream().map(PriceDropIMEI::getPriceDropId).distinct().collect(Collectors.toList());
767
            List<PriceDrop> priceDrops = priceDropRepository.selectByIds(priceDropIds);
768
            Map<Integer, PriceDrop> priceDropMap = priceDrops.stream().collect(Collectors.toMap(PriceDrop::getId, x -> x));
35775 ranu 769
            for (PriceDropIMEI priceDropIMEI : priceDropImeis) {
35938 amit 770
                priceDropIMEI.setPriceDrop(priceDropMap.get(priceDropIMEI.getPriceDropId()));
35775 ranu 771
            }
772
            model.addAttribute("priceDropImeis", priceDropImeis);
773
        }
774
 
775
        netEarnings += offerPayouts.stream().collect(Collectors.summingDouble(x -> x.getAmount()));
776
        model.addAttribute("offerPayouts", offerPayouts);
777
        model.addAttribute("offerRequestMap", offerRequestMap);
778
        model.addAttribute("inventoryItem", inventoryItem);
779
        model.addAttribute("itemPurchaseSummaryModels", itemPurchaseSummaryModels);
780
        model.addAttribute("fofoOrders", filterOrders);
781
        model.addAttribute("activatedImei", activatedImei);
782
        model.addAttribute("netEarnings", netEarnings);
783
        model.addAttribute("fofoId", itemFofoId);
784
        model.addAttribute("schemeMap", schemeMap);
785
        model.addAttribute("item", item);
786
        model.addAttribute("schemeInOut", schemeInOuts);
787
        model.addAttribute("schemes", schemes);
788
        model.addAttribute("customRetailer", customRetailer);
789
        model.addAttribute("searchImei", searchImei);
790
 
791
        return "scheme-imei-results-modal";
792
    }
793
 
794
    /**
795
     * New endpoint for modal model-wise margin search
796
     * Accepts fofoId as parameter to work for both admin and partner views
797
     */
798
    @RequestMapping(value = "/getModelMarginModal", method = RequestMethod.GET)
799
    public String getModelMarginModal(HttpServletRequest request,
800
                                      @RequestParam(name = "searchModel") int searchModel,
801
                                      @RequestParam(name = "fofoId") int fofoId,
802
                                      @RequestParam(required = false) LocalDate date,
803
                                      Model model) throws ProfitMandiBusinessException {
804
        if (date == null) {
805
            date = LocalDate.now();
806
        } else if (date.isAfter(LocalDate.now())) {
807
            date = LocalDate.now();
808
        }
809
 
810
        Item item = itemRepository.selectAllByCatalogItemId(searchModel).get(0);
811
        TagListing tagListing = tagListingRepository.selectByItemId(item.getId());
812
        if (tagListing != null) {
813
            model.addAttribute("dp", tagListing.getSellingPrice());
814
            model.addAttribute("mop", tagListing.getMop());
815
        }
816
        model.addAttribute("modelName", item.getItemDescriptionNoColor());
817
        model.addAttribute("searchModel", searchModel);
818
        model.addAttribute("date", date);
819
 
820
        PriceCircularModel priceCircularModel = priceCircularService.getPriceCircularByOffer(fofoId, Arrays.asList(searchModel), date);
821
        FofoStore fs = fofoStoreRepository.selectByRetailerId(fofoId);
822
        priceDropController.getPriceCircularView(priceCircularModel, model, fs.getCode());
823
 
824
        return "schemes-model-modal";
825
    }
826
 
827
 
32232 amit.gupta 828
    @Autowired
829
    PriceDropController priceDropController;
830
 
33182 shampa 831
    @Autowired
832
    ActivatedImeiRepository activatedImeiRepository;
833
 
31352 amit.gupta 834
    @RequestMapping(value = "/getSchemes", method = RequestMethod.GET)
835
    public String getSchemes(HttpServletRequest request, @RequestParam(name = "offset", defaultValue = "0") int offset,
836
                             @RequestParam(required = false) LocalDate date,
837
                             @RequestParam(name = "limit", required = false, defaultValue = "30") int limit,
838
                             @RequestParam(name = "searchModel", required = false, defaultValue = "0") int searchModel,
839
                             @RequestParam(name = "searchScheme", required = false, defaultValue = "0") int searchScheme,
840
                             @RequestParam(name = "partnerType", required = false, defaultValue = "ALL") PartnerType partnerType,
841
                             @RequestParam(name = "searchImei", required = false, defaultValue = "") String searchImei, Model model)
842
            throws ProfitMandiBusinessException {
843
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
844
        boolean isAdmin = roleManager.isAdmin(loginDetails.getRoleIds());
845
        if (date != null) {
846
            date = date.isAfter(LocalDate.now()) ? LocalDate.now() : date;
847
        } else if (!isAdmin) {
848
            date = LocalDate.now();
849
        }
29608 amit.gupta 850
 
31352 amit.gupta 851
        List<Scheme> schemes = null;
852
        List<SchemeInOut> schemeInOuts = null;
29608 amit.gupta 853
 
31352 amit.gupta 854
        boolean fullAccess = this.getAccess(loginDetails.getEmailId());
29608 amit.gupta 855
 
31352 amit.gupta 856
        model.addAttribute("fullAccess", fullAccess);
857
        model.addAttribute("searchImei", searchImei);
858
        model.addAttribute("isAdmin", isAdmin);
859
        model.addAttribute("searchModel", searchModel);
860
        model.addAttribute("searchScheme", searchScheme);
861
        model.addAttribute("partnerType", partnerType);
862
        model.addAttribute("date", date);
29608 amit.gupta 863
 
31352 amit.gupta 864
        final LocalDate date1 = date;
865
        if (searchScheme > 0) {
866
            schemes = Arrays.asList(schemeRepository.selectById(searchScheme));
867
            this.setSchemeAmountModel(schemes);
868
            if (schemes.size() > 0) {
869
                model.addAttribute("schemes", schemes);
870
                List<SchemeRegion> schemeRegionList = schemeRegionRepository.selectAllBySchemeIds(schemes.stream().map(x -> x.getId()).collect(Collectors.toList()));
871
                Map<Integer, String> schemeRegionMap = schemeRegionList.stream().collect(Collectors.groupingBy(x -> x.getSchemeId(), Collectors.mapping(y -> regionRepository.selectById(y.getRegionId()).getName(), Collectors.joining(","))));
872
                model.addAttribute("schemeRegionMap", schemeRegionMap);
873
                return "schemes";
874
            } else {
875
                throw new ProfitMandiBusinessException("SchemeId", searchScheme, "SchemeId Not Found");
876
            }
877
        } else if (searchModel > 0) {
878
            Item item = itemRepository.selectAllByCatalogItemId(searchModel).get(0);
879
            TagListing tagListing = tagListingRepository.selectByItemId(item.getId());
32331 amit.gupta 880
            LOGGER.info("tagListing {}", tagListing);
31352 amit.gupta 881
            if (tagListing != null) {
882
                model.addAttribute("dp", tagListing.getSellingPrice());
883
                model.addAttribute("mop", tagListing.getMop());
884
            }
885
            model.addAttribute("modelName", item.getItemDescriptionNoColor());
886
            if (isAdmin) {
887
                schemes = schemeService
888
                        .selectSchemeByPartnerType(partnerType, date, searchModel, isAdmin, offset, limit).stream()
889
                        .filter(x -> x.getId() != 411 && x.getId() != 612).collect(Collectors.toList());
890
                this.setSchemeAmountModel(schemes);
891
                model.addAttribute("schemes", schemes);
892
                List<SchemeRegion> schemeRegionList = schemeRegionRepository.selectAllBySchemeIds(schemes.stream().map(x -> x.getId()).collect(Collectors.toList()));
31482 amit.gupta 893
                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 894
                model.addAttribute("schemeRegionMap", schemeRegionMap);
895
                return "schemes";
896
            } else {
32331 amit.gupta 897
                PriceCircularModel priceCircularModel = priceCircularService.getPriceCircularByOffer(loginDetails.getFofoId(), Arrays.asList(searchModel), date);
32905 shampa 898
                FofoStore fs = fofoStoreRepository.selectByRetailerId(loginDetails.getFofoId());
33030 amit.gupta 899
                priceDropController.getPriceCircularView(priceCircularModel, model, fs.getCode());
31352 amit.gupta 900
            }
29608 amit.gupta 901
 
31352 amit.gupta 902
        } else if (org.apache.commons.lang3.StringUtils.isNotEmpty(searchImei)) {
29608 amit.gupta 903
 
31352 amit.gupta 904
            LOGGER.info("searchImei" + searchImei);
29608 amit.gupta 905
 
31352 amit.gupta 906
            InventoryItem inventoryItem = inventoryItemRepository.selectBySerialNumberFofoId(searchImei,
907
                    loginDetails.getFofoId());
908
            Item item = itemRepository.selectById(inventoryItem.getItemId());
909
            Map<Integer, Scheme> schemeMap = new HashMap<>();
910
            double netEarnings = 0;
911
            if (inventoryItem != null) {
32331 amit.gupta 912
                /*date = inventoryItem.getCreateTimestamp().toLocalDate();
913
                PriceCircularModel priceCircularModel = priceCircularService.getPriceCircularByOffer(loginDetails.getFofoId(), Arrays.asList(item.getCatalogItemId()), date);
914
                priceDropController.getPriceCircularView(priceCircularModel, model);*/
31352 amit.gupta 915
                // Offer payout
916
                List<OfferPayout> offerPayouts = offerPayoutRepository.selectAllBySerialNumber(loginDetails.getFofoId(),
917
                        searchImei);
918
                Map<Integer, CreateOfferRequest> offerRequestMap = offerPayouts.stream()
33248 ranu 919
                        .map(x -> {
920
                            try {
921
                                return offerService.getOffer(loginDetails.getFofoId(), (int) x.getOfferId());
922
                            } catch (ProfitMandiBusinessException e) {
923
                                throw new RuntimeException(e);
924
                            }
925
                        })
31352 amit.gupta 926
                        .collect(Collectors.toMap(x -> x.getId(), x -> x));
29608 amit.gupta 927
 
31352 amit.gupta 928
                schemeInOuts = schemeInOutRepository
929
                        .selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItem.getId())));
25256 amit.gupta 930
 
31352 amit.gupta 931
                if (!schemeInOuts.isEmpty()) {
932
                    netEarnings += schemeInOuts.stream().filter(x -> x.getStatus().equals(SchemePayoutStatus.CREDITED))
933
                            .collect(Collectors.summingDouble(x -> x.getAmount()));
934
                    List<Integer> schemeIds = schemeInOuts.stream().map(x -> x.getSchemeId())
935
                            .collect(Collectors.toList());
23914 govind 936
 
31352 amit.gupta 937
                    schemes = schemeRepository.selectBySchemeIds(schemeIds);
938
                    for (Scheme scheme : schemes) {
939
                        if (scheme.getAmountType().equals(AmountType.PERCENTAGE)) {
940
                            scheme.setAmountModel(scheme.getAmount() + "%");
941
                        } else {
942
                            scheme.setAmountModel(scheme.getAmount() + "");
943
                        }
944
                    }
23914 govind 945
 
31352 amit.gupta 946
                    schemeMap = schemes.stream().collect(Collectors.toMap(x -> x.getId(), x -> x));
947
                }
32331 amit.gupta 948
                netEarnings += offerPayouts.stream().collect(Collectors.summingDouble(x -> x.getAmount()));
949
 
31352 amit.gupta 950
                List<PriceDropIMEI> priceDropImeis = priceDropIMEIRepository
951
                        .selectByFofoIdImei(loginDetails.getFofoId(), searchImei);
952
                if (priceDropImeis.size() > 0) {
35938 amit 953
                    List<Integer> priceDropIds = priceDropImeis.stream().map(PriceDropIMEI::getPriceDropId).distinct().collect(Collectors.toList());
954
                    List<PriceDrop> priceDrops = priceDropRepository.selectByIds(priceDropIds);
955
                    Map<Integer, PriceDrop> priceDropMap = priceDrops.stream().collect(Collectors.toMap(PriceDrop::getId, x -> x));
31352 amit.gupta 956
                    for (PriceDropIMEI priceDropIMEI : priceDropImeis) {
35938 amit 957
                        priceDropIMEI.setPriceDrop(priceDropMap.get(priceDropIMEI.getPriceDropId()));
31352 amit.gupta 958
                    }
959
                    model.addAttribute("priceDropImeis", priceDropImeis);
960
                }
32331 amit.gupta 961
 
31352 amit.gupta 962
                model.addAttribute("offerPayouts", offerPayouts);
963
                model.addAttribute("offerRequestMap", offerRequestMap);
964
                model.addAttribute("inventoryItem", inventoryItem);
23914 govind 965
 
31352 amit.gupta 966
            }
32331 amit.gupta 967
            model.addAttribute("netEarnings", netEarnings);
31352 amit.gupta 968
            model.addAttribute("schemeMap", schemeMap);
969
            model.addAttribute("item", item);
970
            model.addAttribute("schemeInOut", schemeInOuts);
971
        }
31170 amit.gupta 972
 
31352 amit.gupta 973
        if (isAdmin) {
34369 amit.gupta 974
            schemes = schemeRepository.selectAll(0, 300);
31352 amit.gupta 975
            this.setSchemeAmountModel(schemes);
976
            List<SchemeRegion> schemeRegionList = schemeRegionRepository.selectAllBySchemeIds(schemes.stream().map(x -> x.getId()).collect(Collectors.toList()));
977
            Map<Integer, String> schemeRegionMap = schemeRegionList.stream().collect(Collectors.groupingBy(x -> x.getSchemeId(), Collectors.mapping(y -> regionRepository.selectById(y.getRegionId()).getName(), Collectors.joining(","))));
978
            model.addAttribute("schemes", schemes);
979
            model.addAttribute("schemeRegionMap", schemeRegionMap);
31170 amit.gupta 980
 
31352 amit.gupta 981
            return "schemes";
982
        } else {
983
            FofoStore fs = fofoStoreRepository.selectByRetailerId(loginDetails.getFofoId());
984
            model.addAttribute("partnerCode", fs.getCode());
985
            model.addAttribute("fofoId", fs.getId());
986
            return "schemes-partner";
987
        }
23914 govind 988
 
31352 amit.gupta 989
    }
23786 amit.gupta 990
 
31352 amit.gupta 991
    private int getNlc(Item item, int fofoId, List<Scheme> schemes, TagListing tagListing) {
31505 amit.gupta 992
        /*if (item.getBrand().equals("Vivo") && fofoStoreRepository.getWarehousePartnerMap().get(7720).stream()
31352 amit.gupta 993
                .filter(x -> x.getId() == fofoId).count() > 0) {
994
            schemes = schemes.stream().filter(x -> !x.getType().equals(SchemeType.INVESTMENT))
995
                    .collect(Collectors.toList());
31505 amit.gupta 996
        }*/
31352 amit.gupta 997
        float nlc = tagListing.getSellingPrice();
998
        for (Scheme scheme : schemes) {
999
            if (scheme.getAmountType().equals(AmountType.PERCENTAGE)) {
1000
                if (tagListing != null) {
1001
                    float amount = tagListing.getSellingPrice() * scheme.getAmount() / 100;
1002
                    scheme.setAmountModel(FormattingUtils.formatDecimal(amount) + " (" + scheme.getAmount() + "%)");
1003
                    nlc -= amount;
1004
                } else {
1005
                    scheme.setAmountModel(scheme.getAmount() + "%");
1006
                }
1007
            } else {
1008
                scheme.setAmountModel(scheme.getAmount() + "");
1009
                nlc -= scheme.getAmount();
1010
            }
1011
        }
23819 govind 1012
 
31352 amit.gupta 1013
        return Math.round(nlc);
23914 govind 1014
 
31352 amit.gupta 1015
    }
29899 tejbeer 1016
 
31352 amit.gupta 1017
    @RequestMapping(value = "/getLastMonthCreditIncome", method = RequestMethod.GET)
1018
    public String getLastMonthCreditIncome(HttpServletRequest request, Model model) throws Exception {
30122 amit.gupta 1019
 
31352 amit.gupta 1020
        String status = "CREDITED";
1021
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
23786 amit.gupta 1022
 
31352 amit.gupta 1023
        LocalDateTime currentStartMonth = LocalDate.now().atStartOfDay().withDayOfMonth(1);
1024
        LocalDateTime currentDate = LocalDate.now().atStartOfDay();
31170 amit.gupta 1025
 
31352 amit.gupta 1026
        YearMonth yearMonth = YearMonth.now();
1027
        LOGGER.info("yearMonth" + yearMonth);
31170 amit.gupta 1028
 
31352 amit.gupta 1029
        boolean partnerType = partnerTypeChangeService.isPartnerTypeUpgraded(loginDetails.getFofoId(), yearMonth);
31170 amit.gupta 1030
 
31352 amit.gupta 1031
        LOGGER.info("partnerType" + partnerType);
31170 amit.gupta 1032
 
31352 amit.gupta 1033
        Map<String, Double> lastMonthCategoryUpgradeMarginMap = new HashMap<>();
31170 amit.gupta 1034
 
31352 amit.gupta 1035
        if (partnerType) {
1036
            lastMonthCategoryUpgradeMarginMap = schemeInOutRepository
1037
                    .selectLastMonthCategoryUpgradeMarginByBrand(loginDetails.getFofoId(), currentStartMonth,
1038
                            currentDate)
1039
                    .stream().collect(Collectors.toMap(x -> x.getBrand(), x -> x.getAmount()));
1040
        }
1041
        List<LastMonthCreditedIncomeModel> lastMonthCreditedIncomeModels = schemeInOutRepository
1042
                .selectLastMonthCreditedIncomeByFofoId(loginDetails.getFofoId(), currentStartMonth, currentDate);
31170 amit.gupta 1043
 
31352 amit.gupta 1044
        List<LastMonthCreditedIncomeModel> lastMonthPurchaseInMargins = schemeInOutRepository
1045
                .selectLastMonthPurchaseInMarginByFofoId(loginDetails.getFofoId(), currentStartMonth, currentDate);
31170 amit.gupta 1046
 
31352 amit.gupta 1047
        List<LastMonthCreditedIncomeModel> lastMonthFrontEndIncomes = schemeInOutRepository
1048
                .selectFrontIncomeByBrand(loginDetails.getFofoId(), currentStartMonth, currentDate);
26802 tejbeer 1049
 
31352 amit.gupta 1050
        Map<String, LastMonthCreditedIncomeModel> lastMonthPendingIncomeMap = schemeInOutRepository
1051
                .selectLastMonthPendingIncomeByFofoId(loginDetails.getFofoId(), currentStartMonth, currentDate).stream()
1052
                .collect(Collectors.toMap(x -> x.getBrand(), x -> x));
28796 tejbeer 1053
 
34409 amit.gupta 1054
        Map<String, LastMonthCreditedIncomeModel> lastMonthPurchaseInMarginMap = lastMonthPurchaseInMargins.stream()
31352 amit.gupta 1055
                .collect(Collectors.toMap(x -> x.getBrand(), x -> x));
29608 amit.gupta 1056
 
31352 amit.gupta 1057
        Map<String, LastMonthCreditedIncomeModel> lastMonthSaleMarginMap = lastMonthCreditedIncomeModels.stream()
1058
                .collect(Collectors.toMap(x -> x.getBrand(), x -> x));
30274 amit.gupta 1059
 
31352 amit.gupta 1060
        lastMonthFrontEndIncomes.stream().forEach(x -> {
1061
            if (lastMonthSaleMarginMap.containsKey(x.getBrand())) {
1062
                x.setAmount(lastMonthSaleMarginMap.get(x.getBrand()).getAmount() + x.getAmount());
1063
                lastMonthSaleMarginMap.put(x.getBrand(), x);
1064
            } else {
1065
                lastMonthSaleMarginMap.put(x.getBrand(), x);
1066
            }
30274 amit.gupta 1067
 
31352 amit.gupta 1068
        });
1069
        Map<String, Float> totalAmountMap = lastMonthSaleMarginMap.entrySet().stream()
1070
                .collect(Collectors.toMap(x -> x.getKey(), x -> x.getValue().getAmount()));
30274 amit.gupta 1071
 
31352 amit.gupta 1072
        Set<String> keySet = new HashSet<>();
1073
        keySet.addAll(lastMonthPurchaseInMarginMap.keySet());
1074
        keySet.addAll(lastMonthSaleMarginMap.keySet());
1075
        keySet.addAll(lastMonthPendingIncomeMap.keySet());
28795 tejbeer 1076
 
31352 amit.gupta 1077
        lastMonthPurchaseInMarginMap.entrySet().stream().forEach(x -> {
1078
            String brand = x.getKey();
1079
            float amount = x.getValue().getAmount();
1080
            if (!totalAmountMap.containsKey(brand)) {
1081
                totalAmountMap.put(brand, 0f);
1082
            }
1083
            totalAmountMap.put(brand, totalAmountMap.get(brand) + amount);
30253 amit.gupta 1084
 
31352 amit.gupta 1085
        });
30122 amit.gupta 1086
 
31352 amit.gupta 1087
        lastMonthPendingIncomeMap.entrySet().stream().forEach(x -> {
1088
            String brand = x.getKey();
1089
            float amount = x.getValue().getAmount();
1090
            if (!totalAmountMap.containsKey(brand)) {
1091
                totalAmountMap.put(brand, 0f);
1092
            }
1093
            totalAmountMap.put(brand, totalAmountMap.get(brand) + amount);
28795 tejbeer 1094
 
31352 amit.gupta 1095
        });
28795 tejbeer 1096
 
1097
 
31352 amit.gupta 1098
        Map<Integer, String> monthValueMap = new HashMap<>();
1099
        for (int i = 0; i <= 5; i++) {
1100
            LocalDateTime startOfMonth = LocalDateTime.now().withDayOfMonth(1).minusMonths(i);
1101
            monthValueMap.put(i, startOfMonth.format(DateTimeFormatter.ofPattern("MMM''uu")));
1102
        }
1103
        model.addAttribute("month", 0);
1104
        model.addAttribute("monthValueMap", monthValueMap);
1105
        model.addAttribute("keySet", keySet);
1106
        model.addAttribute("lastMonthPendingIncomeMap", lastMonthPendingIncomeMap);
28795 tejbeer 1107
 
31352 amit.gupta 1108
        model.addAttribute("lastMonthCategoryUpgradeMarginMap", lastMonthCategoryUpgradeMarginMap);
1109
        model.addAttribute("lastMonthPurchaseInMarginMap", lastMonthPurchaseInMarginMap);
1110
        model.addAttribute("lastMonthSaleMarginMap", lastMonthSaleMarginMap);
1111
        model.addAttribute("status", status);
1112
        model.addAttribute("totalAmountMap", totalAmountMap);
28795 tejbeer 1113
 
31352 amit.gupta 1114
        return "last-month-credited-income";
1115
    }
30651 amit.gupta 1116
 
31352 amit.gupta 1117
    @RequestMapping(value = "/getLastMonthPendingIncome", method = RequestMethod.GET)
1118
    public String getLastMonthPendingIncome(HttpServletRequest request, Model model) throws Exception {
30651 amit.gupta 1119
 
31352 amit.gupta 1120
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
28795 tejbeer 1121
 
31352 amit.gupta 1122
        LocalDateTime currentStartMonth = LocalDate.now().atStartOfDay().withDayOfMonth(1);
1123
        LocalDateTime currentDate = LocalDate.now().atStartOfDay();
1124
        String status = "PENDING";
31170 amit.gupta 1125
 
31352 amit.gupta 1126
        LOGGER.info("currentStartMonth" + currentStartMonth);
1127
        LOGGER.info("currentDate" + currentDate);
28795 tejbeer 1128
 
31352 amit.gupta 1129
        List<LastMonthCreditedIncomeModel> lastMonthPendingIncomeModels = schemeInOutRepository
1130
                .selectLastMonthPendingIncomeByFofoId(loginDetails.getFofoId(), currentStartMonth, currentDate);
29899 tejbeer 1131
 
31352 amit.gupta 1132
        Map<String, LastMonthCreditedIncomeModel> lastMonthMarginMap = new HashMap<>();
23786 amit.gupta 1133
 
31352 amit.gupta 1134
        for (LastMonthCreditedIncomeModel lastMonthPendingIncomeModel : lastMonthPendingIncomeModels) {
28795 tejbeer 1135
 
31352 amit.gupta 1136
            lastMonthMarginMap.put(lastMonthPendingIncomeModel.getBrand(), lastMonthPendingIncomeModel);
1137
        }
1138
        LOGGER.info("lastMonthPendingIncomeModel" + lastMonthPendingIncomeModels);
1139
        LOGGER.info("lastMonthMarginMap" + lastMonthMarginMap);
1140
        model.addAttribute("lastMonthCreditedIncomeModels", lastMonthPendingIncomeModels);
1141
        model.addAttribute("lastMonthMarginMap", lastMonthMarginMap);
1142
        model.addAttribute("status", status);
28795 tejbeer 1143
 
31352 amit.gupta 1144
        return "last-month-credited-income";
1145
    }
28795 tejbeer 1146
 
31352 amit.gupta 1147
    @RequestMapping(value = "/getLastMonthImeiWiseIncome", method = RequestMethod.GET)
1148
    public String getLastMonthImeiWiseIncome(HttpServletRequest request,
1149
                                             @RequestParam(name = "catalogItemId", required = false, defaultValue = "") int catalogItemId,
1150
                                             @RequestParam(name = "month", required = false, defaultValue = "") int month, Model model)
1151
            throws Exception {
30053 manish 1152
 
31352 amit.gupta 1153
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
30053 manish 1154
 
31352 amit.gupta 1155
        LocalDateTime lastMonthStart = LocalDate.now().minusMonths(month).withDayOfMonth(1).atStartOfDay();
1156
        LocalDateTime lastMonthEnd = lastMonthStart.plusMonths(1);
30053 manish 1157
 
31352 amit.gupta 1158
        HashSet<String> allImeiSet = new LinkedHashSet<>();
30053 manish 1159
 
31352 amit.gupta 1160
        List<LastMonthFrontEndImeiModel> lmfi = schemeInOutRepository
1161
                .selectLastMonthFrontEndImei(loginDetails.getFofoId(), catalogItemId, lastMonthStart, lastMonthEnd);
1162
        List<LastMonthImeiModel> lmpi = schemeInOutRepository.selectLastMonthPurchaseInImei(loginDetails.getFofoId(),
1163
                catalogItemId, lastMonthStart, lastMonthEnd);
1164
        List<LastMonthImeiModel> lmci = schemeInOutRepository.selectLastMonthCreditedImei(loginDetails.getFofoId(),
1165
                catalogItemId, lastMonthStart, lastMonthEnd);
30053 manish 1166
 
31352 amit.gupta 1167
        List<OfferPayoutImeiIncomeModel> offerPayoutImeiIncomeModels = offerPayoutRepository.getTotalPayoutsByPartnerPeriod(YearMonth.of(lastMonthStart.getYear(),
1168
                lastMonthStart.getMonth()), loginDetails.getFofoId(), null, catalogItemId);
30053 manish 1169
 
31352 amit.gupta 1170
        LOGGER.info("lmci {}", lmci);
30053 manish 1171
 
31352 amit.gupta 1172
        Map<String, Double> lastmonthCategoryUpgradeMargin = schemeInOutRepository
1173
                .selectLastMonthCategoryUpgradeMarginByImei(loginDetails.getFofoId(), catalogItemId, lastMonthStart,
1174
                        lastMonthEnd)
1175
                .stream().collect(Collectors.toMap(x -> x.getBrand(), x -> x.getAmount()));
30053 manish 1176
 
31352 amit.gupta 1177
        allImeiSet.addAll(lmpi.stream().map(x -> x.getImei()).collect(Collectors.toList()));
1178
        allImeiSet.addAll(lmci.stream().map(x -> x.getImei()).collect(Collectors.toList()));
1179
        allImeiSet.addAll(lmfi.stream().map(x -> x.getImei()).collect(Collectors.toList()));
1180
        allImeiSet.addAll(offerPayoutImeiIncomeModels.stream().map(x -> x.getImei()).collect(Collectors.toList()));
30053 manish 1181
 
31352 amit.gupta 1182
        List<String> allImeiList = new ArrayList<>(allImeiSet);
30053 manish 1183
 
31352 amit.gupta 1184
        LOGGER.info("allImeiList" + allImeiList);
1185
        LOGGER.info("lmcm" + lastmonthCategoryUpgradeMargin);
30253 amit.gupta 1186
 
31352 amit.gupta 1187
        List<LastMonthFrontEndImeiModel> lastMonthFrontEndImeis = schemeInOutRepository
1188
                .selectLastMonthFrontEndByImei(loginDetails.getFofoId(), allImeiList);
31379 amit.gupta 1189
        Map<String, LastMonthFrontEndImeiModel> soldMap = lastMonthFrontEndImeis.stream().collect(Collectors.toMap(x -> x.getImei(), x -> x));
30053 manish 1190
 
31379 amit.gupta 1191
 
31352 amit.gupta 1192
        List<LastMonthImeiModel> lastMonthPurchaseInImeis = schemeInOutRepository
1193
                .selectLastMonthPurchaseInByImei(loginDetails.getFofoId(), allImeiList);
30053 manish 1194
 
31352 amit.gupta 1195
        List<LastMonthImeiModel> lastMonthCreditedImeis = schemeInOutRepository
1196
                .selectLastMonthCreditedByImei(loginDetails.getFofoId(), allImeiList);
1197
        List<OfferPayoutImeiIncomeModel> allOfferPayoutImeiIncomeModels = offerPayoutRepository.getTotalPayoutsByImei(allImeiList);
30053 manish 1198
 
31352 amit.gupta 1199
        //Map<String, OfferPayoutImeiIncomeModel> imeisOfferPayoutMap = allOfferPayoutImeiIncomeModels.stream().collect(Collectors.toMap(x->x.getImei(), x->x));
1200
        Map<String, Double> imeiWisePendingSaleAmount = lastMonthCreditedImeis.stream()
1201
                .filter(x -> x.getStatus().equals(SchemePayoutStatus.PENDING)).collect(Collectors
1202
                        .groupingBy(x -> x.getImei(), Collectors.summingDouble(x -> x.getPendingSaleAmount())));
30053 manish 1203
 
31352 amit.gupta 1204
        allOfferPayoutImeiIncomeModels.stream().forEach(x -> {
1205
            if (x.getSaleDate() != null) {
1206
                LastMonthImeiModel lastMonthImeiModel = new LastMonthImeiModel(x.getImei(), (float) x.getSalePayout(),
1207
                        0, "Addnl Margin", x.getSaleDate(), SchemePayoutStatus.CREDITED);
1208
                lastMonthCreditedImeis.add(lastMonthImeiModel);
1209
            }
1210
            if (x.getGrnDate() != null) {
1211
                LastMonthImeiModel lastMonthImeiModel = new LastMonthImeiModel(x.getImei(), (float) x.getPurchasePayout(),
1212
                        0, "Booster Payout", x.getGrnDate(), SchemePayoutStatus.CREDITED);
1213
                lastMonthPurchaseInImeis.add(lastMonthImeiModel);
1214
            }
1215
        });
30053 manish 1216
 
31352 amit.gupta 1217
        Map<String, Map<String, Double>> lastMonthPurchaseInMapPairMap = lastMonthPurchaseInImeis.stream()
1218
                .collect(Collectors.groupingBy(x -> x.getImei(),
1219
                        Collectors.groupingBy(x -> x.getDescription(), Collectors.summingDouble(x -> x.getAmount()))));
1220
        Map<String, LocalDate> imeiPurchaseDateMap = lastMonthPurchaseInImeis.stream().collect(Collectors.toMap(x -> x.getImei(), x -> x.getCreateTimeStamp().toLocalDate(), (x, y) -> x));
32236 amit.gupta 1221
        LOGGER.info("Last month front end imeis - {}", lastMonthFrontEndImeis);
32232 amit.gupta 1222
        Map<String, LocalDate> imeiSaleDateMap = lastMonthFrontEndImeis.stream().collect(Collectors.toMap(x -> x.getImei(), x -> x.getCreated()));
31352 amit.gupta 1223
        Map<String, Map<String, Double>> lastMonthCreditedMapPairMap = lastMonthCreditedImeis.stream()
1224
                .collect(Collectors.groupingBy(x -> x.getImei(),
1225
                        Collectors.groupingBy(x -> x.getDescription(), Collectors.summingDouble(x -> x.getAmount()))));
30053 manish 1226
 
31352 amit.gupta 1227
        // descriptionSet.add("")
30053 manish 1228
 
34409 amit.gupta 1229
        List<String> purchaseList = lastMonthPurchaseInImeis.stream().map(x -> x.getDescription()).distinct().collect(Collectors.toList());
1230
        List<String> saleList = lastMonthCreditedImeis.stream().map(x -> x.getDescription()).distinct().collect(Collectors.toList());
30253 amit.gupta 1231
 
31352 amit.gupta 1232
        Map<String, ImeiWiseIncomePairAndMapModel> imeiWiseIncomeMapOfMap = new HashMap<>();
30053 manish 1233
 
31352 amit.gupta 1234
        for (Map.Entry<String, Map<String, Double>> entry : lastMonthPurchaseInMapPairMap.entrySet()) {
30235 tejbeer 1235
 
31352 amit.gupta 1236
            String imei = entry.getKey();
1237
            ImeiWiseIncomePairAndMapModel modelImeiMap = new ImeiWiseIncomePairAndMapModel(imei,
1238
                    imeiPurchaseDateMap.get(imei), null);
1239
            imeiWiseIncomeMapOfMap.put(imei, modelImeiMap);
1240
            double totalAmount = entry.getValue().entrySet().stream()
1241
                    .collect(Collectors.summingDouble(x -> x.getValue()));
1242
            imeiWiseIncomeMapOfMap.get(imei).setTotalIncome(totalAmount);
1243
        }
31283 amit.gupta 1244
 
31352 amit.gupta 1245
        for (Map.Entry<String, Map<String, Double>> entry : lastMonthCreditedMapPairMap.entrySet()) {
1246
            Map<String, Double> descriptionAmountMap = entry.getValue();
1247
            if (!imeiWiseIncomeMapOfMap.containsKey(entry.getKey())) {
32232 amit.gupta 1248
                imeiWiseIncomeMapOfMap.put(entry.getKey(), new ImeiWiseIncomePairAndMapModel(entry.getKey(), null, null));
31352 amit.gupta 1249
            }
32232 amit.gupta 1250
            ImeiWiseIncomePairAndMapModel modelImeiMap = imeiWiseIncomeMapOfMap.get(entry.getKey());
1251
            ;
1252
            modelImeiMap.setSaleDate(imeiSaleDateMap.get(entry.getKey()));
30053 manish 1253
 
31352 amit.gupta 1254
            double totalAmount = descriptionAmountMap.entrySet().stream()
1255
                    .collect(Collectors.summingDouble(x -> x.getValue()));
1256
            imeiWiseIncomeMapOfMap.get(entry.getKey())
1257
                    .setTotalIncome(totalAmount + imeiWiseIncomeMapOfMap.get(entry.getKey()).getTotalIncome());
1258
        }
30053 manish 1259
 
31352 amit.gupta 1260
        //Imeis for pending activation
1261
        lastMonthCreditedImeis.stream().filter(x -> x.getStatus().equals(SchemePayoutStatus.PENDING)).forEach(x -> {
1262
            if (!imeiWiseIncomeMapOfMap.containsKey(x.getImei())) {
32232 amit.gupta 1263
                imeiWiseIncomeMapOfMap.put(x.getImei(), new ImeiWiseIncomePairAndMapModel(x.getImei()));
31352 amit.gupta 1264
            }
1265
            ImeiWiseIncomePairAndMapModel imeiWiseIncomePairAndMapModel = imeiWiseIncomeMapOfMap
1266
                    .get(x.getImei());
1267
            imeiWiseIncomePairAndMapModel.setSaleDate(x.getCreateTimeStamp().toLocalDate());
1268
            imeiWiseIncomePairAndMapModel.setTotalIncome(x.getPendingSaleAmount() + imeiWiseIncomePairAndMapModel.getTotalIncome());
1269
        });
30053 manish 1270
 
31379 amit.gupta 1271
        lastMonthFrontEndImeis.stream().forEach(lastMonthFrontEndImeiModel -> {
32232 amit.gupta 1272
            if (!imeiWiseIncomeMapOfMap.containsKey(lastMonthFrontEndImeiModel.getImei())) {
1273
                imeiWiseIncomeMapOfMap.put(lastMonthFrontEndImeiModel.getImei(), new ImeiWiseIncomePairAndMapModel(lastMonthFrontEndImeiModel.getImei()));
31379 amit.gupta 1274
            }
32232 amit.gupta 1275
            ImeiWiseIncomePairAndMapModel imeiWiseIncomePairAndMapModel = imeiWiseIncomeMapOfMap
1276
                    .get(lastMonthFrontEndImeiModel.getImei());
1277
            lastMonthFrontEndImeiModel.setNlc(lastMonthFrontEndImeiModel.getDp()
1278
                    - (float) imeiWiseIncomeMapOfMap.get(lastMonthFrontEndImeiModel.getImei()).getTotalIncome());
1279
            lastMonthFrontEndImeiModel.setNetIncome(lastMonthFrontEndImeiModel.getSellingPrice() - lastMonthFrontEndImeiModel.getNlc());
1280
            imeiWiseIncomePairAndMapModel.setSaleDate(lastMonthFrontEndImeiModel.getCreated());
31379 amit.gupta 1281
        });
1282
 
31352 amit.gupta 1283
        model.addAttribute("imeiWisePendingSaleAmount", imeiWisePendingSaleAmount);
1284
        model.addAttribute("month", month);
1285
        model.addAttribute("purchaseList", purchaseList);
1286
        model.addAttribute("saleList", saleList);
1287
        model.addAttribute("lastMonthPurchaseInMapPairMap", lastMonthPurchaseInMapPairMap);
1288
        model.addAttribute("lastMonthCreditedMapPairMap", lastMonthCreditedMapPairMap);
1289
        model.addAttribute("imeiWiseIncomeMapOfMap", imeiWiseIncomeMapOfMap);
1290
        model.addAttribute("lastmonthCategoryUpgradeMargin", lastmonthCategoryUpgradeMargin);
31379 amit.gupta 1291
        model.addAttribute("soldMap", soldMap);
31352 amit.gupta 1292
        model.addAttribute("allOfferPayoutImeiIncomeModels", allOfferPayoutImeiIncomeModels);
1293
        //model.addAttribute("iimeiSaleDateMap", imeiSaleDateMap);
1294
        //model.addAttribute("imeiPurchaseDateMap", imeiPurchaseDateMap);
30053 manish 1295
 
31352 amit.gupta 1296
        return "last-month-imei-wise-income";
1297
    }
30053 manish 1298
 
31352 amit.gupta 1299
    @RequestMapping(value = "/brandWiseIncome", method = RequestMethod.GET)
1300
    public String getBrandWiseIncome(HttpServletRequest request,
1301
                                     @RequestParam(name = "brand", required = false, defaultValue = "") String brand,
32232 amit.gupta 1302
                                     @RequestParam(name = "month", required = false, defaultValue = "") int month,
1303
                                     Model model)
31352 amit.gupta 1304
            throws ProfitMandiBusinessException {
1305
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1306
        LOGGER.info("loginDetails {}", loginDetails);
1307
        LOGGER.info("brand" + brand);
1308
        LOGGER.info("month {}", month);
30053 manish 1309
 
31352 amit.gupta 1310
        LocalDateTime monthStart = LocalDate.now().minusMonths(month).withDayOfMonth(1).atStartOfDay();
1311
        LocalDateTime monthEnd = monthStart.plusMonths(1);
30053 manish 1312
 
31352 amit.gupta 1313
        List<OfferPayoutImeiIncomeModel> offerPayoutImeiIncomeModels = offerPayoutRepository.getTotalPayoutsByPartnerPeriod(
1314
                YearMonth.of(monthStart.getYear(), monthStart.getMonth()), loginDetails.getFofoId(), brand, null);
32232 amit.gupta 1315
        LOGGER.info("offerPayoutImeiIncomeModels - {}", offerPayoutImeiIncomeModels);
1316
        Map<Integer, Double> additionalPurchasePayout = offerPayoutImeiIncomeModels.stream().filter(x -> x.getPurchasePayout() > 0).collect(Collectors.groupingBy(x -> x.getCatalogId(), Collectors.summingDouble(x -> x.getPurchasePayout())));
1317
        Map<Integer, Integer> additionalPurchaseQty = offerPayoutImeiIncomeModels.stream().filter(x -> x.getPurchasePayout() > 0).collect(Collectors.groupingBy(x -> x.getCatalogId(), Collectors.summingInt(x -> 1)));
1318
        Map<Integer, Double> additionalSalePayoutMap = offerPayoutImeiIncomeModels.stream().filter(x -> x.getSalePayout() > 0).collect(Collectors.groupingBy(x -> x.getCatalogId(), Collectors.summingDouble(x -> x.getSalePayout())));
1319
        Map<Integer, Integer> additionalSaleQty = offerPayoutImeiIncomeModels.stream().filter(x -> x.getSalePayout() > 0).collect(Collectors.groupingBy(x -> x.getCatalogId(), Collectors.summingInt(x -> 1)));
30053 manish 1320
 
32232 amit.gupta 1321
        Set<Integer> allCatalogIds = offerPayoutImeiIncomeModels.stream().map(x -> x.getCatalogId()).collect(Collectors.toSet());
31352 amit.gupta 1322
        boolean partnerTypeUpgraded = partnerTypeChangeService.isPartnerTypeUpgraded(loginDetails.getFofoId(),
1323
                YearMonth.now());
30053 manish 1324
 
31352 amit.gupta 1325
        LOGGER.info("partnerType" + partnerTypeUpgraded);
30053 manish 1326
 
31352 amit.gupta 1327
        Map<String, Double> categoryUpgradeBrandModelMap = null;
1328
        if (partnerTypeUpgraded) {
1329
            categoryUpgradeBrandModelMap = schemeInOutRepository
1330
                    .selectLastMonthCategoryUpgradeMarginByBrandModel(loginDetails.getFofoId(), brand, monthStart,
1331
                            monthEnd)
1332
                    .stream().collect(Collectors.toMap(x -> x.getBrand(), x -> x.getAmount()));
1333
        }
30053 manish 1334
 
31352 amit.gupta 1335
        List<LastMonthFrontEndBrandWiseIncome> modelWiseSalesMargins = schemeInOutRepository
1336
                .selectFrontIncomeBrandWise(loginDetails.getFofoId(), brand, monthStart, monthEnd);
32232 amit.gupta 1337
        Map<Integer, LastMonthFrontEndBrandWiseIncome> modelWiseSalesMarginsMap = modelWiseSalesMargins.stream().collect(Collectors.toMap(x -> x.getCatalogItemId(), x -> x));
30053 manish 1338
 
32232 amit.gupta 1339
 
31352 amit.gupta 1340
        List<LastMonthBrandWiseIncomeModel> modelWiseSchemeOutMargins = schemeInOutRepository
1341
                .selectLastMonthBrandWiseIncome(loginDetails.getFofoId(), brand, monthStart, monthEnd);
1342
        Map<Integer, LastMonthBrandWiseIncomeModel> modelWiseSchemeOutMarginsMap = modelWiseSchemeOutMargins.stream()
1343
                .collect(Collectors.toMap(x -> x.getCatalogItemId(), x -> x));
30053 manish 1344
 
31352 amit.gupta 1345
        List<LastMonthBrandWiseIncomeModel> modelWiseSchemeInMargins = schemeInOutRepository
1346
                .selectLastMonthPurchaseBrandWiseIncome(loginDetails.getFofoId(), brand, monthStart, monthEnd);
1347
        Map<Integer, LastMonthBrandWiseIncomeModel> modelWiseSchemeInMarginsMap = modelWiseSchemeInMargins.stream()
1348
                .collect(Collectors.toMap(x -> x.getCatalogItemId(), x -> x));
30053 manish 1349
 
32232 amit.gupta 1350
        allCatalogIds.addAll(modelWiseSalesMargins.stream().map(x -> x.getCatalogItemId()).collect(Collectors.toSet()));
1351
        allCatalogIds.addAll(modelWiseSchemeInMargins.stream().map(x -> x.getCatalogItemId()).collect(Collectors.toSet()));
1352
        allCatalogIds.addAll(modelWiseSchemeOutMargins.stream().map(x -> x.getCatalogItemId()).collect(Collectors.toSet()));
30053 manish 1353
 
32232 amit.gupta 1354
        Map<Integer, String> modelNameMap = itemRepository.selectAllByCatalogIds(allCatalogIds).stream().collect(Collectors.toMap(x -> x.getCatalogItemId(), x -> x.getModel(), (u, v) -> u));
1355
        Map<Integer, Double> modelIncomeMap = new HashMap<>();
1356
        Map<Integer, Integer> modelPurchaseQtyMap = new HashMap<>();
1357
        Map<Integer, Integer> modelSaleQtyMap = new HashMap<>();
1358
        for (int catalogItemId : modelNameMap.keySet()) {
1359
            int saleQty = 0;
1360
            int purchaseQty = 0;
1361
            double income = 0;
30253 amit.gupta 1362
 
32232 amit.gupta 1363
            if (modelWiseSchemeInMarginsMap.containsKey(catalogItemId)) {
34813 aman 1364
                income += (modelWiseSchemeInMarginsMap.get(catalogItemId).getAmount()) + modelWiseSchemeInMarginsMap.get(catalogItemId).getPendingSaleAmount();
32232 amit.gupta 1365
                purchaseQty += modelWiseSchemeInMarginsMap.get(catalogItemId).getQty();
31352 amit.gupta 1366
            }
32232 amit.gupta 1367
            if (modelWiseSchemeOutMarginsMap.containsKey(catalogItemId)) {
1368
                income += modelWiseSchemeOutMarginsMap.get(catalogItemId).getAmount() + modelWiseSchemeOutMarginsMap.get(catalogItemId).getPendingSaleAmount();
31352 amit.gupta 1369
            }
32232 amit.gupta 1370
            if (additionalSalePayoutMap.containsKey(catalogItemId)) {
1371
                income += additionalSalePayoutMap.get(catalogItemId);
31352 amit.gupta 1372
            }
32232 amit.gupta 1373
            if (additionalPurchasePayout.containsKey(catalogItemId)) {
1374
                income += additionalPurchasePayout.get(catalogItemId);
1375
            }
1376
            if (modelWiseSalesMarginsMap.containsKey(catalogItemId)) {
1377
                income += modelWiseSalesMarginsMap.get(catalogItemId).getAmount();
1378
                saleQty = (int) modelWiseSalesMarginsMap.get(catalogItemId).getQty();
1379
            }
1380
            if (additionalPurchaseQty.containsKey(catalogItemId)) {
1381
                purchaseQty = Math.max(additionalPurchaseQty.get(catalogItemId), purchaseQty);
30253 amit.gupta 1382
 
31352 amit.gupta 1383
            }
32232 amit.gupta 1384
            modelIncomeMap.put(catalogItemId, income);
1385
            modelSaleQtyMap.put(catalogItemId, saleQty);
1386
            modelPurchaseQtyMap.put(catalogItemId, purchaseQty);
30253 amit.gupta 1387
 
32232 amit.gupta 1388
        }
30253 amit.gupta 1389
 
31352 amit.gupta 1390
        model.addAttribute("month", month);
32232 amit.gupta 1391
        model.addAttribute("modelWiseSalesMarginsMap", modelWiseSalesMarginsMap);
31352 amit.gupta 1392
        model.addAttribute("modelWiseSchemeOutMarginsMap", modelWiseSchemeOutMarginsMap);
1393
        model.addAttribute("modelWiseSchemeInMarginsMap", modelWiseSchemeInMarginsMap);
1394
        model.addAttribute("modelNameMap", modelNameMap);
32232 amit.gupta 1395
        model.addAttribute("modelPurchaseQtyMap", modelPurchaseQtyMap);
1396
        model.addAttribute("modelSaleQtyMap", modelSaleQtyMap);
1397
        model.addAttribute("modelIncomeMap", modelIncomeMap);
31352 amit.gupta 1398
        model.addAttribute("categoryUpgradeBrandModelMap", categoryUpgradeBrandModelMap);
1399
        model.addAttribute("additionalPurchasePayoutMap", additionalPurchasePayout);
32232 amit.gupta 1400
        model.addAttribute("additionalSalePayoutMap", additionalSalePayoutMap);
30253 amit.gupta 1401
 
31352 amit.gupta 1402
        return "monthly-brand-wise-income";
30053 manish 1403
 
31352 amit.gupta 1404
    }
30053 manish 1405
 
31352 amit.gupta 1406
    @RequestMapping(value = "/monthWisePartnerIncome/{yearMonth}", method = RequestMethod.GET)
34813 aman 1407
    public String publishedOffersOnMonthBefore(HttpServletRequest request, @RequestParam(required = false) boolean partnerTask, @PathVariable int yearMonth, Model model)
31352 amit.gupta 1408
            throws ProfitMandiBusinessException {
1409
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
30253 amit.gupta 1410
 
31352 amit.gupta 1411
        LocalDateTime startOfMonth = LocalDate.now().minusMonths(yearMonth).withDayOfMonth(1).atStartOfDay();
1412
        LocalDateTime lastMonthEnd = startOfMonth.plusMonths(1);
30253 amit.gupta 1413
 
31352 amit.gupta 1414
        YearMonth monthYear = YearMonth.now();
30053 manish 1415
 
31352 amit.gupta 1416
        boolean partnerType = partnerTypeChangeService.isPartnerTypeUpgraded(loginDetails.getFofoId(), monthYear);
30053 manish 1417
 
31352 amit.gupta 1418
        LOGGER.info("partnerType" + partnerType);
30053 manish 1419
 
31352 amit.gupta 1420
        Map<String, Double> lastMonthCategoryUpgradeMarginMap = new HashMap<>();
30053 manish 1421
 
31352 amit.gupta 1422
        if (partnerType) {
1423
            lastMonthCategoryUpgradeMarginMap = schemeInOutRepository
1424
                    .selectLastMonthCategoryUpgradeMarginByBrand(loginDetails.getFofoId(), startOfMonth,
1425
                            lastMonthEnd)
1426
                    .stream().collect(Collectors.toMap(x -> x.getBrand(), x -> x.getAmount()));
1427
        }
30053 manish 1428
 
31352 amit.gupta 1429
        List<LastMonthCreditedIncomeModel> lastMonthPendingIncomeModels = schemeInOutRepository
1430
                .selectLastMonthPendingIncomeByFofoId(loginDetails.getFofoId(), startOfMonth, lastMonthEnd);
30053 manish 1431
 
31352 amit.gupta 1432
        List<LastMonthCreditedIncomeModel> lastMonthPurchaseInMargins = schemeInOutRepository
1433
                .selectLastMonthPurchaseInMarginByFofoId(loginDetails.getFofoId(), startOfMonth, lastMonthEnd);
30235 tejbeer 1434
 
31352 amit.gupta 1435
        List<LastMonthCreditedIncomeModel> lastMonthFrontEndIncomes = schemeInOutRepository
1436
                .selectFrontIncomeByBrand(loginDetails.getFofoId(), startOfMonth, lastMonthEnd);
32232 amit.gupta 1437
        Map<String, LastMonthCreditedIncomeModel> lastMonthFrontEndIncomeMap = lastMonthFrontEndIncomes.stream().collect(Collectors.toMap(x -> x.getBrand(), x -> x));
30235 tejbeer 1438
 
31352 amit.gupta 1439
        List<OfferPayoutImeiIncomeModel> offerPayoutImeiIncomeModels = offerPayoutRepository.getTotalPayoutsByPartnerPeriod(
1440
                YearMonth.of(startOfMonth.getYear(), startOfMonth.getMonth()), loginDetails.getFofoId(), null, null);
30235 tejbeer 1441
 
31352 amit.gupta 1442
        Map<String, Double> additionalPurchasePayout = offerPayoutImeiIncomeModels.stream().collect(Collectors.groupingBy(OfferPayoutImeiIncomeModel::getBrand, Collectors.summingDouble(OfferPayoutImeiIncomeModel::getPurchasePayout)));
1443
        Map<String, Double> additionSalePayout = offerPayoutImeiIncomeModels.stream().collect(Collectors.groupingBy(OfferPayoutImeiIncomeModel::getBrand, Collectors.summingDouble(OfferPayoutImeiIncomeModel::getSalePayout)));
30235 tejbeer 1444
 
1445
 
31352 amit.gupta 1446
        Map<String, LastMonthCreditedIncomeModel> lastMonthPurchaseInMarginMap = lastMonthPurchaseInMargins.stream()
1447
                .collect(Collectors.toMap(x -> x.getBrand(), x -> x));
30053 manish 1448
 
34409 amit.gupta 1449
        Map<String, LastMonthCreditedIncomeModel> lastMonthSaleMarginMap = schemeInOutRepository
1450
                .selectLastMonthCreditedIncomeByFofoId(loginDetails.getFofoId(), startOfMonth, lastMonthEnd).stream()
31352 amit.gupta 1451
                .collect(Collectors.toMap(x -> x.getBrand(), x -> x));
30053 manish 1452
 
1453
 
31352 amit.gupta 1454
        Map<String, LastMonthCreditedIncomeModel> lastMonthPendingIncomeMap = lastMonthPendingIncomeModels.stream()
1455
                .collect(Collectors.toMap(x -> x.getBrand(), x -> x));
30053 manish 1456
 
31352 amit.gupta 1457
        Map<String, Float> totalAmountMap = lastMonthSaleMarginMap.entrySet().stream()
1458
                .collect(Collectors.toMap(x -> x.getKey(), x -> x.getValue().getAmount()));
1459
        Set<String> brandSet = new HashSet<>();
1460
        brandSet.addAll(lastMonthPurchaseInMarginMap.keySet());
1461
        brandSet.addAll(lastMonthSaleMarginMap.keySet());
1462
        brandSet.addAll(lastMonthPendingIncomeMap.keySet());
1463
        brandSet.addAll(additionalPurchasePayout.keySet());
1464
        brandSet.addAll(additionSalePayout.keySet());
33313 amit.gupta 1465
        brandSet.addAll(lastMonthFrontEndIncomeMap.keySet());
31352 amit.gupta 1466
        brandSet.stream().forEach(brand -> {
1467
            totalAmountMap.put(brand,
1468
                    (lastMonthSaleMarginMap.get(brand) == null ? 0 : lastMonthSaleMarginMap.get(brand).getAmount()) +
1469
                            (lastMonthPurchaseInMarginMap.get(brand) == null ? 0 : lastMonthPurchaseInMarginMap.get(brand).getAmount()) +
1470
                            (lastMonthPendingIncomeMap.get(brand) == null ? 0 : lastMonthPendingIncomeMap.get(brand).getAmount()) +
1471
                            (additionalPurchasePayout.get(brand) == null ? 0 : additionalPurchasePayout.get(brand).longValue()) +
32232 amit.gupta 1472
                            (additionSalePayout.get(brand) == null ? 0 : additionSalePayout.get(brand).longValue()) +
1473
                            (lastMonthFrontEndIncomeMap.get(brand) == null ? 0 : lastMonthFrontEndIncomeMap.get(brand).getAmount())
31352 amit.gupta 1474
            );
1475
        });
30053 manish 1476
 
31352 amit.gupta 1477
        Map<Integer, String> monthValueMap = new HashMap<>();
1478
        for (int i = 0; i <= 5; i++) {
1479
            LocalDateTime monthStart = LocalDateTime.now().withDayOfMonth(1).minusMonths(i);
1480
            monthValueMap.put(i, monthStart.format(DateTimeFormatter.ofPattern("MMM''uu")));
1481
        }
1482
        model.addAttribute("monthValueMap", monthValueMap);
30053 manish 1483
 
32232 amit.gupta 1484
        model.addAttribute("brandSet", brandSet);
31352 amit.gupta 1485
        model.addAttribute("lastMonthPurchaseInMarginMap", lastMonthPurchaseInMarginMap);
1486
        model.addAttribute("lastMonthSaleMarginMap", lastMonthSaleMarginMap);
1487
        model.addAttribute("lastMonthPendingIncomeMap", lastMonthPendingIncomeMap);
1488
        model.addAttribute("additionalPurchasePayoutMap", additionalPurchasePayout);
1489
        model.addAttribute("additionalSalePayoutMap", additionSalePayout);
32232 amit.gupta 1490
        model.addAttribute("lastMonthFrontEndIncomeMap", lastMonthFrontEndIncomeMap);
30053 manish 1491
 
31352 amit.gupta 1492
        model.addAttribute("totalAmountMap", totalAmountMap);
1493
        model.addAttribute("month", yearMonth);
1494
        model.addAttribute("lastMonthCategoryUpgradeMarginMap", lastMonthCategoryUpgradeMarginMap);
1495
        LOGGER.info("totalAmountMap {}", totalAmountMap);
1496
        LOGGER.info("lastMonthSaleMarginMap {}", lastMonthSaleMarginMap);
30253 amit.gupta 1497
 
34813 aman 1498
        if (partnerTask) {
1499
            return "monthly-credited-income";
1500
        } else return "last-month-credited-income";
31352 amit.gupta 1501
    }
30253 amit.gupta 1502
 
31352 amit.gupta 1503
    @RequestMapping(value = "/schemes/downloadPage", method = RequestMethod.GET)
1504
    public String downloadPage(HttpServletRequest request, Model model) {
1505
        return "schemes-download";
1506
    }
30253 amit.gupta 1507
 
31352 amit.gupta 1508
    @RequestMapping(value = "/schemes/download", method = RequestMethod.GET)
1509
    public ResponseEntity<?> downloadInventoryItemAgingByInterval(HttpServletRequest request,
1510
                                                                  @RequestParam LocalDateTime startDateTime, @RequestParam LocalDateTime endDateTime)
1511
            throws ProfitMandiBusinessException {
30253 amit.gupta 1512
 
31352 amit.gupta 1513
        List<SchemeModel> schemeModels = schemeService.getAllSchemeModels(startDateTime, endDateTime);
31334 amit.gupta 1514
 
31352 amit.gupta 1515
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
1516
        ExcelUtils.writeSchemeModels(schemeModels, byteArrayOutputStream);
30253 amit.gupta 1517
 
31352 amit.gupta 1518
        final HttpHeaders headers = new HttpHeaders();
1519
        headers.set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
1520
        headers.set("Content-disposition", "inline; filename=SchemesReport.xlsx");
1521
        headers.setContentLength(byteArrayOutputStream.toByteArray().length);
1522
        final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
1523
        final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
1524
        return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
1525
    }
30053 manish 1526
 
31352 amit.gupta 1527
    @RequestMapping(value = "/getSchemeById", method = RequestMethod.GET)
1528
    public String getSchemeById(HttpServletRequest request,
1529
                                @RequestParam(name = ProfitMandiConstants.SCHEME_ID) int schemeId, Model model)
1530
            throws ProfitMandiBusinessException {
1531
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
30053 manish 1532
 
31352 amit.gupta 1533
        boolean fullAccess = this.getAccess(loginDetails.getEmailId());
1534
        Scheme scheme = schemeService.getSchemeById(schemeId);
1535
        model.addAttribute("fullAccess", fullAccess);
1536
        model.addAttribute("scheme", scheme);
1537
        model.addAttribute("isAdmin", roleManager.isAdmin(loginDetails.getRoleIds()));
1538
        return "scheme-details";
1539
    }
30053 manish 1540
 
31352 amit.gupta 1541
    @RequestMapping(value = "/activeSchemeById", method = RequestMethod.PUT)
1542
    public String activeSchemeById(@RequestParam(name = ProfitMandiConstants.SCHEME_ID) int schemeId,
1543
                                   @RequestParam(name = "offset", defaultValue = "0") int offset,
1544
                                   @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
1545
            throws ProfitMandiBusinessException {
1546
        schemeService.activeSchemeById(schemeId);
1547
        List<Scheme> schemes = schemeRepository.selectAll(offset, limit);
1548
        for (Scheme scheme : schemes) {
1549
            if (scheme.getAmountType().equals(AmountType.PERCENTAGE)) {
1550
                scheme.setAmountModel(scheme.getAmount() + "%");
1551
            } else {
1552
                scheme.setAmountModel(scheme.getAmount() + "");
1553
            }
1554
        }
1555
        return "schemes";
1556
    }
30053 manish 1557
 
34568 vikas.jang 1558
    @RequestMapping(value = "/activeSchemeByIds", method = RequestMethod.PUT)
34575 vikas.jang 1559
    public String activeSchemeByIds(@RequestParam(name = ProfitMandiConstants.SCHEME_ID) String schemeIds, @RequestParam(name = "offset", defaultValue = "0") int offset, @RequestParam(name = "limit", defaultValue = "10") int limit, Model model) throws Exception {
34568 vikas.jang 1560
        List<Integer> ids = Arrays.stream(schemeIds.split(",")).map(String::trim).filter(s -> !s.isEmpty()).map(Integer::parseInt).collect(Collectors.toList());
1561
        List<Scheme> schemes = schemeRepository.selectBySchemeIds(ids);
1562
        schemeService.activeSchemeByIds(schemes);
34575 vikas.jang 1563
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
1564
        return "response";
34568 vikas.jang 1565
    }
1566
 
35252 aman 1567
    @RequestMapping(value = "/expireSchemeByIds", method = RequestMethod.PUT)
1568
    public String expireSchemeByIds(@RequestParam(name = ProfitMandiConstants.SCHEME_ID) String schemeIds, @RequestParam(name = "offset", defaultValue = "0") int offset, @RequestParam(name = "limit", defaultValue = "10") int limit, Model model) throws Exception {
1569
        List<Integer> ids = Arrays.stream(schemeIds.split(",")).map(String::trim).filter(s -> !s.isEmpty()).map(Integer::parseInt).collect(Collectors.toList());
1570
        List<Scheme> schemes = schemeRepository.selectBySchemeIds(ids);
1571
        schemeService.expireSchemeByIds(schemes);
1572
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
1573
        return "response";
1574
    }
1575
 
31352 amit.gupta 1576
    @RequestMapping(value = "/expireSchemeById", method = RequestMethod.PUT)
1577
    public String expireSchemeById(HttpServletRequest request,
1578
                                   @RequestParam(name = ProfitMandiConstants.SCHEME_ID) int schemeId,
1579
                                   @RequestParam(name = ProfitMandiConstants.EXPIRE_TIMESTAMP) LocalDateTime expiryTimestamp, Model model)
1580
            throws ProfitMandiBusinessException {
1581
        schemeService.expireSchemeById(schemeId, expiryTimestamp);
1582
        return getDefaultSchemes(request, model);
1583
    }
30053 manish 1584
 
31352 amit.gupta 1585
    @RequestMapping(value = "/getSchemesJson", method = RequestMethod.GET)
1586
    public ResponseEntity<?> getSchemesJson(HttpServletRequest request,
1587
                                            @RequestParam(name = "offset", defaultValue = "0") int offset,
1588
                                            @RequestParam(name = "limit", defaultValue = "10") int limit, Model model)
1589
            throws ProfitMandiBusinessException {
1590
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1591
        return responseSender.ok(schemeService.getSchemes(loginDetails.getRoleIds(), offset, limit));
1592
    }
30053 manish 1593
 
31352 amit.gupta 1594
    @RequestMapping(value = "/getCustomerOffer", method = RequestMethod.GET)
1595
    public String getCustomerOffer(HttpServletRequest request,
33795 ranu 1596
                                   @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 1597
            throws ProfitMandiBusinessException {
1598
        List<CustomerOffer> customerOffers = null;
1599
        if (searchModel > 0) {
30053 manish 1600
 
31352 amit.gupta 1601
            Item item = itemRepository.selectAllByCatalogItemId(searchModel).get(0);
1602
            customerOffers = customerOfferRepository.selectActiveOfferByModel(searchModel, LocalDate.now());
1603
            model.addAttribute("modelName", item.getItemDescriptionNoColor());
33795 ranu 1604
        } else if (startDate != null && endDate != null) {
1605
            customerOffers = customerOfferRepository.selectOffersByDates(startDate, endDate);
31352 amit.gupta 1606
        } else {
33795 ranu 1607
            if (startDate == null) {
1608
                startDate = LocalDateTime.now().minusMonths(1);  // One month ago from today
1609
            }
1610
            if (endDate == null) {
1611
                endDate = LocalDateTime.now();  // Current date and time
1612
            }
1613
            customerOffers = customerOfferRepository.selectOffersByDates(startDate, endDate);
31352 amit.gupta 1614
        }
30053 manish 1615
 
31352 amit.gupta 1616
        LOGGER.info("customerOffers" + customerOffers);
30053 manish 1617
 
31352 amit.gupta 1618
        for (CustomerOffer customerOffer : customerOffers) {
30053 manish 1619
 
31352 amit.gupta 1620
            LOGGER.info("ss" + searchModel);
30053 manish 1621
 
31352 amit.gupta 1622
            if (!StringUtils.isEmpty(customerOffer.getPartnerCriteria())) {
33030 amit.gupta 1623
                String partnerCriteria = offerService.getPartnerCriteriaString(gson.fromJson(customerOffer.getPartnerCriteria(), PartnerCriteria.class));
31352 amit.gupta 1624
                customerOffer.setPartnerCriteriaString(partnerCriteria);
1625
            }
30053 manish 1626
 
31352 amit.gupta 1627
        }
30053 manish 1628
 
31352 amit.gupta 1629
        List<Integer> fofoIds = fofoStoreRepository.selectActiveStores().stream().map(x -> x.getId())
1630
                .collect(Collectors.toList());
31281 amit.gupta 1631
 
31352 amit.gupta 1632
        Map<Integer, CustomRetailer> customRetailerMap = retailerService.getAllFofoRetailers();
30053 manish 1633
 
31352 amit.gupta 1634
        Map<Integer, CustomRetailer> customRetailersMap = fofoIds.stream().map(x -> customRetailerMap.get(x))
1635
                .filter(x -> x != null).collect(Collectors.toList()).stream()
1636
                .collect(Collectors.toMap(x -> x.getPartnerId(), x -> x));
30053 manish 1637
 
31352 amit.gupta 1638
        model.addAttribute("customRetailersMap", customRetailersMap);
1639
        model.addAttribute("warehouseRegion", ProfitMandiConstants.WAREHOUSE_MAP);
1640
        model.addAttribute("searchModel", searchModel);
30053 manish 1641
 
31352 amit.gupta 1642
        model.addAttribute("customerOffers", customerOffers);
1643
        return "customer-offer";
30053 manish 1644
 
31352 amit.gupta 1645
    }
30053 manish 1646
 
31352 amit.gupta 1647
    @RequestMapping(value = "/createCustomerOffer", method = RequestMethod.POST)
1648
    public String createCustomerOffer(HttpServletRequest request, @RequestBody CustomerOfferModel customerOfferModel,
1649
                                      Model model) throws Exception {
30053 manish 1650
 
31352 amit.gupta 1651
        CustomerOffer co = new CustomerOffer();
1652
        co.setOfferName(customerOfferModel.getOfferName());
1653
        co.setStartDate(customerOfferModel.getStartDate());
1654
        co.setEndDate(customerOfferModel.getEndDate());
1655
        co.setPartnerCriteria(gson.toJson(customerOfferModel.getPartnerCriteria()));
1656
        co.setCreatedTimestamp(LocalDateTime.now());
1657
        co.setUpdatedTimestamp(LocalDateTime.now());
1658
        customerOfferRepository.persist(co);
31281 amit.gupta 1659
 
31352 amit.gupta 1660
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
31281 amit.gupta 1661
 
31352 amit.gupta 1662
        return "response";
30053 manish 1663
 
31352 amit.gupta 1664
    }
30053 manish 1665
 
31352 amit.gupta 1666
    @RequestMapping(value = "/customerOffer/downloadTemplate", method = RequestMethod.GET)
1667
    public ResponseEntity<?> downloadCustomerOfferTemplate(HttpServletRequest request) throws Exception {
1668
        List<List<?>> rows = new ArrayList<>();
30053 manish 1669
 
31352 amit.gupta 1670
        org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil.getCSVByteStream(Arrays.asList("id",
33795 ranu 1671
                        "Catalog Id", "Scheme Payout", "Dealer Payout", "Start Date (dd-mm-yyyy)", "End Date (dd-mm-yyyy)", "Offer Type"),
31352 amit.gupta 1672
                rows);
30053 manish 1673
 
31352 amit.gupta 1674
        final HttpHeaders headers = new HttpHeaders();
1675
        headers.set("Content-Type", "text/csv");
1676
        headers.set("Content-disposition", "inline; filename=customer-offer-template.csv");
1677
        headers.setContentLength(baos.toByteArray().length);
30053 manish 1678
 
31352 amit.gupta 1679
        final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
1680
        final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
1681
        return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
30053 manish 1682
 
31352 amit.gupta 1683
    }
30053 manish 1684
 
31352 amit.gupta 1685
    @RequestMapping(value = "/customerOfferItem/upload", method = RequestMethod.POST)
1686
    public String uploadCustomerOfferItem(HttpServletRequest request, Model model, @RequestParam int offerId,
1687
                                          HttpServletResponse response, @RequestPart MultipartFile file) throws Throwable {
23786 amit.gupta 1688
 
31352 amit.gupta 1689
        List<CSVRecord> records = FileUtil.readFile(file);
1690
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
23914 govind 1691
 
31352 amit.gupta 1692
        CustomerOffer customerOffer = customerOfferRepository.selectById(offerId);
1693
        List<Integer> catalogIds = new ArrayList<>();
1694
        for (CSVRecord record : records) {
23786 amit.gupta 1695
 
31352 amit.gupta 1696
            CustomerOfferItem coi = customerOfferItemRepository.selectById(Integer.parseInt(record.get(0)));
23786 amit.gupta 1697
 
31352 amit.gupta 1698
            if (coi == null) {
1699
                coi = new CustomerOfferItem();
1700
                coi.setCatalogId(Integer.parseInt(record.get(1)));
1701
                coi.setSchemePayout(Integer.parseInt(record.get(2)));
1702
                coi.setDealerPayout(Integer.parseInt(record.get(3)));
33795 ranu 1703
                coi.setOfferType(OfferType.valueOf(record.get(6)));
31352 amit.gupta 1704
                coi.setCustomerOfferId(offerId);
34516 ranu 1705
                coi.setAdditionalInfo(String.valueOf(record.get(7)));
31352 amit.gupta 1706
                coi.setCreatedTimestamp(LocalDateTime.now());
23786 amit.gupta 1707
 
31352 amit.gupta 1708
                customerOfferItemRepository.persist(coi);
29899 tejbeer 1709
 
31352 amit.gupta 1710
            }
1711
            coi.setSchemePayout(Integer.parseInt(record.get(2)));
1712
            coi.setDealerPayout(Integer.parseInt(record.get(3)));
33795 ranu 1713
            coi.setOfferType(OfferType.valueOf(record.get(6)));
34516 ranu 1714
            coi.setAdditionalInfo(String.valueOf(record.get(7)));
31352 amit.gupta 1715
            coi.setCustomerOfferId(offerId);
1716
            coi.setUpdatedTimestamp(LocalDateTime.now());
23786 amit.gupta 1717
 
31352 amit.gupta 1718
            LOGGER.info(record.get(4));
23786 amit.gupta 1719
 
31352 amit.gupta 1720
            LocalDate startDate = LocalDate.parse(record.get(4), formatter);
1721
            LocalDate endDate = LocalDate.parse(record.get(5), formatter);
23786 amit.gupta 1722
 
31352 amit.gupta 1723
            if ((startDate.equals(customerOffer.getStartDate().toLocalDate())
1724
                    || startDate.isAfter(customerOffer.getStartDate().toLocalDate()))
1725
                    && (startDate.isEqual(customerOffer.getEndDate().toLocalDate())
1726
                    || startDate.isBefore(customerOffer.getEndDate().toLocalDate()))) {
1727
                coi.setStartDate(startDate);
26802 tejbeer 1728
 
31352 amit.gupta 1729
            } else {
29707 tejbeer 1730
 
31352 amit.gupta 1731
                catalogIds.add(coi.getCatalogId());
1732
            }
29707 tejbeer 1733
 
31352 amit.gupta 1734
            if ((endDate.equals(customerOffer.getStartDate().toLocalDate())
1735
                    || endDate.isAfter(customerOffer.getStartDate().toLocalDate()))
1736
                    && (endDate.isEqual(customerOffer.getEndDate().toLocalDate())
1737
                    || endDate.isBefore(customerOffer.getEndDate().toLocalDate()))) {
31147 tejbeer 1738
 
31352 amit.gupta 1739
                coi.setEndDate(endDate);
31147 tejbeer 1740
 
31352 amit.gupta 1741
            } else {
1742
                catalogIds.add(coi.getCatalogId());
1743
            }
31147 tejbeer 1744
 
31352 amit.gupta 1745
        }
31147 tejbeer 1746
 
31352 amit.gupta 1747
        if (!catalogIds.isEmpty()) {
1748
            throw new ProfitMandiBusinessException("Please set accurate start and end date", catalogIds,
1749
                    "Please set accurate start and end date");
1750
        }
1751
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
31147 tejbeer 1752
 
31352 amit.gupta 1753
        return "response";
31147 tejbeer 1754
 
31352 amit.gupta 1755
    }
31147 tejbeer 1756
 
34788 ranu 1757
 
1758
    @RequestMapping(value = "/CheckIfExistCustomerOfferItem", method = RequestMethod.POST)
1759
    public String CheckIfExistCustomerOfferItem(HttpServletRequest request,
1760
                                                @RequestBody CustomerOfferItemModel customerOfferItemModel, Model model) throws Throwable {
1761
 
1762
        CustomerOffer customerOffer = customerOfferRepository.selectById(customerOfferItemModel.getOfferId());
1763
 
1764
        if (!(customerOffer.getEndDate().toLocalDate().equals(LocalDate.now()))
1765
                && customerOffer.getEndDate().isBefore(LocalDateTime.now())) {
1766
            throw new ProfitMandiBusinessException("Catalog Id", customerOffer.getOfferName(), "Offer is Expired");
1767
 
1768
        }
1769
 
1770
        List<CustomerOfferItem> customerOfferItems = customerOfferItemRepository
1771
                .selectByOfferAndCatalogId(customerOfferItemModel.getOfferId(), customerOfferItemModel.getCatalogId());
1772
        boolean response = true;
1773
        if (!customerOfferItems.isEmpty()) {
1774
            for (CustomerOfferItem coi : customerOfferItems) {
1775
                if (!(coi.getEndDate().equals(LocalDate.now())) && coi.getEndDate().isAfter(LocalDate.now())) {
1776
                    response = false;
1777
 
1778
                }
1779
            }
1780
        }
1781
        model.addAttribute("response1", mvcResponseSender.createResponseString(response));
1782
        return "response";
1783
 
1784
    }
1785
 
31352 amit.gupta 1786
    @RequestMapping(value = "/addCustomerOfferItem", method = RequestMethod.POST)
1787
    public String addCustomerOfferItem(HttpServletRequest request,
1788
                                       @RequestBody CustomerOfferItemModel customerOfferItemModel, Model model) throws Throwable {
31147 tejbeer 1789
 
31352 amit.gupta 1790
        CustomerOffer customerOffer = customerOfferRepository.selectById(customerOfferItemModel.getOfferId());
31147 tejbeer 1791
 
31352 amit.gupta 1792
        if (!(customerOffer.getEndDate().toLocalDate().equals(LocalDate.now()))
1793
                && customerOffer.getEndDate().isBefore(LocalDateTime.now())) {
1794
            throw new ProfitMandiBusinessException("Catalog Id", customerOffer.getOfferName(), "Offer is Expired");
29707 tejbeer 1795
 
31352 amit.gupta 1796
        }
29707 tejbeer 1797
 
34788 ranu 1798
       /* List<CustomerOfferItem> customerOfferItems = customerOfferItemRepository
31352 amit.gupta 1799
                .selectByOfferAndCatalogId(customerOfferItemModel.getOfferId(), customerOfferItemModel.getCatalogId());
29707 tejbeer 1800
 
31352 amit.gupta 1801
        if (!customerOfferItems.isEmpty()) {
29707 tejbeer 1802
 
31352 amit.gupta 1803
            for (CustomerOfferItem coi : customerOfferItems) {
1804
                if (!(coi.getEndDate().equals(LocalDate.now())) && coi.getEndDate().isAfter(LocalDate.now())) {
1805
                    throw new ProfitMandiBusinessException("Catalog Id", coi.getCatalogId(), "Item is already exist.");
1806
                }
1807
            }
29707 tejbeer 1808
 
34788 ranu 1809
        }*/
29707 tejbeer 1810
 
31352 amit.gupta 1811
        LocalDate startDate = customerOfferItemModel.getStartDate().toLocalDate();
1812
        LocalDate endDate = customerOfferItemModel.getEndDate().toLocalDate();
1813
        CustomerOfferItem coi = new CustomerOfferItem();
1814
        coi.setCatalogId(customerOfferItemModel.getCatalogId());
1815
        coi.setSchemePayout(customerOfferItemModel.getSchemePayout());
34516 ranu 1816
        coi.setAdditionalInfo(customerOfferItemModel.getAdditionalInfo());
31352 amit.gupta 1817
        coi.setDealerPayout(customerOfferItemModel.getDealerPayout());
33795 ranu 1818
        coi.setOfferType(customerOfferItemModel.getOfferType());
31352 amit.gupta 1819
        coi.setCustomerOfferId(customerOfferItemModel.getOfferId());
1820
        coi.setUpdatedTimestamp(LocalDateTime.now());
1821
        coi.setCreatedTimestamp(LocalDateTime.now());
29707 tejbeer 1822
 
31352 amit.gupta 1823
        if ((startDate.equals(customerOffer.getStartDate().toLocalDate())
1824
                || startDate.isAfter(customerOffer.getStartDate().toLocalDate()))
1825
                && (startDate.isEqual(customerOffer.getEndDate().toLocalDate())
1826
                || startDate.isBefore(customerOffer.getEndDate().toLocalDate()))) {
29707 tejbeer 1827
 
31352 amit.gupta 1828
            coi.setStartDate(startDate);
29707 tejbeer 1829
 
31352 amit.gupta 1830
        } else {
29707 tejbeer 1831
 
31352 amit.gupta 1832
            throw new ProfitMandiBusinessException("Catalog Id", customerOffer.getOfferName(),
1833
                    "Please select accurate duration between " + customerOffer.getStartDate().toLocalDate() + " - "
1834
                            + customerOffer.getEndDate());
29707 tejbeer 1835
 
31352 amit.gupta 1836
        }
29707 tejbeer 1837
 
31352 amit.gupta 1838
        if ((endDate.equals(customerOffer.getStartDate().toLocalDate())
1839
                || endDate.isAfter(customerOffer.getStartDate().toLocalDate()))
1840
                && (endDate.isEqual(customerOffer.getEndDate().toLocalDate())
1841
                || endDate.isBefore(customerOffer.getEndDate().toLocalDate()))) {
29707 tejbeer 1842
 
31352 amit.gupta 1843
            coi.setEndDate(endDate);
29707 tejbeer 1844
 
31352 amit.gupta 1845
        } else {
1846
            throw new ProfitMandiBusinessException("Catalog Id", customerOffer.getOfferName(),
1847
                    "Please select accurate duration between " + customerOffer.getStartDate().toLocalDate() + " - "
1848
                            + customerOffer.getEndDate());
1849
        }
31147 tejbeer 1850
 
31352 amit.gupta 1851
        customerOfferItemRepository.persist(coi);
31147 tejbeer 1852
 
31352 amit.gupta 1853
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
31147 tejbeer 1854
 
31352 amit.gupta 1855
        return "response";
29707 tejbeer 1856
 
31352 amit.gupta 1857
    }
31147 tejbeer 1858
 
31352 amit.gupta 1859
    @RequestMapping(value = "/customerOfferItem/download", method = RequestMethod.GET)
1860
    public ResponseEntity<?> downloadOfferItem(HttpServletRequest request, @RequestParam int offerId) throws Exception {
31147 tejbeer 1861
 
31352 amit.gupta 1862
        List<CustomerOfferItem> cois = customerOfferItemRepository.selectByOfferId(offerId);
1863
        List<List<?>> rows = new ArrayList<>();
1864
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
31147 tejbeer 1865
 
31352 amit.gupta 1866
        for (CustomerOfferItem coi : cois) {
1867
            rows.add(Arrays.asList(coi.getId(), coi.getCatalogId(), coi.getSchemePayout(), coi.getDealerPayout(),
34516 ranu 1868
                    coi.getStartDate().format(formatter), coi.getEndDate().format(formatter), coi.getOfferType(), coi.getAdditionalInfo()));
31147 tejbeer 1869
 
31352 amit.gupta 1870
        }
31147 tejbeer 1871
 
31352 amit.gupta 1872
        org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil.getCSVByteStream(
34516 ranu 1873
                Arrays.asList("id", "Catalog Id", "Scheme Payout", "Dealer Payout", "Start Date", "End Date", "Offer Type", "Additional Info"), rows);
29707 tejbeer 1874
 
31352 amit.gupta 1875
        final HttpHeaders headers = new HttpHeaders();
1876
        headers.set("Content-Type", "text/csv");
1877
        headers.set("Content-disposition", "inline; filename=customer-offer-template.csv");
1878
        headers.setContentLength(baos.toByteArray().length);
31147 tejbeer 1879
 
31352 amit.gupta 1880
        final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
1881
        final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
1882
        return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);
31147 tejbeer 1883
 
31352 amit.gupta 1884
    }
31147 tejbeer 1885
 
31352 amit.gupta 1886
    @RequestMapping(value = "/getCustomerOfferItem", method = RequestMethod.GET)
1887
    public String getCustomerOfferItem(HttpServletRequest request, @RequestParam int offerId, Model model)
1888
            throws Exception {
29707 tejbeer 1889
 
31352 amit.gupta 1890
        List<CustomerOfferItem> customerOfferItems = customerOfferItemRepository.selectByOfferId(offerId);
1891
        List<Integer> catalogIds = customerOfferItems.stream().map(x -> x.getCatalogId()).collect(Collectors.toList());
29707 tejbeer 1892
 
31352 amit.gupta 1893
        Map<Integer, List<Item>> catalogItemMap = itemRepository.selectAllByCatalogIds(new HashSet<>(catalogIds))
1894
                .stream().collect(Collectors.groupingBy(x -> x.getCatalogItemId()));
29707 tejbeer 1895
 
33795 ranu 1896
        List<OfferType> offerTypes = Arrays.asList(OfferType.values());
1897
 
31352 amit.gupta 1898
        model.addAttribute("catalogItemMap", catalogItemMap);
29707 tejbeer 1899
 
31352 amit.gupta 1900
        model.addAttribute("offerId", offerId);
31147 tejbeer 1901
 
31352 amit.gupta 1902
        model.addAttribute("customerOfferItems", customerOfferItems);
33795 ranu 1903
 
1904
        model.addAttribute("offerTypes", offerTypes);
1905
 
31352 amit.gupta 1906
        return "customer-offer-item";
31147 tejbeer 1907
 
31352 amit.gupta 1908
    }
31147 tejbeer 1909
 
31352 amit.gupta 1910
    @RequestMapping(value = "/expiredCustomerOfferItem", method = RequestMethod.POST)
1911
    public String expiredCustomerOfferItem(HttpServletRequest request, @RequestParam int id,
1912
                                           @RequestParam LocalDateTime endDate, Model model) throws Exception {
31147 tejbeer 1913
 
31352 amit.gupta 1914
        CustomerOfferItem customerOfferItem = customerOfferItemRepository.selectById(id);
31147 tejbeer 1915
 
31352 amit.gupta 1916
        CustomerOffer customerOffer = customerOfferRepository.selectById(customerOfferItem.getCustomerOfferId());
31147 tejbeer 1917
 
31352 amit.gupta 1918
        if ((endDate.toLocalDate().equals(customerOffer.getStartDate().toLocalDate())
1919
                || endDate.toLocalDate().isAfter(customerOffer.getStartDate().toLocalDate()))
1920
                && (endDate.toLocalDate().isEqual(customerOffer.getEndDate().toLocalDate())
1921
                || endDate.toLocalDate().isBefore(customerOffer.getEndDate().toLocalDate()))) {
31147 tejbeer 1922
 
31352 amit.gupta 1923
            customerOfferItem.setEndDate(endDate.toLocalDate());
31147 tejbeer 1924
 
31352 amit.gupta 1925
        } else {
1926
            throw new ProfitMandiBusinessException("Date", customerOffer.getOfferName(),
1927
                    "customer offer expired on " + customerOffer.getEndDate());
1928
        }
1929
        Map<Integer, List<Item>> catalogItemMap = itemRepository
1930
                .selectAllByCatalogItemId(customerOfferItem.getCatalogId()).stream()
1931
                .collect(Collectors.groupingBy(x -> x.getCatalogItemId()));
1932
        model.addAttribute("catalogItemMap", catalogItemMap);
31147 tejbeer 1933
 
31352 amit.gupta 1934
        model.addAttribute("coi", customerOfferItem);
31147 tejbeer 1935
 
31352 amit.gupta 1936
        return "customer-offer-item-index";
31147 tejbeer 1937
 
31352 amit.gupta 1938
    }
31147 tejbeer 1939
 
31352 amit.gupta 1940
    @RequestMapping(value = "/extendCustomerOffer", method = RequestMethod.POST)
1941
    public String extendCustomerOffer(HttpServletRequest request, @RequestParam int id,
1942
                                      @RequestParam LocalDateTime endDate, Model model) throws ProfitMandiBusinessException {
31147 tejbeer 1943
 
31352 amit.gupta 1944
        CustomerOffer co = customerOfferRepository.selectById(id);
1945
        co.setEndDate(endDate);
1946
        co.setUpdatedTimestamp(LocalDateTime.now());
31147 tejbeer 1947
 
31352 amit.gupta 1948
        model.addAttribute("co", co);
31147 tejbeer 1949
 
31352 amit.gupta 1950
        return "customer-index-offer";
31147 tejbeer 1951
 
31352 amit.gupta 1952
    }
31147 tejbeer 1953
 
31352 amit.gupta 1954
    @RequestMapping(value = "/getSamsungUpgradeOffer", method = RequestMethod.GET)
1955
    public String getSamsungUpgradeOffer(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {
31147 tejbeer 1956
 
31352 amit.gupta 1957
        List<UpgradeOfferStatus> uos = UpgradeOfferStatus.offerStatus;
1958
        List<SamsungUpgradeOffer> samsungUpgradeOffers = samsungUpgradeOfferRepository.selectByStatus(
1959
                uos.stream().filter(x -> !x.equals(UpgradeOfferStatus.rejected)).collect(Collectors.toList()));
31147 tejbeer 1960
 
31352 amit.gupta 1961
        model.addAttribute("samsungUpgradeOffers", samsungUpgradeOffers);
1962
        return "samsung-upgrade-offer";
31147 tejbeer 1963
 
31352 amit.gupta 1964
    }
31147 tejbeer 1965
 
31352 amit.gupta 1966
    @RequestMapping(value = "/approveSamsungUpgradeOffer", method = RequestMethod.POST)
1967
    public String approveSamsungUpgradeOffer(HttpServletRequest request, @RequestParam int id, Model model)
1968
            throws ProfitMandiBusinessException {
29707 tejbeer 1969
 
31352 amit.gupta 1970
        SamsungUpgradeOffer suo = samsungUpgradeOfferRepository.selectById(id);
1971
        suo.setStatus(UpgradeOfferStatus.approved);
1972
        suo.setApprovedTimestamp(LocalDateTime.now());
1973
        model.addAttribute("suo", suo);
1974
        return "samsung-upgrade-offer-index";
29707 tejbeer 1975
 
31352 amit.gupta 1976
    }
29707 tejbeer 1977
 
31352 amit.gupta 1978
    @RequestMapping(value = "/rejectSamsungUpgradeOffer", method = RequestMethod.POST)
1979
    public String rejectSamsungUpgradeOffer(HttpServletRequest request, @RequestParam int id, Model model)
1980
            throws ProfitMandiBusinessException {
29707 tejbeer 1981
 
31352 amit.gupta 1982
        SamsungUpgradeOffer suo = samsungUpgradeOfferRepository.selectById(id);
1983
        suo.setStatus(UpgradeOfferStatus.rejected);
29707 tejbeer 1984
 
31352 amit.gupta 1985
        model.addAttribute("suo", suo);
1986
        return "samsung-upgrade-offer-index";
29707 tejbeer 1987
 
31352 amit.gupta 1988
    }
29707 tejbeer 1989
 
35628 amit 1990
    @RequestMapping(value = "/schemes/rejectActivatedSchemeIds", method = RequestMethod.GET)
1991
    public String rejectActivatedSchemeIds(HttpServletRequest request, @RequestParam String schemeIds, Model model)
1992
            throws Exception {
1993
        LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);
1994
        String emailId = loginDetails.getEmailId();
1995
 
1996
        List<String> techEmails = new ArrayList<>();
1997
        for (EscalationType et : Arrays.asList(EscalationType.L2, EscalationType.L3, EscalationType.L4, EscalationType.L5)) {
1998
            techEmails.addAll(csService.getAuthUserByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_TECHNOLOGY, et)
1999
                    .stream().map(x -> x.getEmailId()).collect(Collectors.toList()));
2000
        }
2001
        if (!techEmails.contains(emailId)) {
2002
            throw new ProfitMandiBusinessException("User", emailId, "Unauthorised access");
2003
        }
2004
 
2005
        List<Integer> schemeIdList = Arrays.stream(schemeIds.split(","))
2006
                .map(String::trim).filter(s -> !s.isEmpty())
2007
                .map(Integer::parseInt).collect(Collectors.toList());
2008
 
2009
        schemeService.rejectActivatedSchemeIds(schemeIdList);
2010
        model.addAttribute("response1", mvcResponseSender.createResponseString(true));
2011
        return "response";
2012
    }
2013
 
22860 ashik.ali 2014
}