package com.genpt.nsight.b2b.service.impl; import com.genpt.nsight.NSightCache; import com.genpt.nsight.b2b.model.FindItPartAvailabilityRequest; import com.genpt.nsight.b2b.model.FindItPartAvailabilityResponse; import com.genpt.nsight.b2b.model.PartOut; import com.genpt.nsight.b2b.model.StoreResponse; import com.genpt.nsight.b2b.model.StoreResponses; import com.genpt.nsight.b2b.service.FindITPartAvailabilityContext; import com.genpt.nsight.b2b.service.FindITPartAvailabilityService; import com.genpt.nsight.v1.SplunkLogger; import com.genpt.nsight.v1.model.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; public class FindITPartAvailabilityServiceImpl implements FindITPartAvailabilityService { private static final Logger LOGGER = LoggerFactory.getLogger(FindITPartAvailabilityServiceImpl.class); private int i = 0; final NSightCache nSightCache; public FindITPartAvailabilityServiceImpl(NSightCache nSightCache) { this.nSightCache = nSightCache; } @Override public com.genpt.nsight.v4.model.ProductAvailabilityRequest createProductAvailabilityRequest( FindITPartAvailabilityContext findITPartAvailabilityContext) { // TODO Auto-generated method stub com.genpt.nsight.v4.model.ProductAvailabilityRequest productAvailabilityRequest = new com.genpt.nsight.v4.model.ProductAvailabilityRequest(); SplunkLogger splunkLogger = null; FindItPartAvailabilityRequest findItPartAvailabilityRequest = findITPartAvailabilityContext .getFindItPartAvailabilityRequest(); Requestor requestor = new Requestor(); RequestorIdentifier requestorIdentifier = new RequestorIdentifier(); requestorIdentifier.setType("9 Digit Store Number"); requestorIdentifier.setValue(findItPartAvailabilityRequest.getStoreID()); requestor.setRequestorType("B2BLegacy"); requestor.setRequestorApplication("FinditUAP"); requestor.setRequestorIdentifier(requestorIdentifier); Responder responder = new Responder(); responder.setResponderApplication("Nsight"); HeaderRequest headerRequest = new HeaderRequest(); headerRequest.setTimestamp(String.valueOf(System.currentTimeMillis())); headerRequest.setCorrelationId(findITPartAvailabilityContext.getCorrelationId()); //need to get the country code of the calling store headerRequest.setCountryCode(nSightCache.getAlpha2CountryCode(findItPartAvailabilityRequest.getStoreID())); headerRequest.setLanguageCode("EN"); headerRequest.setRequestor(requestor); headerRequest.setResponder(responder); if (findItPartAvailabilityRequest.getRequestId()!=null && findItPartAvailabilityRequest.getRequestId().equalsIgnoreCase("MISCHG")) headerRequest.setRequestID(findItPartAvailabilityRequest.getRequestId()); com.genpt.nsight.v4.model.ActionRequest actionRequest = new com.genpt.nsight.v4.model.ActionRequest(); com.genpt.nsight.v4.model.Action action = new com.genpt.nsight.v4.model.Action(); action.setNeedProductQuantity(true); action.setNeedDeliveryEstimateCutOffTimes(false); action.setNeedPricing(false); action.setNeedSuperSedes(false); actionRequest.setAction(action); com.genpt.nsight.v4.model.DetailRequest detailRequest = new com.genpt.nsight.v4.model.DetailRequest(); List siteIdentifierList = new ArrayList(); findItPartAvailabilityRequest.getStores().getStore().forEach(store -> { SiteIdentifier siteIdentifier = new SiteIdentifier(); siteIdentifier.setName("9 Digit Store Number"); siteIdentifier.setValue(store.getStoreID()); siteIdentifier.setPassword(store.getAccountPassword()); siteIdentifierList.add(siteIdentifier); }); OtherSites otherSites = new OtherSites(); otherSites.setSiteIdentifiers(siteIdentifierList); com.genpt.nsight.v4.model.InventoryRelationshipsRequested inventoryRelationshipsRequested = new com.genpt.nsight.v4.model.InventoryRelationshipsRequested(); inventoryRelationshipsRequested.setLocalStore(false); inventoryRelationshipsRequested.setServingDC(false); inventoryRelationshipsRequested.setOtherSites(otherSites); Set parts = new HashSet<>(); findItPartAvailabilityRequest.getParts().getPart().forEach(findItPart -> { com.genpt.nsight.v4.model.Part part = new com.genpt.nsight.v4.model.Part(); part.setLineAbbrev(findItPart.getLineAbbrev()); part.setPartNumber(findItPart.getPartNumber()); parts.add(part); }); detailRequest.setInventoryRelationshipsRequested(inventoryRelationshipsRequested); detailRequest.setParts(parts); productAvailabilityRequest.setHeaderRequest(headerRequest); productAvailabilityRequest.setActionRequest(actionRequest); productAvailabilityRequest.setDetailRequest(detailRequest); return productAvailabilityRequest; } @Override public FindItPartAvailabilityResponse createFindItPartAvailabilityResponse( com.genpt.nsight.v4.model.ProductAvailabilityResponse productAvailabilityResponse, com.genpt.nsight.v4.model.ProductAvailabilityRequest productAvailabilityRequest) { // TODO Auto-generated method stub FindItPartAvailabilityResponse findItPartAvailabilityResponse = new FindItPartAvailabilityResponse(); com.genpt.nsight.b2b.model.Parts parts = new com.genpt.nsight.b2b.model.Parts(); List partList = new ArrayList(); StoreResponses storeResponses = new StoreResponses(); List storeResponseList = new ArrayList(); Map siteToPartOutMap = new HashMap(); Map siteToFaultMap = new HashMap(); productAvailabilityResponse.getDetailResponse().getParts().forEach(part -> { if (part.getTracking().getLog() == null) { part.getSites().forEach(site -> { PartOut partOut = new PartOut(); if (site.getTracking().getFault() == null) { partOut.setQtyOnHand(site.getQuantity().getOnHand()); site.getSiteIdentifiers().forEach(siteIdentifier -> { if (siteIdentifier.getName().equalsIgnoreCase("9 Digit Store Number")) { siteToPartOutMap.put(siteIdentifier.getValue() + "-" + part.getLineAbbrev() + "-" + part.getPartNumber(),partOut ); } }); } else { if(site.getTracking().getFault().getCode()!="" && site.getTracking().getFault().getMessage()!="") { site.getSiteIdentifiers().forEach(siteIdentifier -> { if (siteIdentifier.getName().equalsIgnoreCase("9 Digit Store Number")) { String faultString = site.getTracking().getFault().getCode() +"-"+ site.getTracking().getFault().getMessage(); siteToFaultMap.put(siteIdentifier.getValue() + "-" + part.getLineAbbrev() + "-" + part.getPartNumber(),faultString ); } }); } } }); } }); // Looping through the Stores and Parts Not found productAvailabilityRequest.getDetailRequest().getParts().forEach(requestPart -> { com.genpt.nsight.b2b.model.Part findItPart = new com.genpt.nsight.b2b.model.Part(); findItPart.setLineAbbrev(requestPart.getLineAbbrev()); findItPart.setPartNumber(requestPart.getPartNumber()); partList.add(findItPart); }); productAvailabilityRequest.getDetailRequest().getInventoryRelationshipsRequested().getOtherSites() .getSiteIdentifiers().forEach(requestStore -> { StoreResponse storeResponse = new StoreResponse(); List partOutList = new ArrayList(); productAvailabilityRequest.getDetailRequest().getParts().forEach(requestPart -> { PartOut partOut = new PartOut(); String storePartkey = requestStore.getValue() + "-" + requestPart.getLineAbbrev() + "-" + requestPart.getPartNumber(); if(siteToFaultMap.get(storePartkey)!=null) { String faultMessage=siteToFaultMap.get(storePartkey).substring(siteToFaultMap.get(storePartkey).lastIndexOf("-")+1); String faultCode = siteToFaultMap.get(storePartkey).substring(0,siteToFaultMap.get(storePartkey).lastIndexOf("-")); storeResponse.setStatusMessage(faultMessage); storeResponse.setStatusCode(faultCode); } else if (siteToPartOutMap.get(storePartkey)==null) { partOut.setTamsErrorMsg("Part not found"); } else { partOut=siteToPartOutMap.get(storePartkey); } if(partOut.getQtyOnHand()!=null || partOut.getTamsErrorMsg()!=null) { partOutList.add(partOut); } }); storeResponse.setStoreID(requestStore.getValue()); storeResponse.setAccountPassword(requestStore.getPassword()); if(storeResponse.getStatusCode()==null) { storeResponse.setStatusCode("0"); } storeResponse.setPartOutList(partOutList); storeResponseList.add(storeResponse); }); parts.setPart(partList); findItPartAvailabilityResponse.setParts(parts); storeResponses.setStoreResponses(storeResponseList); findItPartAvailabilityResponse.setStoreResponses(storeResponses); return findItPartAvailabilityResponse; } }