From 94b32daf11a4f2d353b3ad8f9f5c7560d6526b0f Mon Sep 17 00:00:00 2001 From: Yamel Senih Date: Mon, 15 Nov 2021 16:28:09 -0430 Subject: [PATCH] Add service for allocate seller --- .../PointOfSalesServiceImplementation.java | 109 +++++++++++++++--- src/main/proto/point_of_sales.proto | 39 ++++++- 2 files changed, 133 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/spin/grpc/service/PointOfSalesServiceImplementation.java b/src/main/java/org/spin/grpc/service/PointOfSalesServiceImplementation.java index 9027f5830..c72b43cfa 100644 --- a/src/main/java/org/spin/grpc/service/PointOfSalesServiceImplementation.java +++ b/src/main/java/org/spin/grpc/service/PointOfSalesServiceImplementation.java @@ -30,6 +30,7 @@ import java.util.stream.Collectors; import org.adempiere.exceptions.AdempiereException; +import org.adempiere.model.GenericPO; import org.adempiere.pos.process.ReverseTheSalesTransaction; import org.adempiere.pos.service.CPOS; import org.adempiere.pos.util.POSTicketHandler; @@ -108,6 +109,7 @@ import org.spin.base.util.RecordUtil; import org.spin.base.util.ValueUtil; import org.spin.grpc.util.AddressRequest; +import org.spin.grpc.util.AllocateSellerRequest; import org.spin.grpc.util.AvailableDocumentType; import org.spin.grpc.util.AvailablePaymentMethod; import org.spin.grpc.util.AvailablePriceList; @@ -1426,6 +1428,75 @@ public void listCashSummaryMovements(ListCashSummaryMovementsRequest request, St } } + @Override + public void allocateSeller(AllocateSellerRequest request, StreamObserver responseObserver) { + try { + if(request == null) { + throw new AdempiereException("Object Request Null"); + } + log.fine("Cash Withdrawal = " + request.getPosUuid()); + ContextManager.getContext(request.getClientRequest().getSessionUuid(), + request.getClientRequest().getLanguage(), + request.getClientRequest().getOrganizationUuid(), + request.getClientRequest().getWarehouseUuid()); + Empty.Builder empty = allocateSeller(request); + responseObserver.onNext(empty.build()); + responseObserver.onCompleted(); + } catch (Exception e) { + log.severe(e.getLocalizedMessage()); + responseObserver.onError(Status.INTERNAL + .withDescription(e.getLocalizedMessage()) + .augmentDescription(e.getLocalizedMessage()) + .withCause(e) + .asRuntimeException()); + } + } + + /** + * Allocate a seller to point of sales + * @param request + * @return + */ + private Empty.Builder allocateSeller(AllocateSellerRequest request) { + if(Util.isEmpty(request.getPosUuid())) { + throw new AdempiereException("@C_POS_ID@ @IsMandatory@"); + } + if(Util.isEmpty(request.getSalesRepresentativeUuid())) { + throw new AdempiereException("@SalesRep_ID@ @NotFound@"); + } + int posId = RecordUtil.getIdFromUuid(I_C_POS.Table_Name, request.getPosUuid(), null); + int salesRepresentativeId = RecordUtil.getIdFromUuid(I_AD_User.Table_Name, request.getSalesRepresentativeUuid(), null); + MPOS pointOfSales = new MPOS(Env.getCtx(), posId, null); + if(!pointOfSales.get_ValueAsBoolean("IsAllowsAllocateSeller")) { + throw new AdempiereException("@ActionNotAllowedHere@"); + } + Trx.run(transactionName -> { + List allocatedSellersIds = new Query(Env.getCtx(), "C_POSSellerAllocation", "C_POS_ID = ?", transactionName).setParameters(posId).getIDsAsList(); + if(!pointOfSales.get_ValueAsBoolean("IsAllowsConcurrentUse")) { + allocatedSellersIds + .forEach(allocatedSellerId -> { + PO allocatedSeller = new GenericPO("C_POSSellerAllocation", Env.getCtx(), allocatedSellerId, transactionName); + if(allocatedSeller.get_ValueAsInt("SalesRep_ID") != salesRepresentativeId) { + allocatedSeller.set_ValueOfColumn("IsActive", false); + allocatedSeller.saveEx(); + } + }); + } + // For add seller + PO seller = new Query(Env.getCtx(), "C_POSSellerAllocation", "C_POS_ID = ? AND SalesRep_ID = ?", transactionName).setParameters(posId, salesRepresentativeId).first(); + if(seller == null + || seller.get_ID() <= 0) { + seller = new GenericPO("C_POSSellerAllocation", Env.getCtx(), 0, transactionName); + seller.set_ValueOfColumn("C_POS_ID", posId); + seller.set_ValueOfColumn("SalesRep_ID", salesRepresentativeId); + } + seller.set_ValueOfColumn("IsActive", true); + seller.saveEx(); + }); + // Return + return Empty.newBuilder(); + } + /** * List all movements from cash * @return @@ -1435,7 +1506,7 @@ private ListCashSummaryMovementsResponse.Builder listCashSummaryMovements(ListCa ResultSet rs = null; ListCashSummaryMovementsResponse.Builder builder = ListCashSummaryMovementsResponse.newBuilder(); if(Util.isEmpty(request.getPosUuid())) { - throw new AdempiereException("@C_POS_ID@ @NotFound@"); + throw new AdempiereException("@C_POS_ID@ @IsMandatory@"); } int posId = RecordUtil.getIdFromUuid(I_C_POS.Table_Name, request.getPosUuid(), null); MBankStatement cashClosing = getCurrentCashclosing(posId, null); @@ -2886,7 +2957,11 @@ private BigDecimal getConvetedRemainingAmountToPaymentCurrency(BigDecimal remain */ private ListOrdersResponse.Builder listOrders(ListOrdersRequest request) { if(Util.isEmpty(request.getPosUuid())) { - throw new AdempiereException("@C_POS_ID@ @NotFound@"); + throw new AdempiereException("@C_POS_ID@ @IsMandatory@"); + } + // Sales Representative + if(Util.isEmpty(request.getSalesRepresentativeUuid())) { + throw new AdempiereException("@SalesRep_ID@ @IsMandatory@"); } ListOrdersResponse.Builder builder = ListOrdersResponse.newBuilder(); String nexPageToken = null; @@ -2898,13 +2973,20 @@ private ListOrdersResponse.Builder listOrders(ListOrdersRequest request) { List parameters = new ArrayList(); // Aisle Seller int posId = RecordUtil.getIdFromUuid(I_C_POS.Table_Name, request.getPosUuid(), null); + int salesRepresentativeId = RecordUtil.getIdFromUuid(I_AD_User.Table_Name, request.getSalesRepresentativeUuid(), null); int orgId = Env.getAD_Org_ID(Env.getCtx()); boolean isWithAisleSeller = M_Element.get(Env.getCtx(), "IsAisleSeller") != null; + boolean isAppliedNewFeaturesPOS = M_Element.get(Env.getCtx(), "IsSharedPOS") != null && M_Element.get(Env.getCtx(), "IsAllowsAllocateSeller") != null; if(isWithAisleSeller && request.getIsOnlyAisleSeller()) { whereClause.append("(C_Order.C_POS_ID = ? OR (C_Order.AD_Org_ID = ? AND EXISTS(SELECT 1 FROM C_POS p WHERE p.C_POS_ID = C_Order.C_POS_ID AND p.IsAisleSeller = 'Y')))"); parameters.add(posId); parameters.add(orgId); + } else if(isAppliedNewFeaturesPOS) { + whereClause.append("C_Order.C_POS_ID = ? AND ((C_Order.AD_Org_ID = ? AND C_Order.SalesRep_ID = ?) OR EXISTS(SELECT 1 FROM C_POS p WHERE p.C_POS_ID = C_Order.C_POS_ID AND p.IsSharedPOS = 'N'))"); + parameters.add(posId); + parameters.add(orgId); + parameters.add(salesRepresentativeId); } else { whereClause.append("C_Order.C_POS_ID = ?"); parameters.add(posId); @@ -2962,12 +3044,6 @@ private ListOrdersResponse.Builder listOrders(ListOrdersRequest request) { whereClause.append(" AND DateOrdered <= ?"); parameters.add(TimeUtil.getDay(ValueUtil.convertStringToDate(request.getDateOrderedTo()))); } - // Sales Representative - if(!Util.isEmpty(request.getSalesRepresentativeUuid())) { - int salesRepresentativeId = RecordUtil.getIdFromUuid(I_AD_User.Table_Name, request.getSalesRepresentativeUuid(), null); - whereClause.append(" AND SalesRep_ID = ?"); - parameters.add(salesRepresentativeId); - } // Get Product list Query query = new Query(Env.getCtx(), I_C_Order.Table_Name, whereClause.toString(), null) .setParameters(parameters) @@ -3660,16 +3736,21 @@ private ListPointOfSalesResponse.Builder convertPointOfSalesList(ListPointOfSale int limit = RecordUtil.PAGE_SIZE; int offset = pageNumber * RecordUtil.PAGE_SIZE; // Get POS List - boolean isListWithSharedPOS = M_Element.get(Env.getCtx(), "IsSharedPOS") != null; - String whereClause = "(AD_Org_ID = ? OR SalesRep_ID = ?)"; + boolean isAppliedNewFeaturesPOS = M_Element.get(Env.getCtx(), "IsSharedPOS") != null && M_Element.get(Env.getCtx(), "IsAllowsAllocateSeller") != null; + StringBuffer whereClause = new StringBuffer("SalesRep_ID = ? OR EXISTS(SELECT 1 FROM AD_User u WHERE u.AD_User_ID = ? AND IsPOSManager = 'Y')"); List parameters = new ArrayList<>(); parameters.add(salesRepresentativeId); - if(isListWithSharedPOS) { - whereClause = "SalesRep_ID = ? OR EXISTS(SELECT 1 FROM AD_User u WHERE u.AD_User_ID = ? AND IsPOSManager = 'Y') OR (AD_Org_ID = ? AND IsSharedPOS = 'Y')"; - parameters.add(salesRepresentativeId); + parameters.add(salesRepresentativeId); + // applies for Shared pos + if(isAppliedNewFeaturesPOS) { + // Shared POS + whereClause.append(" OR (AD_Org_ID = ? AND IsSharedPOS = 'Y' AND IsAllowsAllocateSeller = 'N')"); + // Allocation by Seller Allocation table + whereClause.append(" OR (IsAllowsAllocateSeller = 'Y' AND EXISTS(SELECT 1 FROM C_POSSellerAllocation sa WHERE sa.C_POS_ID = C_POS.C_POS_ID AND sa.SalesRep_ID = ? AND sa.IsActive = 'Y'))"); parameters.add(Env.getAD_Org_ID(Env.getCtx())); + parameters.add(salesRepresentativeId); } - Query query = new Query(Env.getCtx() , I_C_POS.Table_Name , whereClause, null) + Query query = new Query(Env.getCtx() , I_C_POS.Table_Name , whereClause.toString(), null) .setClient_ID() .setOnlyActiveRecords(true) .setParameters(parameters) diff --git a/src/main/proto/point_of_sales.proto b/src/main/proto/point_of_sales.proto index f20b72ac5..386c27126 100644 --- a/src/main/proto/point_of_sales.proto +++ b/src/main/proto/point_of_sales.proto @@ -78,6 +78,8 @@ service Store { rpc ListAvailableCurrencies(ListAvailableCurrenciesRequest) returns (ListAvailableCurrenciesResponse) {} // List of Available Document Types rpc ListAvailableDocumentTypes(ListAvailableDocumentTypesRequest) returns (ListAvailableDocumentTypesResponse) {} + // List of Available Discounts + rpc ListAvailableDiscounts(ListAvailableDiscountsRequest) returns (ListAvailableDiscountsResponse) {} // Customer // Create Customer rpc CreateCustomer(CreateCustomerRequest) returns (Customer) {} @@ -129,6 +131,15 @@ service Store { rpc ListCashMovements(ListCashMovementsRequest) returns (ListCashMovementsResponse) {} // List Cash Summary rpc ListCashSummaryMovements(ListCashSummaryMovementsRequest) returns (ListCashSummaryMovementsResponse) {} + // Allocate Seller + rpc AllocateSeller(AllocateSellerRequest) returns (Empty) {} +} + +// Allocate Seller Request +message AllocateSellerRequest { + ClientRequest client_request = 1; + string pos_uuid = 2; + string sales_representative_uuid = 3; } // Payment Summary @@ -592,6 +603,30 @@ message AvailablePaymentMethod { Currency reference_currency = 13; } +// List discount schema for POS +message ListAvailableDiscountsRequest { + ClientRequest client_request = 1; + string pos_uuid = 2; + int32 page_size = 3; + string page_token = 4; +} + +// Discounts Response +message ListAvailableDiscountsResponse { + int64 record_count = 1; + repeated AvailableDiscount discounts = 2; + string next_page_token = 3; +} + +// Available Discounts +message AvailableDiscount { + int32 id = 2; + string uuid = 3; + string key = 4; + string name = 5; + bool is_pos_required_pin = 6; +} + // Available Document Type message AvailableDocumentType { int32 id = 2; @@ -655,7 +690,7 @@ message ListAvailableDocumentTypesResponse { string next_page_token = 3; } -// List warehouses for POS +// List price list for POS message ListAvailablePriceListRequest { ClientRequest client_request = 1; string pos_uuid = 2; @@ -809,6 +844,8 @@ message PointOfSales { string default_withdrawal_charge_uuid = 33; Decimal maximum_discount_allowed = 34; Decimal write_off_amount_tolerance = 35; + bool is_allows_allocate_seller = 36; + bool is_allows_concurrent_use = 37; } // Request for create a order