Rev 24168 | Blame | Last modification | View Log | RSS feed
package com.spice.profitmandi.web.controller;import java.util.ArrayList;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 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.stereotype.Controller;import org.springframework.transaction.annotation.Transactional;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.PathVariable;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 com.spice.profitmandi.common.enumuration.ItemType;import com.spice.profitmandi.common.enumuration.ScanType;import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;import com.spice.profitmandi.common.model.CreateItemRequest;import com.spice.profitmandi.common.model.InstructionItemRequest;import com.spice.profitmandi.common.model.ProfitMandiConstants;import com.spice.profitmandi.common.model.ScanInItemRequest;import com.spice.profitmandi.common.model.ScanInPartnerItemRequest;import com.spice.profitmandi.common.model.ScanOutItemRequest;import com.spice.profitmandi.common.model.ScanOutPartnerItemRequest;import com.spice.profitmandi.dao.entity.nonbillable.AdminCurrentInventorySnapshot;import com.spice.profitmandi.dao.entity.nonbillable.AdminDeliveryNote;import com.spice.profitmandi.dao.entity.nonbillable.InstructionItem;import com.spice.profitmandi.dao.entity.nonbillable.InstructionItemDetail;import com.spice.profitmandi.dao.entity.nonbillable.Item;import com.spice.profitmandi.dao.entity.nonbillable.PartnerCurrentInventorySnapshot;import com.spice.profitmandi.dao.entity.nonbillable.ScanOutPartnerItem;import com.spice.profitmandi.dao.entity.nonbillable.Vendor;import com.spice.profitmandi.dao.entity.nonbillable.Warehouse;import com.spice.profitmandi.dao.entity.user.Address;import com.spice.profitmandi.dao.enumuration.nonbillable.InstructionItemStatus;import com.spice.profitmandi.dao.repository.dtr.RetailerRegisteredAddressRepository;import com.spice.profitmandi.dao.repository.dtr.RoleRepository;import com.spice.profitmandi.dao.repository.dtr.UserRepository;import com.spice.profitmandi.dao.repository.dtr.UserRoleRepository;import com.spice.profitmandi.dao.repository.nonbillable.AdminCurrentInventorySnapshotRepository;import com.spice.profitmandi.dao.repository.nonbillable.AdminDeliveryNoteDetailRepository;import com.spice.profitmandi.dao.repository.nonbillable.AdminDeliveryNoteRepository;import com.spice.profitmandi.dao.repository.nonbillable.AdminInventoryItemRepository;import com.spice.profitmandi.dao.repository.nonbillable.InstructionItemDetailRepository;import com.spice.profitmandi.dao.repository.nonbillable.InstructionItemRepository;import com.spice.profitmandi.dao.repository.nonbillable.ItemRepository;import com.spice.profitmandi.dao.repository.nonbillable.PartnerCurrentInventorySnapshotRepository;import com.spice.profitmandi.dao.repository.nonbillable.PartnerInventoryItemRepository;import com.spice.profitmandi.dao.repository.nonbillable.ScanOutPartnerItemRepository;import com.spice.profitmandi.dao.repository.nonbillable.UserWarehouseRepository;import com.spice.profitmandi.dao.repository.nonbillable.VendorRepository;import com.spice.profitmandi.dao.repository.nonbillable.WarehouseRepository;import com.spice.profitmandi.dao.repository.user.AddressRepository;import com.spice.profitmandi.service.nonbillable.InventoryService;import com.spice.profitmandi.service.user.RetailerService;import com.spice.profitmandi.service.user.UserService;import com.spice.profitmandi.web.model.LoginDetails;import com.spice.profitmandi.web.util.CookiesProcessor;import com.spice.profitmandi.web.util.MVCResponseSender;@Controller@Transactionalpublic class ItemController {private static final Logger LOGGER = LogManager.getLogger(ItemController.class);@Autowired@Qualifier("nonbillableItemRepository")private ItemRepository itemRepository;@Autowiredprivate MVCResponseSender mvcResponseSender;@Autowired@Qualifier("nonbillableInventoryService")private InventoryService inventoryService;@Autowiredprivate RoleRepository roleRepository;@Autowiredprivate UserService userService;@Autowiredprivate AdminCurrentInventorySnapshotRepository adminCurrentInventorySnapshotRepository;@Autowiredprivate AdminInventoryItemRepository adminInventoryItemRepository;@Autowiredprivate PartnerCurrentInventorySnapshotRepository partnerCurrentInventorySnapshotRepository;@Autowiredprivate VendorRepository vendorRepository;@Autowiredprivate WarehouseRepository warehouseRepository;@Autowiredprivate RetailerService retailerService;@Autowired@Qualifier(value = "userRepository")private UserRepository userRepository;@Autowiredprivate UserRoleRepository userRoleRepository;@Autowiredprivate UserWarehouseRepository userWarehouseRepository;@Autowiredprivate AdminDeliveryNoteRepository adminDeliveryNoteRepository;@Autowiredprivate RetailerRegisteredAddressRepository retailerRegisteredAddressRepository;@Autowiredprivate AddressRepository addressRepository;@Autowiredprivate PartnerInventoryItemRepository partnerInventoryItemRepository;@Autowiredprivate ScanOutPartnerItemRepository scanOutPartnerItemRepository;@Autowiredprivate InstructionItemRepository instructionItemRepository;@Autowiredprivate InstructionItemDetailRepository instructionItemDetailRepository;@Autowiredprivate AdminDeliveryNoteDetailRepository adminDeliveryNoteDetailRepository;@Autowiredprivate CookiesProcessor cookiesProcessor;private Map<Integer, String> itemsToVendorIdNameMap(List<Item> items) {Map<Integer, String> vendorIdNameMap = new HashMap<>();if (items.isEmpty()) {return vendorIdNameMap;}Set<Integer> vendorIds = new HashSet<>();for (Item item : items) {vendorIds.add(item.getVendorId());}List<Vendor> vendors = vendorRepository.selectByIds(vendorIds);for (Vendor vendor : vendors) {vendorIdNameMap.put(vendor.getId(), vendor.getName());}return vendorIdNameMap;}private Map<Integer, String> adminCurrentInventorySnapshotsToItemIdDescriptionMap(List<AdminCurrentInventorySnapshot> currentInventorySnapshots) {if (currentInventorySnapshots.isEmpty()) {return new HashMap<>();}Set<Integer> itemIds = new HashSet<>();for (AdminCurrentInventorySnapshot currentInventorySnapshot : currentInventorySnapshots) {itemIds.add(currentInventorySnapshot.getItemId());}return itemIdDescriptionMap(itemIds);}private Map<Integer, String> adminCurrentInventorySnapshotsToItemIdTypeMap(List<AdminCurrentInventorySnapshot> currentInventorySnapshots) {if (currentInventorySnapshots.isEmpty()) {return new HashMap<>();}Set<Integer> itemIds = new HashSet<>();for (AdminCurrentInventorySnapshot currentInventorySnapshot : currentInventorySnapshots) {itemIds.add(currentInventorySnapshot.getItemId());}return itemIdTypeMap(itemIds);}private Map<Integer, String> partnerCurrentInventorySnapshotsToItemIdDescriptionMap(List<PartnerCurrentInventorySnapshot> partnerCurrentInventorySnapshots) {if (partnerCurrentInventorySnapshots.isEmpty()) {return new HashMap<>();}Set<Integer> itemIds = new HashSet<>();for (PartnerCurrentInventorySnapshot partnerCurrentInventorySnapshot : partnerCurrentInventorySnapshots) {itemIds.add(partnerCurrentInventorySnapshot.getItemId());}return itemIdDescriptionMap(itemIds);}/** private Map<Integer, String>* adminDeliveryNotesToItemIdDescriptionMap(List<AdminDeliveryNote>* adminDeliveryNotes){ if(adminDeliveryNotes.isEmpty()) { return new* HashMap<>(); } Set<Integer> itemIds = new HashSet<>(); for(AdminDeliveryNote* adminDeliveryNote : adminDeliveryNotes) {* itemIds.add(adminDeliveryNote.getItemId()); } return* itemIdDescriptionMap(itemIds); }*/private Map<Integer, String> scanOutPartnerItemsToItemIdDescriptionMap(List<ScanOutPartnerItem> scanOutPartnerItems) {if (scanOutPartnerItems.isEmpty()) {return new HashMap<>();}Set<Integer> itemIds = new HashSet<>();for (ScanOutPartnerItem scanOutPartnerItem : scanOutPartnerItems) {itemIds.add(scanOutPartnerItem.getItemId());}return itemIdDescriptionMap(itemIds);}private Map<Integer, String> itemIdDescriptionMap(Set<Integer> itemIds) {Map<Integer, String> itemIdDescriptionMap = new HashMap<>();List<Item> items = itemRepository.selectByIds(itemIds);for (Item item : items) {itemIdDescriptionMap.put(item.getId(), item.getBrand() + " " + item.getDescription());}return itemIdDescriptionMap;}private Map<Integer, String> itemIdTypeMap(Set<Integer> itemIds) {Map<Integer, String> itemIdTypeMap = new HashMap<>();List<Item> items = itemRepository.selectByIds(itemIds);for (Item item : items) {itemIdTypeMap.put(item.getId(), item.getType().toString());}return itemIdTypeMap;}private Map<Integer, String> warehouseIdNameMap(List<Warehouse> warehouses) {Map<Integer, String> warehouseIdNameMap = new HashMap<>();for (Warehouse warehouse : warehouses) {warehouseIdNameMap.put(warehouse.getId(), warehouse.getName());}return warehouseIdNameMap;}private Set<Integer> instructionItemsToWarehouseIds(List<InstructionItem> instructionItems) {Set<Integer> warehouseIds = new HashSet<>();for (InstructionItem instructionItem : instructionItems) {warehouseIds.add(instructionItem.getWarehouseId());}return warehouseIds;}private Set<Integer> instructionItemsToFofoIds(List<InstructionItem> instructionItems) {Set<Integer> fofoIds = new HashSet<>();for (InstructionItem instructionItem : instructionItems) {fofoIds.add(instructionItem.getFofoId());}return fofoIds;}private Set<Integer> instructionItemsToInstructionItemIds(List<InstructionItem> instructionItems) {Set<Integer> instructionItemIds = new HashSet<>();for (InstructionItem instructionItem : instructionItems) {instructionItemIds.add(instructionItem.getId());}return instructionItemIds;}private Map<Integer, Integer> instructionItemDetailsToItemIdQuantityMap(List<InstructionItemDetail> instructionItemDetails) {Map<Integer, Integer> itemIdQuantityMap = new HashMap<>();for (InstructionItemDetail instructionItemDetail : instructionItemDetails) {if (!itemIdQuantityMap.containsKey(instructionItemDetail.getItemId())) {itemIdQuantityMap.put(instructionItemDetail.getItemId(), instructionItemDetail.getQuantity());} else {itemIdQuantityMap.put(instructionItemDetail.getItemId(),itemIdQuantityMap.get(instructionItemDetail.getItemId()) + instructionItemDetail.getQuantity());}}return itemIdQuantityMap;}private Map<Integer, List<InstructionItemDetail>> instructionItemsToInstructionItemIdInstructionItemDetailsMap(List<InstructionItemDetail> instructionItemDetails) {// Set<Integer> instructionItemIds =// this.instructionItemsToInstructionItemIds(instructionItems);// List<InstructionItemDetail> instructionItemDetails =// instructionItemDetailRepository.selectByInstructionItemIds(instructionItemIds);Map<Integer, List<InstructionItemDetail>> instructionIdInstructionItemDetailMap = new HashMap<>();for (InstructionItemDetail instructionItemDetail : instructionItemDetails) {if (!instructionIdInstructionItemDetailMap.containsKey(instructionItemDetail.getInstructionItemId())) {List<InstructionItemDetail> instructionItemDetailsList = new ArrayList<>();instructionItemDetailsList.add(instructionItemDetail);instructionIdInstructionItemDetailMap.put(instructionItemDetail.getInstructionItemId(),instructionItemDetailsList);} else {instructionIdInstructionItemDetailMap.get(instructionItemDetail.getInstructionItemId()).add(instructionItemDetail);}}return instructionIdInstructionItemDetailMap;}private Set<Integer> instructionItemDetailsToItemIds(List<InstructionItemDetail> instructionItemDetails) {Set<Integer> itemIds = new HashSet<>();for (InstructionItemDetail instructionItemDetail : instructionItemDetails) {itemIds.add(instructionItemDetail.getItemId());}return itemIds;}private Set<Integer> adminDeliveryNotesToWarehouseIds(List<AdminDeliveryNote> adminDeliveryNotes) {Set<Integer> warehouseIds = new HashSet<>();for (AdminDeliveryNote adminDeliveryNote : adminDeliveryNotes) {warehouseIds.add(adminDeliveryNote.getWarehouseId());}return warehouseIds;}private Set<Integer> adminDeliveryNotesToFofoIds(List<AdminDeliveryNote> adminDeliveryNotes) {Set<Integer> fofoIds = new HashSet<>();for (AdminDeliveryNote adminDeliveryNote : adminDeliveryNotes) {fofoIds.add(adminDeliveryNote.getFofoId());}return fofoIds;}@RequestMapping(value = "/createItem", method = RequestMethod.GET)public String createItem(HttpServletRequest request, @RequestParam(name = "offset", defaultValue = "0") int offset,@RequestParam(name = "limit", defaultValue = "10") int limit, Model model)throws ProfitMandiBusinessException {LOGGER.info("Request Received at url {}", request.getRequestURI());List<Item> items = itemRepository.selectAll(offset, limit);long size = itemRepository.selectAllCount();Map<Integer, String> vendorIdNameMap = this.itemsToVendorIdNameMap(items);List<Vendor> vendors = vendorRepository.selectAll();model.addAttribute("vendors", vendors);model.addAttribute("items", items);model.addAttribute("types", ItemType.values());model.addAttribute("vendorIdNameMap", vendorIdNameMap);model.addAttribute("start", offset + 1);model.addAttribute("size", size);if (items.size() < limit) {model.addAttribute("end", offset + items.size());} else {model.addAttribute("end", offset + limit);}return "items";}@RequestMapping(value = "/createItem", method = RequestMethod.POST)public String createItem(HttpServletRequest request, @RequestBody CreateItemRequest createItemRequest,@RequestParam(name = "offset", defaultValue = "0") int offset,@RequestParam(name = "limit", defaultValue = "10") int limit, Model model)throws ProfitMandiBusinessException {LOGGER.info("Request Received at url {} with body {}", request.getRequestURI(), createItemRequest);inventoryService.createItem(createItemRequest);List<Item> items = itemRepository.selectAll(offset, limit);Map<Integer, String> vendorIdNameMap = this.itemsToVendorIdNameMap(items);long size = itemRepository.selectAllCount();List<Vendor> vendors = vendorRepository.selectAll();model.addAttribute("vendors", vendors);model.addAttribute("items", items);model.addAttribute("types", ItemType.values());model.addAttribute("vendorIdNameMap", vendorIdNameMap);model.addAttribute("start", offset + 1);model.addAttribute("size", size);if (items.size() < limit) {model.addAttribute("end", offset + items.size());} else {model.addAttribute("end", offset + limit);}return "items";}@RequestMapping(value = "/getPaginatedItems", method = RequestMethod.GET)public String getPaginatedItems(HttpServletRequest request,@RequestParam(name = "offset", defaultValue = "0") int offset,@RequestParam(name = "limit", defaultValue = "10") int limit, Model model)throws ProfitMandiBusinessException {List<Item> items = itemRepository.selectAll(offset, limit);Map<Integer, String> vendorIdNameMap = this.itemsToVendorIdNameMap(items);List<Vendor> vendors = vendorRepository.selectAll();model.addAttribute("vendors", vendors);model.addAttribute("items", items);model.addAttribute("vendorIdNameMap", vendorIdNameMap);return "items-paginated";}@RequestMapping(value = "/scanInItems", method = RequestMethod.POST)public String scanInItems(HttpServletRequest request, @RequestBody ScanInItemRequest scanInItemRequest,@RequestParam(name = "offset", defaultValue = "0") int offset,@RequestParam(name = "limit", defaultValue = "10") int limit, Model model)throws ProfitMandiBusinessException {LOGGER.info("Request Received at url {} with body {}", request.getRequestURI(), scanInItemRequest);LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);inventoryService.scanInItem(scanInItemRequest, loginDetails.getFofoId());return getScanInItems(request, scanInItemRequest.getWarehouseId(), 0, 10, model);}@RequestMapping(value = "/authorisedWarehouses", method = RequestMethod.GET)public String getAuthorisedWarehouses(HttpServletRequest request, Model model) throws Throwable {LOGGER.info("Request Received at url {}", request.getRequestURI());LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);List<Integer> warehouseIds = userWarehouseRepository.selectWarehouseIdsByUserId(loginDetails.getFofoId());List<Warehouse> authorisedWarehouses = warehouseRepository.selectByIds(new HashSet<>(warehouseIds));model.addAttribute("response", mvcResponseSender.createResponseString(authorisedWarehouses));return "response";}@RequestMapping(value = "/getScanInItems/{warehouseId}", method = RequestMethod.GET)public String getScanInItems(HttpServletRequest request, @PathVariable int warehouseId,@RequestParam(name = "offset", defaultValue = "0") int offset,@RequestParam(name = "limit", defaultValue = "10") int limit, Model model)throws ProfitMandiBusinessException {LOGGER.info("Request Received at url {}", request.getRequestURI());LOGGER.info("Warehouse Id is {}", request.getRequestURI());Warehouse warehouse = warehouseRepository.selectById(warehouseId);List<Item> items = itemRepository.selectAll();List<AdminCurrentInventorySnapshot> adminCurrentInventorySnapshots = adminCurrentInventorySnapshotRepository.selectAllByWarehouseId(warehouseId, offset, limit);Map<Integer, String> itemIdDescriptionMap = this.adminCurrentInventorySnapshotsToItemIdDescriptionMap(adminCurrentInventorySnapshots);long size = adminCurrentInventorySnapshotRepository.selectAllCountByWarehouseId(warehouseId);model.addAttribute("items", items);model.addAttribute("warehouse", warehouse);model.addAttribute("adminCurrentInventorySnapshots", adminCurrentInventorySnapshots);model.addAttribute("itemIdDescriptionMap", itemIdDescriptionMap);model.addAttribute("start", offset + 1);model.addAttribute("size", size);if (adminCurrentInventorySnapshots.size() < limit) {model.addAttribute("end", offset + adminCurrentInventorySnapshots.size());} else {model.addAttribute("end", offset + limit);}return "scan-in-items";}@RequestMapping(value = "/getPaginatedScanInItems/{warehouseId}", method = RequestMethod.GET)public String getPaginatedScanInItems(HttpServletRequest request, @PathVariable int warehouseId,@RequestParam(name = "offset", defaultValue = "0") int offset,@RequestParam(name = "limit", defaultValue = "10") int limit, Model model)throws ProfitMandiBusinessException {List<AdminCurrentInventorySnapshot> adminCurrentInventorySnapshots = adminCurrentInventorySnapshotRepository.selectAllByWarehouseId(warehouseId);Map<Integer, String> itemIdDescriptionMap = this.adminCurrentInventorySnapshotsToItemIdDescriptionMap(adminCurrentInventorySnapshots);model.addAttribute("adminCurrentInventorySnapshots", adminCurrentInventorySnapshots);model.addAttribute("itemIdDescriptionMap", itemIdDescriptionMap);return "scan-in-items-paginated";}@RequestMapping(value = "/getScanInPartnerItems", method = RequestMethod.GET)public String getScanInPartnerItems(HttpServletRequest request,@RequestParam(name = "offset", defaultValue = "0") int offset,@RequestParam(name = "limit", defaultValue = "10") int limit, Model model)throws ProfitMandiBusinessException {LOGGER.info("Request Received at url {}", request.getRequestURI());LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);// List<Item> items = itemRepository.selectAll();List<PartnerCurrentInventorySnapshot> partnerCurrentInventorySnapshots = partnerCurrentInventorySnapshotRepository.selectAllByFofoId(loginDetails.getFofoId(), offset, limit);Map<Integer, String> itemIdDescriptionMap = this.partnerCurrentInventorySnapshotsToItemIdDescriptionMap(partnerCurrentInventorySnapshots);long size = partnerCurrentInventorySnapshotRepository.selectAllCountByFofoId(loginDetails.getFofoId());// model.addAttribute("items", items);model.addAttribute("partnerCurrentInventorySnapshots", partnerCurrentInventorySnapshots);model.addAttribute("itemIdDescriptionMap", itemIdDescriptionMap);model.addAttribute("start", offset + 1);model.addAttribute("size", size);if (partnerCurrentInventorySnapshots.size() < limit) {model.addAttribute("end", offset + partnerCurrentInventorySnapshots.size());} else {model.addAttribute("end", offset + limit);}return "scan-in-partner-items";}@RequestMapping(value = "/scanInPartnerItems", method = RequestMethod.POST)public String getScanInPartnerItems(HttpServletRequest request,@RequestBody ScanInPartnerItemRequest scanInPartnerItemRequest,@RequestParam(name = "offset", defaultValue = "0") int offset,@RequestParam(name = "limit", defaultValue = "10") int limit, Model model)throws ProfitMandiBusinessException {LOGGER.info("Request Received at url {}", request.getRequestURI());LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);inventoryService.scanInPartnerItem(scanInPartnerItemRequest, loginDetails.getFofoId());List<PartnerCurrentInventorySnapshot> partnerCurrentInventorySnapshots = partnerCurrentInventorySnapshotRepository.selectAllByFofoId(loginDetails.getFofoId(), offset, limit);Map<Integer, String> itemIdDescriptionMap = this.partnerCurrentInventorySnapshotsToItemIdDescriptionMap(partnerCurrentInventorySnapshots);long size = partnerCurrentInventorySnapshotRepository.selectAllCountByFofoId(loginDetails.getFofoId());model.addAttribute("partnerCurrentInventorySnapshots", partnerCurrentInventorySnapshots);model.addAttribute("itemIdDescriptionMap", itemIdDescriptionMap);model.addAttribute("start", offset + 1);model.addAttribute("size", size);if (partnerCurrentInventorySnapshots.size() < limit) {model.addAttribute("end", offset + partnerCurrentInventorySnapshots.size());} else {model.addAttribute("end", offset + limit);}return "scan-in-partner-items";}@RequestMapping(value = "/getPaginatedScanInPartnerItems", method = RequestMethod.GET)public String getPaginatedScanInPartnerItems(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);List<PartnerCurrentInventorySnapshot> partnerCurrentInventorySnapshots = partnerCurrentInventorySnapshotRepository.selectAllByFofoId(loginDetails.getFofoId(), offset, limit);Map<Integer, String> itemIdDescriptionMap = this.partnerCurrentInventorySnapshotsToItemIdDescriptionMap(partnerCurrentInventorySnapshots);model.addAttribute("partnerCurrentInventorySnapshots", partnerCurrentInventorySnapshots);model.addAttribute("itemIdDescriptionMap", itemIdDescriptionMap);return "scan-in-partner-items-paginated";}private Map<Integer, Integer> partnerCurrentInventorySnapshotsItemIdQuantityMap(List<PartnerCurrentInventorySnapshot> partnerCurrentInventorySnapshots) {Map<Integer, Integer> itemIdQuantityMap = new HashMap<>();for (PartnerCurrentInventorySnapshot partnerCurrentInventorySnapshot : partnerCurrentInventorySnapshots) {itemIdQuantityMap.put(partnerCurrentInventorySnapshot.getItemId(),partnerCurrentInventorySnapshot.getAvailability());}return itemIdQuantityMap;}@RequestMapping(value = "/getScanOutPartnerItems", method = RequestMethod.GET)public String getScanOutPartnerItems(HttpServletRequest request,@RequestParam(name = "offset", defaultValue = "0") int offset,@RequestParam(name = "limit", defaultValue = "10") int limit, Model model)throws ProfitMandiBusinessException {LOGGER.info("Request Received at url {}", request.getRequestURI());LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);int addressId = retailerRegisteredAddressRepository.selectAddressIdByRetailerId(loginDetails.getFofoId());Address address = addressRepository.selectById(addressId);List<PartnerCurrentInventorySnapshot> partnerCurrentInventorySnapshots = partnerCurrentInventorySnapshotRepository.selectByFofoId(loginDetails.getFofoId());Map<Integer, Integer> itemIdQuantityMap = this.partnerCurrentInventorySnapshotsItemIdQuantityMap(partnerCurrentInventorySnapshots);List<Item> items = itemRepository.selectByIds(itemIdQuantityMap.keySet());List<ScanOutPartnerItem> scanOutPartnerItems = scanOutPartnerItemRepository.selectAllByFofoId(loginDetails.getFofoId(), offset, limit);Map<Integer, String> itemIdDescriptionMap = this.scanOutPartnerItemsToItemIdDescriptionMap(scanOutPartnerItems);long size = scanOutPartnerItemRepository.selectCountByFofoId(loginDetails.getFofoId());model.addAttribute("items", items);// model.addAttribute("stateNames", Utils.getAllStateNames());model.addAttribute("retailerStateName", address.getState());model.addAttribute("scanOutPartnerItems", scanOutPartnerItems);model.addAttribute("itemIdDescriptionMap", itemIdDescriptionMap);model.addAttribute("itemIdQuantityMap", itemIdQuantityMap);model.addAttribute("start", offset + 1);model.addAttribute("size", size);if (scanOutPartnerItems.size() < limit) {model.addAttribute("end", offset + scanOutPartnerItems.size());} else {model.addAttribute("end", offset + limit);}return "scan-out-partner-items";}@RequestMapping(value = "/instructionItem", method = RequestMethod.POST)public String instructionItems(HttpServletRequest request,@RequestBody InstructionItemRequest instructionItemRequest,@RequestParam(name = "offset", defaultValue = "0") int offset,@RequestParam(name = "limit", defaultValue = "10") int limit, Model model)throws ProfitMandiBusinessException {LOGGER.info("Request Received at url {} with body {}", request.getRequestURI(), instructionItemRequest);LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);inventoryService.instructionItem(instructionItemRequest, loginDetails.getFofoId());return this.getInstructionItems(request, instructionItemRequest.getWarehouseId(), offset, limit, model);}@RequestMapping(value = "/getInstructionItems/{warehouseId}", method = RequestMethod.GET)public String getInstructionItems(HttpServletRequest request, @PathVariable int warehouseId,@RequestParam(name = "offset", defaultValue = "0") int offset,@RequestParam(name = "limit", defaultValue = "10") int limit, Model model)throws ProfitMandiBusinessException {LOGGER.info("Request Received at url {}", request.getRequestURI());List<InstructionItem> instructionItems = instructionItemRepository.selectAllByWarehouseId(warehouseId, offset,limit);LOGGER.info("instructionItems" + instructionItems);Set<Integer> instructionItemWarehouseIds = this.instructionItemsToWarehouseIds(instructionItems);LOGGER.info("instructionItemWarehouseIds" + instructionItemWarehouseIds);Warehouse warehouse = warehouseRepository.selectById(warehouseId);Map<Integer, String> userIdStoreNameMap = retailerService.getAllFofoRetailerIdNameMap();model.addAttribute("userIdStoreNameMap", userIdStoreNameMap);long size = instructionItemRepository.selectCountByWarehouseId(warehouseId);model.addAttribute("warehouse", warehouse);model.addAttribute("instructionItems", instructionItems);model.addAttribute("start", offset + 1);model.addAttribute("size", size);if (instructionItems.size() < limit) {model.addAttribute("end", offset + instructionItems.size());} else {model.addAttribute("end", offset + limit);}return "instruction-items";}@RequestMapping(value = "/getPaginatedInstructionItems/{warehouseId}", method = RequestMethod.GET)public String getPaginatedInstructionItems(HttpServletRequest request, @PathVariable int warehouseId,@RequestParam(name = "offset", defaultValue = "0") int offset,@RequestParam(name = "limit", defaultValue = "10") int limit, Model model)throws ProfitMandiBusinessException {List<InstructionItem> instructionItems = instructionItemRepository.selectAllByWarehouseId(warehouseId, offset,limit);Warehouse warehouse = warehouseRepository.selectById(warehouseId);model.addAttribute("warehouse", warehouse);model.addAttribute("instructionItems", instructionItems);return "scan-out-partner-items-paginated";}@RequestMapping(value = "/scanOutPartnerItem", method = RequestMethod.POST)public String scanOutPartnerItems(HttpServletRequest request,@RequestBody ScanOutPartnerItemRequest scanOutPartnerItemRequest,@RequestParam(name = "offset", defaultValue = "0") int offset,@RequestParam(name = "limit", defaultValue = "10") int limit, Model model)throws ProfitMandiBusinessException {LOGGER.info("Request Received at url {}", request.getRequestURI());LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);inventoryService.scanOutPartnerItem(scanOutPartnerItemRequest, loginDetails.getFofoId());return this.scanOutPartnerItems(request, scanOutPartnerItemRequest, offset, limit, model);}@RequestMapping(value = "/getPaginatedScanOutPartnerItems", method = RequestMethod.GET)public String getPaginatedScanOutPartnerItems(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);List<ScanOutPartnerItem> scanOutPartnerItems = scanOutPartnerItemRepository.selectAllByFofoId(loginDetails.getFofoId(), offset, limit);Map<Integer, String> itemIdDescriptionMap = this.scanOutPartnerItemsToItemIdDescriptionMap(scanOutPartnerItems);model.addAttribute("scanOutPartnerItems", scanOutPartnerItems);model.addAttribute("itemIdDescriptionMap", itemIdDescriptionMap);return "scan-out-partner-items-paginated";}@RequestMapping(value = "/deliveryNoteDetails", method = RequestMethod.GET)public String deliveryNoteDetails(HttpServletRequest request,@RequestParam(name = ProfitMandiConstants.DELIVERY_NOTE_ID) String deliveryNoteId, Model model)throws ProfitMandiBusinessException {LOGGER.info("Request Received at url {}", request.getRequestURI());LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);AdminDeliveryNote adminDeliveryNote = adminDeliveryNoteRepository.selectByDeliveryNoteIdAndFofoid(deliveryNoteId, loginDetails.getFofoId());if (adminDeliveryNote.getCompleteTimestamp() != null) {throw new ProfitMandiBusinessException(ProfitMandiConstants.DELIVERY_NOTE_ID + ", " + ProfitMandiConstants.FOFO_ID,deliveryNoteId + ", " + loginDetails.getFofoId(), "NNBLBL_ITM_1002");}Warehouse warehouse = warehouseRepository.selectById(adminDeliveryNote.getWarehouseId());List<Integer> instructionItemIds = adminDeliveryNoteDetailRepository.selectInstructionItemIdsByDeliveryNoteId(deliveryNoteId);List<InstructionItemDetail> instructionItemDetails = instructionItemDetailRepository.selectByInstructionItemIds(new HashSet<>(instructionItemIds));Map<Integer, Integer> itemIdQuantityMap = this.instructionItemDetailsToItemIdQuantityMap(instructionItemDetails);Map<Integer, String> itemIdDescriptionMap = this.itemIdDescriptionMap(itemIdQuantityMap.keySet());Map<Integer, String> itemIdTypeMap = this.itemIdTypeMap(itemIdQuantityMap.keySet());model.addAttribute("deliveryNoteId", deliveryNoteId);model.addAttribute("warehouseName", warehouse.getName());model.addAttribute("itemIdQuantityMap", itemIdQuantityMap);model.addAttribute("itemIdDescriptionMap", itemIdDescriptionMap);model.addAttribute("itemIdTypeMap", itemIdTypeMap);return "delivery-note-details";}@RequestMapping(value = "/getItemsByWarehouseId", method = RequestMethod.GET)public String getItemsByWarehouseId(HttpServletRequest request,@RequestParam(name = ProfitMandiConstants.WAREHOUSE_ID) int warehouseId, Model model)throws ProfitMandiBusinessException {LOGGER.info("Request Received at url {}", request.getRequestURI());List<AdminCurrentInventorySnapshot> adminCurrentInventorySnapshots = adminCurrentInventorySnapshotRepository.selectAllAvailableByWarehouseId(warehouseId);Map<Integer, String> itemIdDescriptionMap = this.adminCurrentInventorySnapshotsToItemIdDescriptionMap(adminCurrentInventorySnapshots);Map<Integer, String> itemIdTypeMap = this.adminCurrentInventorySnapshotsToItemIdTypeMap(adminCurrentInventorySnapshots);model.addAttribute("itemIdDescriptionMap", itemIdDescriptionMap);model.addAttribute("itemIdTypeMap", itemIdTypeMap);return "warehouse-items";}@RequestMapping(value = "/getInstructionItemsByWarehouseId", method = RequestMethod.GET)public String getInstructionItemsByWarehouseId(HttpServletRequest request,@RequestParam(name = ProfitMandiConstants.WAREHOUSE_ID) int warehouseId, Model model)throws ProfitMandiBusinessException {LOGGER.info("Request Received at url {}", request.getRequestURI());List<AdminCurrentInventorySnapshot> adminCurrentInventorySnapshots = adminCurrentInventorySnapshotRepository.selectAllAvailableByWarehouseId(warehouseId);Map<Integer, String> itemIdDescriptionMap = this.adminCurrentInventorySnapshotsToItemIdDescriptionMap(adminCurrentInventorySnapshots);Map<Integer, String> itemIdTypeMap = this.adminCurrentInventorySnapshotsToItemIdTypeMap(adminCurrentInventorySnapshots);model.addAttribute("itemIdDescriptionMap", itemIdDescriptionMap);model.addAttribute("itemIdTypeMap", itemIdTypeMap);return "warehouse-instruction-items";}@RequestMapping(value = "/getPendingInstructionItems", method = RequestMethod.GET)public String getPendingInstructionItems(HttpServletRequest request,@RequestParam(name = ProfitMandiConstants.WAREHOUSE_ID) int warehouseId,@RequestParam(name = ProfitMandiConstants.USER_ID) int userId, Model model)throws ProfitMandiBusinessException {LOGGER.info("Request Received at url {}", request.getRequestURI());List<InstructionItem> instructionItems = instructionItemRepository.selectByWarehouseIdUserIdStatus(warehouseId,userId, InstructionItemStatus.PENDING);Set<Integer> instructionItemIds = this.instructionItemsToInstructionItemIds(instructionItems);List<InstructionItemDetail> instructionItemDetails = instructionItemDetailRepository.selectByInstructionItemIds(instructionItemIds);Set<Integer> itemIds = this.instructionItemDetailsToItemIds(instructionItemDetails);Map<Integer, List<InstructionItemDetail>> instructionItemIdInstructionItemDetailsMap = this.instructionItemsToInstructionItemIdInstructionItemDetailsMap(instructionItemDetails);Map<Integer, String> itemIdDescriptionMap = this.itemIdDescriptionMap(itemIds);Map<Integer, String> itemIdTypeMap = this.itemIdTypeMap(itemIds);model.addAttribute("instructionItems", instructionItems);model.addAttribute("instructionItemIdInstructionItemDetailsMap", instructionItemIdInstructionItemDetailsMap);model.addAttribute("itemIdDescriptionMap", itemIdDescriptionMap);model.addAttribute("itemIdTypeMap", itemIdTypeMap);return "pending-instruction-items";}@RequestMapping(value = "/getScanOutItems/{warehouseId}", method = RequestMethod.GET)public String getScanOutItems(HttpServletRequest request, @PathVariable int warehouseId,@RequestParam(name = "offset", defaultValue = "0") int offset,@RequestParam(name = "limit", defaultValue = "10") int limit, Model model)throws ProfitMandiBusinessException {LOGGER.info("Request Received at url {}", request.getRequestURI());List<InstructionItem> instructionItems = instructionItemRepository.selectByWarehouseIdStatus(warehouseId,InstructionItemStatus.PENDING);Map<Integer, String> fofoIdNameMap = retailerService.getAllFofoRetailerIdNameMap(instructionItems.stream().map(InstructionItem::getFofoId).collect(Collectors.toList()));Warehouse warehouse = warehouseRepository.selectById(warehouseId);long deliveryNotesCount = adminDeliveryNoteRepository.selectAllByWarehouseIdCount(warehouseId);List<AdminDeliveryNote> adminDeliveryNotes = null;if (deliveryNotesCount > 0) {adminDeliveryNotes = adminDeliveryNoteRepository.selectAllByWarehouseId(warehouseId, offset, limit);} else {adminDeliveryNotes = new ArrayList<>();}long size = adminDeliveryNoteRepository.selectAllCount();model.addAttribute("warehouse", warehouse);model.addAttribute("adminDeliveryNotes", adminDeliveryNotes);model.addAttribute("fofoIdNameMap", fofoIdNameMap);model.addAttribute("start", offset + 1);model.addAttribute("size", size);if (adminDeliveryNotes.size() < limit) {model.addAttribute("end", offset + adminDeliveryNotes.size());} else {model.addAttribute("end", offset + limit);}return "scan-out-items";}@RequestMapping(value = "/scanOutItems", method = RequestMethod.POST)public String scanOutItems(HttpServletRequest request, @RequestBody ScanOutItemRequest scanOutItemRequest,@RequestParam(name = "offset", defaultValue = "0") int offset,@RequestParam(name = "limit", defaultValue = "10") int limit, Model model)throws ProfitMandiBusinessException {LOGGER.info("Request Received at url {} with body {}", request.getRequestURI(), scanOutItemRequest);LoginDetails loginDetails = cookiesProcessor.getCookiesObject(request);inventoryService.scanOutItem(scanOutItemRequest, loginDetails.getFofoId());return this.getScanOutItems(request, scanOutItemRequest.getWarehouseId(), offset, limit, model);}@RequestMapping(value = "/getPaginatedScanOutItems", method = RequestMethod.GET)public String getPaginatedScanOutItems(HttpServletRequest request,@RequestParam(name = "offset", defaultValue = "0") int offset,@RequestParam(name = "limit", defaultValue = "10") int limit, Model model)throws ProfitMandiBusinessException {LOGGER.info("Request Received at url {}", request.getRequestURI());/** List<Warehouse> warehouses = warehouseRepository.selectAll();* List<AdminDeliveryNote> adminDeliveryNotes =* adminDeliveryNoteRepository.selectAll(offset, limit); Map<Integer, String>* itemIdDescriptionMap =* this.adminDeliveryNotesToItemIdDescriptionMap(adminDeliveryNotes);* Map<Integer, String> warehouseIdNameMap =* this.warehouseIdNameMap(warehouses); Map<Integer, String> fofoIdEmailIdMap =* retailerService.getAllFofoRetailerIdEmailIdMap();* model.addAttribute("adminDeliveryNotes", adminDeliveryNotes);* model.addAttribute("warehouseIdNameMap", warehouseIdNameMap);* model.addAttribute("fofoIdEmailIdMap", fofoIdEmailIdMap);* model.addAttribute("itemIdDescriptionMap", itemIdDescriptionMap);*/return "scan-out-items-paginated";}@RequestMapping(value = "/getSerialNumbersByItemIdWarehouseId", method = RequestMethod.GET)public String getSerialNumbersByItemIdWarehouseId(HttpServletRequest request,@RequestParam(name = ProfitMandiConstants.ITEM_ID) int itemId,@RequestParam(name = ProfitMandiConstants.WAREHOUSE_ID) int warehouseId, Model model)throws ProfitMandiBusinessException {List<String> itemSerialNumbers = adminInventoryItemRepository.selectSerialNumbersByWarehouseIdItemIdScanType(warehouseId, itemId, ScanType.IN);model.addAttribute("itemSerialNumbers", itemSerialNumbers);return "item-serial-numbers";}@RequestMapping(value = "/getSerialNumbersByItemId", method = RequestMethod.GET)public String getSerialNumbersByItemId(HttpServletRequest request,@RequestParam(name = ProfitMandiConstants.ITEM_ID) int itemId, Model model)throws ProfitMandiBusinessException {List<String> itemSerialNumbers = partnerInventoryItemRepository.selectSerialNumbersByItemIdScanType(itemId,ScanType.IN);model.addAttribute("itemSerialNumbers", itemSerialNumbers);return "item-serial-numbers-single";}}