Rev 34048 | 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 com.spice.profitmandi.common.exception.ProfitMandiBusinessException;import com.spice.profitmandi.common.model.ItemDescriptionModel;import com.spice.profitmandi.common.util.FileUtil;import com.spice.profitmandi.common.util.FormattingUtils;import com.spice.profitmandi.dao.entity.auth.AuthUser;import com.spice.profitmandi.dao.entity.catalog.CategorisedCatalog;import com.spice.profitmandi.dao.entity.catalog.Item;import com.spice.profitmandi.dao.entity.inventory.Vendor;import com.spice.profitmandi.dao.entity.inventory.VendorCatalogPricing;import com.spice.profitmandi.dao.entity.inventory.VendorCatalogPricingLog;import com.spice.profitmandi.dao.entity.warehouse.Supplier;import com.spice.profitmandi.dao.enumuration.inventory.VendorCatalogPricingStatus;import com.spice.profitmandi.dao.model.VendorCatalogPricingModel;import com.spice.profitmandi.dao.model.VendorPriceCircularModel;import com.spice.profitmandi.dao.repository.auth.AuthRepository;import com.spice.profitmandi.dao.repository.catalog.CategorisedCatalogRepository;import com.spice.profitmandi.dao.repository.catalog.ItemRepository;import com.spice.profitmandi.dao.repository.inventory.VendorCatalogPricingLogRepository;import com.spice.profitmandi.dao.repository.inventory.VendorCatalogPricingRepository;import com.spice.profitmandi.dao.repository.inventory.VendorRepository;import com.spice.profitmandi.dao.repository.transaction.OrderRepository;import com.spice.profitmandi.dao.repository.warehouse.SupplierRepository;import com.spice.profitmandi.service.authentication.RoleManager;import com.spice.profitmandi.service.inventory.VendorCatalogPricingService;import com.spice.profitmandi.service.order.OrderService;import com.spice.profitmandi.service.warehouse.WarehouseService;import com.spice.profitmandi.web.model.LoginDetails;import com.spice.profitmandi.web.util.CookiesProcessor;import com.spice.profitmandi.web.util.MVCResponseSender;import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.core.io.ClassPathResource;import org.springframework.core.io.InputStreamResource;import org.springframework.http.HttpHeaders;import org.springframework.http.MediaType;import org.springframework.http.ResponseEntity;import org.springframework.stereotype.Controller;import org.springframework.transaction.annotation.Transactional;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.*;import org.springframework.web.multipart.MultipartFile;import javax.mail.MessagingException;import javax.servlet.http.HttpServletRequest;import java.io.IOException;import java.time.LocalDate;import java.time.LocalDateTime;import java.util.*;import java.util.stream.Collectors;@Controller@Transactional(rollbackFor = Throwable.class)public class VendorController {@AutowiredVendorRepository vendorRepository;@Autowiredprivate CookiesProcessor cookiesProcessor;@Autowiredprivate RoleManager roleManager;@Autowiredprivate AuthRepository authRepository;@Autowiredprivate OrderRepository orderRepository;@Autowiredprivate OrderService orderService;@Autowiredprivate VendorCatalogPricingService vendorCatalogPricingService;@Autowiredprivate VendorCatalogPricingLogRepository vendorCatalogPricingLogRepository;@Autowiredprivate VendorCatalogPricingRepository vendorCatalogPricingRepository;@Autowiredprivate MVCResponseSender mvcResponseSender;@Autowiredprivate ItemRepository itemRepository;@Autowiredprivate SupplierRepository supplierRepository;@Autowiredprivate WarehouseService warehouseService;@AutowiredCategorisedCatalogRepository categorisedCatalogRepository;private static final Logger LOGGER = LogManager.getLogger(VendorController.class);@RequestMapping(value = "/vendorCatalogPricing", method = RequestMethod.GET)public String vendorCatalogPricing() throws Exception {return "vendor-catalog-pricing";}@RequestMapping(value = "/getVendorCatalogPricingByModel", method = RequestMethod.GET)public String getVendorCatalogPricingByModel(@RequestParam int catalogId, Model model) throws Exception {List<Integer> vendorIds = new ArrayList<>();Map<Integer, VendorCatalogPricing> vendorCatalogPricingMap = new HashMap<>();Map<Integer, VendorCatalogPricingLog> vendorCatalogPricingLogMap = new HashMap<>();List<VendorCatalogPricing> vendorCatalogPricing = vendorCatalogPricingRepository.selectByCatalogId(catalogId);if (!vendorCatalogPricing.isEmpty()) {vendorIds.addAll(vendorCatalogPricing.stream().distinct().map(x -> x.getVendorId()).collect(Collectors.toList()));vendorCatalogPricingMap = vendorCatalogPricing.stream().collect(Collectors.toMap(x -> x.getVendorId(), x -> x));}List<VendorCatalogPricingLog> vendorCatalogPricingLog = vendorCatalogPricingLogRepository.selectByCatalogId(catalogId, VendorCatalogPricingStatus.PENDING);if (!vendorCatalogPricingLog.isEmpty()) {vendorIds.addAll(vendorCatalogPricingLog.stream().distinct().map(x -> x.getVendorId()).collect(Collectors.toList()));vendorCatalogPricingLogMap = vendorCatalogPricingLog.stream().filter(x -> x.getStatus().equals(VendorCatalogPricingStatus.PENDING)).collect(Collectors.toMap(x -> x.getVendorId(), x -> x));}LOGGER.info("VendorIds {}", vendorIds);List<Supplier> suppliers = new ArrayList<Supplier>();if (!vendorIds.isEmpty()) {suppliers.addAll(supplierRepository.selectBySupplierIds(vendorIds));}LOGGER.info("suppliers {}", suppliers);model.addAttribute("suppliers", suppliers);model.addAttribute("vendorCatalogPricingMap", vendorCatalogPricingMap);model.addAttribute("vendorCatalogPricingLogMap", vendorCatalogPricingLogMap);model.addAttribute("catalogId", catalogId);return "vendor-catalog-pricing-view";}@RequestMapping(value = "/vendors", method = RequestMethod.GET)public String getVendor(Model model, @RequestParam String query) throws Throwable {List<Supplier> vendors = supplierRepository.selectAll().stream().filter(x -> x.getName().toLowerCase().matches(".*?" + query.toLowerCase() + ".*?")).filter(x -> x.isStatus()).collect(Collectors.toList());model.addAttribute("response1", mvcResponseSender.createResponseString(vendors));return "response";}@RequestMapping(value = "/createVendorCatalogPricing", method = RequestMethod.POST)public String createVendorCatalogPricing(HttpServletRequest request, @RequestBody VendorCatalogPricingModel vendorCatalogPricingModel, Model model) throws Exception {LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);AuthUser authUser = authRepository.selectByEmailOrMobile(loginDetails.getEmailId());vendorCatalogPricingModel.setAuthId(authUser.getId());LOGGER.info("vendorCatalogPricingModel {}", vendorCatalogPricingModel);vendorCatalogPricingService.createVendorCatalogPricingLog(vendorCatalogPricingModel);model.addAttribute("response1", mvcResponseSender.createResponseString(true));return "response";}@RequestMapping(value = "/createBulkPricing")public String createBulkPricing() throws ProfitMandiBusinessException, MessagingException, IOException {return "bulk-vendor-pricing";}@PostMapping(value = "/bulkVendorCatalogPricing/upload")public String uploadCatalog(HttpServletRequest request, @RequestPart("file") MultipartFile file, Model model)throws Exception {LoginDetails fofoDetails = cookiesProcessor.getCookiesObject(request);int authId = authRepository.selectByEmailOrMobile(fofoDetails.getEmailId()).getId();LOGGER.info("authId - {}", authId);vendorCatalogPricingService.parseBulkVendorCatalogPricing(file, authId);model.addAttribute("response1", mvcResponseSender.createResponseString(true));return "response";}@GetMapping("/bulkVendorCatalogPricing/downloadReferenceFile")public ResponseEntity<?> downloadReferenceFile() throws IOException {ClassPathResource dummyFile = new ClassPathResource("vendor-catalog-pricing-file.xlsx"); // Make sure the file is in the resources folderreturn ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=dummy-file.xlsx").contentType(MediaType.APPLICATION_OCTET_STREAM).body(new InputStreamResource(dummyFile.getInputStream()));}@RequestMapping(value = "/vendorCatalogPricingRequests", method = RequestMethod.GET)public String vendorCatalogPricingRequests(Model model) throws Exception {List<VendorCatalogPricingLog> vendorCatalogPricingRequests = vendorCatalogPricingLogRepository.selectByStatus(VendorCatalogPricingStatus.PENDING);Map<Integer, AuthUser> authUserMap = authRepository.selectAllActiveUser().stream().collect(Collectors.toMap(x -> x.getId(), x -> x));model.addAttribute("vendorCatalogPricingRequests", vendorCatalogPricingRequests);if (!vendorCatalogPricingRequests.isEmpty()) {Set<Integer> catalogIds = vendorCatalogPricingRequests.stream().map(x -> x.getCatalogId()).collect(Collectors.toSet());List<Integer> vendorIds = vendorCatalogPricingRequests.stream().map(x -> x.getVendorId()).collect(Collectors.toList());Map<Integer, List<Item>> itemMap = itemRepository.selectAllByCatalogIds(catalogIds).stream().collect(Collectors.groupingBy(x -> x.getCatalogItemId()));model.addAttribute("itemMap", itemMap);}Map<Integer, Vendor> vendorMap = vendorRepository.selectAll().stream().collect(Collectors.toMap(x -> x.getId(), x -> x));model.addAttribute("authMap", authUserMap);model.addAttribute("vendorMap", vendorMap);model.addAttribute("vendorPricingStatus", VendorCatalogPricingStatus.values());return "vendor-catalog-pricing-request";}@RequestMapping(value = "/vendorCatalogPricingPendingRequests", method = RequestMethod.GET)public String vendorCatalogPricingPendingRequests() throws Exception {return "vendor-catalog-pricing-pending-request";}@RequestMapping(value = "/datewiseVendorCatalogPricingPendingRequests", method = RequestMethod.GET)public String datewiseVendorCatalogPricingPendingRequests(@RequestParam LocalDateTime startDate, @RequestParam LocalDateTime endDate, Model model) throws Exception {List<VendorCatalogPricingLog> vendorCatalogPricingRequests = vendorCatalogPricingLogRepository.selectByDate(startDate, endDate);Map<Integer, AuthUser> authUserMap = authRepository.selectAllActiveUser().stream().collect(Collectors.toMap(x -> x.getId(), x -> x));LOGGER.info("vendorCatalogPricingRequests {}", vendorCatalogPricingRequests);model.addAttribute("vendorCatalogPricingRequests", vendorCatalogPricingRequests);if (!vendorCatalogPricingRequests.isEmpty()) {Set<Integer> catalogIds = vendorCatalogPricingRequests.stream().map(x -> x.getCatalogId()).collect(Collectors.toSet());Map<Integer, List<Item>> itemMap = itemRepository.selectAllByCatalogIds(catalogIds).stream().collect(Collectors.groupingBy(x -> x.getCatalogItemId()));model.addAttribute("itemMap", itemMap);}Map<Integer, Vendor> vendorMap = vendorRepository.selectAll().stream().collect(Collectors.toMap(x -> x.getId(), x -> x));model.addAttribute("authMap", authUserMap);model.addAttribute("vendorMap", vendorMap);model.addAttribute("vendorPricingStatus", VendorCatalogPricingStatus.values());return "vendor-catalog-pricing-pending-request-table";}@RequestMapping(value = "/verifyVendorCatalogPricingRequest", method = RequestMethod.POST)public String verifyVendorCatalogPricingRequest(HttpServletRequest request, @RequestParam int id, @RequestParam VendorCatalogPricingStatus status, Model model) throws Exception {LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);AuthUser authUser = authRepository.selectByEmailOrMobile(loginDetails.getEmailId());VendorCatalogPricingLog vendorCatalogPricingLog = vendorCatalogPricingLogRepository.selectById(id);if (status.equals(VendorCatalogPricingStatus.APPROVED)) {List<VendorCatalogPricingLog> vendorCatalogPricingLogsOnEffectedDate = vendorCatalogPricingLogRepository.selectByEffectedDateAndCatalogId(vendorCatalogPricingLog.getVendorId(), vendorCatalogPricingLog.getCatalogId(), vendorCatalogPricingLog.getEffectedOn());Optional<VendorCatalogPricingLog> optionalVendorCatalogPricingLog = vendorCatalogPricingLogsOnEffectedDate.stream().filter(x -> x.getStatus().equals(VendorCatalogPricingStatus.APPROVED)).findAny();if (optionalVendorCatalogPricingLog.isPresent()) {VendorCatalogPricingLog approvedPricingLog = optionalVendorCatalogPricingLog.get();approvedPricingLog.setStatus(VendorCatalogPricingStatus.REJECTED);approvedPricingLog.setUpdatedTimestamp(LocalDateTime.now());}}vendorCatalogPricingLog.setStatus(status);vendorCatalogPricingLog.setUpdatedTimestamp(LocalDateTime.now());if (vendorCatalogPricingLog.getStatus().equals(VendorCatalogPricingStatus.APPROVED)) {vendorCatalogPricingLog.setApprovedBy(authUser.getId());vendorCatalogPricingLog.setApprovedTimestamp(LocalDateTime.now());vendorCatalogPricingService.createVendorCatalogPricing(vendorCatalogPricingLog);}model.addAttribute("response1", mvcResponseSender.createResponseString(true));return "response";}@RequestMapping(value = "/vendorPriceCircular", method = RequestMethod.GET)public String vendorPriceCircular() throws Exception {return "vendor-price-circular";}@RequestMapping(value = "/getVendorPriceCircular", method = RequestMethod.GET)public String getVendorPriceCircular(@RequestParam(defaultValue = "0") int vendorId, @RequestParam LocalDate effectedDate, Model model) throws Exception {List<VendorPriceCircularModel> vendorCatalogPricings = vendorCatalogPricingLogRepository.getVendorPricesOnDate(vendorId, effectedDate);Map<Integer, Supplier> supplierMap = supplierRepository.selectAll().stream().collect(Collectors.toMap(x -> x.getId(), x -> x));if (!vendorCatalogPricings.isEmpty()) {Set<Integer> catalogIds = vendorCatalogPricings.stream().map(x -> x.getCatalogId()).collect(Collectors.toSet());Map<Integer, List<Item>> itemMap = itemRepository.selectAllByCatalogIds(catalogIds).stream().collect(Collectors.groupingBy(x -> x.getCatalogItemId()));model.addAttribute("itemMap", itemMap);}model.addAttribute("vendorCatalogPricings", vendorCatalogPricings);model.addAttribute("suppliers", supplierMap);return "vendor-price-circular-view";}@RequestMapping(value = "/downloadPriceCircularReport", method = RequestMethod.GET)public ResponseEntity<?> getSelectDownloadPriceCircularReport(@RequestParam(name = "startDate") LocalDate startDate) throws Exception {List<VendorPriceCircularModel> vendorCatalogPricings = vendorCatalogPricingLogRepository.getVendorPricesOnDate(0, startDate);Map<Integer, Supplier> supplierMap = supplierRepository.selectAll().stream().collect(Collectors.toMap(x -> x.getId(), x -> x));Map<Integer, List<Item>> itemMap = new HashMap<>();List<List<?>> rows = new ArrayList<>();if (!vendorCatalogPricings.isEmpty()) {Set<Integer> catalogIds = vendorCatalogPricings.stream().map(x -> x.getCatalogId()).collect(Collectors.toSet());itemMap = itemRepository.selectAllByCatalogIds(catalogIds).stream().collect(Collectors.groupingBy(x -> x.getCatalogItemId()));}for (VendorPriceCircularModel vcp : vendorCatalogPricings) {rows.add(Arrays.asList(vcp.getCatalogId(), supplierMap.get(vcp.getVendorId()).getName(), itemMap.get(vcp.getCatalogId()).get(0).getItemDescriptionNoColor(), vcp.getTransferPrice(), vcp.getDealerPrice(), vcp.getMop(),FormattingUtils.formatDate(vcp.getEffectedOn())));}org.apache.commons.io.output.ByteArrayOutputStream baos = FileUtil.getCSVByteStream(Arrays.asList("Catalog Id", "Vendor Name", "Model name", "TP", "DP", "MOP","Effected On"), rows);ResponseEntity<?> responseEntity = orderService.downloadReportInCsv(baos, rows, "price circular report");return responseEntity;}@RequestMapping(value = "/getPricing", method = RequestMethod.GET)public String getPricing(HttpServletRequest request, @RequestParam int vendorId, @RequestParam int itemId, @RequestParam LocalDate onDate, Model model) throws Exception {List<Integer> checkRequiredCategoryId = Arrays.asList(10006, 10010);List<String> checkRequiredCategoryGroup = Arrays.asList("Handset", "Tablets");Item item = itemRepository.selectById(itemId);List<String> brandsIgnoreToCheckCategory = Arrays.asList("Dummy", "Live Demo");if (!brandsIgnoreToCheckCategory.contains(item.getBrand())) {if (checkRequiredCategoryId.contains(item.getCategoryId()) || checkRequiredCategoryGroup.contains(item.getProductGroup())) {CategorisedCatalog categorisedCatalog = categorisedCatalogRepository.getCurrentCatalogMovement(item.getCatalogItemId());if (categorisedCatalog == null || categorisedCatalog.getStatus().getValue().isEmpty()) {model.addAttribute("response1", mvcResponseSender.createResponseString(false));return "response";}}}VendorPriceCircularModel vendorPriceCircularModel = vendorCatalogPricingLogRepository.getVendorPriceOnDate(vendorId, item.getCatalogItemId(), onDate);LOGGER.info("vendorCatalogPricing {}", vendorPriceCircularModel);model.addAttribute("response1", mvcResponseSender.createResponseString(vendorPriceCircularModel));return "response";}private void addVendorPricingIfMissing(int itemId, int vendorId) throws ProfitMandiBusinessException {Supplier supplier = supplierRepository.selectById(vendorId);Item item = itemRepository.selectById(itemId);int vendorWithPricing = 0;if (supplier.isInternal() && (item.getBrand().equals("Samsung") || item.getCategoryId() != 10006)) {VendorPriceCircularModel vendorPriceCircularModel = vendorCatalogPricingLogRepository.getVendorPriceOnDate(vendorId, item.getCatalogItemId(), LocalDate.now());LOGGER.info("VendorPriceCircularModel - {}", vendorPriceCircularModel);if (vendorPriceCircularModel == null) {if (item.getBrand().equals("Samsung")) {//BSBvendorWithPricing = 334;} else if (item.getCategoryId() != 10006) {vendorWithPricing = vendorCatalogPricingLogRepository.selectByCatalogId(item.getCatalogItemId(), VendorCatalogPricingStatus.APPROVED).stream().map(x -> x.getVendorId()).findFirst().orElse(null);}VendorPriceCircularModel existingPriceCircular = vendorCatalogPricingLogRepository.getVendorPriceOnDate(vendorWithPricing, item.getCatalogItemId(), LocalDate.now());LOGGER.info("Existing price circular - {}", existingPriceCircular);if (existingPriceCircular == null) {throw new ProfitMandiBusinessException("Pricing missing for vendor - " + vendorId, "Pricing missing for vendor - " + vendorId, "Pricing missing for vendor - " + vendorId);}VendorCatalogPricingModel vendorCatalogPricingModel = new VendorCatalogPricingModel();vendorCatalogPricingModel.setAuthId(52);vendorCatalogPricingModel.setVendorId(vendorId);vendorCatalogPricingModel.setCatalogId(existingPriceCircular.getCatalogId());vendorCatalogPricingModel.setDp(existingPriceCircular.getDealerPrice());vendorCatalogPricingModel.setEffectedOn(existingPriceCircular.getEffectedOn());vendorCatalogPricingModel.setMop(existingPriceCircular.getMop());vendorCatalogPricingModel.setTp(existingPriceCircular.getTransferPrice());vendorCatalogPricingModel.setCatalogId(item.getCatalogItemId());VendorCatalogPricingLog vendorCatalogPricingLog = vendorCatalogPricingService.createVendorCatalogPricingLog(vendorCatalogPricingModel);vendorCatalogPricingLog.setStatus(VendorCatalogPricingStatus.APPROVED);vendorCatalogPricingLog.setUpdatedTimestamp(LocalDateTime.now());//Deenanath Auth IdvendorCatalogPricingLog.setApprovedBy(138);vendorCatalogPricingLog.setApprovedTimestamp(LocalDateTime.now());vendorCatalogPricingService.createVendorCatalogPricing(vendorCatalogPricingLog);}}}@RequestMapping(value = "/vendorItem", method = RequestMethod.GET)public String getItemPricing(Model model, @RequestParam int vendorId, @RequestParam String query) throws Exception {String query1 = query.toLowerCase();int itemId = 0;try {itemId = Integer.parseInt(query1);addVendorPricingIfMissing(itemId, vendorId);} catch (NumberFormatException e) {LOGGER.info("Ignore number format exception");// e.printStackTrace();}LOGGER.info("Vendor Id - {}", vendorId);List<ItemDescriptionModel> partnersItemDescription = warehouseService.getAllPartnerItemStringDescription(vendorId).parallelStream().filter(x -> x.getItemDescription().toLowerCase().matches(".*?" + query1 + ".*?")).collect(Collectors.toList());LOGGER.info("partnersItemDescription" + partnersItemDescription);model.addAttribute("response1", mvcResponseSender.createResponseString(partnersItemDescription));return "response";}}