Skip to content

Commit

Permalink
Add service for allocate seller
Browse files Browse the repository at this point in the history
  • Loading branch information
yamelsenih committed Nov 15, 2021
1 parent ca5644d commit 94b32da
Show file tree
Hide file tree
Showing 2 changed files with 133 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -1426,6 +1428,75 @@ public void listCashSummaryMovements(ListCashSummaryMovementsRequest request, St
}
}

@Override
public void allocateSeller(AllocateSellerRequest request, StreamObserver<Empty> 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<Integer> 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
Expand All @@ -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);
Expand Down Expand Up @@ -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;
Expand All @@ -2898,13 +2973,20 @@ private ListOrdersResponse.Builder listOrders(ListOrdersRequest request) {
List<Object> parameters = new ArrayList<Object>();
// 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);
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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<Object> 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)
Expand Down
39 changes: 38 additions & 1 deletion src/main/proto/point_of_sales.proto
Original file line number Diff line number Diff line change
Expand Up @@ -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) {}
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 94b32da

Please sign in to comment.