diff --git a/docker/envoy_template.yaml b/docker/envoy_template.yaml index a8da61d47..fa59a76b7 100644 --- a/docker/envoy_template.yaml +++ b/docker/envoy_template.yaml @@ -58,6 +58,7 @@ static_resources: - express_shipment.ExpressShipment - field.business_partner.BusinessPartnerInfoService - field.invoice.InvoiceInfoService + - field.order.OrderInfoService - field.product.ProductInfoService - file_management.FileManagement - general_ledger.GeneralLedger @@ -69,7 +70,6 @@ static_resources: - match_po_receipt_invoice.MatchPORReceiptInvoice - material_management.MaterialManagement - notice_management.NoticeManagement - - order.Order - payment_allocation.PaymentAllocation - payment_print_export.PaymentPrintExport - payment.Payment diff --git a/resources/adempiere-grpc-server.pb b/resources/adempiere-grpc-server.pb index 660c01242..02d3973ba 100644 Binary files a/resources/adempiere-grpc-server.pb and b/resources/adempiere-grpc-server.pb differ diff --git a/resources/envoy.yaml b/resources/envoy.yaml index 2f8ba67f5..1e6094d45 100644 --- a/resources/envoy.yaml +++ b/resources/envoy.yaml @@ -55,6 +55,7 @@ static_resources: - express_shipment.ExpressShipment - field.business_partner.BusinessPartnerInfoService - field.invoice.InvoiceInfoService + - field.order.OrderInfoService - field.product.ProductInfoService - file_management.FileManagement - general_ledger.GeneralLedger @@ -66,7 +67,6 @@ static_resources: - match_po_receipt_invoice.MatchPORReceiptInvoice - material_management.MaterialManagement - notice_management.NoticeManagement - - order.Order - payment_allocation.PaymentAllocation - payment_print_export.PaymentPrintExport - payment.Payment diff --git a/src/main/java/org/spin/grpc/service/OrderInfo.java b/src/main/java/org/spin/grpc/service/OrderInfo.java deleted file mode 100644 index d236de253..000000000 --- a/src/main/java/org/spin/grpc/service/OrderInfo.java +++ /dev/null @@ -1,159 +0,0 @@ -/************************************************************************************ - * Copyright (C) 2018-present E.R.P. Consultores y Asociados, C.A. * - * Contributor(s): Edwin Betancourt, EdwinBetanc0urt@outlook.com * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - ************************************************************************************/ -package org.spin.grpc.service; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ThreadLocalRandom; - -import org.adempiere.exceptions.AdempiereException; -import org.adempiere.core.domains.models.I_C_Order; -import org.compiere.model.MLookupInfo; -import org.compiere.model.MRole; -import org.compiere.model.MTable; -import org.compiere.util.CLogger; -import org.compiere.util.Env; -import org.compiere.util.Util; -import org.spin.base.db.QueryUtil; -import org.spin.base.db.WhereClauseUtil; -import org.spin.base.util.ContextManager; -import org.spin.base.util.RecordUtil; -import org.spin.base.util.ReferenceInfo; -import org.spin.service.grpc.authentication.SessionManager; -import org.spin.service.grpc.util.db.CountUtil; -import org.spin.service.grpc.util.db.LimitUtil; -import org.spin.service.grpc.util.value.ValueManager; -import org.spin.backend.grpc.common.ListEntitiesResponse; -import org.spin.backend.grpc.order.ListOrderInfoRequest; -import org.spin.backend.grpc.order.OrderGrpc.OrderImplBase; - -import io.grpc.Status; -import io.grpc.stub.StreamObserver; - -/** - * @author Edwin Betancourt, EdwinBetanc0urt@outlook.com, https://github.com/EdwinBetanc0urt - * Service for backend of Update Center - */ -public class OrderInfo extends OrderImplBase { - /** Logger */ - private CLogger log = CLogger.getCLogger(OrderInfo.class); - - public String tableName = I_C_Order.Table_Name; - - @Override - public void listOrderInfo(ListOrderInfoRequest request, StreamObserver responseObserver) { - try { - if(request == null) { - throw new AdempiereException("Object Request Null"); - } - - ListEntitiesResponse.Builder entityValueList = listOrderInfo(request); - responseObserver.onNext(entityValueList.build()); - responseObserver.onCompleted(); - } catch (Exception e) { - log.severe(e.getLocalizedMessage()); - responseObserver.onError(Status.INTERNAL - .withDescription(e.getLocalizedMessage()) - .withCause(e) - .asRuntimeException()); - } - } - - /** - * Get default value base on field, process parameter, browse field or column - * @param request - * @return - */ - private ListEntitiesResponse.Builder listOrderInfo(ListOrderInfoRequest request) { - MLookupInfo reference = ReferenceInfo.getInfoFromRequest( - request.getReferenceId(), - request.getFieldId(), - request.getProcessParameterId(), - request.getBrowseFieldId(), - request.getColumnId(), - request.getColumnName(), - this.tableName - ); - - int windowNo = ThreadLocalRandom.current().nextInt(1, 8996 + 1); - ContextManager.setContextWithAttributesFromStruct(windowNo, Env.getCtx(), request.getContextAttributes()); - - // - MTable table = MTable.get(Env.getCtx(), this.tableName); - StringBuilder sql = new StringBuilder(QueryUtil.getTableQueryWithReferences(table)); - - // add where with access restriction - String sqlWithRoleAccess = MRole.getDefault() - .addAccessSQL( - sql.toString(), - null, - MRole.SQL_FULLYQUALIFIED, - MRole.SQL_RO - ); - - StringBuffer whereClause = new StringBuffer(); - - // validation code of field - String validationCode = WhereClauseUtil.getWhereRestrictionsWithAlias(tableName, reference.ValidationCode); - String parsedValidationCode = Env.parseContext(Env.getCtx(), windowNo, validationCode, false); - if (!Util.isEmpty(reference.ValidationCode, true)) { - if (Util.isEmpty(parsedValidationCode, true)) { - throw new AdempiereException("@WhereClause@ @Unparseable@"); - } - whereClause.append(" AND ").append(parsedValidationCode); - } - - // For dynamic condition - List params = new ArrayList<>(); // includes on filters criteria - String dynamicWhere = WhereClauseUtil.getWhereClauseFromCriteria(request.getFilters(), this.tableName, params); - if (!Util.isEmpty(dynamicWhere, true)) { - // Add includes first AND - whereClause.append(" AND ") - .append("(") - .append(dynamicWhere) - .append(")"); - } - - sqlWithRoleAccess += whereClause; - String parsedSQL = RecordUtil.addSearchValueAndGet(sqlWithRoleAccess, this.tableName, request.getSearchValue(), params); - - // Get page and count - int pageNumber = LimitUtil.getPageNumber(SessionManager.getSessionUuid(), request.getPageToken()); - int limit = LimitUtil.getPageSize(request.getPageSize()); - int offset = (pageNumber - 1) * limit; - int count = 0; - - ListEntitiesResponse.Builder builder = ListEntitiesResponse.newBuilder(); - - // Count records - count = CountUtil.countRecords(parsedSQL, this.tableName, params); - // Add Row Number - parsedSQL = LimitUtil.getQueryWithLimit(parsedSQL, limit, offset); - builder = RecordUtil.convertListEntitiesResult(MTable.get(Env.getCtx(), this.tableName), parsedSQL, params); - // - builder.setRecordCount(count); - // Set page token - String nexPageToken = null; - if(LimitUtil.isValidNextPageToken(count, offset, limit)) { - nexPageToken = LimitUtil.getPagePrefix(SessionManager.getSessionUuid()) + (pageNumber + 1); - } - builder.setNextPageToken( - ValueManager.validateNull(nexPageToken) - ); - - return builder; - } - -} diff --git a/src/main/java/org/spin/grpc/service/field/order/OrderInfoConvert.java b/src/main/java/org/spin/grpc/service/field/order/OrderInfoConvert.java new file mode 100644 index 000000000..99f5835ca --- /dev/null +++ b/src/main/java/org/spin/grpc/service/field/order/OrderInfoConvert.java @@ -0,0 +1,132 @@ +/************************************************************************************ + * Copyright (C) 2018-present E.R.P. Consultores y Asociados, C.A. * + * Contributor(s): Elsio Sanchez elsiosanches@gmail.com * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 2 of the License, or * + * (at your option) any later version. * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + ************************************************************************************/ + +package org.spin.grpc.service.field.order; + +import java.sql.ResultSet; +import java.sql.SQLException; + +import org.adempiere.core.domains.models.I_C_Order; +import org.compiere.model.MOrder; +import org.compiere.util.Env; +import org.spin.backend.grpc.field.order.OrderInfo; +import org.spin.service.grpc.util.value.NumberManager; +import org.spin.service.grpc.util.value.TimeManager; +import org.spin.service.grpc.util.value.ValueManager; + +/** + * @author Elsio Sanchez elsiosanches@gmail.com, https://github.com/elsiosanchez + * Service for backend of Product Info field + */ +public class OrderInfoConvert { + + public static OrderInfo.Builder convertOrderInfo(ResultSet rs) throws SQLException { + OrderInfo.Builder builder = OrderInfo.newBuilder(); + if (rs == null) { + return builder; + } + int orderId = rs.getInt( + I_C_Order.COLUMNNAME_C_Order_ID + ); + MOrder order = new MOrder(Env.getCtx(), orderId, null); + + builder.setId( + rs.getInt( + I_C_Order.COLUMNNAME_C_Order_ID + ) + ) + .setUuid( + ValueManager.validateNull( + rs.getString( + I_C_Order.COLUMNNAME_UUID + ) + ) + ) + .setDisplayValue( + ValueManager.validateNull( + order.getDisplayValue() + ) + ) + .setBusinessPartner( + ValueManager.validateNull( + rs.getString("BusinessPartner") + ) + ) + .setDateOrdered( + TimeManager.convertDateToValue( + rs.getTimestamp( + I_C_Order.COLUMNNAME_DateOrdered + ) + ) + ) + .setDocumentNo( + ValueManager.validateNull( + rs.getString( + I_C_Order.COLUMNNAME_DocumentNo + ) + ) + ) + .setCurrency( + ValueManager.validateNull( + rs.getString("Currency") + ) + ) + .setGrandTotal( + NumberManager.getBigDecimalToString( + rs.getBigDecimal( + I_C_Order.COLUMNNAME_GrandTotal + ) + ) + ) + .setConvertedAmount( + NumberManager.getBigDecimalToString( + rs.getBigDecimal("currencyBase") + ) + ) + .setIsSalesTransaction( + rs.getBoolean( + I_C_Order.COLUMNNAME_IsSOTrx + ) + ) + + .setIsDelivered( + rs.getBoolean( + I_C_Order.COLUMNNAME_IsDelivered + ) + ) + .setDescription( + ValueManager.validateNull( + rs.getString( + I_C_Order.COLUMNNAME_Description + ) + ) + ) + .setPoReference( + ValueManager.validateNull( + rs.getString( + I_C_Order.COLUMNNAME_POReference + ) + ) + ) + .setDocumentStatus( + ValueManager.validateNull( + order.getDocStatusName() + ) + ) + ; + + return builder; + } +} diff --git a/src/main/java/org/spin/grpc/service/field/order/OrderInfoLogic.java b/src/main/java/org/spin/grpc/service/field/order/OrderInfoLogic.java new file mode 100644 index 000000000..e4242b26d --- /dev/null +++ b/src/main/java/org/spin/grpc/service/field/order/OrderInfoLogic.java @@ -0,0 +1,337 @@ +package org.spin.grpc.service.field.order; + +import java.math.BigDecimal; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +import org.adempiere.core.domains.models.I_C_Order; +import org.adempiere.exceptions.AdempiereException; +import org.compiere.model.MLookupInfo; +import org.compiere.model.MRole; +import org.compiere.util.DB; +import org.compiere.util.DisplayType; +import org.compiere.util.Env; +import org.compiere.util.Util; +import org.spin.backend.grpc.common.ListLookupItemsResponse; +import org.spin.backend.grpc.field.order.GetOrderInfoRequest; +import org.spin.backend.grpc.field.order.ListBusinessPartnersOrderRequest; +import org.spin.backend.grpc.field.order.ListOrdersInfoRequest; +import org.spin.backend.grpc.field.order.ListOrdersInfoResponse; +import org.spin.backend.grpc.field.order.OrderInfo; +import org.spin.base.db.WhereClauseUtil; +import org.spin.base.util.ContextManager; +import org.spin.base.util.RecordUtil; +import org.spin.base.util.ReferenceInfo; +import org.spin.grpc.service.UserInterface; +import org.spin.service.grpc.authentication.SessionManager; +import org.spin.service.grpc.util.db.CountUtil; +import org.spin.service.grpc.util.db.LimitUtil; +import org.spin.service.grpc.util.db.ParameterUtil; +import org.spin.service.grpc.util.value.BooleanManager; +import org.spin.service.grpc.util.value.NumberManager; +import org.spin.service.grpc.util.value.ValueManager; + +public class OrderInfoLogic { + // public static tableName = C_Order.Table_Name; + + /** + * Validate productId and MProduct, and get instance + * @param tableName + * @return + */ + + public static ListLookupItemsResponse.Builder listBusinessPartners(ListBusinessPartnersOrderRequest request) { + String whereClause = ""; + if (!Util.isEmpty(request.getIsSalesTransaction(), true)) { + boolean isSalesTransaction = BooleanManager.getBooleanFromString( + request.getIsSalesTransaction() + ); + if (isSalesTransaction) { + whereClause = " C_BPartner.IsCustomer = 'Y' "; + } else { + whereClause = " C_BPartner.IsVendor = 'Y' "; + } + } + // Warehouse + MLookupInfo reference = ReferenceInfo.getInfoFromRequest( + DisplayType.TableDir, + 0, 0, 0, + 0, + I_C_Order.COLUMNNAME_C_BPartner_ID, I_C_Order.Table_Name, + 0, + whereClause + ); + + ListLookupItemsResponse.Builder builderList = UserInterface.listLookupItems( + reference, + null, + request.getPageSize(), + request.getPageToken(), + request.getSearchValue(), + true + ); + + return builderList; + } + + public static OrderInfo.Builder getOrder(GetOrderInfoRequest request) { + final int orderId = request.getId(); + if (orderId <= 0) { + throw new AdempiereException("@FillMandatory@ @C_Invoice_ID@"); + } + final String sql = "SELECT " + + "o.C_Order_ID, o.UUID," + + "(SELECT Name FROM C_BPartner bp WHERE bp.C_BPartner_ID=o.C_BPartner_ID) AS BusinessPartner, " + + "o.DateOrdered, " + + "o.DocumentNo, " + + "((SELECT ISO_Code FROM C_Currency c WHERE c.C_Currency_ID=o.C_Currency_ID)) AS Currency, " + + "o.GrandTotal, " + + "currencyBase(o.GrandTotal,o.C_Currency_ID,o.DateAcct, o.AD_Client_ID,o.AD_Org_ID), " + + "o.IsSOTrx, " + + "o.Description, " + + "o.POReference, " + + "o.isdelivered, " + + "o.DocStatus " + + "FROM C_Order AS o " + + "WHERE o.C_Order_ID = ? " + ; + + OrderInfo.Builder builder = OrderInfo.newBuilder(); + + PreparedStatement pstmt = null; + ResultSet rs = null; + try { + pstmt = DB.prepareStatement(sql, null); + pstmt.setInt(1, orderId); + rs = pstmt.executeQuery(); + if (rs.next()) { + builder = OrderInfoConvert.convertOrderInfo( + rs + ); + } + } catch (SQLException e) { + throw new AdempiereException(e); + } finally { + DB.close(rs, pstmt); + } + + return builder; + } + + /** + * Get default value base on field, process parameter, browse field or column + * @param request + * @return + */ + public static ListOrdersInfoResponse.Builder listOrderInfo(ListOrdersInfoRequest request) { + // Fill context + int windowNo = ThreadLocalRandom.current().nextInt(1, 8996 + 1); + ContextManager.setContextWithAttributesFromString(windowNo, Env.getCtx(), request.getContextAttributes()); + + String tableName; + MLookupInfo reference = ReferenceInfo.getInfoFromRequest( + request.getReferenceId(), + request.getFieldId(), + request.getProcessParameterId(), + request.getBrowseFieldId(), + request.getColumnId(), + request.getColumnName(), + tableName = "C_Order" + ); + + // + String sql = "SELECT " + + "o.C_Order_ID, o.UUID," + + "(SELECT Name FROM C_BPartner bp WHERE bp.C_BPartner_ID=o.C_BPartner_ID) AS BusinessPartner, " + + "o.DateOrdered, " + + "o.DocumentNo, " + + "((SELECT ISO_Code FROM C_Currency c WHERE c.C_Currency_ID=o.C_Currency_ID)) AS Currency, " + + "o.GrandTotal, " + + "currencyBase(o.GrandTotal,o.C_Currency_ID,o.DateAcct, o.AD_Client_ID,o.AD_Org_ID), " + + "o.IsSOTrx, " + + "o.Description, " + + "o.POReference, " + + "o.isdelivered, " + + "o.DocStatus " + + "FROM C_Order AS o " + + "WHERE 1=1 " + ; + + List filtersList = new ArrayList<>(); // includes on filters criteria + // Document No + if (!Util.isEmpty(request.getDocumentNo(), true)) { + sql += "AND UPPER(o.DocumentNo) LIKE '%' || UPPER(?) || '%' "; + filtersList.add( + request.getDocumentNo() + ); + } + // Business Partner + if (request.getBusinessPartnerId() > 0) { + sql += "AND o.C_BPartner_ID = ? "; + filtersList.add( + request.getBusinessPartnerId() + ); + } + // Is Sales Transaction + if (!Util.isEmpty(request.getIsSalesTransaction(), true)) { + sql += "AND o.IsSOTrx = ? "; + filtersList.add( + BooleanManager.getBooleanToString( + request.getIsSalesTransaction() + ) + ); + } + // Is Delivered + if (!Util.isEmpty(request.getIsDelivered(), true)) { + sql += "AND IsDelivered = ? "; + filtersList.add( + BooleanManager.getBooleanToString( + request.getIsDelivered() + ) + ); + } + // Description + if (!Util.isEmpty(request.getDescription(), true)) { + sql += "AND UPPER(o.Description) LIKE '%' || UPPER(?) || '%' "; + filtersList.add( + request.getDescription() + ); + } + // Date Order + Timestamp dateFrom = ValueManager.getDateFromTimestampDate( + request.getOrderDateFrom() + ); + Timestamp dateTo = ValueManager.getDateFromTimestampDate( + request.getOrderDateTo() + ); + if (dateFrom != null || dateTo != null) { + sql += " AND "; + if (dateFrom != null && dateTo != null) { + sql += "TRUNC(o.DateOrdered, 'DD') BETWEEN ? AND ? "; + filtersList.add(dateFrom); + filtersList.add(dateTo); + } + else if (dateFrom != null) { + sql += "TRUNC(o.DateOrdered, 'DD') >= ? "; + filtersList.add(dateFrom); + } + else { + // DateTo != null + sql += "TRUNC(o.DateOrdered, 'DD') <= ? "; + filtersList.add(dateTo); + } + } + // Order + if (request.getOrderId() > 0) { + sql += "AND o.C_Order_ID = ? "; + filtersList.add( + request.getOrderId() + ); + } + // Grand Total From + BigDecimal grandTotalFrom = NumberManager.getBigDecimalFromString( + request.getGrandTotalFrom() + ); + if (grandTotalFrom != null) { + sql += "AND o.GrandTotal >= ? "; + filtersList.add( + grandTotalFrom + ); + } + // Grand Total To + BigDecimal grandTotalTo = NumberManager.getBigDecimalFromString( + request.getGrandTotalTo() + ); + if (grandTotalTo != null) { + sql += "AND o.GrandTotal <= ? "; + filtersList.add( + grandTotalTo + ); + } + + // add where with access restriction + String sqlWithRoleAccess = MRole.getDefault(Env.getCtx(), false) + .addAccessSQL( + sql.toString(), + "o", + MRole.SQL_FULLYQUALIFIED, + MRole.SQL_RO + ); + + StringBuffer whereClause = new StringBuffer(); + + // validation code of field + String validationCode = WhereClauseUtil.getWhereRestrictionsWithAlias("o", reference.ValidationCode); + String parsedValidationCode = Env.parseContext(Env.getCtx(), windowNo, validationCode, false); + if (!Util.isEmpty(reference.ValidationCode, true)) { + if (Util.isEmpty(parsedValidationCode, true)) { + throw new AdempiereException("@WhereClause@ @Unparseable@"); + } + whereClause.append(" AND ").append(parsedValidationCode); + } + + // For dynamic condition + String dynamicWhere = WhereClauseUtil.getWhereClauseFromCriteria(request.getFilters(), tableName, "o", filtersList); + if (!Util.isEmpty(dynamicWhere, true)) { + // Add includes first AND + whereClause.append(" AND ") + .append("(") + .append(dynamicWhere) + .append(")"); + } + + sqlWithRoleAccess += whereClause; + String parsedSQL = RecordUtil.addSearchValueAndGet(sqlWithRoleAccess, tableName, "o", request.getSearchValue(), filtersList); + + // Get page and count + final int pageNumber = LimitUtil.getPageNumber(SessionManager.getSessionUuid(), request.getPageToken()); + final int limit = LimitUtil.getPageSize(request.getPageSize()); + final int offset = (pageNumber - 1) * limit; + final int count = CountUtil.countRecords(parsedSQL, tableName, "o", filtersList); + + // Add Row Number + parsedSQL += " ORDER BY o.DateOrdered desc, o.DocumentNo "; + parsedSQL = LimitUtil.getQueryWithLimit(parsedSQL, limit, offset); + + // Set page token + String nexPageToken = null; + if(LimitUtil.isValidNextPageToken(count, offset, limit)) { + nexPageToken = LimitUtil.getPagePrefix(SessionManager.getSessionUuid()) + (pageNumber + 1); + } + + ListOrdersInfoResponse.Builder builderList = ListOrdersInfoResponse.newBuilder() + .setRecordCount(count) + .setNextPageToken( + ValueManager.validateNull( + nexPageToken + ) + ) + ; + + PreparedStatement pstmt = null; + ResultSet rs = null; + + try { + pstmt = DB.prepareStatement(parsedSQL, null); + ParameterUtil.setParametersFromObjectsList(pstmt, filtersList); + rs = pstmt.executeQuery(); + while (rs.next()) { + OrderInfo.Builder builder = OrderInfoConvert.convertOrderInfo( + rs + ); + builderList.addRecords(builder); + } + } catch (SQLException e) { + throw new AdempiereException(e); + } finally { + DB.close(rs, pstmt); + } + + return builderList; + } +} diff --git a/src/main/java/org/spin/grpc/service/field/order/OrderInfoService.java b/src/main/java/org/spin/grpc/service/field/order/OrderInfoService.java new file mode 100644 index 000000000..5c9ddbcd8 --- /dev/null +++ b/src/main/java/org/spin/grpc/service/field/order/OrderInfoService.java @@ -0,0 +1,91 @@ +package org.spin.grpc.service.field.order; + +import org.adempiere.exceptions.AdempiereException; +import org.compiere.util.CLogger; +import org.spin.backend.grpc.common.ListLookupItemsResponse; +import org.spin.backend.grpc.field.order.GetOrderInfoRequest; +import org.spin.backend.grpc.field.order.ListBusinessPartnersOrderRequest; +import org.spin.backend.grpc.field.order.ListOrdersInfoRequest; +import org.spin.backend.grpc.field.order.ListOrdersInfoResponse; +import org.spin.backend.grpc.field.order.OrderInfo; +import org.spin.backend.grpc.field.order.OrderInfoServiceGrpc.OrderInfoServiceImplBase; + +import io.grpc.Status; +import io.grpc.stub.StreamObserver; + +public class OrderInfoService extends OrderInfoServiceImplBase { + private CLogger log = CLogger.getCLogger(OrderInfo.class); + + @Override + public void listOrderInfo(ListOrdersInfoRequest request, StreamObserver responseObserver) { + try { + if(request == null) { + throw new AdempiereException("Object Request Null"); + } + ListOrdersInfoResponse.Builder entityValueList = OrderInfoLogic.listOrderInfo(request); + responseObserver.onNext( + entityValueList.build() + ); + responseObserver.onCompleted(); + } catch (Exception e) { + log.severe(e.getLocalizedMessage()); + responseObserver.onError(Status.INTERNAL + .withDescription(e.getLocalizedMessage()) + .withCause(e) + .asRuntimeException() + ); + } + } + + /** + * @param request + * @param responseObserver + */ + public void getOrderInfo(GetOrderInfoRequest request, StreamObserver responseObserver) { + try { + if(request == null) { + throw new AdempiereException("Object GetOrderInfoRequest Null"); + } + OrderInfo.Builder entityValue = OrderInfoLogic.getOrder(request); + responseObserver.onNext( + entityValue.build() + ); + responseObserver.onCompleted(); + } catch (Exception e) { + log.severe(e.getLocalizedMessage()); + responseObserver.onError(Status.INTERNAL + .withDescription(e.getLocalizedMessage()) + .withCause(e) + .asRuntimeException() + ); + } + } + + + /** + * @param request + * @param responseObserver + */ + @Override + public void listBusinessPartners(ListBusinessPartnersOrderRequest request, StreamObserver responseObserver) { + try { + // if(request == null) { + // throw new AdempiereException("Object ListBusinessPartnersRequest Null"); + // } + ListLookupItemsResponse.Builder entityValueList = OrderInfoLogic.listBusinessPartners(request); + responseObserver.onNext( + entityValueList.build() + ); + responseObserver.onCompleted(); + } catch (Exception e) { + log.severe(e.getLocalizedMessage()); + responseObserver.onError(Status.INTERNAL + .withDescription(e.getLocalizedMessage()) + .withCause(e) + .asRuntimeException() + ); + } + } + +} + diff --git a/src/main/java/org/spin/server/AllInOneServices.java b/src/main/java/org/spin/server/AllInOneServices.java index ab1952931..c35629f9f 100644 --- a/src/main/java/org/spin/server/AllInOneServices.java +++ b/src/main/java/org/spin/server/AllInOneServices.java @@ -34,7 +34,6 @@ import org.spin.grpc.service.LogsInfo; import org.spin.grpc.service.MaterialManagement; import org.spin.grpc.service.NoticeManagement; -import org.spin.grpc.service.OrderInfo; import org.spin.grpc.service.PaymentPrintExport; import org.spin.grpc.service.PaymentInfo; import org.spin.grpc.service.PointOfSalesForm; @@ -53,6 +52,7 @@ import org.spin.grpc.service.field.business_partner.BusinessPartnerInfo; import org.spin.grpc.service.field.invoice.InvoiceInfoService; import org.spin.grpc.service.field.location_address.LocationAddress; +import org.spin.grpc.service.field.order.OrderInfoService; import org.spin.grpc.service.field.product.ProductInfo; import org.spin.grpc.service.form.ExpressMovement; import org.spin.grpc.service.form.ExpressReceipt; @@ -200,6 +200,9 @@ private void start() throws IOException { // Invoice Field serverBuilder.addService(new InvoiceInfoService()); logger.info("Service " + InvoiceInfoService.class.getName() + " added on " + SetupLoader.getInstance().getServer().getPort()); + // Order Field + serverBuilder.addService(new OrderInfoService()); + logger.info("Service " + OrderInfoService.class.getName() + " added on " + SetupLoader.getInstance().getServer().getPort()); // Issue Management serverBuilder.addService(new IssueManagement()); logger.info("Service " + IssueManagement.class.getName() + " added on " + SetupLoader.getInstance().getServer().getPort()); @@ -218,9 +221,6 @@ private void start() throws IOException { // Notice Management serverBuilder.addService(new NoticeManagement()); logger.info("Service " + NoticeManagement.class.getName() + " added on " + SetupLoader.getInstance().getServer().getPort()); - // Order - serverBuilder.addService(new OrderInfo()); - logger.info("Service " + OrderInfo.class.getName() + " added on " + SetupLoader.getInstance().getServer().getPort()); // Payment serverBuilder.addService(new PaymentInfo()); logger.info("Service " + PaymentInfo.class.getName() + " added on " + SetupLoader.getInstance().getServer().getPort()); diff --git a/src/main/proto/order.proto b/src/main/proto/order.proto deleted file mode 100644 index a98d43ad5..000000000 --- a/src/main/proto/order.proto +++ /dev/null @@ -1,57 +0,0 @@ -/************************************************************************************ - * Copyright (C) 2018-present E.R.P. Consultores y Asociados, C.A. * - * Contributor(s): Edwin Betancourt EdwinBetanc0urt@outlook.com * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 2 of the License, or * - * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - ************************************************************************************/ -syntax = "proto3"; - - -option java_multiple_files = true; -option java_package = "org.spin.backend.grpc.order"; -option java_outer_classname = "ADempiereOrder"; - -import "google/api/annotations.proto"; -import "google/protobuf/struct.proto"; - -import "base_data_type.proto"; - -// Base URL -// /info/sales/ - -package order; - -// The order service definition. -service Order { - // List Order Info Request - rpc ListOrderInfo(ListOrderInfoRequest) returns (data.ListEntitiesResponse) { - option (google.api.http) = { get: "/info/sales/orders" }; - } -} - -// List Order Info Request -message ListOrderInfoRequest { - string filters = 1; - string sort_by = 2; - repeated string group_columns = 3; - repeated string select_columns = 4; - int32 page_size = 5; - string page_token = 6; - string search_value = 7; - // references - int32 process_parameter_id = 8; - int32 field_id = 9; - int32 browse_field_id = 10; - int32 reference_id = 11; - int32 column_id = 12; - string column_name = 13; - google.protobuf.Struct context_attributes = 14; -} diff --git a/src/main/proto/order_info.proto b/src/main/proto/order_info.proto new file mode 100644 index 000000000..957980c1d --- /dev/null +++ b/src/main/proto/order_info.proto @@ -0,0 +1,153 @@ +/************************************************************************************ +* Copyright (C) 2018-present E.R.P. Consultores y Asociados, C.A. * +* Contributor(s): Elsio Sanchez elsiosanches@gmail.com * +* This program is free software: you can redistribute it and/or modify * +* it under the terms of the GNU General Public License as published by * +* the Free Software Foundation, either version 2 of the License, or * +* (at your option) any later version. * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* You should have received a copy of the GNU General Public License * +* along with this program. If not, see . * +************************************************************************************/ +syntax = "proto3"; + + +option java_multiple_files = true; +option java_package = "org.spin.backend.grpc.field.order"; +option java_outer_classname = "ADempiereOrder"; + +import "google/api/annotations.proto"; +import "google/protobuf/timestamp.proto"; + +import "base_data_type.proto"; + +// Base URL +// /field/order/ + +package field.order; + +// The order service definition. +service OrderInfoService { + // criteria + rpc ListBusinessPartners(ListBusinessPartnersOrderRequest) returns (data.ListLookupItemsResponse) { + option (google.api.http) = { + get: "/field/orders/customers" + }; + } + + // result + rpc ListOrderInfo(ListOrdersInfoRequest) returns (ListOrdersInfoResponse) { + option (google.api.http) = { + get: "/field/orders" + additional_bindings: { + get: "/field/orders/table/{table_name}/{column_name}" + } + additional_bindings: { + get: "/field/orders/column/{column_id}" + } + additional_bindings: { + get: "/field/orders/field/{field_id}" + } + additional_bindings: { + get: "/field/orders/parameter/{process_parameter_id}" + } + additional_bindings: { + get: "/field/orders/query-criteria/{browse_field_id}" + } + }; + } + rpc GetOrderInfo(GetOrderInfoRequest) returns (OrderInfo) { + option (google.api.http) = { + get: "/field/orders/{id}" + }; + } +} + +// List Order Info Request +message ListOrdersRequest { + string filters = 1; + string sort_by = 2; + repeated string group_columns = 3; + repeated string select_columns = 4; + int32 page_size = 5; + string page_token = 6; + string search_value = 7; + string context_attributes = 8; + bool is_only_active_records = 9; + // custom filters + string is_sales_transaction = 10; +} + +// Business Partners +message ListBusinessPartnersOrderRequest { + string filters = 1; + string sort_by = 2; + repeated string group_columns = 3; + repeated string select_columns = 4; + int32 page_size = 5; + string page_token = 6; + string search_value = 7; + string context_attributes = 8; + bool is_only_active_records = 9; + // custom filters + string is_sales_transaction = 10; +} + + +// List Order Info Request +message OrderInfo { + int32 id = 1; + string uuid = 2; + string display_value = 3; + string business_partner = 4; + google.protobuf.Timestamp date_ordered = 5; + string document_no = 6; + string currency = 7; + string grand_total = 8; + string converted_amount = 9; + bool is_sales_transaction = 10; + bool is_delivered = 11; + string description = 12; + string po_reference = 13; + string document_status = 14; +} +message GetOrderInfoRequest { + int32 id = 1; + string uuid = 2; +} +message ListOrdersInfoResponse { + int64 record_count = 1; + repeated OrderInfo records = 2; + string next_page_token = 3; +} +message ListOrdersInfoRequest { + string filters = 1; + string sort_by = 2; + repeated string group_columns = 3; + repeated string select_columns = 4; + int32 page_size = 5; + string page_token = 6; + string search_value = 7; + string context_attributes = 8; + // references + int32 process_parameter_id = 9; + int32 field_id = 10; + int32 browse_field_id = 11; + int32 reference_id = 12; + int32 column_id = 13; + string column_name = 14; + // custom filter + string document_no = 15; + int32 business_partner_id = 16; + string is_sales_transaction = 17; + string description = 19; + google.protobuf.Timestamp order_date_from = 20; + google.protobuf.Timestamp order_date_to = 21; + string is_delivered = 22; + int32 order_id = 23; + string grand_total_from = 24; + string grand_total_to = 25; +}