package com.napa.pulse.controller.rest; import com.google.gson.Gson; import com.napa.pulse.annotations.JwtToken; import com.napa.pulse.annotations.Track; import com.napa.pulse.dto.SKUTableWidgetData; import com.napa.pulse.entity.security.User; import com.napa.pulse.enums.AccessItem; import com.napa.pulse.exception.PulseException; import com.napa.pulse.security.model.JwtUserData; import com.napa.pulse.service.interfaces.AdminService; import com.napa.pulse.service.interfaces.ExportService; import com.napa.pulse.service.interfaces.SessionService; import com.napa.pulse.service.interfaces.UserService; import com.napa.pulse.utils.PulseConstants; import com.napa.pulse.utils.ROLE; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @RestController public class ExportRestController { private static final Logger LOGGER = LoggerFactory.getLogger(ExportRestController.class); @Autowired private ExportService service; @Autowired private UserService userService; @Autowired private AdminService adminService; @Autowired private SessionService sessionService; private final Gson gson = new Gson(); private static final String ERROR_GENERATING_REPORT = "Error generating report"; @RequestMapping(value = "auth/non-napa-or-export/{sessionId}/{siteId}", produces = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") @ResponseBody public void getOrderExport(HttpServletResponse response, @JwtToken(PulseConstants.JWT_USER_DETAILS) JwtUserData jwtUserData, @PathVariable(PulseConstants.SESSION_ID) int sessionId, @PathVariable(PulseConstants.SITE_ID) int siteId) { setXlsxResponseHeaderAndContentType(response); try { User user = userService.findUserByLogin(jwtUserData.getUsername()); service.generateNonNapaOrderExport(user, response, sessionId, siteId); } catch (IOException e) { LOGGER.error(ERROR_GENERATING_REPORT, e); response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value()); } } @RequestMapping(value = "auth/major-accounts/export/{sessionId}", produces = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") @ResponseBody public void getMajorAccountSessionOrderExport(HttpServletResponse response, @JwtToken(PulseConstants.JWT_USER_DETAILS) JwtUserData jwtUserData, @PathVariable(PulseConstants.SESSION_ID) int sessionId, @RequestParam("siteIds") Integer[] siteIds) { setXlsxResponseHeaderAndContentType(response); try { User user = userService.findUserByLogin(jwtUserData.getUsername()); service.generateMajorAccountSessionExport(user, response, sessionId, siteIds); } catch (IOException e) { LOGGER.error(ERROR_GENERATING_REPORT, e); response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value()); } } @RequestMapping(value = "auth/fleet/export", produces = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") @ResponseBody public void getFleetExport(HttpServletResponse response, @JwtToken(PulseConstants.JWT_USER_DETAILS) JwtUserData jwtUserData, @RequestParam("fleetGroupIds") int[] fleetGroupIds) { setXlsxResponseHeaderAndContentType(response); try { User user = userService.findUserByLogin(jwtUserData.getUsername()); service.generateFleetExport(user, response, fleetGroupIds); } catch (IOException e) { LOGGER.error(ERROR_GENERATING_REPORT, e); response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value()); } } @RequestMapping(value = "auth/session/export-info/{sessionId}", method = RequestMethod.GET, produces = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") public void getSessionExport(HttpServletResponse response, @JwtToken(PulseConstants.JWT_USER_DETAILS) JwtUserData jwtUserData, @PathVariable(PulseConstants.SESSION_ID) int sessionId, @RequestParam(required = false) Boolean includePtsCols) { setXlsxResponseHeaderAndContentType(response); try { User user = userService.findUserByLogin(jwtUserData.getUsername()); service.generateSessionExport(user, response, sessionId, includePtsCols); } catch (IOException e) { LOGGER.error(ERROR_GENERATING_REPORT, e); response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value()); } } @RequestMapping(value = "auth/clear-cache", method = RequestMethod.GET) public void clearCachedHeaders() { service.clearCachedHeaders(); } @RequestMapping(value = "auth/hub-spoke-export-info/{siteId}", method = RequestMethod.GET, produces = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") public void getHubSpokeExport(HttpServletResponse response, @JwtToken(PulseConstants.JWT_USER_DETAILS) JwtUserData jwtUserData, @PathVariable(PulseConstants.SITE_ID) int siteId) { setXlsxResponseHeaderAndContentType(response); try { User user = userService.findUserByLogin(jwtUserData.getUsername()); service.generateHubSpokeExport(user, response, siteId); } catch (IOException e) { LOGGER.error(ERROR_GENERATING_REPORT, e); response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value()); } } /** * @param jwtUserData * @param sessionId * @param pageNumber * @param numberOfRecordsPerPage * @param sortBy * @param sortingOrder * @param isObsoleteSkus * @param isDisplayFlag * @param isSoldNotStocked * @param isFleets * @param isProspectParts * @param lowVehicleCount * @param lineAbbr * @param avgAgeMin * @param avgAgeMax * @param isOrder * @param isReturn * @param partNumber * @param isKeepFlag * @param hierarchyId * @param groupCode * @param expensiveItem * @param largerOrderQty * @param highSkuEdit * @param highSkuEditHierarchyId * @param isSurvivingParts * @param isSpecials * @param isOverstock * @param isTwentyfourAndOut * @param isNonApplication * @param isReviewed * @param isOther * @param fleetGroupIds * @param siteIds * @param isSystem * @param isHideSystemFollowers * @param isSimilarParts * @param response * @return * @throws PulseException */ @Track @RequestMapping(value = "auth/sessions/review-excel-sheet", method = RequestMethod.GET) public void generateReviewPageExcel(@JwtToken(PulseConstants.JWT_USER_DETAILS) JwtUserData jwtUserData, @RequestParam(required = true) int sessionId, @RequestParam(required = false) Integer pageNumber, @RequestParam(required = false) Integer numberOfRecordsPerPage, @RequestParam(required = false) String sortBy, @RequestParam(required = false) String sortingOrder, @RequestParam(required = false) boolean isObsoleteSkus, @RequestParam(required = false) boolean isDisplayFlag, @RequestParam(required = false) boolean isSoldNotStocked, @RequestParam(required = false) boolean isFleets, @RequestParam(required = false) boolean isProspectParts, @RequestParam(required = false) Integer lowVehicleCount, @RequestParam(required = false) String lineAbbr, @RequestParam(required = false) Integer avgAgeMin, @RequestParam(required = false) Integer avgAgeMax, @RequestParam(required = false) boolean isOrder, @RequestParam(required = false) boolean isReturn, @RequestParam(required = false) String partNumber, @RequestParam(required = false) boolean isKeepFlag, @RequestParam(defaultValue = "0") Integer hierarchyId, @RequestParam(required = false) Integer groupCode, @RequestParam(required = false) boolean expensiveItem, @RequestParam(required = false) boolean largerOrderQty, @RequestParam(required = false) Boolean highSkuEdit, @RequestParam(required = false) Integer highSkuEditHierarchyId, @RequestParam(required = false) boolean isSurvivingParts, @RequestParam(required = false) boolean isSpecials, @RequestParam(required = false) boolean isOverstock, @RequestParam(required = false) boolean isTwentyfourAndOut, @RequestParam(required = false) boolean isNonApplication, @RequestParam(required = false) Boolean isReviewed, @RequestParam(required = false) boolean isOther, @RequestParam(required = false) String fleetGroupIds, @RequestParam(required = false) String siteIds, @RequestParam(required = false) String lowVehicleOperator, @RequestParam(required = false) boolean isSystem, @RequestParam(required = false) boolean isHideSystemFollowers, @RequestParam(required = false) boolean isNewNumber, @RequestParam(required = false) Integer ptsMin, @RequestParam(required = false) Integer ptsMax, @RequestParam(required = false) Integer salesOccurrMin, @RequestParam(required = false) Integer salesOccurrMax, @RequestParam(required = false) Integer salesOccurrMonth, @RequestParam(required = false) Integer dcSalesMin, @RequestParam(required = false) Integer dcSalesMax, @RequestParam(required = false) Integer dcSalesMonth, //@RequestParam(required = false) Boolean isDcNetSales, @RequestParam(required = false) Double dcrPtsMin, @RequestParam(required = false) Double dcrPtsMax, @RequestParam(required = false) String orderOption, @RequestParam(required = false) String returnOption, @RequestParam(required = false) String firstStockToDt, @RequestParam(required = false) String firstStockFromDt, @RequestParam(required = false) boolean isSimilarParts, @RequestParam(required = false) String simPartsOption, @RequestParam(required = false) boolean isBlockOrderSuggestion, @RequestParam(required = false) boolean isHubspoke, @RequestParam(required = false) String hubSpokeOption, @RequestParam(required = false) boolean isAppNonApp, @RequestParam(required = false) String appNonAppOption, @RequestParam(required = false) boolean isStoreInventory, @RequestParam(required = false) String selectedStoreInventoryOption, @RequestParam(required = false) boolean isDcStocking, @RequestParam(required = false) String selectedStockNonStockOption, @RequestParam(required = false) Double costMin, @RequestParam(required = false) Double costMax, @RequestParam(required = false) Integer dcWideSalesMin, @RequestParam(required = false) Integer dcWideSalesMax, @RequestParam(required = false) Integer dcWideSalesMonth, @RequestParam(required = false) Integer hubDemandMin, @RequestParam(required = false) Integer hubDemandMax, @RequestParam(required = false) Integer hubDemandMonth, @RequestParam(required = false) boolean checkHubSpoke, HttpServletResponse response) throws PulseException { // check user role access if (!jwtUserData.getRoleAccessList().contains(AccessItem.REVIEW_PAGE.getNumVal())) { return ; } if (groupCode == null) { groupCode = -1; } else if (groupCode < 0 || groupCode > 999) { return ; } try { User user = userService.findUserByLogin(jwtUserData.getUsername()); String userAccessSites = adminService.getUserSiteList(jwtUserData.getUserId()); if (jwtUserData.getRoleId() == ROLE.ADMIN.getNumVal() || jwtUserData.getRoleId() == ROLE.XO.getNumVal() || sessionService.validateUserSessionAccess(sessionId, jwtUserData.getUserId(), userAccessSites)) { SKUTableWidgetData skuTableWidgetData = new SKUTableWidgetData(); skuTableWidgetData.setAvgAgeMin(avgAgeMin); skuTableWidgetData.setAvgAgeMax(avgAgeMax); skuTableWidgetData.setDisplayFlag(isDisplayFlag); skuTableWidgetData.setFleets(isFleets); skuTableWidgetData.setKeepFlag(isKeepFlag); skuTableWidgetData.setLineAbbr(lineAbbr); skuTableWidgetData.setSoldNotStocked(isSoldNotStocked); skuTableWidgetData.setLowVehicleCount(lowVehicleCount); skuTableWidgetData.setProspectParts(isProspectParts); skuTableWidgetData.setOrder(isOrder); skuTableWidgetData.setReturn(isReturn); skuTableWidgetData.setPartNumber(partNumber); skuTableWidgetData.setSessionId(sessionId); skuTableWidgetData.setSortBy(sortBy); skuTableWidgetData.setSortingOrder(sortingOrder); skuTableWidgetData.setObsoleteSkus(isObsoleteSkus); skuTableWidgetData.setGroupCode(groupCode); skuTableWidgetData.setExpensiveItem(expensiveItem); skuTableWidgetData.setLargeOrderQty(largerOrderQty); skuTableWidgetData.setHighSkuEdit(highSkuEdit); skuTableWidgetData.setHighSkuEditHierarchyId(highSkuEditHierarchyId); skuTableWidgetData.setSupersedes(isSurvivingParts); skuTableWidgetData.setSpecials(isSpecials); skuTableWidgetData.setNonApplication(isNonApplication); skuTableWidgetData.setOverstock(isOverstock); skuTableWidgetData.setTwentyFourAndOut(isTwentyfourAndOut); skuTableWidgetData.setIsReviewed(isReviewed); skuTableWidgetData.setOther(isOther); skuTableWidgetData.setSystem(isSystem); skuTableWidgetData.setIsHideSystemFollowers(isHideSystemFollowers); skuTableWidgetData.setHierarchyId(hierarchyId); skuTableWidgetData.setIsNewNumber(isNewNumber); skuTableWidgetData.setLowVehicleOperator(lowVehicleOperator); skuTableWidgetData.setPtsMin(ptsMin); skuTableWidgetData.setPtsMax(ptsMax); skuTableWidgetData.setDcrPtsMin(dcrPtsMin); skuTableWidgetData.setDcrPtsMax(dcrPtsMax); skuTableWidgetData.setSalesOccurrMin(salesOccurrMin); skuTableWidgetData.setSalesOccurrMax(salesOccurrMax); skuTableWidgetData.setSalesOccurrMonth(salesOccurrMonth); skuTableWidgetData.setDcSalesMin(dcSalesMin); skuTableWidgetData.setDcSalesMax(dcSalesMax); skuTableWidgetData.setDcSalesMonth(dcSalesMonth); //skuTableWidgetData.setDcNetSales(isDcNetSales); skuTableWidgetData.setOrderOption(orderOption); skuTableWidgetData.setReturnOption(returnOption); skuTableWidgetData.setSimilarParts(isSimilarParts); skuTableWidgetData.setBlockOrderSuggestion(isBlockOrderSuggestion); skuTableWidgetData.setHubspoke(isHubspoke); skuTableWidgetData.setHubSpokeOption(hubSpokeOption); skuTableWidgetData.setAppNonApp(isAppNonApp); skuTableWidgetData.setAppNonAppOption(appNonAppOption); skuTableWidgetData.setStoreInventory(isStoreInventory); skuTableWidgetData.setSelectedStoreInventoryOption(selectedStoreInventoryOption); skuTableWidgetData.setDcStocking(isDcStocking); skuTableWidgetData.setSelectedStockNonStockOption(selectedStockNonStockOption); skuTableWidgetData.setSimPartsOption(simPartsOption); skuTableWidgetData.setFirstStockToDt(firstStockToDt); skuTableWidgetData.setFirstStockFromDt(firstStockFromDt); skuTableWidgetData.setCostMin(costMin); skuTableWidgetData.setCostMax(costMax); skuTableWidgetData.setDcWideSalesMin(dcWideSalesMin); skuTableWidgetData.setDcWideSalesMax(dcWideSalesMax); skuTableWidgetData.setDcWideSalesMonth(dcWideSalesMonth); skuTableWidgetData.setHubDemandMin(hubDemandMin); skuTableWidgetData.setHubDemandMax(hubDemandMax); skuTableWidgetData.setHubDemandMonth(hubDemandMonth); skuTableWidgetData.setCheckHubSpoke( checkHubSpoke ); if (StringUtils.isNotBlank(fleetGroupIds)) { skuTableWidgetData.setFleetGroupIdsArray(gson.fromJson(fleetGroupIds, Integer[].class)); } if (StringUtils.isNotBlank(siteIds)) { skuTableWidgetData.setSiteIdsArray(gson.fromJson(siteIds, Integer[].class)); } service.generateReviewPageExcel(skuTableWidgetData, user, response); } else { // return 403 response.setStatus(HttpServletResponse.SC_FORBIDDEN); } } catch (Exception e) { LOGGER.error("Error Generating Review Sku/Sku-Detail Excel", e); response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value()); } } private void setXlsxResponseHeaderAndContentType(HttpServletResponse response) { response.setHeader("Content-Disposition", "attachment;filename=\"excelReport.xlsx\""); response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); } @Track @RequestMapping(value = "auth/sessions/dashboard-spoke-excel-sheet", method = RequestMethod.GET) public void generateDashboardPageSpokeExcel(@JwtToken(PulseConstants.JWT_USER_DETAILS) JwtUserData jwtUserData, @RequestParam(required = true) int sessionId, HttpServletResponse response) throws PulseException { try { User user = userService.findUserByLogin(jwtUserData.getUsername()); String userAccessSites = adminService.getUserSiteList(jwtUserData.getUserId()); if (jwtUserData.getRoleId() == ROLE.ADMIN.getNumVal() || jwtUserData.getRoleId() == ROLE.XO.getNumVal() || sessionService.validateUserSessionAccess(sessionId, jwtUserData.getUserId(), userAccessSites)) { service.generateDashboardPageSpokeExcel(sessionId, user, response); } else { // return 403 response.setStatus(HttpServletResponse.SC_FORBIDDEN); } } catch (Exception e) { LOGGER.error("Error Generating DashboardPage Spoke Excel", e); response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value()); } } }