Rev 29899 | Rev 29927 | Go to most recent revision | View as "text/plain" | Blame | Compare with Previous | Last modification | View Log | RSS feed
package com.spice.profitmandi.web.controller;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.InputStream;import java.time.LocalDate;import java.time.LocalDateTime;import java.time.LocalTime;import java.time.Month;import java.time.YearMonth;import java.util.ArrayList;import java.util.Arrays;import java.util.HashMap;import java.util.HashSet;import java.util.List;import java.util.Map;import java.util.Set;import java.util.stream.Collectors;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.transaction.Transactional;import org.apache.commons.csv.CSVRecord;import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.core.io.InputStreamResource;import org.springframework.http.HttpHeaders;import org.springframework.http.HttpStatus;import org.springframework.http.ResponseEntity;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RequestPart;import org.springframework.web.multipart.MultipartFile;import com.spice.profitmandi.common.enumuration.DateTimePattern;import com.spice.profitmandi.common.enumuration.ReporticoProject;import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;import com.spice.profitmandi.common.model.CustomRetailer;import com.spice.profitmandi.common.model.MapWrapper;import com.spice.profitmandi.common.model.ProfitMandiConstants;import com.spice.profitmandi.common.model.SchemeItems;import com.spice.profitmandi.common.model.SchemeModel;import com.spice.profitmandi.common.services.ReporticoService;import com.spice.profitmandi.common.util.ExcelUtils;import com.spice.profitmandi.common.util.FileUtil;import com.spice.profitmandi.common.util.FormattingUtils;import com.spice.profitmandi.common.util.StringUtils;import com.spice.profitmandi.common.util.Utils;import com.spice.profitmandi.common.web.util.ResponseSender;import com.spice.profitmandi.dao.entity.catalog.CustomerOffer;import com.spice.profitmandi.dao.entity.catalog.CustomerOfferItem;import com.spice.profitmandi.dao.entity.catalog.EvaluateSchemeInvestmentPayoutModel;import com.spice.profitmandi.dao.entity.catalog.Item;import com.spice.profitmandi.dao.entity.catalog.SamsungUpgradeOffer;import com.spice.profitmandi.dao.entity.catalog.Scheme;import com.spice.profitmandi.dao.entity.catalog.TagListing;import com.spice.profitmandi.dao.entity.fofo.FofoStore;import com.spice.profitmandi.dao.entity.fofo.InventoryItem;import com.spice.profitmandi.dao.entity.fofo.PartnerDailyInvestment;import com.spice.profitmandi.dao.entity.fofo.PartnerType;import com.spice.profitmandi.dao.entity.fofo.SchemeInOut;import com.spice.profitmandi.dao.entity.fofo.SchemeItem;import com.spice.profitmandi.dao.entity.transaction.PriceDrop;import com.spice.profitmandi.dao.entity.transaction.PriceDropIMEI;import com.spice.profitmandi.dao.enumuration.catalog.AmountType;import com.spice.profitmandi.dao.enumuration.catalog.SchemeType;import com.spice.profitmandi.dao.enumuration.catalog.UpgradeOfferStatus;import com.spice.profitmandi.dao.enumuration.cs.EscalationType;import com.spice.profitmandi.dao.enumuration.transaction.SchemePayoutStatus;import com.spice.profitmandi.dao.model.CreateOfferRequest;import com.spice.profitmandi.dao.model.CreateSchemeRequest;import com.spice.profitmandi.dao.repository.catalog.CustomerOfferItemRepository;import com.spice.profitmandi.dao.repository.catalog.CustomerOfferRepository;import com.spice.profitmandi.dao.repository.catalog.ItemRepository;import com.spice.profitmandi.dao.repository.catalog.SamsungUpgradeOfferRepository;import com.spice.profitmandi.dao.repository.catalog.SchemeRepository;import com.spice.profitmandi.dao.repository.catalog.StateGstRateRepository;import com.spice.profitmandi.dao.repository.catalog.TagListingRepository;import com.spice.profitmandi.dao.repository.cs.CsService;import com.spice.profitmandi.dao.repository.dtr.FofoStoreRepository;import com.spice.profitmandi.dao.repository.dtr.Mongo;import com.spice.profitmandi.dao.repository.fofo.InventoryItemRepository;import com.spice.profitmandi.dao.repository.fofo.PartnerDailyInvestmentRepository;import com.spice.profitmandi.dao.repository.fofo.PartnerTypeChangeService;import com.spice.profitmandi.dao.repository.fofo.SchemeInOutRepository;import com.spice.profitmandi.dao.repository.fofo.SchemeItemRepository;import com.spice.profitmandi.dao.repository.transaction.PriceDropIMEIRepository;import com.spice.profitmandi.dao.repository.transaction.PriceDropRepository;import com.spice.profitmandi.service.authentication.RoleManager;import com.spice.profitmandi.service.inventory.InventoryService;import com.spice.profitmandi.service.offers.OfferService;import com.spice.profitmandi.service.scheme.SchemeService;import com.spice.profitmandi.service.user.RetailerService;import com.spice.profitmandi.service.wallet.WalletService;import com.spice.profitmandi.web.model.LoginDetails;import com.spice.profitmandi.web.util.CookiesProcessor;import com.spice.profitmandi.web.util.MVCResponseSender;import in.shop2020.model.v1.order.WalletReferenceType;@Controller@Transactional(rollbackOn = Throwable.class)public class SchemeController {private static final Logger LOGGER = LogManager.getLogger(SchemeController.class);@Autowiredprivate SchemeService schemeService;@Autowiredprivate OfferService offerService;@Autowiredprivate StateGstRateRepository stateGstRateRepository;@Autowiredprivate ItemRepository itemRepository;@Autowiredprivate ReporticoService reporticoService;@Autowiredprivate SchemeRepository schemeRepository;@Autowiredprivate SchemeItemRepository schemeItemRepository;@Autowiredprivate MVCResponseSender mvcResponseSender;@Autowiredprivate CookiesProcessor cookiesProcessor;@Autowired@Qualifier("fofoInventoryService")private InventoryService inventoryService;@Autowiredprivate TagListingRepository tagListingRepository;@Autowiredprivate RoleManager roleManager;@Autowiredprivate ResponseSender<?> responseSender;@Autowiredprivate FofoStoreRepository fofoStoreRepository;@Autowiredprivate RetailerService retailerService;@Autowiredprivate Mongo mongoClient;@AutowiredWalletService walletService;@AutowiredPartnerDailyInvestmentRepository partnerDailyInvestmentRepository;@Autowiredprivate PartnerTypeChangeService partnerTypeChangeService;@AutowiredInventoryItemRepository inventoryItemRepository;@AutowiredPriceDropIMEIRepository priceDropIMEIRepository;@AutowiredPriceDropRepository priceDropRepository;@AutowiredSchemeInOutRepository schemeInOutRepository;@Autowiredprivate CustomerOfferRepository customerOfferRepository;@Autowiredprivate CustomerOfferItemRepository customerOfferItemRepository;@Autowiredprivate SamsungUpgradeOfferRepository samsungUpgradeOfferRepository;@Autowiredprivate CsService csService;List<String> adminEmail = Arrays.asList("tarun.verma@smartdukaan.com", "neeraj.gupta@smartdukaan.com","amit.gupta@shop2020.in", "manish.tiwari@smartdukaan.com", "tejbeer.kaur@shop2020.in");@RequestMapping(value = "/createScheme", method = RequestMethod.GET)public String createScheme(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);LocalDate currentdate = LocalDate.now();Month month = currentdate.getMonth().minus(1);model.addAttribute("month", month);// Map<Integer, String> itemIdItemDescriptionMap =// inventoryService.getAllItemIdItemDescriptionMap();// model.addAttribute("itemIdItemDescriptionMap", itemIdItemDescriptionMap);Set<String> brands = inventoryService.getAllTagListingBrands(ProfitMandiConstants.MOBILE_CATEGORY_ID);brands.addAll(inventoryService.getAllTagListingBrands(14206));boolean fullAccesss = this.getAccess(loginDetails.getEmailId());model.addAttribute("fullAccesss", fullAccesss);model.addAttribute("brands", brands);model.addAttribute("retailerTypes", PartnerType.values());return "create-scheme";}private boolean getAccess(String emailId) {boolean fullAccesss = false;List<String> emails = csService.getAuthUserByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_CATEGORY, EscalationType.L3).stream().map(x -> x.getEmailId()).collect(Collectors.toList());emails.addAll(csService.getAuthUserByCategoryId(ProfitMandiConstants.TICKET_CATEGORY_CATEGORY, EscalationType.L2).stream().map(x -> x.getEmailId()).collect(Collectors.toList()));if (adminEmail.contains(emailId)) {fullAccesss = true;}if (emails.contains(emailId)) {fullAccesss = false;}return fullAccesss;}@RequestMapping(value = "/getTagListingItemsByBrand", method = RequestMethod.POST)public String getTagListingItemsByBrand(HttpServletRequest request, @RequestBody List<String> brands, Model model) {Map<Integer, String> itemIdItemDescriptionMap = new HashMap<>();LOGGER.info("brands" + brands);List<MapWrapper<Integer, String>> itemIdItemDescriptionMaplist = inventoryService.getAllTagListingItemIdItemDescriptionMap(new HashSet<>(brands));for (MapWrapper<Integer, String> mapWrapper : itemIdItemDescriptionMaplist) {itemIdItemDescriptionMap.put(mapWrapper.getKey(), mapWrapper.getValue());}model.addAttribute("itemIdItemDescriptionMap", itemIdItemDescriptionMap);// model.addAttribute("brands", inventoryService.getAllBrands());return "tag-listing-items-description";}@RequestMapping(value = "/schemes/update-schemes-page", method = RequestMethod.GET)public String updateShcemes(HttpServletRequest request) throws ProfitMandiBusinessException {LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);if (!roleManager.isAdmin(loginDetails.getRoleIds())) {throw new ProfitMandiBusinessException("User", loginDetails.getEmailId(), "Unauthorised access");}return "update-schemes-page";}@RequestMapping(value = "/payMonthlyInvestment", method = RequestMethod.POST)public void payMonthlyInvestment(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {LocalDate firstDateOfCurrentMonth = LocalDateTime.now().withDayOfMonth(1).toLocalDate();LocalDate startOfPreviousMonth = firstDateOfCurrentMonth.minusMonths(1);int referenceId = Integer.parseInt(FormattingUtils.getYearMonth(startOfPreviousMonth.atStartOfDay()));LocalDate lastOfPreviousMonth = firstDateOfCurrentMonth.minusDays(1);List<PartnerDailyInvestment> partnerDailyInvestments = partnerDailyInvestmentRepository.selectAll(startOfPreviousMonth, lastOfPreviousMonth);Map<Integer, Long> investmentMaintainedDaysMap = partnerDailyInvestments.stream().filter(x -> x.getShortPercentage() <= 10).collect(Collectors.groupingBy(x -> x.getFofoId(), Collectors.counting()));LOGGER.info("investmentMaintainedDaysMap {}", investmentMaintainedDaysMap);List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectAllPending(SchemeType.INVESTMENT,startOfPreviousMonth.atStartOfDay(), firstDateOfCurrentMonth.atStartOfDay());if (schemeInOuts.isEmpty()) {throw new ProfitMandiBusinessException("Investment Payout", "", "No data Found");}Map<Integer, List<SchemeInOut>> inventoryItemIdSchemeMap = schemeInOuts.stream().collect(Collectors.groupingBy(x -> x.getInventoryItemId()));List<InventoryItem> inventoryItems = inventoryItemRepository.selectByIds(inventoryItemIdSchemeMap.keySet());Map<Integer, List<Integer>> retailerInventoryItemIdMap = inventoryItems.stream().collect(Collectors.groupingBy(x -> x.getFofoId(), Collectors.mapping(x -> x.getId(), Collectors.toList())));System.out.println("Fofo Id\tInvestment Maintained Days\tEligible payout");for (Map.Entry<Integer, List<Integer>> retailerEntry : retailerInventoryItemIdMap.entrySet()) {int fofoId = retailerEntry.getKey();long investmentMaintainedDays = investmentMaintainedDaysMap.get(fofoId) == null ? 0: investmentMaintainedDaysMap.get(fofoId);List<SchemeInOut> schemeInouts = retailerEntry.getValue().stream().map(x -> inventoryItemIdSchemeMap.get(x)).flatMap(List::stream).filter(x -> x.getRolledBackTimestamp() == null).collect(Collectors.toList());float totalAmount = 0;for (SchemeInOut sio : schemeInouts) {if (investmentMaintainedDays < 8) {sio.setStatus(SchemePayoutStatus.REJECTED);// sio.setRolledBackTimestamp(LocalDateTime.now());sio.setStatusDescription("Investment maintained for " + investmentMaintainedDays + "(< 8) days");} else if (investmentMaintainedDays < 12) {sio.setStatus(SchemePayoutStatus.CREDITED);sio.setAmount(sio.getAmount() / 2);sio.setCreditTimestamp(LocalDateTime.now());sio.setStatusDescription("Investment maintained for " + investmentMaintainedDays + "(< 12) days");totalAmount += sio.getAmount();} else {sio.setStatus(SchemePayoutStatus.CREDITED);sio.setCreditTimestamp(LocalDateTime.now());totalAmount += sio.getAmount();}}if (totalAmount > 0) {String description = "Investment margin paid for "+ FormattingUtils.formatYearMonth(startOfPreviousMonth.atStartOfDay());if (investmentMaintainedDays < 12) {description += ", as maintained for " + investmentMaintainedDays + "(< 12) days";}walletService.addAmountToWallet(fofoId, referenceId, WalletReferenceType.INVESTMENT_PAYOUT, description,totalAmount, lastOfPreviousMonth.atTime(LocalTime.MAX));}System.out.printf("%d\t%d\t%f%n", fofoId, investmentMaintainedDays, totalAmount);}}@RequestMapping(value = "/evaluateActualInvestmentPayout", method = RequestMethod.GET)public ResponseEntity<?> evaluateActualInvestmentPayout(HttpServletRequest request, Model model) throws Exception {List<List<?>> rows = new ArrayList<>();LocalDate firstDateOfCurrentMonth = LocalDateTime.now().withDayOfMonth(1).toLocalDate();LocalDate startOfPreviousMonth = firstDateOfCurrentMonth.minusMonths(1);LocalDate lastOfPreviousMonth = firstDateOfCurrentMonth.minusDays(1);List<PartnerDailyInvestment> partnerDailyInvestments = partnerDailyInvestmentRepository.selectAll(startOfPreviousMonth, lastOfPreviousMonth);Map<Integer, Long> investmentMaintainedDaysMap = partnerDailyInvestments.stream().filter(x -> x.getShortPercentage() <= 10).collect(Collectors.groupingBy(x -> x.getFofoId(), Collectors.counting()));LOGGER.info("investmentMaintainedDaysMap {}", investmentMaintainedDaysMap);List<SchemeInOut> schemeInOuts = schemeInOutRepository.selectAllPending(SchemeType.INVESTMENT,startOfPreviousMonth.atStartOfDay(), firstDateOfCurrentMonth.atStartOfDay());Map<Integer, List<SchemeInOut>> inventoryItemIdSchemeMap = schemeInOuts.stream().collect(Collectors.groupingBy(x -> x.getInventoryItemId()));List<InventoryItem> inventoryItems = inventoryItemRepository.selectByIds(inventoryItemIdSchemeMap.keySet());Map<Integer, List<Integer>> retailerInventoryItemIdMap = inventoryItems.stream().collect(Collectors.groupingBy(x -> x.getFofoId(), Collectors.mapping(x -> x.getId(), Collectors.toList())));System.out.println("Fofo Id\tInvestment Maintained Days\tEligible payout");for (Map.Entry<Integer, List<Integer>> retailerEntry : retailerInventoryItemIdMap.entrySet()) {int fofoId = retailerEntry.getKey();List<SchemeInOut> schemeInouts = retailerEntry.getValue().stream().map(x -> inventoryItemIdSchemeMap.get(x)).flatMap(List::stream).collect(Collectors.toList());double totalAmount = schemeInouts.stream().filter(x -> x.getRolledBackTimestamp() == null).collect(Collectors.summingDouble(x -> x.getAmount()));long investmentMaintainedDays = investmentMaintainedDaysMap.get(fofoId) == null ? 0: investmentMaintainedDaysMap.get(fofoId);if (investmentMaintainedDays < 8) {totalAmount = 0;} else if (investmentMaintainedDays < 12) {totalAmount = totalAmount / 2;}System.out.printf("%d\t%d\t%f%n", fofoId, investmentMaintainedDays, totalAmount);CustomRetailer customRetailer = retailerService.getFofoRetailer(fofoId);rows.add(Arrays.asList(fofoId, customRetailer.getBusinessName(), customRetailer.getCode(),investmentMaintainedDays, totalAmount));}org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil.getCSVByteStream(Arrays.asList("fofoId", "Name", "Code", "investmentMaintainedDays", "totalAmount"), rows);final HttpHeaders headers = new HttpHeaders();headers.set("Content-Type", "text/csv");headers.set("Content-disposition", "inline; filename=investmentMaintainedDays.csv");headers.setContentLength(baos.toByteArray().length);final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);}@RequestMapping(value = "/processInvestmentDryRun", method = RequestMethod.GET)public ResponseEntity<?> processInvestmentDryRun(HttpServletRequest request, Model model) throws Exception {LocalDate firstDateOfCurrentMonth = LocalDateTime.now().withDayOfMonth(1).toLocalDate();LocalDate startOfPreviousMonth = firstDateOfCurrentMonth.minusMonths(1);LocalDate lastOfPreviousMonth = firstDateOfCurrentMonth.minusDays(1);List<List<?>> rows = new ArrayList<>();Map<String, String> params = new HashMap<>();params.put("MANUAL_datesBetween_FROMDATE", firstDateOfCurrentMonth.toString());params.put("MANUAL_datesBetween_TODATE", firstDateOfCurrentMonth.plusDays(9).toString());params.put("type", "INVESTMENT");List<EvaluateSchemeInvestmentPayoutModel> evaluateSchemeInvestmentPayouts = reporticoService.getReports(EvaluateSchemeInvestmentPayoutModel.class, ReporticoProject.FOCO, "schemepayout.xml", params);LOGGER.info("reportResponse {}", evaluateSchemeInvestmentPayouts);int referenceId = Integer.parseInt(FormattingUtils.getYearMonth(startOfPreviousMonth.atStartOfDay()));List<PartnerDailyInvestment> partnerDailyInvestments = partnerDailyInvestmentRepository.selectAll(startOfPreviousMonth, lastOfPreviousMonth);Map<Integer, Long> investmentMaintainedDaysMap = partnerDailyInvestments.stream().filter(x -> x.getShortPercentage() <= 10).collect(Collectors.groupingBy(x -> x.getFofoId(), Collectors.counting()));for (EvaluateSchemeInvestmentPayoutModel esip : evaluateSchemeInvestmentPayouts) {long investmentMaintainedDays = investmentMaintainedDaysMap.get(esip.getFofoId()) == null ? 0: investmentMaintainedDaysMap.get(esip.getFofoId());esip.setInvestmentDays(investmentMaintainedDays);float processAmount = esip.getPaidAmount() / 2;esip.setProcessAmount(processAmount);rows.add(Arrays.asList(esip.getCode(), esip.getStoreName(), esip.getFofoId(), esip.getItemId(),esip.getBrand(), esip.getModelName(), esip.getModelNumber(), esip.getColor(), esip.getSchemeInDp(),esip.getSchemeOutDp(), esip.getSchemeId(), esip.getName(), esip.getType(), esip.getPartnerType(),esip.getAmountType(), esip.getAmount(), esip.getPurchaseInvoice(), esip.getSaleInovoice(),esip.getPaidAmount(), esip.getCreateTimestamp(), esip.getRolledBackTimestamp(),esip.getSerialNumber(), esip.getInRef(), esip.getOutRef(), esip.getBusinessDate(), esip.getStatus(),esip.getDescription(), esip.getProcessAmount(), esip.getInvestmentDays()));}org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil.getCSVByteStream(Arrays.asList("Code", "Store Name", "Fofo Id", "Item Id", "Brand", "Model Name","Model Number", "Color", "Scheme In Dp", "Scheme Out Dp", "Scheme Id", "Name", "Type","Partner Type", "Amount Type", "Amount", "Purchase Invoice", "Sale Inovoice", "Paid Amount","Create Timestamp", "Rolled Back Timestamp", "Serial Number", "In Ref", "Out Ref","Business Date", "Status", "Description", "Process Amount", "Investment Days"), rows);final HttpHeaders headers = new HttpHeaders();headers.set("Content-Type", "text/csv");headers.set("Content-disposition", "inline; filename=schemePayout.csv");headers.setContentLength(baos.toByteArray().length);final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);}@RequestMapping(value = "/schemes/update", method = RequestMethod.POST)public String updateShcemes(HttpServletRequest request, @RequestBody SchemeItems schemeItems, Model model)throws Exception {for (int schemeId : schemeItems.getSchemeIds()) {if (schemeRepository.selectById(schemeId) != null)for (int itemId : schemeItems.getItemIds()) {if (tagListingRepository.selectByItemIdsAndTagIds(new HashSet<>(Arrays.asList(itemId)),new HashSet<>(Arrays.asList(4, 7))).size() > 0) {SchemeItem si = new SchemeItem();si.setItemId(itemId);si.setSchemeId(schemeId);si.setCreateTimestamp(LocalDateTime.now());try {schemeItemRepository.persist(si);} catch (Exception e) {LOGGER.info("Scheme aleady exist");}model.addAttribute("response", mvcResponseSender.createResponseString(true));} else {model.addAttribute("response", mvcResponseSender.createResponseString(false));throw new ProfitMandiBusinessException("ItemId", itemId, "Invalid Item Id");}}}return "response";}@RequestMapping(value = "/addItemToScheme", method = RequestMethod.POST)public String updateScheme(HttpServletRequest request, @RequestBody SchemeItems schemeItems, Model model)throws Exception {for (int schemeId : schemeItems.getSchemeIds()) {List<Integer> itemIds = schemeItemRepository.selectItemIdsBySchemeId(schemeId);if (schemeRepository.selectById(schemeId) != null)for (int itemId : schemeItems.getItemIds()) {if (tagListingRepository.selectByItemIdsAndTagIds(new HashSet<>(Arrays.asList(itemId)),new HashSet<>(Arrays.asList(4, 7))).size() > 0 && (!(itemIds.contains(itemId)))) {SchemeItem si = new SchemeItem();si.setItemId(itemId);si.setSchemeId(schemeId);si.setCreateTimestamp(LocalDateTime.now());try {schemeItemRepository.persist(si);} catch (Exception e) {LOGGER.info("Scheme already exist");}model.addAttribute("response", mvcResponseSender.createResponseString(true));} else {model.addAttribute("response", mvcResponseSender.createResponseString(false));}}}return "response";}@RequestMapping(value = "/schemes/delete", method = RequestMethod.DELETE)public String deleteShcemes(HttpServletRequest request,@RequestParam(name = "schemeId", required = false, defaultValue = "0") int schemeId,@RequestParam(name = "itemId", required = false, defaultValue = "0") int itemId, Model model)throws Exception {LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);if (!(schemeId == 0 && itemId == 0) || (!(schemeId == 0 || itemId == 0))) {schemeItemRepository.deletebyItemIdsandSchemeIds(itemId, schemeId);model.addAttribute("response", mvcResponseSender.createResponseString(true));model.addAttribute("roleType", roleManager.isAdmin(loginDetails.getRoleIds()));}return "response";}@RequestMapping(value = "/extendAllSchemes", method = RequestMethod.POST)public String extendAllScheme(HttpServletRequest request, @RequestBody LocalDateTime extendDatetime, Model model)throws Exception {extendDatetime = LocalDateTime.of(extendDatetime.toLocalDate(), Utils.MAX_TIME);List<Scheme> schemes = schemeRepository.selectActiveAll();if (schemes.size() > 0) {for (Scheme scheme : schemes) {if (scheme.getExpireTimestamp() == null) {scheme.setEndDateTime(extendDatetime);schemeRepository.persist(scheme);}}model.addAttribute("response", mvcResponseSender.createResponseString(true));return "response";}model.addAttribute("response", mvcResponseSender.createResponseString(false));return "response";}@RequestMapping(value = "/extendSchemeById", method = RequestMethod.POST)public String extendSchemeById(HttpServletRequest request,@RequestParam(name = ProfitMandiConstants.SCHEME_ID) int schemeId,@RequestBody LocalDateTime extendDatetime, Model model) throws Exception {extendDatetime = LocalDateTime.of(extendDatetime.toLocalDate(), Utils.MAX_TIME);Scheme scheme = schemeRepository.selectById(schemeId);if ((!(scheme.getActiveTimestamp() == null)) && scheme.getExpireTimestamp() == null) {scheme.setEndDateTime(extendDatetime);schemeRepository.persist(scheme);model.addAttribute("response", mvcResponseSender.createResponseString(true));return "response";}model.addAttribute("response", mvcResponseSender.createResponseString(false));return "response";}@RequestMapping(value = "/createScheme", method = RequestMethod.POST)public String createScheme(HttpServletRequest request, @RequestBody CreateSchemeRequest createSchemeRequest,@RequestParam(name = "offset", defaultValue = "0") int offset,@RequestParam(name = "limit", defaultValue = "10") int limit,@RequestParam(name = "searchItem", required = false, defaultValue = "") String searchItem,@RequestParam(name = "searchTerm", required = false, defaultValue = "") String searchTerm, Model model)throws ProfitMandiBusinessException {LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);LOGGER.info("CreateSchemeRequest {}", createSchemeRequest);schemeService.saveScheme(loginDetails.getFofoId(), createSchemeRequest);LOGGER.info("Scheme saved successfully");long size = schemeRepository.selectAllCount();List<Scheme> schemes = schemeRepository.selectAll(offset, limit);if (!schemes.isEmpty()) {for (Scheme scheme : schemes) {if (scheme.getAmountType().equals(AmountType.PERCENTAGE)) {scheme.setAmountModel(scheme.getAmount() + "%");} else {scheme.setAmountModel(scheme.getAmount() + "");}}}model.addAttribute("schemes", schemes);model.addAttribute("start", offset + 1);model.addAttribute("size", size);model.addAttribute("searchItem", searchItem);model.addAttribute("searchTerm", searchTerm);model.addAttribute("roleType", roleManager.isAdmin(loginDetails.getRoleIds()));if (schemes.size() < limit) {model.addAttribute("end", offset + schemes.size());} else {model.addAttribute("end", offset + limit);}return "schemes";}@RequestMapping(value = "/getSchemes", method = RequestMethod.GET)public String getSchemes(HttpServletRequest request, @RequestParam(name = "offset", defaultValue = "0") int offset,@RequestParam(required = false) LocalDate date,@RequestParam(name = "limit", defaultValue = "10") int limit,@RequestParam(name = "searchItem", required = false, defaultValue = "0") int searchItem,@RequestParam(name = "searchTerm", required = false, defaultValue = "") String searchTerm,@RequestParam(name = "partnerType", required = false, defaultValue = "") PartnerType partnerType,@RequestParam(name = "searchImei", required = false, defaultValue = "") String searchImei, Model model)throws ProfitMandiBusinessException {LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);boolean isAdmin = roleManager.isAdmin(loginDetails.getRoleIds());if (date == null) {date = LocalDate.now();}model.addAttribute("date", date);List<Scheme> schemes = null;List<SchemeInOut> schemeInOut = null;long size = 0;date = date.isAfter(LocalDate.now()) ? LocalDate.now() : date;final LocalDate date1 = date;if (partnerType == null) {// TODO - SCHEMEpartnerType = partnerTypeChangeService.getTypeOnMonth(loginDetails.getFofoId(), YearMonth.from(date));// partnerType =// partnerTypeChangeService.getTypeOnDate(loginDetails.getFofoId(), date);}if (!(searchTerm.equals(""))) {schemes = schemeRepository.selectBySearchTerm(searchTerm, offset, limit);for (Scheme scheme : schemes) {if (scheme.getAmountType().equals(AmountType.PERCENTAGE)) {scheme.setAmountModel(scheme.getAmount() + "%");} else {scheme.setAmountModel(scheme.getAmount() + "");}}if (schemes.size() > 0) {size = schemeRepository.selectAllCount();LOGGER.info("schemes" + schemes);model.addAttribute("schemes", schemes);model.addAttribute("start", offset + 1);model.addAttribute("size", size);if (schemes.size() < limit) {model.addAttribute("end", offset + schemes.size());} else {model.addAttribute("end", offset + limit);}}else {throw new ProfitMandiBusinessException("SchemeId", searchTerm, "SchemeId Not Found");}}else if (searchItem > 0) {TagListing tagListing = null;tagListing = tagListingRepository.selectByItemId(searchItem);Item item = itemRepository.selectById(searchItem);if (tagListing != null) {model.addAttribute("dp", tagListing.getSellingPrice());model.addAttribute("mop", tagListing.getMop());}schemes = schemeService.selectSchemeByPartnerType(partnerType, date, searchItem, isAdmin, offset, limit).stream().filter(x -> {return (x.getId() != 411 && x.getId() != 612) || date1.isBefore(LocalDate.of(2021, 12, 1));}).collect(Collectors.toList());// Remove 411 and 612model.addAttribute("schemes", schemes);if (schemes.size() == 0) {if (isAdmin)return "schemes";else {return "schemes-partner";}}// For 7720(HR) remove investmentint nlc = this.getNlc(item, loginDetails.getFofoId(), schemes, tagListing, searchItem);size = schemeService.selectSchemeCount(partnerType, date, searchItem, isAdmin);model.addAttribute("start", offset + 1);model.addAttribute("size", size);if (schemes.size() < limit) {model.addAttribute("end", offset + schemes.size());} else {model.addAttribute("end", offset + limit);}model.addAttribute("nlc", Math.round(nlc));} else if (!(searchImei.equals(""))) {LOGGER.info("searchImei" + searchImei);InventoryItem inventoryItem = inventoryItemRepository.selectBySerialNumberFofoId(searchImei,loginDetails.getFofoId());Item item = itemRepository.selectById(inventoryItem.getItemId());Map<Integer, Scheme> schemeMap = new HashMap<>();if (inventoryItem != null) {LOGGER.info("inventoryItem" + inventoryItem);schemeInOut = schemeInOutRepository.selectByInventoryItemIds(new HashSet<>(Arrays.asList(inventoryItem.getId())));LOGGER.info("schemeInOut" + schemeInOut);if (!schemeInOut.isEmpty()) {List<Integer> schemeIds = schemeInOut.stream().map(x -> x.getSchemeId()).collect(Collectors.toList());schemes = schemeRepository.selectBySchemeIds(schemeIds);for (Scheme scheme : schemes) {if (scheme.getAmountType().equals(AmountType.PERCENTAGE)) {scheme.setAmountModel(scheme.getAmount() + "%");} else {scheme.setAmountModel(scheme.getAmount() + "");}}schemeMap = schemes.stream().collect(Collectors.toMap(x -> x.getId(), x -> x));}}model.addAttribute("schemeMap", schemeMap);model.addAttribute("item", item);}model.addAttribute("schemeInOut", schemeInOut);model.addAttribute("searchItem", searchItem);model.addAttribute("searchTerm", searchTerm);model.addAttribute("partnerType", partnerType);model.addAttribute("isAdmin", isAdmin);LOGGER.info("schemes" + schemes);model.addAttribute("schemes", schemes != null ? schemes.stream().filter(x -> {return (x.getId() != 411 && x.getId() != 612) || date1.isBefore(LocalDate.of(2021, 12, 1));}).collect(Collectors.toList()) : null);LOGGER.info("schemes" + schemes);// model.addAttribute("roleTypes", loginDetails.getRoleTypes());if (isAdmin) {boolean fullAccess = this.getAccess(loginDetails.getEmailId());model.addAttribute("fullAccess", fullAccess);return "schemes";} else {List<CreateOfferRequest> offers = new ArrayList<>();Map<Integer, Map<Integer, Long>> offerSlabPayoutMap = new HashMap<>();List<PriceDropIMEI> priceDropImeis = new ArrayList<>();if (searchItem > 0) {offers = offerService.getPublishedOffers(date, loginDetails.getFofoId(), searchItem);for (CreateOfferRequest createOfferRequest : offers) {Map<Integer, Map<Integer, Long>> itemSlabPayoutMap = offerService.getSlabPayoutMap(createOfferRequest);Map<Integer, Long> slabPayoutMap = itemSlabPayoutMap.get(searchItem);offerSlabPayoutMap.put(createOfferRequest.getId(), slabPayoutMap);}}if (!(searchImei.equals(""))) {InventoryItem inventoryItem = inventoryItemRepository.selectBySerialNumberFofoId(searchImei,loginDetails.getFofoId());priceDropImeis = priceDropIMEIRepository.selectByFofoIdImei(loginDetails.getFofoId(), searchImei);for (PriceDropIMEI priceDropIMEI : priceDropImeis) {int priceDropId = priceDropIMEI.getPriceDropId();PriceDrop pd = priceDropRepository.selectById(priceDropId);priceDropIMEI.setPriceDrop(pd);}}FofoStore fs = fofoStoreRepository.selectByRetailerId(loginDetails.getFofoId());model.addAttribute("offers", offers);model.addAttribute("offerSlabPayoutMap", offerSlabPayoutMap);model.addAttribute("partnerCode", fs.getCode());model.addAttribute("fofoId", fs.getId());model.addAttribute("priceDropImeis", priceDropImeis);return "schemes-partner";}}private int getNlc(Item item, int fofoId, List<Scheme> schemes, TagListing tagListing, int itemId)throws ProfitMandiBusinessException {if (item.getBrand().equals("Vivo") && fofoStoreRepository.getWarehousePartnerMap().get(7720).stream().filter(x -> x.getId() == fofoId).count() > 0) {schemes = schemes.stream().filter(x -> !x.getType().equals(SchemeType.INVESTMENT)).collect(Collectors.toList());}float nlc = tagListing.getSellingPrice();for (Scheme scheme : schemes) {if (scheme.getAmountType().equals(AmountType.PERCENTAGE)) {if (tagListing != null) {float taxRate = stateGstRateRepository.getIgstTaxRate(Arrays.asList(itemId)).get(itemId);float taxableSellingPrice = tagListing.getSellingPrice() / (1 + taxRate / 100);float amount = taxableSellingPrice * scheme.getAmount() / 100;scheme.setAmountModel(FormattingUtils.formatDecimalTwoDigits(amount) + " (" + scheme.getAmount() + "%)");nlc -= amount;}else {scheme.setAmountModel(scheme.getAmount() + "%");}} else {scheme.setAmountModel(scheme.getAmount() + "");nlc -= scheme.getAmount();}}return Math.round(nlc);}@RequestMapping(value = "/getPaginatedSchemes", method = RequestMethod.GET)public String getPaginatedSchemes(HttpServletRequest request, @RequestParam(required = false) LocalDate date,@RequestParam(name = "offset", defaultValue = "0") int offset,@RequestParam(name = "limit", defaultValue = "10") int limit,@RequestParam(name = "partnerType", required = false, defaultValue = "ALL") PartnerType partnerType,Model model) throws ProfitMandiBusinessException {LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);boolean isAdmin = roleManager.isAdmin(loginDetails.getRoleIds());if (date == null) {date = LocalDate.now();}LOGGER.info("requested offset=[{}], limit = [{}]", offset, limit);List<Scheme> schemes = schemeRepository.selectAll();int itemId = 0;TagListing tagListing = null;for (Scheme scheme : schemes) {if (scheme.getAmountType().equals(AmountType.PERCENTAGE)) {if (itemId > 0) {float taxRate = stateGstRateRepository.getIgstTaxRate(Arrays.asList(itemId)).get(itemId);float taxableSellingPrice = tagListing.getSellingPrice() / (1 + taxRate / 100);float amount = taxableSellingPrice * scheme.getAmount() / 100;scheme.setAmountModel(FormattingUtils.formatDecimalTwoDigits(amount) + " (" + scheme.getAmount() + "%)");} else {scheme.setAmountModel(scheme.getAmount() + "%");}} else {scheme.setAmountModel("" + scheme.getAmount());}}model.addAttribute("schemes", schemes);model.addAttribute("partnerType", partnerType);model.addAttribute("roleType", roleManager.isAdmin(loginDetails.getRoleIds()));return "schemes-paginated";}@RequestMapping(value = "/schemes/downloadPage", method = RequestMethod.GET)public String downloadPage(HttpServletRequest request, Model model) {return "schemes-download";}@RequestMapping(value = "/schemes/download", method = RequestMethod.GET)public ResponseEntity<?> downloadInventoryItemAgingByInterval(HttpServletRequest request,@RequestParam(name = ProfitMandiConstants.START_DATE_TIME) String startDateTimeString,@RequestParam(name = ProfitMandiConstants.END_DATE_TIME) String endDateTimeString, Model model)throws ProfitMandiBusinessException {LocalDateTime startDateTime = StringUtils.toDateTime(startDateTimeString,DateTimePattern.DD_MM_yyyy_T_HH_MM_SS);LocalDateTime endDateTime = StringUtils.toDateTime(endDateTimeString, DateTimePattern.DD_MM_yyyy_T_HH_MM_SS);List<SchemeModel> schemeModels = schemeService.getAllSchemeModels(startDateTime, endDateTime);ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();ExcelUtils.writeSchemeModels(schemeModels, byteArrayOutputStream);final HttpHeaders headers = new HttpHeaders();headers.set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");headers.set("Content-disposition", "inline; filename=SchemesReport.xlsx");headers.setContentLength(byteArrayOutputStream.toByteArray().length);final InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);}@RequestMapping(value = "/getSchemeById", method = RequestMethod.GET)public String getSchemeById(HttpServletRequest request,@RequestParam(name = ProfitMandiConstants.SCHEME_ID) int schemeId, Model model)throws ProfitMandiBusinessException {LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);boolean fullAccess = this.getAccess(loginDetails.getEmailId());Scheme scheme = schemeService.getSchemeById(schemeId);model.addAttribute("fullAccess", fullAccess);model.addAttribute("scheme", scheme);model.addAttribute("isAdmin", roleManager.isAdmin(loginDetails.getRoleIds()));return "scheme-details";}@RequestMapping(value = "/activeSchemeById", method = RequestMethod.PUT)public String activeSchemeById(HttpServletRequest request,@RequestParam(name = ProfitMandiConstants.SCHEME_ID) int schemeId,@RequestParam(name = "offset", defaultValue = "0") int offset,@RequestParam(name = "limit", defaultValue = "10") int limit, Model model)throws ProfitMandiBusinessException {schemeService.activeSchemeById(schemeId);List<Scheme> schemes = schemeRepository.selectAll(offset, limit);model.addAttribute("schemes", schemes);return "schemes-paginated";}@RequestMapping(value = "/expireSchemeById", method = RequestMethod.PUT)public String expireSchemeById(HttpServletRequest request,@RequestParam(name = ProfitMandiConstants.SCHEME_ID) int schemeId,@RequestParam(name = ProfitMandiConstants.EXPIRE_TIMESTAMP) LocalDateTime expiryTimestamp,@RequestParam(name = "offset", defaultValue = "0") int offset,@RequestParam(name = "limit", defaultValue = "10") int limit, Model model)throws ProfitMandiBusinessException {expiryTimestamp = LocalDateTime.of(expiryTimestamp.toLocalDate(), Utils.MAX_TIME);schemeService.expireSchemeById(schemeId, expiryTimestamp);List<Scheme> schemes = schemeRepository.selectAll(offset, limit);model.addAttribute("schemes", schemes);return "schemes-paginated";}@RequestMapping(value = "/getSchemesJson", method = RequestMethod.GET)public ResponseEntity<?> getSchemesJson(HttpServletRequest request,@RequestParam(name = "offset", defaultValue = "0") int offset,@RequestParam(name = "limit", defaultValue = "10") int limit, Model model)throws ProfitMandiBusinessException {LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);return responseSender.ok(schemeService.getSchemes(loginDetails.getRoleIds(), offset, limit));}@RequestMapping(value = "/searchSchemeByCategory")public String getSchemeByCategory(HttpServletRequest request,@RequestParam(name = "offset", defaultValue = "0") int offset,@RequestParam(name = "limit", defaultValue = "10") int limit,@RequestParam(name = "searchItem", required = false, defaultValue = "") String searchItem,@RequestParam(name = "searchTerm", required = false, defaultValue = "") String searchTerm,@RequestParam(name = "category", required = true, defaultValue = "") PartnerType category, Model model)throws ProfitMandiBusinessException {LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);List<Scheme> schemes = null;long size = 0;schemes = schemeRepository.selectByPartnerType(category, offset, limit);if (!(schemes.size() == 0)) {size = schemeRepository.selectAllCount();LOGGER.info("schemes" + schemes);model.addAttribute("schemes", schemes);model.addAttribute("start", offset + 1);model.addAttribute("size", size);model.addAttribute("searchTerm", searchTerm);model.addAttribute("searchItem", searchItem);model.addAttribute("roleType", roleManager.isAdmin(loginDetails.getRoleIds()));if (schemes.size() < limit) {model.addAttribute("end", offset + schemes.size());} else {model.addAttribute("end", offset + limit);}}return "schemes";}@RequestMapping(value = "/getSchemeByCategoryPaginated")public String getSchemeByCategoryPaginated(HttpServletRequest request,@RequestParam(name = "offset", defaultValue = "0") int offset,@RequestParam(name = "limit", defaultValue = "10") int limit,@RequestParam(name = "searchItem", required = false, defaultValue = "") String searchItem,@RequestParam(name = "searchTerm", required = false, defaultValue = "") String searchTerm,@RequestParam(name = "category", required = true, defaultValue = "") PartnerType category, Model model)throws ProfitMandiBusinessException {LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);LOGGER.info("In search Item....");List<Scheme> schemes = null;schemes = schemeRepository.selectByPartnerType(category, offset, limit);model.addAttribute("schemes", schemes);model.addAttribute("searchItem", searchItem);model.addAttribute("roleType", roleManager.isAdmin(loginDetails.getRoleIds()));return "schemes-paginated";}@RequestMapping(value = "/searchScheme")public String getSchemeBySchemeId(HttpServletRequest request,@RequestParam(name = "offset", defaultValue = "0") int offset,@RequestParam(name = "limit", defaultValue = "10") int limit,@RequestParam(name = "searchTerm", required = false, defaultValue = "") String searchTerm,@RequestParam(name = "searchItem", required = false, defaultValue = "") String searchItem, Model model)throws ProfitMandiBusinessException {LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);List<Scheme> schemes = null;long size = 0;if (!(searchTerm.equals("")) && searchItem.equals("")) {schemes = schemeRepository.selectBySearchTerm(searchTerm, offset, limit);if (!(schemes.size() == 0)) {size = schemeRepository.selectAllCount();LOGGER.info("schemes" + schemes);model.addAttribute("schemes", schemes);model.addAttribute("start", offset + 1);model.addAttribute("size", size);model.addAttribute("searchTerm", searchTerm);model.addAttribute("searchItem", searchItem);model.addAttribute("roleType", roleManager.isAdmin(loginDetails.getRoleIds()));if (schemes.size() < limit) {model.addAttribute("end", offset + schemes.size());} else {model.addAttribute("end", offset + limit);}} else {throw new ProfitMandiBusinessException("SchemeId", searchTerm, "SchemeId Not Found");}} else if (!(searchItem.equals("")) && searchTerm.equals("")) {List<Integer> schemeIds = schemeItemRepository.selectSchemeIdByItemId(Integer.parseInt(searchItem));if (!(schemeIds.size() == 0)) {LOGGER.info("schemeIds in searchItemScheme" + schemeIds);schemes = schemeRepository.selectBySchemeIds(schemeIds, offset, limit);size = schemeIds.size();LOGGER.info("Size" + size);model.addAttribute("schemes", schemes);model.addAttribute("start", offset + 1);model.addAttribute("size", size);model.addAttribute("searchItem", searchItem);model.addAttribute("searchTerm", searchTerm);model.addAttribute("roleType", roleManager.isAdmin(loginDetails.getRoleIds()));if (schemes.size() < limit) {model.addAttribute("end", offset + schemes.size());} else {model.addAttribute("end", offset + limit);}} else {throw new ProfitMandiBusinessException("SchemeIds", searchItem, "SchemeId Not Found");}} else {if (roleManager.isAdmin(loginDetails.getRoleIds())) {schemes = schemeRepository.selectAll(offset, limit);size = schemeRepository.selectAllCount();} else {schemes = schemeRepository.selectActiveAll(offset, limit);size = schemeRepository.selectAllActiveCount();}model.addAttribute("schemes", schemes);model.addAttribute("start", offset + 1);model.addAttribute("size", size);model.addAttribute("searchItem", searchItem);model.addAttribute("searchTerm", searchTerm);model.addAttribute("roleType", roleManager.isAdmin(loginDetails.getRoleIds()));if (schemes.size() < limit) {model.addAttribute("end", offset + schemes.size());} else {model.addAttribute("end", offset + limit);}}return "schemes";}@RequestMapping(value = "/searchItemSchemePanigated")public String getSchemeByItemPanigated(HttpServletRequest request,@RequestParam(name = "offset", defaultValue = "0") int offset,@RequestParam(name = "limit", defaultValue = "10") int limit,@RequestParam(name = "searchItem", required = false, defaultValue = "") String searchItem, Model model)throws ProfitMandiBusinessException {LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);LOGGER.info("In search Item....");List<Scheme> schemes = null;if (!searchItem.equals("")) {List<Integer> schemeIds = schemeItemRepository.selectSchemeIdByItemId(Integer.parseInt(searchItem));if (schemeIds != null) {LOGGER.info(schemeIds);schemes = schemeRepository.selectBySchemeIds(schemeIds, offset, limit);}}model.addAttribute("schemes", schemes);model.addAttribute("searchItem", searchItem);model.addAttribute("roleType", roleManager.isAdmin(loginDetails.getRoleIds()));return "schemes-paginated";}@RequestMapping(value = "/getCustomerOffer", method = RequestMethod.GET)public String getCustomerOffer(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {List<CustomerOffer> customerOffers = customerOfferRepository.selectAll();model.addAttribute("customerOffers", customerOffers);return "customer-offer";}@RequestMapping(value = "/createCustomerOffer", method = RequestMethod.POST)public String createCustomerOffer(HttpServletRequest request, @RequestParam String offerName,@RequestParam LocalDateTime startDate, @RequestParam LocalDateTime endDate, Model model) throws Exception {CustomerOffer co = new CustomerOffer();co.setOfferName(offerName);co.setStartDate(startDate);co.setEndDate(endDate);co.setCreatedTimestamp(LocalDateTime.now());co.setUpdatedTimestamp(LocalDateTime.now());customerOfferRepository.persist(co);model.addAttribute("response", mvcResponseSender.createResponseString(true));return "response";}@RequestMapping(value = "/customerOffer/downloadTemplate", method = RequestMethod.GET)public ResponseEntity<?> downloadCustomerOfferTemplate(HttpServletRequest request) throws Exception {List<List<?>> rows = new ArrayList<>();org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil.getCSVByteStream(Arrays.asList("id", "Catalog Id", "Scheme Payout", "Dealer Payout"), rows);final HttpHeaders headers = new HttpHeaders();headers.set("Content-Type", "text/csv");headers.set("Content-disposition", "inline; filename=customer-offer-template.csv");headers.setContentLength(baos.toByteArray().length);final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);}@RequestMapping(value = "/customerOfferItem/upload", method = RequestMethod.POST)public String uploadCustomerOfferItem(HttpServletRequest request, Model model, @RequestParam int offerId,HttpServletResponse response, @RequestPart MultipartFile file) throws Throwable {List<CSVRecord> records = FileUtil.readFile(file);for (CSVRecord record : records) {if (Integer.parseInt(record.get(0)) == 0) {CustomerOfferItem coi = new CustomerOfferItem();coi.setCatalogId(Integer.parseInt(record.get(1)));coi.setSchemePayout(Integer.parseInt(record.get(2)));coi.setDealerPayout(Integer.parseInt(record.get(3)));coi.setCustomerOfferId(offerId);coi.setUpdatedTimestamp(LocalDateTime.now());coi.setCreatedTimestamp(LocalDateTime.now());customerOfferItemRepository.persist(coi);} else {CustomerOfferItem coi = customerOfferItemRepository.selectById(Integer.parseInt(record.get(0)));coi.setSchemePayout(Integer.parseInt(record.get(2)));coi.setDealerPayout(Integer.parseInt(record.get(3)));coi.setUpdatedTimestamp(LocalDateTime.now());}}model.addAttribute("response", mvcResponseSender.createResponseString(true));return "response";}@RequestMapping(value = "/customerOfferItem/download", method = RequestMethod.GET)public ResponseEntity<?> downloadOfferItem(HttpServletRequest request, @RequestParam int offerId) throws Exception {List<CustomerOfferItem> cois = customerOfferItemRepository.selectByOfferId(offerId);List<List<?>> rows = new ArrayList<>();for (CustomerOfferItem coi : cois) {rows.add(Arrays.asList(coi.getId(), coi.getCatalogId(), coi.getSchemePayout(), coi.getDealerPayout()));}org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil.getCSVByteStream(Arrays.asList("id", "Catalog Id", "Scheme Payout", "Dealer Payout"), rows);final HttpHeaders headers = new HttpHeaders();headers.set("Content-Type", "text/csv");headers.set("Content-disposition", "inline; filename=customer-offer-template.csv");headers.setContentLength(baos.toByteArray().length);final InputStream inputStream = new ByteArrayInputStream(baos.toByteArray());final InputStreamResource inputStreamResource = new InputStreamResource(inputStream);return new ResponseEntity<InputStreamResource>(inputStreamResource, headers, HttpStatus.OK);}@RequestMapping(value = "/extendCustomerOffer", method = RequestMethod.POST)public String extendCustomerOffer(HttpServletRequest request, @RequestParam int id,@RequestParam LocalDateTime endDate, Model model) throws ProfitMandiBusinessException {CustomerOffer co = customerOfferRepository.selectById(id);co.setEndDate(endDate);co.setUpdatedTimestamp(LocalDateTime.now());model.addAttribute("co", co);return "customer-index-offer";}@RequestMapping(value = "/getSamsungUpgradeOffer", method = RequestMethod.GET)public String getSamsungUpgradeOffer(HttpServletRequest request, Model model) throws ProfitMandiBusinessException {List<UpgradeOfferStatus> uos = UpgradeOfferStatus.offerStatus;List<SamsungUpgradeOffer> samsungUpgradeOffers = samsungUpgradeOfferRepository.selectByStatus(uos.stream().filter(x -> !x.equals(UpgradeOfferStatus.rejected)).collect(Collectors.toList()));model.addAttribute("samsungUpgradeOffers", samsungUpgradeOffers);return "samsung-upgrade-offer";}@RequestMapping(value = "/approveSamsungUpgradeOffer", method = RequestMethod.POST)public String approveSamsungUpgradeOffer(HttpServletRequest request, @RequestParam int id, Model model)throws ProfitMandiBusinessException {SamsungUpgradeOffer suo = samsungUpgradeOfferRepository.selectById(id);suo.setStatus(UpgradeOfferStatus.approved);suo.setApprovedTimestamp(LocalDateTime.now());model.addAttribute("suo", suo);return "samsung-upgrade-offer-index";}@RequestMapping(value = "/rejectSamsungUpgradeOffer", method = RequestMethod.POST)public String rejectSamsungUpgradeOffer(HttpServletRequest request, @RequestParam int id, Model model)throws ProfitMandiBusinessException {SamsungUpgradeOffer suo = samsungUpgradeOfferRepository.selectById(id);suo.setStatus(UpgradeOfferStatus.rejected);model.addAttribute("suo", suo);return "samsung-upgrade-offer-index";}}