From e75a608c58fac67c76cf6d0fe18c139a7e8f0375 Mon Sep 17 00:00:00 2001 From: PayalThu Date: Tue, 10 Dec 2024 16:21:13 +0530 Subject: [PATCH 1/2] Add GSSUP-1114 Add Common HTTP request call --- modules/common-http-request-api/.gitignore | 3 + modules/common-http-request-api/bnd.bnd | 4 + modules/common-http-request-api/build.gradle | 3 + .../request/api/CommonHttpRequestApi.java | 25 + .../request/api/constants/ApiException.java | 70 +++ .../api/constants/DataNotFoundException.java | 19 + .../com/liferay/common/http/request/.gitkeep | 0 .../common/http/request/api/packageinfo | 1 + modules/common-http-request-impl/.gitignore | 3 + modules/common-http-request-impl/bnd.bnd | 3 + modules/common-http-request-impl/build.gradle | 4 + .../request/impl/CommonHttpRequestImpl.java | 482 ++++++++++++++++++ .../src/main/resources/.gitkeep | 0 13 files changed, 617 insertions(+) create mode 100644 modules/common-http-request-api/.gitignore create mode 100644 modules/common-http-request-api/bnd.bnd create mode 100644 modules/common-http-request-api/build.gradle create mode 100644 modules/common-http-request-api/src/main/java/com/liferay/common/http/request/api/CommonHttpRequestApi.java create mode 100644 modules/common-http-request-api/src/main/java/com/liferay/common/http/request/api/constants/ApiException.java create mode 100644 modules/common-http-request-api/src/main/java/com/liferay/common/http/request/api/constants/DataNotFoundException.java create mode 100644 modules/common-http-request-api/src/main/resources/com/liferay/common/http/request/.gitkeep create mode 100644 modules/common-http-request-api/src/main/resources/com/liferay/common/http/request/api/packageinfo create mode 100644 modules/common-http-request-impl/.gitignore create mode 100644 modules/common-http-request-impl/bnd.bnd create mode 100644 modules/common-http-request-impl/build.gradle create mode 100644 modules/common-http-request-impl/src/main/java/com/liferay/common/http/request/impl/CommonHttpRequestImpl.java create mode 100644 modules/common-http-request-impl/src/main/resources/.gitkeep diff --git a/modules/common-http-request-api/.gitignore b/modules/common-http-request-api/.gitignore new file mode 100644 index 0000000..c19c172 --- /dev/null +++ b/modules/common-http-request-api/.gitignore @@ -0,0 +1,3 @@ +.gradle/ +build/ +target/ \ No newline at end of file diff --git a/modules/common-http-request-api/bnd.bnd b/modules/common-http-request-api/bnd.bnd new file mode 100644 index 0000000..80c5873 --- /dev/null +++ b/modules/common-http-request-api/bnd.bnd @@ -0,0 +1,4 @@ +Bundle-Name: common-http-request-api +Bundle-SymbolicName: com.liferay.common.http.request +Bundle-Version: 1.0.0 +Export-Package: com.liferay.common.http.request.api,\com.liferay.common.http.request.api.constants diff --git a/modules/common-http-request-api/build.gradle b/modules/common-http-request-api/build.gradle new file mode 100644 index 0000000..b742b8c --- /dev/null +++ b/modules/common-http-request-api/build.gradle @@ -0,0 +1,3 @@ +dependencies { + compileOnly group: "com.liferay.portal", name: "release.dxp.api" +} \ No newline at end of file diff --git a/modules/common-http-request-api/src/main/java/com/liferay/common/http/request/api/CommonHttpRequestApi.java b/modules/common-http-request-api/src/main/java/com/liferay/common/http/request/api/CommonHttpRequestApi.java new file mode 100644 index 0000000..f39facd --- /dev/null +++ b/modules/common-http-request-api/src/main/java/com/liferay/common/http/request/api/CommonHttpRequestApi.java @@ -0,0 +1,25 @@ +package com.liferay.common.http.request.api; + +import java.util.Map; + +/** + * @author Payal + */ +public interface CommonHttpRequestApi { + + String invokeGetRestServiceHttps(String url, String requestBody, String urlParameters, + Map requestHeaderAttributes); + T invoketHttpsGet(String url, String urlParameters, Class responseType, + Map requestHeaderAttributes); + String invokePostRestService(String url, String requestBody,String authHeader, String urlParameters); + + String invokePostRestServiceHttps(String url, String requestBody,String authHeader, String urlParameters, Map requestHeaderAttributes); + + String invokePutRestService(String url, String requestBody, String authHeader, String urlParameters); + + String invokePutRestServiceHttps(String url, String requestBody, String authHeader, String urlParameters); + + String invokeDeleteFileRestServiceHttps(String url, String queryString, String requestBody, String authHeader, + Map requestHeaderAttributes); + +} \ No newline at end of file diff --git a/modules/common-http-request-api/src/main/java/com/liferay/common/http/request/api/constants/ApiException.java b/modules/common-http-request-api/src/main/java/com/liferay/common/http/request/api/constants/ApiException.java new file mode 100644 index 0000000..faafb96 --- /dev/null +++ b/modules/common-http-request-api/src/main/java/com/liferay/common/http/request/api/constants/ApiException.java @@ -0,0 +1,70 @@ +package com.liferay.common.http.request.api.constants; + +import java.io.Serializable; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +public class ApiException extends RuntimeException implements Serializable { + + // Predefined HTTP Status Codes + public static final int BAD_REQUEST = 400; + public static final int UNAUTHORIZED = 401; + public static final int FORBIDDEN = 403; + public static final int DATA_NOT_FOUND = 404; + public static final int INTERNAL_SERVER_ERROR = 500; + + private static final long serialVersionUID = 1L; // For serialization + + private int statusCode; + private Map fieldErrors; + private Throwable throwable; // New field for the throwable + + public ApiException(String message, int statusCode) { + super(message); + this.statusCode = statusCode; + this.fieldErrors = new HashMap<>(); + } + + public ApiException(String message, int statusCode, Map fieldErrors) { + super(message); + this.statusCode = statusCode; + this.fieldErrors = new HashMap<>(fieldErrors); // Make a defensive copy + } + + public ApiException(String message, int statusCode, Throwable throwable) { + super(message, throwable); + this.statusCode = statusCode; + this.fieldErrors = new HashMap<>(); + this.throwable = throwable; + } + + public ApiException(String message, int statusCode, Map fieldErrors, Throwable throwable) { + super(message, throwable); + this.statusCode = statusCode; + this.fieldErrors = new HashMap<>(fieldErrors); // Make a defensive copy + this.throwable = throwable; + } + + public int getStatusCode() { + return statusCode; + } + + public Map getFieldErrors() { + return Collections.unmodifiableMap(fieldErrors); // Return unmodifiable map + } + + public void addFieldError(String field, String errorMessage) { + this.fieldErrors.put(field, errorMessage); + } + + public String getThrowableMessage() { + return throwable != null ? throwable.getMessage() : null; + } + + @Override + public String toString() { + return String.format("ApiException{message='%s', statusCode=%d, fieldErrors=%s, throwableMessage=%s}", + getMessage(), statusCode, fieldErrors, getThrowableMessage()); + } +} \ No newline at end of file diff --git a/modules/common-http-request-api/src/main/java/com/liferay/common/http/request/api/constants/DataNotFoundException.java b/modules/common-http-request-api/src/main/java/com/liferay/common/http/request/api/constants/DataNotFoundException.java new file mode 100644 index 0000000..83d1279 --- /dev/null +++ b/modules/common-http-request-api/src/main/java/com/liferay/common/http/request/api/constants/DataNotFoundException.java @@ -0,0 +1,19 @@ +package com.liferay.common.http.request.api.constants; + +import java.util.Map; + +public class DataNotFoundException extends ApiException { + + public DataNotFoundException(String message) { + super(message, DATA_NOT_FOUND); // Status code 404 for data not found + } + + public DataNotFoundException(String message, Map fieldErrors) { + super(message, DATA_NOT_FOUND, fieldErrors); + } + + public DataNotFoundException(String field, String errorMessage) { + super("Data not found for the provided field(s)", DATA_NOT_FOUND); + addFieldError(field, errorMessage); // Add a specific field error + } +} \ No newline at end of file diff --git a/modules/common-http-request-api/src/main/resources/com/liferay/common/http/request/.gitkeep b/modules/common-http-request-api/src/main/resources/com/liferay/common/http/request/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/modules/common-http-request-api/src/main/resources/com/liferay/common/http/request/api/packageinfo b/modules/common-http-request-api/src/main/resources/com/liferay/common/http/request/api/packageinfo new file mode 100644 index 0000000..e252556 --- /dev/null +++ b/modules/common-http-request-api/src/main/resources/com/liferay/common/http/request/api/packageinfo @@ -0,0 +1 @@ +version 1.0.0 \ No newline at end of file diff --git a/modules/common-http-request-impl/.gitignore b/modules/common-http-request-impl/.gitignore new file mode 100644 index 0000000..c19c172 --- /dev/null +++ b/modules/common-http-request-impl/.gitignore @@ -0,0 +1,3 @@ +.gradle/ +build/ +target/ \ No newline at end of file diff --git a/modules/common-http-request-impl/bnd.bnd b/modules/common-http-request-impl/bnd.bnd new file mode 100644 index 0000000..3975bd0 --- /dev/null +++ b/modules/common-http-request-impl/bnd.bnd @@ -0,0 +1,3 @@ +Bundle-Name: common-http-request-impl +Bundle-SymbolicName: com.liferay.common.http.request.impl +Bundle-Version: 1.0.0 diff --git a/modules/common-http-request-impl/build.gradle b/modules/common-http-request-impl/build.gradle new file mode 100644 index 0000000..5aaf240 --- /dev/null +++ b/modules/common-http-request-impl/build.gradle @@ -0,0 +1,4 @@ +dependencies { + compileOnly group: "com.liferay.portal", name: "release.dxp.api" + compileOnly project(":modules:common-http-request-api") +} \ No newline at end of file diff --git a/modules/common-http-request-impl/src/main/java/com/liferay/common/http/request/impl/CommonHttpRequestImpl.java b/modules/common-http-request-impl/src/main/java/com/liferay/common/http/request/impl/CommonHttpRequestImpl.java new file mode 100644 index 0000000..2c32cc2 --- /dev/null +++ b/modules/common-http-request-impl/src/main/java/com/liferay/common/http/request/impl/CommonHttpRequestImpl.java @@ -0,0 +1,482 @@ +package com.liferay.common.http.request.impl; + + +import com.liferay.common.http.request.api.CommonHttpRequestApi; +import com.liferay.common.http.request.api.constants.DataNotFoundException; +import org.osgi.service.component.annotations.Component; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.liferay.petra.string.StringPool; +import com.liferay.portal.kernel.exception.PortalException; +import com.liferay.portal.kernel.json.JSONException; +import com.liferay.portal.kernel.json.JSONFactoryUtil; +import com.liferay.portal.kernel.json.JSONObject; +import com.liferay.portal.kernel.log.Log; +import com.liferay.portal.kernel.log.LogFactoryUtil; +import org.osgi.service.component.annotations.Component; + +import javax.net.ssl.HttpsURLConnection; +import javax.ws.rs.BadRequestException; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.Map; +/** + * @author Payal + */ +@Component( + property = { + }, + service = CommonHttpRequestApi.class +) +public class CommonHttpRequestImpl implements CommonHttpRequestApi { + + + public static final String HTTP_GET_METHOD="GET"; + public static final String APPLICATION_JSON = MediaType.APPLICATION_JSON; + public static final String ACCEPT ="Accept"; + public static final String HTTP_POST_METHOD ="POST"; + public static final String CONTENT_TYPE = "Content-Type"; + public static final String APPLICATION_JSON_UTF8 = "application/json; utf-8"; + public static final String AUTHORIZATION = "Authorization"; + public static final String SPACE_REPLACEMENT_CHAR = "%20"; + public static final String UTF8_ENCODING = "utf-8"; + public static final String EXCEPTION_REST_SERVICE_CALL_MSG="Application Issue: Failed to Rest Service[FNE_ERRR009] : HTTP Error Code"; + public static final String HTTP_PUT_METHOD = "PUT"; + public static final String HTTP_DELETE_METHOD = "DELETE"; + + final Log logger = LogFactoryUtil.getLog(CommonHttpRequestImpl.class); + + // Method for HTTP requests + + @Override + public T invoketHttpsGet(String url, String urlParameters, Class responseType, + Map requestHeaderAttributes) { + ObjectMapper objectMapper = new ObjectMapper(); + HttpsURLConnection conn = null; + StringBuilder jsonBuffer = new StringBuilder(); + URL endpointURL; + + try { + if (urlParameters != null && !urlParameters.isEmpty()) { + endpointURL = new URL(url + StringPool.QUESTION + + urlParameters.replace(StringPool.SPACE, StringPool.BLANK)); + } else { + endpointURL = new URL(url); + } + logger.debug("endpointURL: " + endpointURL); + + conn = (HttpsURLConnection) endpointURL.openConnection(); + conn.setRequestMethod(HTTP_GET_METHOD); + conn.setRequestProperty(ACCEPT, APPLICATION_JSON); + + if (requestHeaderAttributes != null) { + requestHeaderAttributes.forEach(conn::setRequestProperty); + } + + validateConnResponse(conn, jsonBuffer); + + convertStreamToJsonBuffer(conn.getInputStream(), jsonBuffer); + // Deserialize the JSON response to an object of type T + return objectMapper.readValue(jsonBuffer.toString(), responseType); + + } catch (Exception e) { + logger.error("Error occurred in invokeHttpsGet: " + e.getMessage(), e); + throw new RuntimeException("Failed to invoke GET request", e); + + } finally { + if (conn != null) { + conn.disconnect(); + } + } + } + + @Override + public String invokeGetRestServiceHttps(String url, String requestBody, String urlParameters, + Map requestHeaderAttributes) { + + HttpsURLConnection conn = null; + String output; + String response = null; + StringBuilder jsonBuffer = new StringBuilder(); + URL endpointURL; + + try { + if (null != urlParameters && !urlParameters.isEmpty()) { + endpointURL = new URL(url + StringPool.QUESTION + + urlParameters.replace(StringPool.SPACE, StringPool.BLANK)); + } else { + endpointURL = new URL(url); + } + logger.debug("endpointURL ::" + url); + conn = (HttpsURLConnection) endpointURL.openConnection(); + conn.setRequestMethod(HTTP_GET_METHOD); + conn.setRequestProperty(ACCEPT, APPLICATION_JSON); + + if (null != requestHeaderAttributes && !requestHeaderAttributes.isEmpty()) { + for (Map.Entry entry : requestHeaderAttributes.entrySet()) { + conn.setRequestProperty(entry.getKey(), entry.getValue()); + } + } + + validateConnResponse(conn, jsonBuffer); + + try (BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream())))) { + + while ((output = br.readLine()) != null) { + jsonBuffer.append(output); + } + } catch (Exception e) { + logger.error( + "CommonService :: invokeGetRestServiceHttps :: Error Occurred:while reading output to json buffer ::Exception::" + + e); + } + response = jsonBuffer.toString(); + + } catch (PortalException e) { + logger.error( + "CommonService :: invokeGetRestServiceHttps :: Error Occurred:PortalException::" + e.getMessage()); + + } catch (Exception e) { + logger.error( + "CommonService :: invokeGetRestServiceHttps :: Error Occurred:Exception::" + e.getMessage()); + + } finally { + + if (null != conn) { + conn.disconnect(); + } + } + logger.debug("CommonService :: exiting from invokeGetRestServiceHttps() method"); + return response; + } + + private void validateConnResponse(HttpsURLConnection conn, StringBuilder jsonBuffer) throws Exception { + int responseCode = conn.getResponseCode(); + logger.info("API ResponseCode: "+ responseCode+ "Response Message: "+ conn.getErrorStream()); + if (responseCode != HttpsURLConnection.HTTP_OK && responseCode != HttpsURLConnection.HTTP_CREATED) { + + String errorMessage = getErrorMessage(conn, jsonBuffer); + + if (responseCode == Response.Status.BAD_REQUEST.getStatusCode() || responseCode == 422) { + throw new BadRequestException("API Bad Request Exception: " + errorMessage); + } + + if (responseCode == Response.Status.NOT_FOUND.getStatusCode()) { + throw new DataNotFoundException("API Data Not Found Exception: " + errorMessage); + } + + throw new PortalException("API call failure with HTTP error code: " + responseCode+ ", ErrorMessage: "+errorMessage); + } + } + + private static String getErrorMessage(HttpsURLConnection conn, StringBuilder jsonBuffer) throws IOException, JSONException { + String errorMessage = conn.getResponseMessage(); + convertStreamToJsonBuffer(conn.getErrorStream(), jsonBuffer); + if (jsonBuffer.length() > 0) { + JSONObject jsonObject = JSONFactoryUtil.createJSONObject(jsonBuffer.toString()); + errorMessage = jsonObject.getString("error"); + } + return errorMessage; + } + + private static void convertStreamToJsonBuffer(InputStream inputStreamResponse, StringBuilder jsonBuffer) throws IOException { + try (BufferedReader br = new BufferedReader(new InputStreamReader(inputStreamResponse))) { + String output; + while ((output = br.readLine()) != null) { + jsonBuffer.append(output); + } + } + } + + @Override + public String invokePostRestService(String url, String requestBody,String authHeader, String urlParameters) { + Long startTime =System.currentTimeMillis(); + HttpURLConnection conn = null; + String response = null; + StringBuilder jsonBuffer = new StringBuilder(); + URL endpointURL = null; + try { + if(null!=urlParameters && !urlParameters.isEmpty()) { + endpointURL = new URL(url+StringPool.QUESTION+urlParameters.replace(StringPool.SPACE, SPACE_REPLACEMENT_CHAR)); + }else { + endpointURL = new URL(url); + } + + conn = (HttpURLConnection) endpointURL.openConnection(); + + conn.setRequestMethod(HTTP_POST_METHOD); + conn.setRequestProperty(CONTENT_TYPE, APPLICATION_JSON); + conn.setRequestProperty(ACCEPT, APPLICATION_JSON); + if(null!=authHeader && !authHeader.isEmpty()) + { + conn.setRequestProperty(AUTHORIZATION,authHeader); + } + + conn.setDoOutput(true); + try(OutputStream os = conn.getOutputStream()) { + byte[] input = requestBody.getBytes(UTF8_ENCODING); + os.write(input, 0, input.length); + os.flush(); + }catch(Exception e) { + logger.error("RestInvokerImpl :: invokePostRestService :: Error Occured while writing request to OutStream::"+e); + throw new RuntimeException("Failed to invoke POST request", e); + } + // added 201,204 status codes for PEGA calls + if (conn.getResponseCode() != 200 && conn.getResponseCode() != 201 && conn.getResponseCode() != 204) { + + + logger.error(new StringBuilder() + .append("REST Call Error").append(StringPool.BLANK) + .append(EXCEPTION_REST_SERVICE_CALL_MSG).append(conn.getResponseCode()) + .append(StringPool.PIPE).append(conn.getResponseMessage())); + throw new PortalException("Failed to invoke POST request for the code " + conn.getResponseCode()); + + }else { + response= readResponse(conn.getInputStream(), jsonBuffer); + } + + }catch(Exception e) { + logger.error("RestInvokerImpl :: invokePostRestService :: Error Occured:Exception::"+e); + e.printStackTrace(); + } + return response; + } + + public String readResponse(InputStream in, StringBuilder jsonBuffer) { + String output = null; + try (BufferedReader br = new BufferedReader(new InputStreamReader(in, UTF8_ENCODING))) { + while ((output = br.readLine()) != null) { + jsonBuffer.append(output.trim()); + } + } catch (Exception e) { + logger.error( + "RestInvokerImpl :: invokePostRestService :: Error Occured while reading response from inputstream::" + + e); + e.printStackTrace(); + } + return jsonBuffer.toString(); + } + + @Override + public String invokePostRestServiceHttps(String url, String requestBody,String authHeader, String urlParameters, Map requestHeaderAttributes) { + Long startTime =System.currentTimeMillis(); + HttpsURLConnection conn = null; + String output = null; + String response = null; + + URL endpointURL = null; + try { + if(null!=urlParameters && !urlParameters.isEmpty()) { + endpointURL = new URL(url+StringPool.QUESTION+urlParameters.replace(StringPool.BLANK, SPACE_REPLACEMENT_CHAR)); + }else { + endpointURL = new URL(url); + } + + conn = (HttpsURLConnection) endpointURL.openConnection(); + + conn.setRequestMethod(HTTP_POST_METHOD); + conn.setRequestProperty(CONTENT_TYPE, APPLICATION_JSON); + conn.setRequestProperty(ACCEPT, APPLICATION_JSON); + if(null!=requestHeaderAttributes && requestHeaderAttributes.size()>0) + { + for(Map.Entry entry: requestHeaderAttributes.entrySet()) { + conn.setRequestProperty(entry.getKey(), entry.getValue()); + } + } + if(null!=authHeader && !authHeader.isEmpty()) { + conn.setRequestProperty(AUTHORIZATION,authHeader); + } + + + conn.setDoOutput(true); + try(OutputStream os = conn.getOutputStream()) { + byte[] input = requestBody.getBytes(UTF8_ENCODING); + os.write(input, 0, input.length); + os.flush(); + }catch(Exception e) { + logger.error("RestInvokerImpl :: invokePostRestServiceHttps :: Error Occured while writing request to OutStream::"+e); + e.printStackTrace(); + } + if (conn.getResponseCode() != 200 && conn.getResponseCode() != 201) { + logger.error(" The Post request call is failed with responseCode "+ conn.getResponseCode()); + }else { + response = populateJsonBuffer(conn,output); + } + + }catch(Exception e) { + logger.error("RestInvokerImpl :: invokePostRestServiceHttps :: Error Occured:Exception::"+e); + e.printStackTrace(); + } + return response; + } + + @Override + public String invokePutRestServiceHttps(String url, String requestBody, String authHeader, String urlParameters) + { + Long startTime =System.currentTimeMillis(); + HttpsURLConnection conn = null; + String output = null; + String response = null; + + URL endpointURL = null; + try { + endpointURL = new URL(url); + conn = (HttpsURLConnection) endpointURL.openConnection(); + + conn.setRequestMethod(HTTP_PUT_METHOD); + conn.setRequestProperty(CONTENT_TYPE, APPLICATION_JSON); + conn.setRequestProperty(ACCEPT, APPLICATION_JSON); + if(null!=authHeader && !authHeader.isEmpty()) { + conn.setRequestProperty(AUTHORIZATION,authHeader); + } + + conn.setDoOutput(true); + try(OutputStream os = conn.getOutputStream()) { + byte[] input = requestBody.getBytes(UTF8_ENCODING); + os.write(input, 0, input.length); + os.flush(); + }catch(Exception e) { + logger.error("RestInvokerImpl :: invokePutRestServiceHttps :: Error Occured while writing request to OutStream::"+e); + e.printStackTrace(); + } + if (conn.getResponseCode() != 200 && conn.getResponseCode() != 201) { + + logger.error(" The Put request call is failed with responseCode "+ conn.getResponseCode()); + }else { + + response = populateJsonBuffer(conn,output); + } + + }catch(Exception e) { + logger.error("RestInvokerImpl :: invokePutRestServiceHttps :: Error Occured:Exception::"+e); + e.printStackTrace(); + } + return response; + } + + @Override + public String invokePutRestService(String url, String requestBody, String authHeader, String urlParameters) + { + Long startTime =System.currentTimeMillis(); + HttpURLConnection conn = null; + String response = null; + StringBuilder jsonBuffer = new StringBuilder(); + URL endpointURL = null; + try { + endpointURL = new URL(url); + + conn = (HttpURLConnection) endpointURL.openConnection(); + + conn.setRequestMethod(HTTP_PUT_METHOD); + conn.setRequestProperty(CONTENT_TYPE, APPLICATION_JSON); + conn.setRequestProperty(ACCEPT, APPLICATION_JSON); + if(null!=authHeader && !authHeader.isEmpty()) { + conn.setRequestProperty(AUTHORIZATION,authHeader); + } + + conn.setDoOutput(true); + try(OutputStream os = conn.getOutputStream()) { + byte[] input = requestBody.getBytes(UTF8_ENCODING); + os.write(input, 0, input.length); + os.flush(); + }catch(Exception e) { + logger.error("RestInvokerImpl :: invokePutRestService :: Error Occured while writing request to OutStream::"+e); + e.printStackTrace(); + } + if (conn.getResponseCode() != 200 && conn.getResponseCode() != 201) { + logger.error(" The Put request call is failed with responseCode "+ conn.getResponseCode()); + + }else { + response= readResponse(conn.getInputStream(), jsonBuffer); + } + + }catch(Exception e) { + logger.error("RestInvokerImpl :: invokePutRestService :: Error Occured:Exception::"+e); + e.printStackTrace(); + } + return response; + + } + + private String populateJsonBuffer(HttpURLConnection conn,String output) + { + StringBuilder jsonBuffer = new StringBuilder(); + String response=null; + try(BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), UTF8_ENCODING))) { + while ((output = br.readLine()) != null) { + jsonBuffer.append(output.trim()); + } + }catch(Exception e) { + logger.error("RestInvokerImpl :: populateJsonBuffer :: Error Occured while reading response from inputstream::"+e); + e.printStackTrace(); + } + response=jsonBuffer.toString(); + return response; + } + + @Override + public String invokeDeleteFileRestServiceHttps(String url, String queryString, String requestBody, String authHeader, + Map requestHeaderAttributes) { + Long startTime =System.currentTimeMillis(); + HttpsURLConnection conn = null; + String output = null; + String response = null; + StringBuilder jsonBuffer = new StringBuilder(); + URL endpointURL = null; + + try { + if(null!=queryString && !queryString.isEmpty()) { + endpointURL = new URL(url+StringPool.QUESTION+queryString.replace(StringPool.BLANK, SPACE_REPLACEMENT_CHAR)); + }else { + endpointURL = new URL(url); + } + + + conn = (HttpsURLConnection) endpointURL.openConnection(); + + + conn.setRequestMethod(HTTP_DELETE_METHOD); + conn.setRequestProperty(CONTENT_TYPE, APPLICATION_JSON); + + + if(null!=requestHeaderAttributes && requestHeaderAttributes.size()>0) + { + for(String key: requestHeaderAttributes.keySet()) { + conn.setRequestProperty(key, requestHeaderAttributes.get(key)); + } + } + if(null!=authHeader && !authHeader.isEmpty()) + { + conn.setRequestProperty(AUTHORIZATION,authHeader); + } + + conn.setDoOutput(true); + try(OutputStream os = conn.getOutputStream()) { + byte[] input = requestBody.getBytes(UTF8_ENCODING); + os.write(input, 0, input.length); + os.flush(); + }catch(Exception e) { + logger.error("RestInvokerImpl :: invokePostRestService :: Error Occured while writing request to OutStream::"+e); + e.printStackTrace(); + } + + if (conn.getResponseCode() != 200 && conn.getResponseCode() != 201) { + logger.error(" The Delete request call is failed with responseCode "+ conn.getResponseCode()); + }else { + response = populateJsonBuffer(conn, output); + } + + } catch (Exception e) { + logger.error("RestInvokerImpl :: invokeDeleteRestServiceHttps :: Error Occured:Exception::"+e.getMessage()); + e.printStackTrace(); + } finally { + + if (null != conn) { + conn.disconnect(); + } + } + return response; + } +} \ No newline at end of file diff --git a/modules/common-http-request-impl/src/main/resources/.gitkeep b/modules/common-http-request-impl/src/main/resources/.gitkeep new file mode 100644 index 0000000..e69de29 From 3ae311d7389405a5b3b385bde375bba2c27381f5 Mon Sep 17 00:00:00 2001 From: Brian Chan Date: Tue, 7 Jan 2025 17:41:29 +0530 Subject: [PATCH 2/2] commerce order status override reusable component added --- .../commerce-order-status-override/.gitignore | 4 + .../commerce-order-status-override/bnd.bnd | 4 + .../build.gradle | 3 + .../AwaitingPaymentOrderStatusOverride.java | 115 +++++++++++ .../CancelledOrderStatusOverride.java | 112 ++++++++++ .../CompletedOrderStatusOverride.java | 114 +++++++++++ .../ConfirmedOrderStatusOverride.java | 124 +++++++++++ .../override/OnHoldOrderStatusOverride.java | 109 ++++++++++ .../override/PaidOrderStatusOverride.java | 124 +++++++++++ .../PartiallyShippedOrderStatusOverride.java | 114 +++++++++++ ...endingCancellationOrderStatusOverride.java | 111 ++++++++++ .../override/PendingOrderStatusOverride.java | 192 ++++++++++++++++++ .../override/PlacedOrderStatusOverride.java | 146 +++++++++++++ .../ProcessingOrderStatusOverride.java | 123 +++++++++++ .../override/ShippedOrderStatusOverride.java | 146 +++++++++++++ .../CommerceOrderStatusOverrideConstants.java | 130 ++++++++++++ .../src/main/resources/.gitkeep | 0 17 files changed, 1671 insertions(+) create mode 100644 modules/commerce-order-status-override/.gitignore create mode 100644 modules/commerce-order-status-override/bnd.bnd create mode 100644 modules/commerce-order-status-override/build.gradle create mode 100644 modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/AwaitingPaymentOrderStatusOverride.java create mode 100644 modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/CancelledOrderStatusOverride.java create mode 100644 modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/CompletedOrderStatusOverride.java create mode 100644 modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/ConfirmedOrderStatusOverride.java create mode 100644 modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/OnHoldOrderStatusOverride.java create mode 100644 modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/PaidOrderStatusOverride.java create mode 100644 modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/PartiallyShippedOrderStatusOverride.java create mode 100644 modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/PendingCancellationOrderStatusOverride.java create mode 100644 modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/PendingOrderStatusOverride.java create mode 100644 modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/PlacedOrderStatusOverride.java create mode 100644 modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/ProcessingOrderStatusOverride.java create mode 100644 modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/ShippedOrderStatusOverride.java create mode 100644 modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/constants/CommerceOrderStatusOverrideConstants.java create mode 100644 modules/commerce-order-status-override/src/main/resources/.gitkeep diff --git a/modules/commerce-order-status-override/.gitignore b/modules/commerce-order-status-override/.gitignore new file mode 100644 index 0000000..7597516 --- /dev/null +++ b/modules/commerce-order-status-override/.gitignore @@ -0,0 +1,4 @@ + +.gradle/ +build/ +target/ \ No newline at end of file diff --git a/modules/commerce-order-status-override/bnd.bnd b/modules/commerce-order-status-override/bnd.bnd new file mode 100644 index 0000000..e333b09 --- /dev/null +++ b/modules/commerce-order-status-override/bnd.bnd @@ -0,0 +1,4 @@ +Bundle-Name: commerce-order-status-override +Bundle-SymbolicName: com.liferay.commerce.order.status.override +Bundle-Version: 1.0.0 +Export-Package: com.liferay.commerce.order.status.override.constants \ No newline at end of file diff --git a/modules/commerce-order-status-override/build.gradle b/modules/commerce-order-status-override/build.gradle new file mode 100644 index 0000000..68802bd --- /dev/null +++ b/modules/commerce-order-status-override/build.gradle @@ -0,0 +1,3 @@ +dependencies { + compileOnly group: "com.liferay.portal", name: "release.dxp.api", version:"2024.q1.1" +} \ No newline at end of file diff --git a/modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/AwaitingPaymentOrderStatusOverride.java b/modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/AwaitingPaymentOrderStatusOverride.java new file mode 100644 index 0000000..229ccb3 --- /dev/null +++ b/modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/AwaitingPaymentOrderStatusOverride.java @@ -0,0 +1,115 @@ +package com.liferay.commerce.order.status.override; + +import com.liferay.commerce.constants.CommerceOrderConstants; +import com.liferay.commerce.model.CommerceOrder; +import com.liferay.commerce.order.status.CommerceOrderStatus; +import com.liferay.commerce.service.CommerceOrderService; +import com.liferay.portal.kernel.exception.PortalException; +import com.liferay.portal.kernel.language.LanguageUtil; +import com.liferay.commerce.order.status.override.constants.CommerceOrderStatusOverrideConstants; + +import java.util.Locale; + +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; + +/** + * @author Payal + */ +@Component(property = { + "commerce.order.status.key=" + CommerceOrderStatusOverrideConstants.ORDER_STATUS_AWAITING_PAYMENT, + "commerce.order.status.priority:Integer=" + AwaitingPaymentOrderStatusOverride.PRIORITY, + "service.ranking:Integer=100" }, service = CommerceOrderStatus.class) + +public class AwaitingPaymentOrderStatusOverride implements CommerceOrderStatus { + + public static final int PRIORITY = 50; + + /** + * Called on transition change for order status + * + * @param commerceOrder + * @param userId + * @return commerceOrder + */ + @Override + public CommerceOrder doTransition(CommerceOrder commerceOrder, long userId, boolean secure) throws PortalException { + + commerceOrder.setOrderStatus(CommerceOrderStatusOverrideConstants.ORDER_STATUS_AWAITING_PAYMENT); + return commerceOrderService.updateCommerceOrder(commerceOrder); + } + + + /** + * Get key + * + * @return key in int + */ + @Override + public int getKey() { + return CommerceOrderStatusOverrideConstants.ORDER_STATUS_AWAITING_PAYMENT; + } + + /** + * Get Label + * + * @param locale + * @return order status label + */ + @Override + public String getLabel(Locale locale) { + return LanguageUtil.get(locale, CommerceOrderStatusOverrideConstants.ORDER_STATUS_AWAITING_PAYMENT_LABEL); + } + + /** + * Get priority + * + * @return priority in int + */ + @Override + public int getPriority() { + return PRIORITY; + } + + /** + * verify the order is in complete state or not + * + * @param commerceOrder + * @return true or false + */ + @Override + public boolean isComplete(CommerceOrder commerceOrder) { + boolean isComplete = Boolean.FALSE; + + if (!commerceOrder.isOpen() && commerceOrder.isApproved() + && (commerceOrder.getOrderStatus() != CommerceOrderConstants.ORDER_STATUS_PROCESSING)) { + isComplete = Boolean.TRUE; + } + + + return isComplete; + + } + + /** + * Check transition criteria met or not based on next status will be enable + * + * @param commerceOrder + * @return true or false + */ + @Override + public boolean isTransitionCriteriaMet(CommerceOrder commerceOrder) throws PortalException { + boolean isTransitionMet = Boolean.FALSE; + + if (commerceOrder.getOrderStatus() == CommerceOrderStatusOverrideConstants.ORDER_STATUS_PLACED) { + isTransitionMet = Boolean.TRUE; + } + + return isTransitionMet; + + } + + + @Reference + private CommerceOrderService commerceOrderService; +} \ No newline at end of file diff --git a/modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/CancelledOrderStatusOverride.java b/modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/CancelledOrderStatusOverride.java new file mode 100644 index 0000000..9537658 --- /dev/null +++ b/modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/CancelledOrderStatusOverride.java @@ -0,0 +1,112 @@ +package com.liferay.commerce.order.status.override; + +import com.liferay.commerce.constants.CommerceOrderConstants; +import com.liferay.commerce.model.CommerceOrder; +import com.liferay.commerce.order.status.CommerceOrderStatus; +import com.liferay.commerce.service.CommerceOrderService; +import com.liferay.portal.kernel.exception.PortalException; +import com.liferay.portal.kernel.language.LanguageUtil; +import com.liferay.commerce.order.status.override.constants.CommerceOrderStatusOverrideConstants; + +import java.util.Locale; + +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; + +/** + * @author Payal + */ +@Component(property = { "commerce.order.status.key=" + CancelledOrderStatusOverride.KEY, + "commerce.order.status.priority:Integer=" + CancelledOrderStatusOverride.PRIORITY, + "service.ranking:Integer=100" }, service = CommerceOrderStatus.class) +public class CancelledOrderStatusOverride implements CommerceOrderStatus { + + public static final int KEY = CommerceOrderConstants.ORDER_STATUS_CANCELLED; + + public static final int PRIORITY = 54; + + /** + * Called on transition change for order status + * + * @param commerceOrder + * @param userId + * @return commerceOrder + */ + @Override + public CommerceOrder doTransition(CommerceOrder commerceOrder, long userId, boolean secure) throws PortalException { + + commerceOrder.setOrderStatus(KEY); + + return commerceOrderService.updateCommerceOrder(commerceOrder); + } + + /** + * Get key + * + * @return key in int + */ + @Override + public int getKey() { + return KEY; + } + + /** + * Get Label + * + * @param locale + * @return order status label + */ + @Override + public String getLabel(Locale locale) { + return LanguageUtil.get(locale, CommerceOrderConstants.getOrderStatusLabel(KEY)); + } + + /** + * Get priority + * + * @return priority in int + */ + @Override + public int getPriority() { + return PRIORITY; + } + + /** + * Check transition criteria met or not based on next status will be enable + * + * @param commerceOrder + * @return true or false + */ + @Override + public boolean isTransitionCriteriaMet(CommerceOrder commerceOrder) throws PortalException { + boolean isTransitionMet = Boolean.FALSE; + + if ((commerceOrder.getOrderStatus() == CommerceOrderStatusOverrideConstants.ORDER_STATUS_PENDING_CANCELLATION)) { + isTransitionMet = Boolean.TRUE; + } + return isTransitionMet; + + } + + /** + * Check the status is valid for current status + * + * @param commerceOrder + * @return true or false + */ + @Override + public boolean isValidForOrder(CommerceOrder commerceOrder) throws PortalException { + boolean isValid = Boolean.FALSE; + + if (commerceOrder.getOrderStatus() == CommerceOrderStatusOverrideConstants.ORDER_STATUS_PENDING_CANCELLATION + || commerceOrder.getOrderStatus() == CommerceOrderConstants.ORDER_STATUS_CANCELLED) { + isValid = Boolean.TRUE; + } + return isValid; + + } + + @Reference + private CommerceOrderService commerceOrderService; + +} \ No newline at end of file diff --git a/modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/CompletedOrderStatusOverride.java b/modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/CompletedOrderStatusOverride.java new file mode 100644 index 0000000..fff51b0 --- /dev/null +++ b/modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/CompletedOrderStatusOverride.java @@ -0,0 +1,114 @@ +package com.liferay.commerce.order.status.override; + +import com.liferay.commerce.constants.CommerceOrderConstants; +import com.liferay.commerce.model.CommerceOrder; +import com.liferay.commerce.order.status.CommerceOrderStatus; +import com.liferay.commerce.service.CommerceOrderService; +import com.liferay.commerce.util.CommerceShippingHelper; +import com.liferay.portal.kernel.exception.PortalException; +import com.liferay.commerce.order.status.override.constants.CommerceOrderStatusOverrideConstants; + +import java.util.Locale; + +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; + +@Component(property = { "commerce.order.status.key=" + CommerceOrderConstants.ORDER_STATUS_COMPLETED, + "commerce.order.status.priority:Integer=" + CompletedOrderStatusOverride.PRIORITY, + "service.ranking:Integer=100" }, service = CommerceOrderStatus.class) +public class CompletedOrderStatusOverride implements CommerceOrderStatus { + + public static final int KEY = CommerceOrderConstants.ORDER_STATUS_COMPLETED; + + public static final int PRIORITY = 70; + + /** + * Called on transition change for order status + * + * @param commerceOrder + * @param userId + * @return commerceOrder + */ + @Override + public CommerceOrder doTransition(CommerceOrder commerceOrder, long userId, boolean secure) throws PortalException { + + commerceOrder.setOrderStatus(KEY); + + return commerceOrderService.updateCommerceOrder(commerceOrder); + } + + /** + * Get key + * + * @return key in int + */ + @Override + public int getKey() { + return KEY; + } + + /** + * Get Label + * + * @param locale + * @return order status label + */ + @Override + public String getLabel(Locale locale) { + return CommerceOrderStatusOverrideConstants.ORDER_STATUS_COMPLETED_LABEL; + } + + /** + * Get priority + * + * @return priority in int + */ + @Override + public int getPriority() { + return PRIORITY; + } + + /** + * Check transition criteria met or not based on next status will be enable + * + * @param commerceOrder + * @return true or false + */ + @Override + public boolean isTransitionCriteriaMet(CommerceOrder commerceOrder) throws PortalException { + boolean isTransitionMet = Boolean.FALSE; + + if ((commerceOrder.getOrderStatus() == CommerceOrderConstants.ORDER_STATUS_SHIPPED) + || ((commerceOrder.getOrderStatus() == CommerceOrderConstants.ORDER_STATUS_PROCESSING) + && !commerceShippingHelper.isShippable(commerceOrder))) { + isTransitionMet = Boolean.TRUE; + } + + return isTransitionMet; + + } + + /** + * Check the status is valid for current status + * + * @param commerceOrder + * @return true or false + */ + @Override + public boolean isValidForOrder(CommerceOrder commerceOrder) throws PortalException { + boolean isValid = Boolean.TRUE; + + if (commerceOrder.getOrderStatus() == CommerceOrderConstants.ORDER_STATUS_CANCELLED || commerceOrder + .getOrderStatus() == CommerceOrderStatusOverrideConstants.ORDER_STATUS_PENDING_CANCELLATION) { + isValid = Boolean.FALSE; + } + return isValid; + + } + + @Reference + private CommerceOrderService commerceOrderService; + + @Reference + private CommerceShippingHelper commerceShippingHelper; +} \ No newline at end of file diff --git a/modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/ConfirmedOrderStatusOverride.java b/modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/ConfirmedOrderStatusOverride.java new file mode 100644 index 0000000..4bababe --- /dev/null +++ b/modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/ConfirmedOrderStatusOverride.java @@ -0,0 +1,124 @@ +package com.liferay.commerce.order.status.override; + +import com.liferay.commerce.constants.CommerceOrderConstants; +import com.liferay.commerce.model.CommerceOrder; +import com.liferay.commerce.order.status.CommerceOrderStatus; +import com.liferay.commerce.service.CommerceOrderService; +import com.liferay.petra.string.StringPool; +import com.liferay.portal.kernel.exception.PortalException; +import com.liferay.commerce.order.status.override.constants.CommerceOrderStatusOverrideConstants; + +import java.util.Locale; + +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; + +/** + * @author Payal + */ +@Component(property = { "commerce.order.status.key=" + CommerceOrderStatusOverrideConstants.ORDER_STATUS_CONFIRMED, + "commerce.order.status.priority:Integer=" + ConfirmedOrderStatusOverride.PRIORITY, + "service.ranking:Integer=100" }, service = CommerceOrderStatus.class) + +public class ConfirmedOrderStatusOverride implements CommerceOrderStatus { + + public static final int KEY = CommerceOrderStatusOverrideConstants.ORDER_STATUS_CONFIRMED; + + public static final int PRIORITY = 55; + + /** + * Called on transition change for order status + * + * @param commerceOrder + * @param userId + * @return commerceOrder + */ + @Override + public CommerceOrder doTransition(CommerceOrder commerceOrder, long userId, boolean secure) throws PortalException { + + commerceOrder.setOrderStatus(KEY); + + return commerceOrderService.updateCommerceOrder(commerceOrder); + } + + /** + * Get key + * + * @return key in int + */ + @Override + public int getKey() { + return KEY; + } + + /** + * Get Label + * + * @param locale + * @return order status label + */ + @Override + public String getLabel(Locale locale) { + return CommerceOrderStatusOverrideConstants.ORDER_STATUS_CONFIRMED_LABEL; + } + + /** + * Get priority + * + * @return priority in int + */ + @Override + public int getPriority() { + return PRIORITY; + } + + /** + * verify the order is in complete state or not + * + * @param commerceOrder + * @return true or false + */ + @Override + public boolean isComplete(CommerceOrder commerceOrder) { + boolean isComplete = Boolean.FALSE; + if (commerceOrder.getOrderStatus() == CommerceOrderStatusOverrideConstants.ORDER_STATUS_CONFIRMED || + commerceOrder.getOrderStatus() == CommerceOrderConstants.ORDER_STATUS_PARTIALLY_SHIPPED || + commerceOrder.getOrderStatus() == CommerceOrderConstants.ORDER_STATUS_SHIPPED || + commerceOrder.getOrderStatus() == CommerceOrderConstants.ORDER_STATUS_COMPLETED + ) { + isComplete = Boolean.TRUE; + } + return isComplete; + + } + + /** + * Check transition criteria met or not based on next status will be enable + * + * @param commerceOrder + * @return true or false + */ + @Override + public boolean isTransitionCriteriaMet(CommerceOrder commerceOrder) throws PortalException { + boolean isTransitionMet = Boolean.FALSE; + + if (commerceOrder.getOrderStatus() == CommerceOrderStatusOverrideConstants.ORDER_STATUS_PAID || + commerceOrder.getOrderStatus() == CommerceOrderStatusOverrideConstants.ORDER_STATUS_AWAITING_PAYMENT) { + isTransitionMet = Boolean.TRUE; + } + return isTransitionMet; + + } + + @Override + public boolean isValidForOrder(CommerceOrder commerceOrder) throws PortalException { + boolean isValid = Boolean.FALSE; + if (commerceOrder.getExpandoBridge().getAttribute("cancellationWithErp").equals(StringPool.BLANK)){ + isValid = Boolean.TRUE; + } + return isValid; + } + + @Reference + private CommerceOrderService commerceOrderService; +} \ No newline at end of file diff --git a/modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/OnHoldOrderStatusOverride.java b/modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/OnHoldOrderStatusOverride.java new file mode 100644 index 0000000..531b556 --- /dev/null +++ b/modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/OnHoldOrderStatusOverride.java @@ -0,0 +1,109 @@ +package com.liferay.commerce.order.status.override; + +import com.liferay.commerce.constants.CommerceOrderConstants; +import com.liferay.commerce.model.CommerceOrder; +import com.liferay.commerce.order.engine.CommerceOrderEngine; +import com.liferay.commerce.order.status.CommerceOrderStatus; +import com.liferay.commerce.order.status.CommerceOrderStatusRegistry; +import com.liferay.commerce.service.CommerceOrderService; +import com.liferay.portal.kernel.exception.PortalException; +import com.liferay.portal.kernel.language.LanguageUtil; + +import java.util.Locale; + +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; + +@Component(property = { "commerce.order.status.key=" + OnHoldOrderStatusOverride.KEY, + "commerce.order.status.priority:Integer=" + OnHoldOrderStatusOverride.PRIORITY, "service.ranking:Integer=100" + +}, service = CommerceOrderStatus.class) +public class OnHoldOrderStatusOverride implements CommerceOrderStatus { + + public static final int KEY = CommerceOrderConstants.ORDER_STATUS_ON_HOLD; + + public static final int PRIORITY = -1; + + /** + * Called on transition change for order status + * + * @param commerceOrder + * @param userId + * @return commerceOrder + */ + @Override + public CommerceOrder doTransition(CommerceOrder commerceOrder, long userId, boolean secure) throws PortalException { + + if (commerceOrder.getOrderStatus() == KEY) { + return commerceOrderEngine.transitionCommerceOrder(commerceOrder, + CommerceOrderConstants.ORDER_STATUS_PROCESSING, userId, false); + } + + commerceOrder.setOrderStatus(KEY); + + return commerceOrderService.updateCommerceOrder(commerceOrder); + } + + /** + * Get key + * + * @return key in int + */ + @Override + public int getKey() { + return KEY; + } + + /** + * Get Label + * + * @param locale + * @return order status label + */ + @Override + public String getLabel(Locale locale) { + return LanguageUtil.get(locale, CommerceOrderConstants.getOrderStatusLabel(KEY)); + } + + /** + * Get priority + * + * @return priority in int + */ + @Override + public int getPriority() { + return PRIORITY; + } + + /** + * Check transition criteria met or not based on next status will be enable + * + * @param commerceOrder + * @return true or false + */ + @Override + public boolean isTransitionCriteriaMet(CommerceOrder commerceOrder) throws PortalException { + return false; + } + + /** + * Check the status is valid for current status + * + * @param commerceOrder + * @return true or false + */ + @Override + public boolean isValidForOrder(CommerceOrder commerceOrder) throws PortalException { + return false; + } + + @Reference + private CommerceOrderEngine commerceOrderEngine; + + @Reference + private CommerceOrderService commerceOrderService; + + @Reference + private CommerceOrderStatusRegistry commerceOrderStatusRegistry; + +} \ No newline at end of file diff --git a/modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/PaidOrderStatusOverride.java b/modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/PaidOrderStatusOverride.java new file mode 100644 index 0000000..e30d267 --- /dev/null +++ b/modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/PaidOrderStatusOverride.java @@ -0,0 +1,124 @@ +package com.liferay.commerce.order.status.override; + + +import com.liferay.commerce.model.CommerceOrder; +import com.liferay.commerce.order.status.CommerceOrderStatus; +import com.liferay.commerce.service.CommerceOrderService; +import com.liferay.petra.string.StringPool; +import com.liferay.portal.kernel.exception.PortalException; +import com.liferay.portal.kernel.log.Log; +import com.liferay.portal.kernel.log.LogFactoryUtil; +import com.liferay.portal.kernel.module.configuration.ConfigurationException; +import com.liferay.commerce.order.status.override.constants.CommerceOrderStatusOverrideConstants; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; + +import java.util.Locale; + +/** + * @author Shrish + */ + +@Component(property = { "commerce.order.status.key=" + CommerceOrderStatusOverrideConstants.ORDER_STATUS_PAID, + "commerce.order.status.priority:Integer=" + PaidOrderStatusOverride.PRIORITY, + "service.ranking:Integer=100" }, service = CommerceOrderStatus.class) +public class PaidOrderStatusOverride implements CommerceOrderStatus{ + + public static final int KEY = CommerceOrderStatusOverrideConstants.ORDER_STATUS_PAID; + + public static final int PRIORITY = 51; + + private static final Log log = LogFactoryUtil.getLog(PaidOrderStatusOverride.class); + + @Override + public CommerceOrder doTransition(CommerceOrder commerceOrder, long userId, boolean secure) throws PortalException { + + commerceOrder.setOrderStatus(CommerceOrderStatusOverrideConstants.ORDER_STATUS_PAID); + + return commerceOrderService.updateCommerceOrder(commerceOrder); + } + + /** + * Get key + * + * @return key in int + */ + @Override + public int getKey() { + return CommerceOrderStatusOverrideConstants.ORDER_STATUS_PAID; + } + + /** + * Get Label + * + * @param locale + * @return order status label + */ + @Override + public String getLabel(Locale locale) { + return CommerceOrderStatusOverrideConstants.ORDER_STATUS_PAID_LABEL; + } + + /** + * Get priority + * + * @return priority in int + */ + @Override + public int getPriority() { + return PRIORITY; + } + + + /** + * Check transition criteria met or not based on next status will be enable + * + * @param commerceOrder + * @return true or false + */ + @Override + public boolean isTransitionCriteriaMet(CommerceOrder commerceOrder) throws PortalException { + boolean isTransitionMet = Boolean.FALSE; + + if (commerceOrder.getOrderStatus() == CommerceOrderStatusOverrideConstants.ORDER_STATUS_AWAITING_PAYMENT) { + isTransitionMet = Boolean.TRUE; + } + + return isTransitionMet; + + } + + @Override + public boolean isComplete(CommerceOrder commerceOrder) throws ConfigurationException { + boolean isComplete = Boolean.FALSE; + + if (!commerceOrder.isOpen() && commerceOrder.isApproved() + && (commerceOrder.getOrderStatus() != CommerceOrderStatusOverrideConstants.ORDER_STATUS_AWAITING_PAYMENT || + commerceOrder.getOrderStatus() != CommerceOrderStatusOverrideConstants.ORDER_STATUS_PLACED + )) { + isComplete = Boolean.TRUE; + } + return isComplete; + } + + @Override + public boolean isValidForOrder(CommerceOrder commerceOrder) throws PortalException { + boolean isValid = Boolean.FALSE; + + + if ((commerceOrder.getAccountEntry().getExpandoBridge().getAttribute("Cashcustomer").equals(true) || + (commerceOrder.getAccountEntry().getExpandoBridge().getAttribute("Cashcustomer").equals(false)) + && + (commerceOrder.getExpandoBridge().getAttribute("cancellationWithErp").equals(StringPool.BLANK)) + && + (!commerceOrder.getExpandoBridge().getAttribute("PaymentOption").equals("onaccount")))){ + isValid = Boolean.TRUE; + } + return isValid; + } + + + @Reference + private CommerceOrderService commerceOrderService; + +} diff --git a/modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/PartiallyShippedOrderStatusOverride.java b/modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/PartiallyShippedOrderStatusOverride.java new file mode 100644 index 0000000..69337d5 --- /dev/null +++ b/modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/PartiallyShippedOrderStatusOverride.java @@ -0,0 +1,114 @@ +package com.liferay.commerce.order.status.override; + +import com.liferay.commerce.constants.CommerceOrderConstants; +import com.liferay.commerce.model.CommerceOrder; +import com.liferay.commerce.order.status.CommerceOrderStatus; +import com.liferay.commerce.service.CommerceOrderService; +import com.liferay.portal.kernel.exception.PortalException; +import com.liferay.portal.kernel.language.LanguageUtil; +import com.liferay.commerce.order.status.override.constants.CommerceOrderStatusOverrideConstants; + +import java.util.Locale; + +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; + +/** + * @author Payal + */ +@Component(property = { "commerce.order.status.key=" + PartiallyShippedOrderStatusOverride.KEY, + "commerce.order.status.priority:Integer=" + PartiallyShippedOrderStatusOverride.PRIORITY, + "service.ranking:Integer=100" }, service = CommerceOrderStatus.class) +public class PartiallyShippedOrderStatusOverride implements CommerceOrderStatus { + + public static final int KEY = CommerceOrderConstants.ORDER_STATUS_PARTIALLY_SHIPPED; + + public static final int PRIORITY = 60; + + /** + * Called on transition change for order status + * + * @param commerceOrder + * @param userId + * @return commerceOrder + */ + @Override + public CommerceOrder doTransition(CommerceOrder commerceOrder, long userId, boolean secure) throws PortalException { + + commerceOrder.setOrderStatus(KEY); + + return commerceOrderService.updateCommerceOrder(commerceOrder); + } + + /** + * Get key + * + * @return key in int + */ + @Override + public int getKey() { + return KEY; + } + + /** + * Get Label + * + * @param locale + * @return order status label + */ + @Override + public String getLabel(Locale locale) { + return LanguageUtil.get(locale, CommerceOrderConstants.getOrderStatusLabel(KEY)); + } + + /** + * Get priority + * + * @return priority in int + */ + @Override + public int getPriority() { + return PRIORITY; + } + + /** + * Check the status is valid for current status + * + * @param commerceOrder + * @return true or false + */ + @Override + public boolean isValidForOrder(CommerceOrder commerceOrder) throws PortalException { + boolean isValid = Boolean.TRUE; + + if (commerceOrder.getOrderStatus() == CommerceOrderConstants.ORDER_STATUS_CANCELLED + || commerceOrder + .getOrderStatus() == CommerceOrderStatusOverrideConstants.ORDER_STATUS_PENDING_CANCELLATION) + isValid = Boolean.FALSE; + + return isValid; + + } + + /** + * Check transition criteria met or not based on next status will be enable + * + * @param commerceOrder + * @return true or false + */ + @Override + public boolean isTransitionCriteriaMet(CommerceOrder commerceOrder) throws PortalException { + boolean isTransitionMet = Boolean.FALSE; + + if ((commerceOrder.getOrderStatus() == CommerceOrderStatusOverrideConstants.ORDER_STATUS_CONFIRMED)) { + isTransitionMet = Boolean.TRUE; + } + + return isTransitionMet; + + } + + @Reference + private CommerceOrderService commerceOrderService; + +} \ No newline at end of file diff --git a/modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/PendingCancellationOrderStatusOverride.java b/modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/PendingCancellationOrderStatusOverride.java new file mode 100644 index 0000000..561f27a --- /dev/null +++ b/modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/PendingCancellationOrderStatusOverride.java @@ -0,0 +1,111 @@ +package com.liferay.commerce.order.status.override; + +import com.liferay.commerce.constants.CommerceOrderConstants; +import com.liferay.commerce.model.CommerceOrder; +import com.liferay.commerce.order.status.CommerceOrderStatus; +import com.liferay.commerce.service.CommerceOrderService; +import com.liferay.portal.kernel.exception.PortalException; +import com.liferay.commerce.order.status.override.constants.CommerceOrderStatusOverrideConstants; + +import java.util.Locale; + +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; + +/** + * @author Payal Thummar + */ +@Component(property = { "commerce.order.status.key=" + PendingCancellationOrderStatusOverride.KEY, + "commerce.order.status.priority:Integer=" + PendingCancellationOrderStatusOverride.PRIORITY, + "service.ranking:Integer=100" }, service = CommerceOrderStatus.class) +public class PendingCancellationOrderStatusOverride implements CommerceOrderStatus { + + public static final int KEY = CommerceOrderStatusOverrideConstants.ORDER_STATUS_PENDING_CANCELLATION; + + public static final int PRIORITY = 53; + + /** + * Called on transition change for order status + * + * @param commerceOrder + * @param userId + * @return commerceOrder + */ + @Override + public CommerceOrder doTransition(CommerceOrder commerceOrder, long userId, boolean secure) throws PortalException { + + commerceOrder.setOrderStatus(KEY); + + return commerceOrderService.updateCommerceOrder(commerceOrder); + } + + /** + * Get key + * + * @return key in int + */ + @Override + public int getKey() { + return KEY; + } + + /** + * Get Label + * + * @param locale + * @return order status label + */ + @Override + public String getLabel(Locale locale) { + return CommerceOrderStatusOverrideConstants.ORDER_STATUS_PENDING_CANCELLATION_LABEL; + } + + /** + * Get priority + * + * @return priority in int + */ + @Override + public int getPriority() { + return PRIORITY; + } + + /** + * Check transition criteria met or not based on next status will be enable + * + * @param commerceOrder + * @return true or false + */ + @Override + public boolean isTransitionCriteriaMet(CommerceOrder commerceOrder) throws PortalException { + boolean isTransitionMet = Boolean.FALSE; + + if ((commerceOrder.getOrderStatus() == CommerceOrderStatusOverrideConstants.ORDER_STATUS_AWAITING_PAYMENT)) { + isTransitionMet = Boolean.TRUE; + } + return isTransitionMet; + } + + /** + * Check the status is valid for current status + * + * @param commerceOrder + * @return true or false + */ + @Override + public boolean isValidForOrder(CommerceOrder commerceOrder) throws PortalException { + boolean isValid = Boolean.FALSE; + if ((commerceOrder.getOrderStatus() == CommerceOrderConstants.ORDER_STATUS_CANCELLED + || commerceOrder.getOrderStatus() == CommerceOrderStatusOverrideConstants.ORDER_STATUS_PENDING_CANCELLATION) + && + (!commerceOrder.getExpandoBridge().getAttribute("cancellationWithErp").equals("erp"))) { + isValid = Boolean.TRUE; + } + return isValid; + + } + + @Reference + private CommerceOrderService commerceOrderService; + +} \ No newline at end of file diff --git a/modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/PendingOrderStatusOverride.java b/modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/PendingOrderStatusOverride.java new file mode 100644 index 0000000..70f51f8 --- /dev/null +++ b/modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/PendingOrderStatusOverride.java @@ -0,0 +1,192 @@ +package com.liferay.commerce.order.status.override; + +import com.liferay.commerce.constants.CommerceOrderConstants; +import com.liferay.commerce.constants.CommerceOrderPaymentConstants; +import com.liferay.commerce.constants.CommercePaymentMethodConstants; +import com.liferay.commerce.model.CommerceOrder; +import com.liferay.commerce.order.CommerceOrderValidatorRegistry; +import com.liferay.commerce.order.status.CommerceOrderStatus; +import com.liferay.commerce.payment.method.CommercePaymentMethod; +import com.liferay.commerce.payment.method.CommercePaymentMethodRegistry; +import com.liferay.commerce.service.CommerceOrderLocalService; +import com.liferay.portal.kernel.exception.PortalException; +import com.liferay.portal.kernel.language.Language; +import com.liferay.portal.kernel.model.WorkflowDefinitionLink; +import com.liferay.portal.kernel.service.ServiceContext; +import com.liferay.portal.kernel.service.WorkflowDefinitionLinkLocalService; +import com.liferay.portal.kernel.util.LocaleUtil; +import com.liferay.portal.kernel.util.Validator; +import com.liferay.portal.kernel.workflow.WorkflowConstants; +import com.liferay.portal.kernel.workflow.WorkflowHandlerRegistryUtil; + +import java.util.HashMap; +import java.util.Locale; + +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; + +/** + * @author Payal + */ +@Component(property = { "commerce.order.status.key=" + CommerceOrderConstants.ORDER_STATUS_PENDING, + "commerce.order.status.priority:Integer=" + PendingOrderStatusOverride.PRIORITY, + "service.ranking:Integer=100" }, service = CommerceOrderStatus.class) +public class PendingOrderStatusOverride implements CommerceOrderStatus { + + public static final int KEY = CommerceOrderConstants.ORDER_STATUS_PENDING; + + public static final int PRIORITY = 30; + + /** + * Called on transition change for order status + * + * @param commerceOrder + * @param userId + * @return commerceOrder + */ + @Override + public CommerceOrder doTransition(CommerceOrder commerceOrder, long userId, boolean secure) throws PortalException { + + commerceOrder.setOrderStatus(KEY); + + commerceOrder = commerceOrderLocalService.updateCommerceOrder(commerceOrder); + + if (isWorkflowEnabled(commerceOrder)) { + + // Commerce order + + commerceOrder.setStatus(WorkflowConstants.STATUS_PENDING); + + // Workflow + + ServiceContext serviceContext = new ServiceContext(); + + serviceContext.setScopeGroupId(commerceOrder.getGroupId()); + serviceContext.setUserId(userId); + serviceContext.setWorkflowAction(WorkflowConstants.ACTION_PUBLISH); + + commerceOrder = WorkflowHandlerRegistryUtil.startWorkflowInstance(commerceOrder.getCompanyId(), + commerceOrder.getScopeGroupId(), userId, CommerceOrder.class.getName(), + commerceOrder.getCommerceOrderId(), commerceOrder, serviceContext, new HashMap<>()); + } + + return commerceOrderLocalService.updateCommerceOrder(commerceOrder); + } + + /** + * Get key + * + * @return key in int + */ + @Override + public int getKey() { + return KEY; + } + + /** + * Get Label + * + * @param locale + * @return order status label + */ + @Override + public String getLabel(Locale locale) { + return language.get(locale, CommerceOrderConstants.getOrderStatusLabel(KEY)); + } + + /** + * Get priority + * + * @return priority in int + */ + @Override + public int getPriority() { + return PRIORITY; + } + + /** + * verify the order is in complete state or not + * + * @param commerceOrder + * @return true or false + */ + @Override + public boolean isComplete(CommerceOrder commerceOrder) { + boolean isComplete = Boolean.FALSE; + if (!commerceOrder.isOpen() && commerceOrder.isApproved()) { + isComplete = Boolean.TRUE; + } + return isComplete; + } + + /** + * Check transition criteria met or not based on next status will be enable + * + * @param commerceOrder + * @return true or false + */ + @Override + public boolean isTransitionCriteriaMet(CommerceOrder commerceOrder) throws PortalException { + + boolean isTransitionMet = Boolean.FALSE; + CommercePaymentMethod commercePaymentMethod = commercePaymentMethodRegistry + .getCommercePaymentMethod(commerceOrder.getCommercePaymentMethodKey()); + + if (commercePaymentMethod == null) { + isTransitionMet = Boolean.TRUE; + } + + if (Validator.isNotNull(commercePaymentMethod) && Validator.isNotNull(commerceOrder) + && (commerceOrder.getPaymentStatus() == CommerceOrderPaymentConstants.STATUS_COMPLETED) + || (commercePaymentMethod.getPaymentType() == CommercePaymentMethodConstants.TYPE_OFFLINE)) { + isTransitionMet = commerceOrderValidatorRegistry.isValid(LocaleUtil.getSiteDefault(), commerceOrder); + } + return isTransitionMet; + } + + /** + * Check the workflow is enabled or not + * + * @param commerceOrder + * @return true or false + */ + @Override + public boolean isWorkflowEnabled(CommerceOrder commerceOrder) throws PortalException { + boolean isWorkflowEnabled = Boolean.FALSE; + WorkflowDefinitionLink workflowDefinitionLink = workflowDefinitionLinkLocalService.fetchWorkflowDefinitionLink( + commerceOrder.getCompanyId(), commerceOrder.getGroupId(), CommerceOrder.class.getName(), 0, + CommerceOrderConstants.TYPE_PK_FULFILLMENT, true); + + if (workflowDefinitionLink != null) { + isWorkflowEnabled = Boolean.TRUE; + } + return isWorkflowEnabled; + + } + + /** + * Check the status is valid for current status + * + * @param commerceOrder + * @return true or false + */ + @Override + public boolean isValidForOrder(CommerceOrder commerceOrder) throws PortalException { + return false; + } + + @Reference + private CommerceOrderLocalService commerceOrderLocalService; + + @Reference + private CommerceOrderValidatorRegistry commerceOrderValidatorRegistry; + + @Reference + private CommercePaymentMethodRegistry commercePaymentMethodRegistry; + + @Reference + private Language language; + + @Reference + private WorkflowDefinitionLinkLocalService workflowDefinitionLinkLocalService; +} \ No newline at end of file diff --git a/modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/PlacedOrderStatusOverride.java b/modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/PlacedOrderStatusOverride.java new file mode 100644 index 0000000..08b1bdc --- /dev/null +++ b/modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/PlacedOrderStatusOverride.java @@ -0,0 +1,146 @@ + +package com.liferay.commerce.order.status.override; + +import com.liferay.commerce.constants.CommerceOrderConstants; +import com.liferay.commerce.model.CommerceOrder; +import com.liferay.commerce.order.CommerceOrderValidatorRegistry; +import com.liferay.commerce.order.status.CommerceOrderStatus; +import com.liferay.commerce.payment.method.CommercePaymentMethodRegistry; +import com.liferay.commerce.service.CommerceOrderService; +import com.liferay.portal.kernel.exception.PortalException; +import com.liferay.portal.kernel.model.WorkflowDefinitionLink; +import com.liferay.portal.kernel.service.WorkflowDefinitionLinkLocalService; +import com.liferay.commerce.order.status.override.constants.CommerceOrderStatusOverrideConstants; + +import java.util.Locale; + +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; + +/** + * @author Payal T + */ +@Component(property = { "commerce.order.status.key=" + CommerceOrderStatusOverrideConstants.ORDER_STATUS_PLACED, + "commerce.order.status.priority:Integer=" + PlacedOrderStatusOverride.PRIORITY, + "service.ranking:Integer=100" }, service = CommerceOrderStatus.class) +public class PlacedOrderStatusOverride implements CommerceOrderStatus { + + public static final int KEY = CommerceOrderStatusOverrideConstants.ORDER_STATUS_PLACED; + + public static final int PRIORITY = 31; + + /** + * Called on transition change for order status + * + * @param commerceOrder + * @param userId + * @return commerceOrder + */ + @Override + public CommerceOrder doTransition(CommerceOrder commerceOrder, long userId, boolean secure) throws PortalException { + + commerceOrder.setOrderStatus(CommerceOrderStatusOverrideConstants.ORDER_STATUS_PLACED); + + return commerceOrderService.updateCommerceOrder(commerceOrder); + } + + /** + * Get key + * + * @return key in int + */ + @Override + public int getKey() { + return CommerceOrderStatusOverrideConstants.ORDER_STATUS_PLACED; + } + + /** + * Get Label + * + * @param locale + * @return order status label + */ + @Override + public String getLabel(Locale locale) { + return CommerceOrderStatusOverrideConstants.ORDER_STATUS_PLACED_LABEL; + } + + /** + * Get priority + * + * @return priority in int + */ + @Override + public int getPriority() { + return PRIORITY; + } + + /** + * verify the order is in complete state or not + * + * @param commerceOrder + * @return true or false + */ + @Override + public boolean isComplete(CommerceOrder commerceOrder) { + boolean isComplete = Boolean.FALSE; + if (!commerceOrder.isOpen() && commerceOrder.isApproved()) { + isComplete = Boolean.TRUE; + } + return isComplete; + + } + + /** + * Check transition criteria met or not based on next status will be enable + * + * @param commerceOrder + * @return true or false + */ + @Override + public boolean isTransitionCriteriaMet(CommerceOrder commerceOrder) throws PortalException { + boolean isTransitionMet = Boolean.FALSE; + + if (commerceOrder.getOrderStatus() == CommerceOrderConstants.ORDER_STATUS_PENDING) { + isTransitionMet = Boolean.TRUE; + } + + return isTransitionMet; + + } + + /** + * Check the workflow is enabled or not + * + * @param commerceOrder + * @return true or false + */ + @Override + public boolean isWorkflowEnabled(CommerceOrder commerceOrder) throws PortalException { + boolean isWorkflowEnabled = Boolean.FALSE; + + WorkflowDefinitionLink workflowDefinitionLink = workflowDefinitionLinkLocalService.fetchWorkflowDefinitionLink( + commerceOrder.getCompanyId(), commerceOrder.getGroupId(), CommerceOrder.class.getName(), 0, + CommerceOrderConstants.TYPE_PK_FULFILLMENT, true); + + if (workflowDefinitionLink != null) { + isWorkflowEnabled = Boolean.TRUE; + } + + return isWorkflowEnabled; + + } + + @Reference + private CommerceOrderService commerceOrderService; + + @Reference + private CommercePaymentMethodRegistry commercePaymentMethodRegistry; + + @Reference + private WorkflowDefinitionLinkLocalService workflowDefinitionLinkLocalService; + + @Reference + private CommerceOrderValidatorRegistry commerceOrderValidatorRegistry; + +} diff --git a/modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/ProcessingOrderStatusOverride.java b/modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/ProcessingOrderStatusOverride.java new file mode 100644 index 0000000..4e62cce --- /dev/null +++ b/modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/ProcessingOrderStatusOverride.java @@ -0,0 +1,123 @@ +package com.liferay.commerce.order.status.override; + +import com.liferay.commerce.constants.CommerceOrderConstants; +import com.liferay.commerce.model.CommerceOrder; +import com.liferay.commerce.order.status.CommerceOrderStatus; +import com.liferay.commerce.service.CommerceOrderService; +import com.liferay.portal.kernel.exception.PortalException; +import com.liferay.portal.kernel.language.LanguageUtil; + +import java.util.Locale; + +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; + +@Component(property = { "commerce.order.status.key=" + CommerceOrderConstants.ORDER_STATUS_PROCESSING, + "commerce.order.status.priority:Integer=" + ProcessingOrderStatusOverride.PRIORITY, + "service.ranking:Integer=100" }, service = CommerceOrderStatus.class) + +public class ProcessingOrderStatusOverride implements CommerceOrderStatus { + + public static final int PRIORITY = 50; + + /** + * Called on transition change for order status + * + * @param commerceOrder + * @param userId + * @return commerceOrder + */ + @Override + public CommerceOrder doTransition(CommerceOrder commerceOrder, long userId, boolean secure) throws PortalException { + + commerceOrder.setOrderStatus(CommerceOrderConstants.ORDER_STATUS_PROCESSING); + + return commerceOrderService.updateCommerceOrder(commerceOrder); + } + + /** + * Get key + * + * @return key in int + */ + @Override + public int getKey() { + return CommerceOrderConstants.ORDER_STATUS_PROCESSING; + } + + /** + * Get Label + * + * @param locale + * @return order status label + */ + @Override + public String getLabel(Locale locale) { + return LanguageUtil.get(locale, + CommerceOrderConstants.getOrderStatusLabel(CommerceOrderConstants.ORDER_STATUS_PROCESSING)); + } + + /** + * Get priority + * + * @return priority in int + */ + @Override + public int getPriority() { + return PRIORITY; + } + + /** + * verify the order is in complete state or not + * + * @param commerceOrder + * @return true or false + */ + @Override + public boolean isComplete(CommerceOrder commerceOrder) { + boolean isComplete = Boolean.FALSE; + + if (!commerceOrder.isOpen() && commerceOrder.isApproved() + && (commerceOrder.getOrderStatus() != CommerceOrderConstants.ORDER_STATUS_PENDING)) { + isComplete = Boolean.TRUE; + } + + return isComplete; + + } + + /** + * Check transition criteria met or not based on next status will be enable + * + * @param commerceOrder + * @return true or false + */ + @Override + public boolean isTransitionCriteriaMet(CommerceOrder commerceOrder) throws PortalException { + boolean isTransitionMet = Boolean.FALSE; + + if ((commerceOrder.getOrderStatus() == CommerceOrderConstants.ORDER_STATUS_PENDING) + || (commerceOrder.getOrderStatus() == CommerceOrderConstants.ORDER_STATUS_ON_HOLD)) { + isTransitionMet = Boolean.TRUE; + } + + return isTransitionMet; + + } + + /** + * Check the status is valid for current status + * + * @param commerceOrder + * @return true or false + */ + @Override + public boolean isValidForOrder(CommerceOrder commerceOrder) throws PortalException { + return Boolean.FALSE; + + } + + @Reference + private CommerceOrderService commerceOrderService; + +} \ No newline at end of file diff --git a/modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/ShippedOrderStatusOverride.java b/modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/ShippedOrderStatusOverride.java new file mode 100644 index 0000000..afcbcc8 --- /dev/null +++ b/modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/ShippedOrderStatusOverride.java @@ -0,0 +1,146 @@ + +package com.liferay.commerce.order.status.override; + +import com.liferay.commerce.constants.CommerceOrderConstants; +import com.liferay.commerce.model.CommerceOrder; +import com.liferay.commerce.model.CommerceOrderItem; +import com.liferay.commerce.order.status.CommerceOrderStatus; +import com.liferay.commerce.service.CommerceOrderService; +import com.liferay.portal.kernel.exception.PortalException; +import com.liferay.portal.kernel.language.LanguageUtil; +import com.liferay.commerce.order.status.override.constants.CommerceOrderStatusOverrideConstants; + +import java.util.Locale; + +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; + +@Component(property = { "commerce.order.status.key=" + CommerceOrderConstants.ORDER_STATUS_SHIPPED, + "commerce.order.status.priority:Integer=" + ShippedOrderStatusOverride.PRIORITY, + "service.ranking:Integer=100" }, service = CommerceOrderStatus.class) +public class ShippedOrderStatusOverride implements CommerceOrderStatus { + public static final int PRIORITY = 60; + + /** + * Called on transition change for order status + * + * @param commerceOrder + * @param userId + * @return commerceOrder + */ + @Override + public CommerceOrder doTransition(CommerceOrder commerceOrder, long userId, boolean secure) throws PortalException { + commerceOrder.setOrderStatus(CommerceOrderConstants.ORDER_STATUS_SHIPPED); + + return commerceOrderService.updateCommerceOrder(commerceOrder); + } + + /** + * Get key + * + * @return key in int + */ + @Override + public int getKey() { + return CommerceOrderConstants.ORDER_STATUS_SHIPPED; + } + + /** + * Get Label + * + * @param locale + * @return order status label + */ + @Override + public String getLabel(Locale locale) { + return LanguageUtil.get(locale, + CommerceOrderConstants.getOrderStatusLabel(CommerceOrderConstants.ORDER_STATUS_SHIPPED)); + } + + /** + * verify the order is in complete state or not + * + * @param commerceOrder + * @return true or false + */ + @Override + public boolean isComplete(CommerceOrder commerceOrder) { + boolean isCompleteStatus = Boolean.FALSE; + + if ((commerceOrder.getOrderStatus() == CommerceOrderConstants.ORDER_STATUS_SHIPPED) + || (commerceOrder.getOrderStatus() == CommerceOrderConstants.ORDER_STATUS_COMPLETED)) + { + isCompleteStatus = Boolean.TRUE; + } + + return isCompleteStatus; + } + + /** + * Check transition criteria met or not based on next status will be enable + * + * @param commerceOrder + * @return true or false + */ + @Override + public boolean isTransitionCriteriaMet(CommerceOrder commerceOrder) throws PortalException { + + boolean allOrderItemsShipped = true; + + if ((commerceOrder.getOrderStatus() == CommerceOrderStatusOverrideConstants.ORDER_STATUS_CONFIRMED)) + return allOrderItemsShipped; + + for (CommerceOrderItem shippedCommerceOrderItem : commerceOrder.getCommerceOrderItems()) { + + if ((shippedCommerceOrderItem.getShippedQuantity().compareTo(shippedCommerceOrderItem.getQuantity()) < 0) + && shippedCommerceOrderItem.isShippable()) { + allOrderItemsShipped = Boolean.FALSE; + } + + } + + if (((commerceOrder.getOrderStatus() == CommerceOrderConstants.ORDER_STATUS_CANCELLED) || (commerceOrder + .getOrderStatus() == CommerceOrderStatusOverrideConstants.ORDER_STATUS_PENDING_CANCELLATION)) + && allOrderItemsShipped) { + allOrderItemsShipped = Boolean.FALSE; + } + + if (commerceOrder.getOrderStatus() == CommerceOrderConstants.ORDER_STATUS_PROCESSING) { + allOrderItemsShipped = Boolean.FALSE; + } + return allOrderItemsShipped; + } + + /** + * Check the status is valid for current status + * + * @param commerceOrder + * @return true or false + */ + @Override + public boolean isValidForOrder(CommerceOrder commerceOrder) throws PortalException { + boolean isValid = Boolean.TRUE; + + if (commerceOrder.getOrderStatus() == CommerceOrderConstants.ORDER_STATUS_CANCELLED + || commerceOrder + .getOrderStatus() == CommerceOrderStatusOverrideConstants.ORDER_STATUS_PENDING_CANCELLATION + || commerceOrder.getOrderStatus() == CommerceOrderConstants.ORDER_STATUS_PARTIALLY_SHIPPED) + isValid = Boolean.FALSE; + + return isValid; + + } + + /** + * Get priority + * + * @return priority in int + */ + @Override + public int getPriority() { + return PRIORITY; + } + + @Reference + private CommerceOrderService commerceOrderService; +} diff --git a/modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/constants/CommerceOrderStatusOverrideConstants.java b/modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/constants/CommerceOrderStatusOverrideConstants.java new file mode 100644 index 0000000..bae9764 --- /dev/null +++ b/modules/commerce-order-status-override/src/main/java/com/liferay/commerce/order/status/override/constants/CommerceOrderStatusOverrideConstants.java @@ -0,0 +1,130 @@ +package com.liferay.commerce.order.status.override.constants; + +import com.liferay.commerce.constants.CommerceOrderConstants; +import com.liferay.petra.string.StringPool; + +public class CommerceOrderStatusOverrideConstants { + + private CommerceOrderStatusOverrideConstants() { + } + + public static final int ORDER_STATUS_PLACED = 31; + public static final int ORDER_STATUS_AWAITING_PAYMENT = 32; + public static final int ORDER_STATUS_CONFIRMED = 55; + public static final int ORDER_STATUS_PENDING_CANCELLATION = 53; + public static final int ORDER_STATUS_PAID = 51; + + public static final String ORDER_STATUS_PLACED_LABEL = "Placed"; + public static final String ORDER_STATUS_AWAITING_PAYMENT_LABEL = "Awaiting Payment/Blocked"; + public static final String ORDER_STATUS_CONFIRMED_LABEL = "Confirmed"; + public static final String ORDER_STATUS_PENDING_CANCELLATION_LABEL = "Pending Cancellation"; + public static final String ORDER_STATUS_COMPLETED_LABEL = "Invoiced"; + public static final String ORDER_STATUS_SHIPPED_LABEL = "Shipped"; + public static final String ORDER_STATUS_CANCELED_LABEL = "Canceled"; + public static final String ORDER_STATUS_CANCELLED_LABEL = "Cancelled"; + public static final String ORDER_STATUS_PARTIALLY_SHIPPED_LABEL = "Partially Shipped"; + public static final String ORDER_STATUS_PAID_LABEL = "Paid"; + + public static final String ORDER_STATUS_PLACED_ICON = "order-confirmed.svg"; + public static final String ORDER_STATUS_PAID_ICON = "paid.svg"; + public static final String ORDER_STATUS_AWAITING_PAYMENT_ICON = "await-order.svg"; + public static final String ORDER_STATUS_CONFIRMED_ICON = "out-delivery.svg"; + public static final String ORDER_STATUS_PENDING_CANCELLATION_ICON = "delivered.svg"; + public static final String ORDER_STATUS_COMPLETED_ICON = "invoice-order.svg"; + public static final String ORDER_STATUS_SHIPPED_ICON = "shipped.svg"; + public static final String ORDER_STATUS_PARTIALLY_SHIPPED_ICON = "out-delivery.svg"; + public static final String ORDER_STATUS_CALCELLED_ICON = "cancel-order.svg"; + + /** + * Gets the orderStatus icon url. + * + * @param orderStatus + * @return icon + */ + public static String getOrderStatusIcon(String orderStatus) { + + if (orderStatus.equalsIgnoreCase(ORDER_STATUS_PLACED_LABEL)) { + return ORDER_STATUS_PLACED_ICON; + } else if (orderStatus.equalsIgnoreCase(ORDER_STATUS_PENDING_CANCELLATION_LABEL)) { + return ORDER_STATUS_PENDING_CANCELLATION_ICON; + } else if (orderStatus.equalsIgnoreCase(ORDER_STATUS_SHIPPED_LABEL)) { + return ORDER_STATUS_SHIPPED_ICON; + } else if (orderStatus.equalsIgnoreCase(ORDER_STATUS_PARTIALLY_SHIPPED_LABEL)) { + return ORDER_STATUS_PARTIALLY_SHIPPED_ICON; + } else if (orderStatus.equalsIgnoreCase(ORDER_STATUS_COMPLETED_LABEL)) { + return ORDER_STATUS_COMPLETED_ICON; + } else if (orderStatus.equalsIgnoreCase(ORDER_STATUS_CANCELED_LABEL)) { + return ORDER_STATUS_CALCELLED_ICON; + } else if (orderStatus.equalsIgnoreCase(ORDER_STATUS_AWAITING_PAYMENT_LABEL)) { + return ORDER_STATUS_AWAITING_PAYMENT_ICON; + } else if (orderStatus.equalsIgnoreCase(ORDER_STATUS_CONFIRMED_LABEL)) { + return ORDER_STATUS_CONFIRMED_ICON; + } else if (orderStatus.equalsIgnoreCase(ORDER_STATUS_PAID_LABEL)){ + return ORDER_STATUS_PAID_ICON; + } + return StringPool.BLANK; + } + + /** + * Gets the orderStatus label. + * + * @return orderStatus label + */ + public static String getOrderStatus(int status) { + + if (status == ORDER_STATUS_PLACED) { + return ORDER_STATUS_PLACED_LABEL; + } else if (status == CommerceOrderConstants.ORDER_STATUS_SHIPPED) { + return ORDER_STATUS_SHIPPED_LABEL; + } else if (status == CommerceOrderConstants.ORDER_STATUS_PARTIALLY_SHIPPED) { + return ORDER_STATUS_PARTIALLY_SHIPPED_LABEL; + } else if (status == CommerceOrderStatusOverrideConstants.ORDER_STATUS_AWAITING_PAYMENT) { + return ORDER_STATUS_AWAITING_PAYMENT_LABEL; + } else if (status == ORDER_STATUS_CONFIRMED) { + return ORDER_STATUS_CONFIRMED_LABEL; + } else if (status == ORDER_STATUS_PENDING_CANCELLATION) { + return ORDER_STATUS_PENDING_CANCELLATION_LABEL; + } else if (status == CommerceOrderConstants.ORDER_STATUS_COMPLETED) { + return ORDER_STATUS_COMPLETED_LABEL; + } else if (status == CommerceOrderConstants.ORDER_STATUS_CANCELLED) { + return ORDER_STATUS_CANCELLED_LABEL; + } else if (status == ORDER_STATUS_PAID){ + return ORDER_STATUS_PAID_LABEL; + } + + return StringPool.BLANK; + } + + /** + * Gets the orderStatus label. + * + * @return orderStatus label + */ + public static int getOrderStatus(String orderStatusLabel) { + + if (orderStatusLabel.equalsIgnoreCase(ORDER_STATUS_PLACED_LABEL)) { + return ORDER_STATUS_PLACED; + } else if (orderStatusLabel.equalsIgnoreCase(ORDER_STATUS_SHIPPED_LABEL)) { + return CommerceOrderConstants.ORDER_STATUS_SHIPPED; + } else if (orderStatusLabel.equalsIgnoreCase(ORDER_STATUS_PARTIALLY_SHIPPED_LABEL)) { + return CommerceOrderConstants.ORDER_STATUS_PARTIALLY_SHIPPED; + } else if (orderStatusLabel.equalsIgnoreCase(ORDER_STATUS_AWAITING_PAYMENT_LABEL)) { + return CommerceOrderStatusOverrideConstants.ORDER_STATUS_AWAITING_PAYMENT; + } else if (orderStatusLabel.equalsIgnoreCase(ORDER_STATUS_CONFIRMED_LABEL)) { + return ORDER_STATUS_CONFIRMED; + } else if (orderStatusLabel.equalsIgnoreCase(ORDER_STATUS_PENDING_CANCELLATION_LABEL)) { + return ORDER_STATUS_PENDING_CANCELLATION; + } else if (orderStatusLabel.equalsIgnoreCase(ORDER_STATUS_COMPLETED_LABEL)) { + return CommerceOrderConstants.ORDER_STATUS_COMPLETED; + } else if (orderStatusLabel.equalsIgnoreCase(ORDER_STATUS_CANCELLED_LABEL) + || orderStatusLabel.equalsIgnoreCase(ORDER_STATUS_CANCELED_LABEL)) { + return CommerceOrderConstants.ORDER_STATUS_CANCELLED; + } else if (orderStatusLabel.equalsIgnoreCase(ORDER_STATUS_PAID_LABEL)){ + return ORDER_STATUS_PAID; + } + return -1; + } + + + +} diff --git a/modules/commerce-order-status-override/src/main/resources/.gitkeep b/modules/commerce-order-status-override/src/main/resources/.gitkeep new file mode 100644 index 0000000..e69de29