Commit 3716ef27 authored by Jose Hugo Torres's avatar Jose Hugo Torres
Browse files

Implementado subtotal e impuestos.

parent 173f8f39
{
"editor.formatOnType": true,
"[lisp]": {
"editor.wordSeparators": "`|;:'\",()"
}
}
\ No newline at end of file
{
"operationConfiguration": {
"forceQuantityInput": false,
"pricePositionLimit": 10000,
"pricePositionZeroAllowed": true,
"priceTransactionLimit": -1,
"priceDifferencePercentPositionLimit": 100,
"priceDifferenceAbsolutePositionLimit": 999999,
"priceDifferenceLimitExceedAction": "Warn",
"priceNegDifferenceLimitExceedAction": "Warn",
"closeCurrent": "Required",
"closePrevious": "Required",
"filterResult": true,
"allowedWithWeight": true,
"allowedWithLength": true,
"allowedWithArea": true,
"allowedWithVolume": true,
"allowedWithMeasure": true,
"maximumQuantity": 999999,
"minimumQuantity": 1,
"quantityInputOrder": "BeforeOrAfter",
"priceInputOrder": "BeforeOrAfter",
"quantityLimitExceedAction": "Warn",
"amountLimitExceedAction": "Warn",
"weightUnitFactor": 0,
"measureUnitFactor": 0,
"priceDeviationType": "All",
"priceNegDeviationType": "All",
"xXCustom08": "string",
"xXCustom10": "string",
"xXCustom09": "string",
"xXCustom07": "string",
"xXCustom05": "string",
"xXCustom06": "string",
"xXCustom11": "string",
"xXCustom12": "string",
"xXCustom13": "string",
"xXCustom14": "string",
"xXCustom15": "string",
"xXCustom03": "string",
"xXCustom02": "string",
"xXCustom04": "string",
"xXCustom01": "string"
},
"barcode": "7703100270009",
"salesRestrictionsCheckNeeded": false,
"priceVariant": "Actual",
"itemEntryConfig": {
"forceQuantityInput": true,
"pricePositionLimit": 0,
"pricePositionZeroAllowed": true,
"priceTransactionLimit": 0,
"priceDifferencePercentPositionLimit": 0,
"priceDifferenceAbsolutePositionLimit": 0,
"priceDifferenceLimitExceedAction": "Warn",
"priceNegDifferenceLimitExceedAction": "Warn",
"closeCurrent": "Required",
"closePrevious": "Required",
"filterResult": true,
"allowedWithWeight": true,
"allowedWithLength": true,
"allowedWithArea": true,
"allowedWithVolume": true,
"allowedWithMeasure": true,
"maximumQuantity": 0,
"minimumQuantity": 0,
"quantityInputOrder": "BeforeOrAfter",
"priceInputOrder": "BeforeOrAfter",
"quantityLimitExceedAction": "Warn",
"weightUnitFactor": 0,
"measureUnitFactor": 0,
"priceDeviationType": "All",
"priceNegDeviationType": "All",
"xXCustom01": "string",
"xXCustom02": "string",
"xXCustom03": "string",
"xXCustom04": "string",
"xXCustom05": "string",
"xXCustom06": "string",
"xXCustom07": "string",
"xXCustom08": "string",
"xXCustom09": "string",
"xXCustom10": "string",
"xXCustom11": "string",
"xXCustom12": "string",
"xXCustom13": "string",
"xXCustom14": "string",
"xXCustom15": "string"
},
"entryMethodCode": "Keyed",
"keyedOnline": true
}
\ No newline at end of file
......@@ -25,10 +25,10 @@ namespace EvaPOS_API_FRAME.Adaptadores
public DTOBase ObtieneDTO(int idSesion, TipoMensaje tipoMensaje, XmlElement docXml)
{
XmlNode? nodo = docXml.SelectSingleNode(NombreElementoXMLDatos);
XmlSerializer serializer = new XmlSerializer(typeof(AddItemRequest));
AddItemRequest dto;
XmlSerializer serializer = new XmlSerializer(typeof(AddItemRequestDTO));
AddItemRequestDTO dto;
XmlNodeReader elemento = new XmlNodeReader(nodo);
dto = (AddItemRequest)serializer.Deserialize(elemento);
dto = (AddItemRequestDTO)serializer.Deserialize(elemento);
if (nodo == null)
......
......@@ -18,7 +18,7 @@ namespace EvaPOS_API_FRAME.Comandos
/// <summary>
/// DTO con solicitud.
/// </summary>
public AddItemRequest Request { get; private set; }
public AddItemRequestDTO Request { get; private set; }
/// <summary>
/// Procesa y responde ReportStatusEventsRequest.
......@@ -77,7 +77,7 @@ namespace EvaPOS_API_FRAME.Comandos
public void CargaDTO(DTOBase addItemRequestDTO)
{
Request = (AddItemRequest)addItemRequestDTO;
Request = (AddItemRequestDTO)addItemRequestDTO;
}
}
......
......@@ -25,7 +25,7 @@ namespace EvaPOS_API_FRAME.Comandos
/// <summary>
/// DTO con solicitud.
/// </summary>
public AddItemRequest Request { get; private set; }
public AddItemRequestDTO Request { get; private set; }
/// <summary>
/// Procesa y responde ReportStatusEventsRequest.
......@@ -83,7 +83,7 @@ namespace EvaPOS_API_FRAME.Comandos
public void CargaDTO(DTOBase addItemRequestDTO)
{
Request = (AddItemRequest)addItemRequestDTO;
Request = (AddItemRequestDTO)addItemRequestDTO;
}
}
......
......@@ -31,7 +31,7 @@ namespace gatewayGK.ComandosGk
/// <summary>
/// DTO con solicitud.
/// </summary>
public AddItemRequest Request { get; private set; }
public AddItemRequestDTO Request { get; private set; }
/// <summary>
/// Procesa y responde ReportStatusEventsRequest.
......@@ -210,7 +210,7 @@ namespace gatewayGK.ComandosGk
var regularUnitPriceTrans = regularUnitPrice.ToString();
Log.Debug($"Transaction ID: {transactionId} ");
Entorno<EntornoGK>.Instancia.getDatos().TransactionID = transactionId;
Entorno<EntornoGK>.Instancia.get().TransactionID = transactionId;
string tomarNombreCorto = "";
//Valores que se mandan en chec
......@@ -247,7 +247,7 @@ namespace gatewayGK.ComandosGk
public void CargaDTO(DTOBase addItemRequestDTO)
{
Request = (AddItemRequest)addItemRequestDTO;
Request = (AddItemRequestDTO)addItemRequestDTO;
}
}
}
using EvaPOS_API_FRAME.DTO.Intercambio;
using EvaPOS_API_FRAME.DTO;
using EvaPOS_API_FRAME.RespuestasXML;
using EvaPosSrvDTO;
using EvaPosSrvResp;
using Serilog;
using System.Globalization;
using RestSharp;
using gatewayGK.POSGk;
using System.Text.Json;
using Newtonsoft.Json.Linq;
using GatewaySCO;
namespace gatewayGK.ComandosGk
{
///<summary>
/// Procesa solicitudes del primer item agregado.
/// </summary>
// TODO - unificar uso de libreria json: using System.Text.Json OR using Newtonsoft.Json.Linq;
//
public class AddItemRequestCmdGk2 : IComando
{
public string Referencia { get; set; } = "scsns:AddItem";
/// <summary>
/// DTO con solicitud.
/// </summary>
public AddItemRequestDTO Request { get; private set; }
/// <summary>
/// Url servicio autenticación Gk.
/// </summary>
private string _urlRegisterItem = Entorno<EntornoGK>.Instancia.get().UrlBase
+ "/com.gk_software.pos.api.service.transaction.LineItemService/registerLineItem";
/// <summary>
/// Procesa agregar item y responde ReportStatusEventsRequest.
/// </summary>
public Respuestas Ejecutar()
{
Log.Debug("Cmd AddItemRequestDTO ejecutado. AddItemRequest : {AddItemRequest}", Request.RequestID);
//int requestIdGuardado = RequestIdGuardado();
POSBCStatusEvent posbcStatus = null;
TransactionStatusEvent transactionStatusEvent = null;
POSReceiptEventHeaderResponse posReceiptEventHeader = null;
POSReceiptEvent pOSReceiptEvent = null;
TotalsEventResponse totalEvent = null;
AddItemResponse itemResponse = null;
//Variables para manejar las respuestas de error - (item con peso, no se encuentra el item,item requiere cantidad)
AddItemResponseError addItemResponseError = null;
Respuestas respuesta = null;
Venta venta = null;
//Variables del adaptador de entrada - addItem
int requestId = Request.RequestID;
long barCode = 0;
int quantity = Request.ItemIdentifier.Quantity == 0 ? 1 : Request.ItemIdentifier.Quantity;
bool cancelItem = Request.ItemIdentifier.VoidFlag;
double peso = Request.ItemIdentifier.ScaleWeight;
//Logica para validar el valor del codigo de barras
//Si es un item de busqueda o imagen, trae el valor KeyedItemID, si es escaneado trae barcode
if (Request.ItemIdentifier.BarCode != null)
barCode = Request.ItemIdentifier.BarCode.ScanDataLabel;
else
barCode = Request.ItemIdentifier.KeyedItemID;
// --- cliente rest.
var options = new RestClientOptions()
{
// TODO manejar el timeout como un parámetro de configuración.
MaxTimeout = -1,
RemoteCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true
};
string sessionId = Entorno<EntornoGK>.Instancia.get().posSessionId;
string cookieValue = $"sessionid={sessionId}";
var client = new RestClient(options);
var request = new RestRequest(_urlRegisterItem, Method.Post);
request.AddHeader("Accept", "application/json;Format=GK-PLAIN-JSON");
request.AddHeader("Content-Type", "application/json;Format=GK-PLAIN-JSON");
request.AddHeader("_pos_session_", sessionId);
request.AddHeader("Cookie", cookieValue);
// Record inicializado por nombre de propiedades.
var operationConfiguration = new operationConfiguration { pricePositionLimit = 10000000 }; // TODO - controlar este valor, como sacarlo del Smart POS.
var datosItem = new registerLineItemReq
{
barcode = barCode.ToString(),
entryMethodCode = "Keyed",
operationConfiguration = operationConfiguration
};
string json = JsonSerializer.Serialize(datosItem);
request.AddJsonBody(json);
Log.Verbose(">> GK registerLineItem - body {json}", json);
Log.Information(">> GK registerLineItem - posSessionId {posSessionId}, barCode {barCode}", sessionId, barCode);
RestResponse response = client.Execute(request);
System.Net.HttpStatusCode statusCode = response.StatusCode;
int numericStatusCode = (int)statusCode;
Log.Debug("<< GK registerLineItem - StatusCode {StatusCode}, numericStatusCode {numericStatusCode}", response.StatusCode, numericStatusCode);
Log.Verbose("<< GK registerLineItem - Headers {Headers}", response.Headers);
Log.Verbose("<< GK registerLineItem - Content {Content}", response.Content);
if (response.IsSuccessful == false)
{
if (response.StatusCode == System.Net.HttpStatusCode.InternalServerError)
{
var jsonRespErr = System.Text.Json.JsonSerializer.Deserialize<JsonElement>(response.Content
?? throw new ApplicationException("Null content in response to POST method."));
var errorCode = jsonRespErr.GetProperty("errorCode").GetProperty("errorCode").GetString();
var message = jsonRespErr.GetProperty("errorCode").GetProperty("message").GetString();
var posItemID = jsonRespErr.GetProperty("additionalContextInfoMap").GetProperty("posItemID").GetString();
Log.Warning("<< GK registerLineItem - errorCode {errorCode}, message {message}, posItemID {posItemID}",
errorCode, message, posItemID);
// Item no encontrado.
if (errorCode == "GKR-POS-002075")
{
addItemResponseError = new AddItemResponseError(1,
TipoMensaje.Resp, requestId, "Articulo no encontrado", "ITEM_NOT_FOUND");
respuesta = new Respuestas { addItemResponseError };
return respuesta;
}
}
// TODO - interpretar la respuesta par amostrar el mensaje de error, ejemplo:
// {"errorCode":{"errorCode":"GKR-POS-000001","message":"Invalid session","messageKey":"com.gk_software.pos.utils.error.ErrorCodeMessages.MSG_INVALID_SESSION","arguments":[]},"timestamp":"2023-08-04T07:16:57.066","additionalContextInfoMap":{}}
Log.Error("<< GK registerLineItem failed: StatusCode {StatusCode}, Content {Content}",
response.StatusCode, response.Content);
throw new ApplicationException("Servicio POST 'registerLineItem' en error.");
}
var jsonResp = System.Text.Json.JsonSerializer.Deserialize<JsonElement>(response.Content
?? throw new ApplicationException("Null content in response to POST method."));
var statusOk = jsonResp.GetProperty("statusOk").GetBoolean();
// La respuesta puede ser IsSuccessful == true pero aún así se debe validar si hay
// mas conediciones de falla o alertas asociadas al atrículo.
if (statusOk == false)
{
// var errorCode = jsonResp.GetProperty("failure").GetProperty("errorCode").GetString();
// var message = jsonResp.GetProperty("failure").GetProperty("errorMessage").GetString();
// var posItemId = jsonResp.GetProperty("posItemId").GetString();
// var itemIdx = jsonResp.GetProperty("itemId").GetString();
// var itemName = jsonResp.GetProperty("itemName").GetString();
// Log.Warning("<< GK registerLineItem - errorCode {errorCode}, message {message}, posItemID {posItemID}, itemId {itemId}, itemName {itemName}",
// errorCode, message, posItemId, itemIdx, itemName);
Log.Warning("<< GK registerLineItem - statusOk {statusOk}, errorCode {errorCode}, message {message}", statusOk);
// Position limit exceeded - Price too high!
// if (errorCode == "GKR-POS-003031")
// {
// addItemResponseError = new AddItemResponseError(1,
// TipoMensaje.Resp, requestId, "Precio muy alto, límite excedido", "ITEM_NOT_FOUND");
// respuesta = new Respuestas { addItemResponseError };
// return respuesta;
// }
addItemResponseError = new AddItemResponseError(1,
TipoMensaje.Resp, requestId, "Error no reconocido", "ITEM_NOT_FOUND");
respuesta = new Respuestas { addItemResponseError };
return respuesta;
}
var options2 = new JsonSerializerOptions
{
PropertyNameCaseInsensitive = true
};
var jObject = JObject.Parse(response.Content);
var jsonString = jObject["primaryEntry"].ToString();
var jsonObject = JsonSerializer.Deserialize<primaryEntry>(jsonString, options2);
var transactionId = jsonObject.transaction.key.transactionID;
var addedOrModifiedLineItems = jsonObject.addedOrModifiedLineItems;
var itemId = addedOrModifiedLineItems[0].saleReturnLineItemList[0].itemID;
var regularUnitPrice = addedOrModifiedLineItems[0].saleReturnLineItemList[0].regularUnitPrice;
var quantityService = addedOrModifiedLineItems[0].saleReturnLineItemList[0].quantity;
var units = addedOrModifiedLineItems[0].saleReturnLineItemList[0].units;
var textName = addedOrModifiedLineItems[0].saleReturnLineItemList[0].receiptText;
//Pasarlo a string
var regularUnitPriceTrans = regularUnitPrice.ToString();
Log.Debug("""
<< GK registerLineItemTransaction ID:
transactionId {transactionId},
addedOrModifiedLineItems {addedOrModifiedLineItems},
itemId {itemId},
regularUnitPrice {regularUnitPrice},
quantityService {quantityService},
units {units},
textName {textName}
""",
transactionId,
addedOrModifiedLineItems,
itemId,
regularUnitPrice,
quantityService,
units,
textName
);
Entorno<EntornoGK>.Instancia.get().TransactionID = transactionId;
string tomarNombreCorto = "";
//Valores que se mandan en chec
var date = DateTime.Now.ToString("dd/MM/yyyy");
CultureInfo culture = new CultureInfo("en-US");
culture.DateTimeFormat.AMDesignator = "AM";
culture.DateTimeFormat.PMDesignator = "PM";
var time = DateTime.Now.ToString("hh:mm tt", culture);
transactionStatusEvent = new TransactionStatusEvent(1, TipoMensaje.Event, requestId, "TRANSACTION_START", 1, "regularSale", "sales", date, time);
pOSReceiptEvent = new POSReceiptEvent(1, TipoMensaje.Event, requestId, "Customer", 0, "Body", requestId, 1, "center", "LineItem", "ItemSale", itemId + " " + textName + " " + quantityService + " " + regularUnitPrice, "Add");
posReceiptEventHeader = new POSReceiptEventHeaderResponse(1, TipoMensaje.Event, requestId);
totalEvent = new TotalsEventResponse(1, TipoMensaje.Event, requestId, regularUnitPriceTrans, regularUnitPriceTrans, regularUnitPriceTrans, regularUnitPriceTrans, "0.00", "0.00", "0.00", "0.00", "0.00", 1, 0, "0.00", "0.00");
itemResponse = new AddItemResponse(1, TipoMensaje.Resp, requestId, tomarNombreCorto, "false", "false", "true", "1234", "ScannedItemCode", "3200", 1, "3200", 0, "0.00", 0, 1, 0, "unit", "false", 0, "false", "false", "true", "true");
respuesta = new Respuestas { transactionStatusEvent, posReceiptEventHeader, pOSReceiptEvent, totalEvent, itemResponse };
return respuesta;
}
public IComando CreaCopia()
{
return (AddItemRequestCmdGk)this.MemberwiseClone();
}
public void CargaDTO(DTOBase addItemRequestDTO)
{
Request = (AddItemRequestDTO)addItemRequestDTO;
}
}
}
using EvaPOS_API_FRAME.DTO.Intercambio;
using EvaPOS_API_FRAME.DTO;
using EvaPOS_API_FRAME.RespuestasXML;
using EvaPosSrvDTO;
using EvaPosSrvResp;
using Serilog;
using System.Globalization;
using RestSharp;
using gatewayGK.POSGk;
using System.Text.Json;
using Newtonsoft.Json.Linq;
using GatewaySCO;
using Newtonsoft.Json;
using IO.Swagger.Model;
namespace gatewayGK.ComandosGk
{
///<summary>
/// Procesa solicitudes del primer item agregado.
/// </summary>
// TODO - unificar uso de libreria json: using System.Text.Json OR using Newtonsoft.Json.Linq;
//
public class AddItemRequestCmdGk3 : IComando
{
public string Referencia { get; set; } = "scsns:AddItem";
/// <summary>
/// DTO con solicitud.
/// </summary>
public AddItemRequestDTO Request { get; private set; }
/// <summary>
/// Url servicio autenticación Gk.
/// </summary>
private string _urlRegisterItem = Entorno<EntornoGK>.Instancia.get().UrlBase
+ "/com.gk_software.pos.api.service.transaction.LineItemService/registerLineItem";
/// <summary>
/// Procesa agregar item y responde ReportStatusEventsRequest.
/// </summary>
public Respuestas Ejecutar()
{
Log.Debug("Cmd AddItemRequestCmdGk3 ejecutado. AddItemRequest : {AddItemRequest}", Request.RequestID);
//int requestIdGuardado = RequestIdGuardado();
POSBCStatusEvent posbcStatus = null;
TransactionStatusEvent transactionStatusEvent = null;
POSReceiptEventHeaderResponse posReceiptEventHeader = null;
POSReceiptEvent pOSReceiptEvent = null;
TotalsEventResponse totalEvent = null;
AddItemResponse itemResponse = null;
//Variables para manejar las respuestas de error - (item con peso, no se encuentra el item,item requiere cantidad)
AddItemResponseError addItemResponseError = null;
Respuestas respuesta = null;
Venta venta = null;
//Variables del adaptador de entrada - addItem
int requestId = Request.RequestID;
long barCode = 0;
int quantity = Request.ItemIdentifier.Quantity == 0 ? 1 : Request.ItemIdentifier.Quantity;
bool cancelItem = Request.ItemIdentifier.VoidFlag;
double peso = Request.ItemIdentifier.ScaleWeight;
//Logica para validar el valor del codigo de barras
//Si es un item de busqueda o imagen, trae el valor KeyedItemID, si es escaneado trae barcode
if (Request.ItemIdentifier.BarCode != null)
barCode = Request.ItemIdentifier.BarCode.ScanDataLabel;
else
barCode = Request.ItemIdentifier.KeyedItemID;
// --- cliente rest.
var options = new RestClientOptions()
{
// TODO manejar el timeout como un parámetro de configuración.
MaxTimeout = -1,
RemoteCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true
};
string sessionId = Entorno<EntornoGK>.Instancia.get().posSessionId;
string cookieValue = $"sessionid={sessionId}";
var client = new RestClient(options);
var request = new RestRequest(_urlRegisterItem, Method.Post);
request.AddHeader("Accept", "application/json;Format=GK-PLAIN-JSON");
request.AddHeader("Content-Type", "application/json;Format=GK-PLAIN-JSON");
request.AddHeader("_pos_session_", sessionId);
request.AddHeader("Cookie", cookieValue);
// Record inicializado por nombre de propiedades.
var operationConfiguration = new operationConfiguration { pricePositionLimit = 10000000 }; // TODO - controlar este valor, como sacarlo del Smart POS.
var datosItem = new registerLineItemReq
{
barcode = barCode.ToString(),
entryMethodCode = "Keyed",
operationConfiguration = operationConfiguration
};
string json = System.Text.Json.JsonSerializer.Serialize(datosItem);
request.AddJsonBody(json);
Log.Verbose(">> GK registerLineItem - sessionId {sessionId}", sessionId);
Log.Verbose(">> GK registerLineItem - body {body}", json);
Log.Information(">> GK registerLineItem - barCode {barCode}", barCode);
RestResponse response = client.Execute(request);
System.Net.HttpStatusCode statusCode = response.StatusCode;
int numericStatusCode = (int)statusCode;
Log.Information("<< GK registerLineItem - Http.StatusCode {StatusCode}, Http.numericStatusCode {numericStatusCode}", response.StatusCode, numericStatusCode);
Log.Verbose("<< GK registerLineItem - Headers {Headers}", response.Headers);
Log.Verbose("<< GK registerLineItem - Content {Content}", response.Content);
if (response.IsSuccessful == false)
{
if (response.StatusCode == System.Net.HttpStatusCode.InternalServerError)
{
var jsonRespErr = System.Text.Json.JsonSerializer.Deserialize<JsonElement>(response.Content
?? throw new ApplicationException("Null content in response to POST method."));
var errorCode = jsonRespErr.GetProperty("errorCode").GetProperty("errorCode").GetString();
var message = jsonRespErr.GetProperty("errorCode").GetProperty("message").GetString();
var posItemID = jsonRespErr.GetProperty("additionalContextInfoMap").GetProperty("posItemID").GetString();
Log.Warning("<< GK registerLineItem - errorCode {errorCode}, message {message}, posItemID {posItemID}",
errorCode, message, posItemID);
// Item no encontrado.
if (errorCode == "GKR-POS-002075")
{
addItemResponseError = new AddItemResponseError(1,
TipoMensaje.Resp, requestId, "Articulo no encontrado", "ITEM_NOT_FOUND");
respuesta = new Respuestas { addItemResponseError };
return respuesta;
}
}
// TODO - interpretar la respuesta par amostrar el mensaje de error, ejemplo:
// {"errorCode":{"errorCode":"GKR-POS-000001","message":"Invalid session","messageKey":"com.gk_software.pos.utils.error.ErrorCodeMessages.MSG_INVALID_SESSION","arguments":[]},"timestamp":"2023-08-04T07:16:57.066","additionalContextInfoMap":{}}
Log.Error("<< GK registerLineItem failed: StatusCode {StatusCode}, Content {Content}",
response.StatusCode, response.Content);
throw new ApplicationException("Servicio POST 'registerLineItem' en error.");
}
// En este punto, la respuesta es exitosa a nivel de http.
var respTransacAddItem = Newtonsoft.Json.JsonConvert.DeserializeObject<ComGkSoftwarePosApiServiceTransactionRegistrationResult>(
response.Content ?? throw new ApplicationException("Null content in response to POST method."))
?? throw new ApplicationException("Null content in response to POST method.");
// Log.Verbose("<< GK registerLineItem: respNewtonsoft {respNewtonsoft}", respTransacAddItem);
// La respuesta puede ser IsSuccessful == true pero aún así se debe validar si hay
// mas conediciones de falla o alertas asociadas al atrículo.
if (respTransacAddItem.StatusOk == false)
{
Log.Warning("<< GK registerLineItem - statusOk {statusOk}", respTransacAddItem.StatusOk);
// Position limit exceeded - Price too high!
// if (errorCode == "GKR-POS-003031")
// {
// addItemResponseError = new AddItemResponseError(1,
// TipoMensaje.Resp, requestId, "Precio muy alto, límite excedido", "ITEM_NOT_FOUND");
// respuesta = new Respuestas { addItemResponseError };
// return respuesta;
// }
addItemResponseError = new AddItemResponseError(1,
TipoMensaje.Resp, requestId, "Error no reconocido", "ITEM_NOT_FOUND");
respuesta = new Respuestas { addItemResponseError };
return respuesta;
}
// En este punto statusOk == True : el item ingreso a la transacción de venta.
var transactionId = respTransacAddItem.PrimaryEntry.Transaction.Key.TransactionID;
var businessUnitGroupID = respTransacAddItem.PrimaryEntry.Transaction.Key.BusinessUnitGroupID;
var addedOrModifiedLineItems = respTransacAddItem.PrimaryEntry.AddedOrModifiedLineItems[0].SaleReturnLineItemList[0];
var itemId = addedOrModifiedLineItems.ItemID;
var regularUnitPrice = addedOrModifiedLineItems.RegularUnitPrice;
var quantityService = addedOrModifiedLineItems.Quantity;
var units = addedOrModifiedLineItems.Units;
var receiptText = addedOrModifiedLineItems.ReceiptText;
var registrationNumber = addedOrModifiedLineItems.RegistrationNumber;
var extensionSequenceNumber = addedOrModifiedLineItems.SaleReturnLineItemExtensionList[0].Key.ExtensionSequenceNumber;
var retailTransactionList = respTransacAddItem.PrimaryEntry.Transaction.RetailTransactionList;
var dtoRetailTransactionTotalList = retailTransactionList[0].RetailTransactionTotalList;
double? total = 0.0;
double? subtotal = 0.0;
double? subtotalDcto = 0.0;
// Recorrer lista de totales y sacar valores
foreach (var tipoTotal in dtoRetailTransactionTotalList)
{
var k = tipoTotal.Key;
var valor = tipoTotal.Amount;
switch (k.TransactionTotalTypeCode)
{
case "TOTAL":
total = valor;
break;
case "SUBTOTAL":
subtotal = valor;
break;
case "SUBTOTAL_DISCOUNT":
subtotalDcto = valor;
break;
default:
break;
// throw new ApplicationException("Null content in response to POST method (TransactionTotalTypeCode).");
}
}
//Pasarlo a string
var regularUnitPriceTrans = regularUnitPrice.ToString();
Log.Debug("<< GK TransactionRegistrationResult: transactionId {transactionId}, itemId {itemId}, regularUnitPrice {regularUnitPrice}, quantityService {quantityService}, units {units}, textName {textName}",
transactionId,
itemId,
regularUnitPrice,
quantityService,
units,
receiptText
);
Log.Information(String.Format("{0,3} | {1,13} | {2,-20} | {3,3}| {4,-5:N2} | {5,12:N2} | {6,12:N2} | {7,12:N2} | {8,12:N2} | {9,3}",
addedOrModifiedLineItems.Key.RetailTransactionLineItemSequenceNumber,
registrationNumber,
receiptText,
addedOrModifiedLineItems.UnitOfMeasureCode,
addedOrModifiedLineItems.Quantity,
addedOrModifiedLineItems.ActualUnitPrice,
addedOrModifiedLineItems.ExtendedAmount,
addedOrModifiedLineItems.ExtendedDiscountAmount,
addedOrModifiedLineItems.GrandExtendedAmount,
addedOrModifiedLineItems.TaxGroupID
));
Log.Information(String.Format("\t\tSUBTOTAL: {0,12:N2} -- SUBTOTAL_DISCOUNT: {1,12:N2} -- TOTAL: {2,12:N2}",
subtotal, subtotalDcto, total));
Entorno<EntornoGK>.Instancia.get().TransactionID = transactionId;
Entorno<EntornoGK>.Instancia.get().BusinessUnitGroupID = businessUnitGroupID;
string tomarNombreCorto = "";
//Valores que se mandan en chec
var date = DateTime.Now.ToString("dd/MM/yyyy");
CultureInfo culture = new CultureInfo("en-US");
culture.DateTimeFormat.AMDesignator = "AM";
culture.DateTimeFormat.PMDesignator = "PM";
var time = DateTime.Now.ToString("hh:mm tt", culture);
transactionStatusEvent = new TransactionStatusEvent(1, TipoMensaje.Event, requestId, "TRANSACTION_START", 1, "regularSale", "sales", date, time);
pOSReceiptEvent = new POSReceiptEvent(1, TipoMensaje.Event, requestId, "Customer", 0, "Body", requestId, 1, "center", "LineItem", "ItemSale", itemId + " " + receiptText + " " + quantityService + " " + regularUnitPrice, "Add");
posReceiptEventHeader = new POSReceiptEventHeaderResponse(1, TipoMensaje.Event, requestId);
totalEvent = new TotalsEventResponse(1, TipoMensaje.Event, requestId, regularUnitPriceTrans, regularUnitPriceTrans, regularUnitPriceTrans, regularUnitPriceTrans, "0.00", "0.00", "0.00", "0.00", "0.00", 1, 0, "0.00", "0.00");
itemResponse = new AddItemResponse(1, TipoMensaje.Resp, requestId, tomarNombreCorto, "false", "false", "true", "1234", "ScannedItemCode", "3200", 1, "3200", 0, "0.00", 0, 1, 0, "unit", "false", 0, "false", "false", "true", "true");
respuesta = new Respuestas { transactionStatusEvent, posReceiptEventHeader, pOSReceiptEvent, totalEvent, itemResponse };
return respuesta;
}
public IComando CreaCopia()
{
return (AddItemRequestCmdGk)this.MemberwiseClone();
}
public void CargaDTO(DTOBase addItemRequestDTO)
{
Request = (AddItemRequestDTO)addItemRequestDTO;
}
}
}
using EvaPOS_API_FRAME.DTO.Intercambio;
using EvaPOS_API_FRAME.DTO;
using EvaPOS_API_FRAME.RespuestasXML;
using EvaPosSrvDTO;
using EvaPosSrvResp;
using Serilog;
using System.Globalization;
using RestSharp;
using gatewayGK.POSGk;
using System.Text.Json;
using Newtonsoft.Json.Linq;
using GatewaySCO;
using Newtonsoft.Json;
using IO.Swagger.Model;
namespace gatewayGK.ComandosGk
{
///<summary>
/// Calcular el impuesto de un item.
/// TODO - terminar esto.
/// </summary>
public class CalculateTaxtCmdGk : IComando
{
public string Referencia { get; set; } = "scsns:AddItem";
/// <summary>
/// DTO con solicitud.
/// </summary>
public AddItemRequestDTO Request { get; private set; }
/// <summary>
/// Url servicio autenticación Gk.
/// </summary>
private string _urlRegisterItem = Entorno<EntornoGK>.Instancia.get().UrlBase
+ "services/com.gk_software.pos.api.service.taxengine.TaxEngineService/calculateTax";
/// <summary>
/// Calcular impuestos.
/// </summary>
public Respuestas Ejecutar()
{
Log.Debug("Cmd CalculateTaxtCmdGk ejecutado. AddItemRequest : {AddItemRequest}", Request.RequestID);
//int requestIdGuardado = RequestIdGuardado();
POSBCStatusEvent posbcStatus = null;
TransactionStatusEvent transactionStatusEvent = null;
POSReceiptEventHeaderResponse posReceiptEventHeader = null;
POSReceiptEvent pOSReceiptEvent = null;
TotalsEventResponse totalEvent = null;
// Parámetros de invocación servicios web: TaxEngineServiceCalculateTaxAsync
// Var definición de esta clase para sus parámetros requeridos de inicialización.
ComGkSoftwareGkrApiTxpoolDtoTransaction dtoTransactionCalculateTax = new()
{
Key = new()
{
BusinessUnitGroupID = Entorno<EntornoGK>.Instancia.get().BusinessUnitGroupID,
TransactionID = ""
},
OperatorID = "",
WorkstationID = "",
BusinessUnitID = "",
BusinessDayDate = "",
SequenceNumber = 0,
TransactionTypeCode = "",
InternalSequenceNumber = 0,
FiscalFlag = true,
IsocurrencyCode = ""
};
//Variables para manejar las respuestas de error - (item con peso, no se encuentra el item,item requiere cantidad)
Respuestas respuesta = null;
//Variables del adaptador de entrada - addItem
int requestId = Request.RequestID;
// --- cliente rest.
var options = new RestClientOptions()
{
// TODO manejar el timeout como un parámetro de configuración.
MaxTimeout = -1,
RemoteCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true
};
string sessionId = Entorno<EntornoGK>.Instancia.get().posSessionId;
string cookieValue = $"sessionid={sessionId}";
var client = new RestClient(options);
var request = new RestRequest(_urlRegisterItem, Method.Post);
request.AddHeader("Accept", "application/json;Format=GK-PLAIN-JSON");
request.AddHeader("Content-Type", "application/json;Format=GK-PLAIN-JSON");
request.AddHeader("_pos_session_", sessionId);
request.AddHeader("Cookie", cookieValue);
// Record inicializado por nombre de propiedades.
dtoTransactionCalculateTax = new ComGkSoftwareGkrApiTxpoolDtoTransaction();
var key = new Key();
// TODO - usar newtonsoft
string json = System.Text.Json.JsonSerializer.Serialize(dtoTransactionCalculateTax);
request.AddJsonBody(json);
Log.Verbose(">> GK registerLineItem - sessionId {sessionId}", sessionId);
Log.Verbose(">> GK registerLineItem - body {body}", json);
Log.Information(">> GK calculateTax");
RestResponse response = client.Execute(request);
System.Net.HttpStatusCode statusCode = response.StatusCode;
int numericStatusCode = (int)statusCode;
Log.Information("<< GK registerLineItem - Http.StatusCode {StatusCode}, Http.numericStatusCode {numericStatusCode}", response.StatusCode, numericStatusCode);
Log.Verbose("<< GK registerLineItem - Headers {Headers}", response.Headers);
Log.Verbose("<< GK registerLineItem - Content {Content}", response.Content);
if (response.IsSuccessful == false)
{
if (response.StatusCode == System.Net.HttpStatusCode.InternalServerError)
{
var jsonRespErr = System.Text.Json.JsonSerializer.Deserialize<JsonElement>(response.Content
?? throw new ApplicationException("Null content in response to POST method."));
var errorCode = jsonRespErr.GetProperty("errorCode").GetProperty("errorCode").GetString();
var message = jsonRespErr.GetProperty("errorCode").GetProperty("message").GetString();
var posItemID = jsonRespErr.GetProperty("additionalContextInfoMap").GetProperty("posItemID").GetString();
Log.Warning("<< GK registerLineItem - errorCode {errorCode}, message {message}, posItemID {posItemID}",
errorCode, message, posItemID);
}
// TODO - interpretar la respuesta par amostrar el mensaje de error, ejemplo:
// {"errorCode":{"errorCode":"GKR-POS-000001","message":"Invalid session","messageKey":"com.gk_software.pos.utils.error.ErrorCodeMessages.MSG_INVALID_SESSION","arguments":[]},"timestamp":"2023-08-04T07:16:57.066","additionalContextInfoMap":{}}
Log.Error("<< GK registerLineItem failed: StatusCode {StatusCode}, Content {Content}",
response.StatusCode, response.Content);
throw new ApplicationException("Servicio POST 'registerLineItem' en error.");
}
// En este punto, la respuesta es exitosa a nivel de http.
var respTransacAddItem = Newtonsoft.Json.JsonConvert.DeserializeObject<ComGkSoftwarePosApiServiceTransactionRegistrationResult>(
response.Content ?? throw new ApplicationException("Null content in response to POST method."))
?? throw new ApplicationException("Null content in response to POST method.");
// Log.Verbose("<< GK registerLineItem: respNewtonsoft {respNewtonsoft}", respTransacAddItem);
// La respuesta puede ser IsSuccessful == true pero aún así se debe validar si hay
// mas conediciones de falla o alertas asociadas al atrículo.
if (respTransacAddItem.StatusOk == false)
{
Log.Warning("<< GK registerLineItem - statusOk {statusOk}", respTransacAddItem.StatusOk);
// TODO : esto no corresonde a mensaje a CHEC apropiado.
respuesta = new Respuestas { new AddItemResponseError(1,
TipoMensaje.Resp, requestId, "Error no reconocido", "ITEM_NOT_FOUND") };
return respuesta;
}
// En este punto statusOk == True : el item ingreso a la transacción de venta.
var transactionId = respTransacAddItem.PrimaryEntry.Transaction.Key.TransactionID;
var businessUnitGroupID = respTransacAddItem.PrimaryEntry.Transaction.Key.BusinessUnitGroupID;
var addedOrModifiedLineItems = respTransacAddItem.PrimaryEntry.AddedOrModifiedLineItems[0].SaleReturnLineItemList[0];
var itemId = addedOrModifiedLineItems.ItemID;
var regularUnitPrice = addedOrModifiedLineItems.RegularUnitPrice;
var quantityService = addedOrModifiedLineItems.Quantity;
var units = addedOrModifiedLineItems.Units;
var receiptText = addedOrModifiedLineItems.ReceiptText;
var registrationNumber = addedOrModifiedLineItems.RegistrationNumber;
var extensionSequenceNumber = addedOrModifiedLineItems.SaleReturnLineItemExtensionList[0].Key.ExtensionSequenceNumber;
var retailTransactionList = respTransacAddItem.PrimaryEntry.Transaction.RetailTransactionList;
var dtoRetailTransactionTotalList = retailTransactionList[0].RetailTransactionTotalList;
double? total = 0.0;
double? subtotal = 0.0;
double? subtotalDcto = 0.0;
//Pasarlo a string
var regularUnitPriceTrans = regularUnitPrice.ToString();
Log.Debug("<< GK TransactionRegistrationResult: transactionId {transactionId}, itemId {itemId}, regularUnitPrice {regularUnitPrice}, quantityService {quantityService}, units {units}, textName {textName}",
transactionId,
itemId,
regularUnitPrice,
quantityService,
units,
receiptText
);
Log.Information(String.Format("{0,3} | {1,13} | {2,-20} | {3,3}| {4,-5:N2} | {5,8:N2} | {6,12:N2} | {7,12:N2} | {8,12:N2} | {9,3}",
addedOrModifiedLineItems.Key.RetailTransactionLineItemSequenceNumber,
registrationNumber,
receiptText,
addedOrModifiedLineItems.UnitOfMeasureCode,
addedOrModifiedLineItems.Quantity,
addedOrModifiedLineItems.ActualUnitPrice,
addedOrModifiedLineItems.ExtendedAmount,
addedOrModifiedLineItems.ExtendedDiscountAmount,
addedOrModifiedLineItems.GrandExtendedAmount,
addedOrModifiedLineItems.TaxGroupID
));
Log.Information(String.Format("SUBTOTAL: {0,12:N2} // SUBTOTAL_DISCOUNT: {1,12:N2} // TOTAL: {2,12:N2}",
subtotal, subtotalDcto, total));
Entorno<EntornoGK>.Instancia.get().TransactionID = transactionId;
string tomarNombreCorto = "";
//Valores que se mandan en chec
var date = DateTime.Now.ToString("dd/MM/yyyy");
CultureInfo culture = new CultureInfo("en-US");
culture.DateTimeFormat.AMDesignator = "AM";
culture.DateTimeFormat.PMDesignator = "PM";
var time = DateTime.Now.ToString("hh:mm tt", culture);
transactionStatusEvent = new TransactionStatusEvent(1, TipoMensaje.Event, requestId, "TRANSACTION_START", 1, "regularSale", "sales", date, time);
pOSReceiptEvent = new POSReceiptEvent(1, TipoMensaje.Event, requestId, "Customer", 0, "Body", requestId, 1, "center", "LineItem", "ItemSale", itemId + " " + receiptText + " " + quantityService + " " + regularUnitPrice, "Add");
posReceiptEventHeader = new POSReceiptEventHeaderResponse(1, TipoMensaje.Event, requestId);
totalEvent = new TotalsEventResponse(1, TipoMensaje.Event, requestId, regularUnitPriceTrans, regularUnitPriceTrans, regularUnitPriceTrans, regularUnitPriceTrans, "0.00", "0.00", "0.00", "0.00", "0.00", 1, 0, "0.00", "0.00");
respuesta = new Respuestas { transactionStatusEvent, posReceiptEventHeader, pOSReceiptEvent, totalEvent };
return respuesta;
}
public IComando CreaCopia()
{
return (AddItemRequestCmdGk)this.MemberwiseClone();
}
public void CargaDTO(DTOBase addItemRequestDTO)
{
Request = (AddItemRequestDTO)addItemRequestDTO;
}
}
}
......@@ -5,13 +5,7 @@ using GatewaySCO;
using RestSharp;
using SCOGateway.POSGk;
using Serilog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;
......@@ -28,7 +22,8 @@ namespace gatewayGK.ComandosGk
/// <summary>
/// Url servicio autenticación Gk.
/// </summary>
public const string UrlLogin = ConstantesGK.UrlBaseMaquetaProd + "/com.gk_software.pos.api.service.session.PosSessionService/login";
private string _urlLogin = Entorno<EntornoGK>.Instancia.get().UrlBase
+ "/com.gk_software.pos.api.service.session.PosSessionService/login";
/// <summary>
/// Procesa y responde el login.
......@@ -37,49 +32,49 @@ namespace gatewayGK.ComandosGk
public Respuestas Ejecutar()
{
// Crea una instancia de IConfiguration para acceder a la configuración
IConfiguration configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.Build();
//Llamar valores del archivo de configuración
string retailStoreId = configuration["DataGK:RetailStoreId"];
string workstationId = configuration["DataGK:WorkstationId"];
string workstationAddress = configuration["DataGK:WorkstationAddress"];
string workstationTypeCode = configuration["DataGK:WorkstationTypeCode"];
string loginName = configuration["DataGK:LoginName"];
string businessUnitGroupID = configuration["DataGK:BusinessUnitGroupID"];
string tillID = configuration["DataGK:TillID"];
string password = configuration["DataGK:Password"];
string jSessionId = configuration["DataGK:SessionID"]; ;
string cookieValue = $"JSESSIONID={jSessionId}";
Respuestas respuestaChec = null;
string cookieValue = $"JSESSIONID=";
string banner =
"""
_____ _ _ ______ ____ _____ _ _____ _ __ _____ _ _____ ____ _____
/ ____ | | | | ____/ ____| / ____| | / ____| |/ / / ____| | | | __ \ / __ \ / ____|
| | | |__| | |__ | | ______ | | __| |___ ____ _ _ _ ______ | | __| ' / | (___ _ __ ___ __ _ _ __| |_ | |__) | | | | (___
| | | __ | __|| | |______| | | |_ | __\ \ /\ / / _` | | | | |______| | | |_ | < \___ \| '_ ` _ \ / _` | '__| __| | ___/| | | |\___ \
| |___ | | | | |___| |____ | |__| | |_ \ V V / (_| | |_| | | |__| | . \ ____) | | | | | | (_| | | | |_ | | | |__| |____) |
\_____ |_| |_|______\_____| \_____|\__| \_/\_/ \__,_|\__, | \_____|_|\_\ |_____/|_| |_| |_|\__,_|_| \__| |_| \____/|_____/
__/ |
|___/
""";
Log.Information(banner);
int terminalNumber = Request.TerminalNumber;
Log.Debug("Cmd InitializeRequestCmd ejecutado - Gk pruebas. Request id: {id}, terminal: {terminal}, recovery: {recovery}", Request.OperatorID, Request.TerminalNumber, Request.Recovery);
Log.Debug("Cmd InitializeRequestCmd ejecutado: OperatorID {OperatorID}, TerminalNumber {TerminalNumber}, Recovery {Recovery}", Request.OperatorID, Request.TerminalNumber, Request.Recovery);
// Contactar Smart POS Gk.
var options = new RestClientOptions(UrlLogin)
var options = new RestClientOptions()
{
// TODO manejar el timeout como un parámetro de configuración.
MaxTimeout = -1,
RemoteCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true
};
var client = new RestClient(options);
var request = new RestRequest(UrlLogin, Method.Post);
var request = new RestRequest(_urlLogin, Method.Post);
request.AddHeader("Accept", "application/json;Format=GK-PLAIN-JSON");
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Cookie", cookieValue);
var datosAutenticacion = new AutenticationReq
{
RetailStoreId = retailStoreId,
WorkstationId = workstationId,
WorkstationAddress = workstationAddress,
WorkstationTypeCode = workstationTypeCode,
LoginName = loginName,
Password = password,
RetailStoreId = Entorno<EntornoGK>.Instancia.get().ConfigGk.RetailStoreId,
WorkstationId = Entorno<EntornoGK>.Instancia.get().ConfigGk.WorkstationId,
WorkstationAddress = Entorno<EntornoGK>.Instancia.get().ConfigGk.WorkstationAddress,
WorkstationTypeCode = Entorno<EntornoGK>.Instancia.get().ConfigGk.WorkstationTypeCode,
LoginName = Entorno<EntornoGK>.Instancia.get().ConfigGk.LoginName,
Password = Entorno<EntornoGK>.Instancia.get().ConfigGk.Password,
TrainingMode = false,
FinalizeControlTransactionFlag = false,
UseLoginTypeTechnicalForLoginManager = false,
......@@ -87,8 +82,8 @@ namespace gatewayGK.ComandosGk
{
TillDoKey = new TillDoKey
{
BusinessUnitGroupID = businessUnitGroupID,
TillID = tillID
BusinessUnitGroupID = Entorno<EntornoGK>.Instancia.get().ConfigGk.BusinessUnitGroupID,
TillID = Entorno<EntornoGK>.Instancia.get().ConfigGk.TillID
}
}
};
......@@ -98,40 +93,43 @@ namespace gatewayGK.ComandosGk
LoginRequest = datosAutenticacion
};
string json = JsonSerializer.Serialize(loginRequestWrapper, new JsonSerializerOptions { WriteIndented = true });
string json = JsonSerializer.Serialize(loginRequestWrapper);
request.AddJsonBody(json);
Log.Information(">> GK login: LoginName {LoginName}, RetailStoreId {RetailStoreId}, WorkstationId {WorkstationId}",
datosAutenticacion.LoginName, datosAutenticacion.RetailStoreId, datosAutenticacion.WorkstationId);
var response = client.Execute(request);
if (response.IsSuccessful)
if (response.IsSuccessful == false)
{
Log.Debug($"Gk: Autenticate - POST - response {response}");
// TODO mejorar manejo como en Logout
Log.Error("<< GK login failed: StatusCode {StatusCode}, Content {Content}",
response.StatusCode, response.Content);
throw new ApplicationException("Servicio POST 'Login' en error.");
}
var autenticacionResp = JsonSerializer.Deserialize<AuthenticateResp>(response.Content);
Log.Debug("<< GK login - StatusCode {StatusCode}", response.StatusCode);
Log.Verbose("<< GK login - Headers {Headers}", response.Headers);
Log.Verbose("<< GK login - Content {Content}", response.Content);
var autenticacionResp = JsonSerializer.Deserialize<AuthenticateResp>(response.Content
?? throw new ApplicationException("Null content in response to POST method."))
?? throw new ApplicationException("authenticationResp object not found in response POST method.");
var transactionId = autenticacionResp.primaryEntry.transaction.key.transactionID;
var operatorID = autenticacionResp.primaryEntry.transaction.operatorID;
var posSessionId = autenticacionResp.posSessionId.id;
//var sessionId = autenticacionResp.primaryEntry.transaction.posSessionId.id;
Log.Debug($"Transaction ID: {transactionId}, operatorID: {operatorID} ");
// Salvar Transaccion y id de la session.
//Entorno<EntornoGK>.Instancia.getDatos().TransactionID = transactionId;
Entorno<EntornoGK>.Instancia.getDatos().posSessionId = posSessionId;
Entorno<EntornoGK>.Instancia.getDatos().SeccionId = jSessionId;
Entorno<EntornoGK>.Instancia.get().posSessionId = posSessionId;
Log.Information("<< GK login:operatorID {operatorID}, transactionId {transactionId}, posSessionId {posSessionId}",
operatorID, transactionId, Entorno<EntornoGK>.Instancia.get().posSessionId);
// Respuestas a SCO.
var posbcStatus1 = new POSBCStatusEvent(1, TipoMensaje.Event, "INFO", "CONNECTING_TO_POS", "Connecting to POS system");
var posbcStatus2 = new POSBCStatusEvent(1, TipoMensaje.Event, "INFO", "CONNECTED_TO_POS", "Connected to POS system");
var posbcStatus3 = new POSBCStatusEvent(1, TipoMensaje.Event, "INFO", "POS_RESOURCES_INITIALIZED", "POS Resources Initialized");
var inicializacionOk = new InitializeResponse(1, TipoMensaje.Resp, terminalNumber);
respuestaChec = new Respuestas { posbcStatus1, posbcStatus2, posbcStatus3, inicializacionOk };
}
else
{
Log.Error($"Failed to connect to GK web service: {response.StatusCode}");
Log.Error(response.Content);
throw new ApplicationException("Servicio POST 'Login' en error.");
}
Respuestas respuestaChec = new Respuestas { posbcStatus1, posbcStatus2, posbcStatus3, inicializacionOk };
return respuestaChec;
}
......
using EvaPOS_API_FRAME.DTO.Intercambio;
using EvaPOS_API_FRAME.DTO;
using EvaPOS_API_FRAME.RespuestasXML;
using EvaPosSrvDTO;
using EvaPosSrvResp;
using Serilog;
using System.Globalization;
using RestSharp;
using gatewayGK.POSGk;
using System.Text.Json;
using GatewaySCO;
using Newtonsoft.Json;
using IO.Swagger.Model;
using static IO.Swagger.Model.ComGkSoftwarePosApiModelConfigProcessActionPositionOperationConfig;
namespace gatewayGK.ComandosGk
{
///<summary>
/// Calcular el impuesto de un item.
/// TODO - terminar esto.
/// </summary>
public class SubtotalCalculationCmdGk : IComando
{
public string Referencia { get; set; } = "scsns:AddItem"; // <-- Arreglar Referencia
/// <summary>
/// DTO con solicitud.
/// </summary>
public AddItemRequestDTO Request { get; private set; } // <-- Buscar el correcto.
/// <summary>
/// Url servicio autenticación Gk.
/// </summary>
private readonly string _urlRequest = Entorno<EntornoGK>.Instancia.get().UrlBase
+ "/com.gk_software.pos.api.service.subtotal.SubtotalService/processSubtotalCalculation";
/// <summary>
/// Calcular subtotal.
/// </summary>
public Respuestas Ejecutar()
{
Log.Debug("Cmd SubtotalCalculationCmdGk ejecutado. RequestID : {RequestID}", Request.RequestID);
//int requestIdGuardado = RequestIdGuardado();
POSBCStatusEvent posbcStatus = null;
TransactionStatusEvent transactionStatusEvent = null;
POSReceiptEventHeaderResponse posReceiptEventHeader = null;
POSReceiptEvent pOSReceiptEvent = null;
TotalsEventResponse totalEvent = null;
// Objeto invocación servicio web, SubtotalServiceApi.cs
ComGkSoftwarePosApiModelConfigProcessActionPositionOperationConfig configReq = new(
false, //(bool? forceQuantityInput = default(bool?)
1000000000, //double? pricePositionLimit = default(double?)
true, //bool? pricePositionZeroAllowed = default(bool?)
-1.0, // double? priceTransactionLimit = default(double?)
100.0, //priceDifferencePercentPositionLimit = default(double?)
99999999.0, // priceDifferenceAbsolutePositionLimit = default(double?)
PriceDifferenceLimitExceedActionEnum.Authorize, //priceDifferenceLimitExceedAction = default(PriceDifferenceLimitExceedActionEnum)
PriceNegDifferenceLimitExceedActionEnum.Unchecked, // PriceNegDifferenceLimitExceedActionEnum priceNegDifferenceLimitExceedAction = default(PriceNegDifferenceLimitExceedActionEnum),
CloseCurrentEnum.Disabled, // CloseCurrentEnum closeCurrent = default(CloseCurrentEnum),
ClosePreviousEnum.Required, // ClosePreviousEnum closePrevious = default(ClosePreviousEnum),
false, // bool? filterResult = default(bool?),
false, // bool? allowedWithWeight = default(bool?),
false, // bool? allowedWithLength = default(bool?),
false, // bool? allowedWithArea = default(bool?),
false, // bool? allowedWithVolume = default(bool?),
false, // bool? allowedWithMeasure = default(bool?),
99999, // int? maximumQuantity = default(int?),
1, // int? minimumQuantity = default(int?),
QuantityInputOrderEnum.BeforeOrAfter, // QuantityInputOrderEnum quantityInputOrder = default(QuantityInputOrderEnum),
PriceInputOrderEnum.BeforeOrAfter, // PriceInputOrderEnum priceInputOrder = default(PriceInputOrderEnum),
QuantityLimitExceedActionEnum.Forbid, // QuantityLimitExceedActionEnum quantityLimitExceedAction = default(QuantityLimitExceedActionEnum),
AmountLimitExceedActionEnum.Forbid, // AmountLimitExceedActionEnum amountLimitExceedAction = default(AmountLimitExceedActionEnum),
0.0, // double? weightUnitFactor = default(double?),
0.0, // double? measureUnitFactor = default(double?),
PriceDeviationTypeEnum.All, // PriceDeviationTypeEnum priceDeviationType = default(PriceDeviationTypeEnum)
PriceNegDeviationTypeEnum.All, // PriceNegDeviationTypeEnum priceNegDeviationType = default(PriceNegDeviationTypeEnum),
"", "", "", "", "", "", "", "", "", "", "", "", "", "", "");
// string xXCustom08 = default(string), string xXCustom10 = default(string), string xXCustom09 = default(string), string xXCustom07 = default(string),
// string xXCustom05 = default(string), string xXCustom06 = default(string), string xXCustom11 = default(string), string xXCustom12 = default(string),
// string xXCustom13 = default(string), string xXCustom14 = default(string), string xXCustom15 = default(string), string xXCustom03 = default(string),
// string xXCustom02 = default(string), string xXCustom04 = default(string), string xXCustom01 = default(string))
// Objeto respuesta servicio web, SubtotalServiceApi.cs
ComGkSoftwarePosApiServiceTransactionSubtotalOperationResult result;
// Mensajes respuesta a CHEC.
Respuestas respuesta = null;
//Variables del adaptador de entrada - addItem
int requestId = Request.RequestID;
// --- cliente rest.
var options = new RestClientOptions()
{
// TODO manejar el timeout como un parámetro de configuración.
MaxTimeout = -1,
RemoteCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true
};
string sessionId = Entorno<EntornoGK>.Instancia.get().posSessionId;
string cookieValue = $"sessionid={sessionId}";
var client = new RestClient(options);
var request = new RestRequest(_urlRequest, Method.Post);
request.AddHeader("Accept", "application/json;Format=GK-PLAIN-JSON");
request.AddHeader("Content-Type", "application/json;Format=GK-PLAIN-JSON");
request.AddHeader("_pos_session_", sessionId);
request.AddHeader("Cookie", cookieValue);
// -- Inicializar request. Nada que inicializar.
string jsonReq = JsonConvert.SerializeObject(configReq);
string body = $"{{ \"com.gk_software.pos.api.model.config.process.action.PositionOperationConfig\": {jsonReq} }}";
request.AddJsonBody(body);
Log.Verbose(">> GK processSubtotalCalculation - sessionId {sessionId}", sessionId);
Log.Verbose(">> GK processSubtotalCalculation - body {body}", body);
Log.Information(">> GK processSubtotalCalculation");
RestResponse response = client.Execute(request);
System.Net.HttpStatusCode statusCode = response.StatusCode;
int numericStatusCode = (int)statusCode;
Log.Information("<< GK processSubtotalCalculation - Http.StatusCode {StatusCode}, Http.numericStatusCode {numericStatusCode}", response.StatusCode, numericStatusCode);
Log.Verbose("<< GK processSubtotalCalculation - Headers {Headers}", response.Headers);
Log.Verbose("<< GK processSubtotalCalculation - Content {Content}", response.Content);
if (response.IsSuccessful == false)
{
if (response.StatusCode == System.Net.HttpStatusCode.InternalServerError)
{
var jsonRespErr = System.Text.Json.JsonSerializer.Deserialize<JsonElement>(response.Content
?? throw new ApplicationException("Null content in response to POST method."));
var errorCode = jsonRespErr.GetProperty("errorCode").GetProperty("errorCode").GetString();
var message = jsonRespErr.GetProperty("errorCode").GetProperty("message").GetString();
var posItemID = jsonRespErr.GetProperty("additionalContextInfoMap").GetProperty("posItemID").GetString();
Log.Warning("<< GK processSubtotalCalculation - errorCode {errorCode}, message {message}, posItemID {posItemID}",
errorCode, message, posItemID);
}
Log.Error("<< GK processSubtotalCalculation failed: StatusCode {StatusCode}, Content {Content}",
response.StatusCode, response.Content);
throw new ApplicationException("Servicio POST 'processSubtotalCalculation' en error.");
}
// --- En este punto, la respuesta es exitosa a nivel de http.
result = Newtonsoft.Json.JsonConvert.DeserializeObject<ComGkSoftwarePosApiServiceTransactionSubtotalOperationResult>(
response.Content ?? throw new ApplicationException("Null content in response to POST method."))
?? throw new ApplicationException("Null content in response to POST method.");
// ------------------------------------------------------------------------------------
// En este punto statusOk == True : el item ingreso a la transacción de venta.
var transactionId = result.PrimaryEntry.Transaction.Key.TransactionID;
var businessUnitGroupID = result.PrimaryEntry.Transaction.Key.BusinessUnitGroupID;
var lineItemsList = result.PrimaryEntry.Transaction.RetailTransactionList[0].RetailTransactionLineItemList;
// Recorrer lista
Log.Information("<< GK processSubtotalCalculation: transactionId {transactionId}", transactionId);
Log.Information("-------------------------------------------------------------------------------------------------------------------------");
Log.Information(String.Format("{0,3} | {1,-13} | {2,-20} | {3,-3}| {4,-5} | {5,-12} | {6,-12} | {7,-12} | {8,-12} | {9,3}",
"#",
"positemID",
"receiptText",
"und",
"qntty",
"actlUntPrice",
"extnddAmount",
"extnddDiscnt",
"grndExtdAmnt",
"tax"
));
Log.Information("-------------------------------------------------------------------------------------------------------------------------");
bool encabezadoTaxImpreso = false;
foreach (var lineItem in lineItemsList)
{
//if (lineItem.SaleReturnLineItemList == null) continue;
var retailTransactionLineItemTypeCode = lineItem.RetailTransactionLineItemTypeCode;
Log.Debug("<< GK processSubtotalCalculation: transactionId {transactionId}, retailTransactionLineItemTypeCode {retailTransactionLineItemTypeCode}",
transactionId,
retailTransactionLineItemTypeCode
);
switch (retailTransactionLineItemTypeCode)
{
case "SR":
// transaction line item REGISTRO ITEM VENTA
var item = lineItem.SaleReturnLineItemList[0];
var positemID = item.PositemID;
var itemSequenceNumber = item.Key.RetailTransactionLineItemSequenceNumber;
var receiptText = item.ReceiptText;
var regularUnitPrice = item.RegularUnitPrice;
var actualUnitPrice = item.ActualUnitPrice;
var unitOfMeasureCode = item.UnitOfMeasureCode;
var quantity = item.Quantity;
var extendedAmount = item.ExtendedAmount;
var extendedDiscountAmount = item.ExtendedDiscountAmount;
var grandExtendedAmount = item.GrandExtendedAmount;
var taxLineItem = item.SaleReturnTaxLineItemList[0];
var taxReceiptPrintCode = taxLineItem.ReceiptPrintCode;
Log.Debug("<< GK processSubtotalCalculation: transactionId {transactionId}, itemId {itemId}, regularUnitPrice {regularUnitPrice}, quantity {quantity}, unitOfMeasureCode {unitOfMeasureCode}, receiptText {receiptText}",
transactionId,
positemID,
regularUnitPrice,
quantity,
unitOfMeasureCode,
receiptText
);
Log.Information(String.Format("{0,3} | {1,13} | {2,-20} | {3,3}| {4,-5:N2} | {5,12:N2} | {6,12:N2} | {7,12:N2} | {8,12:N2} | {9,3}",
itemSequenceNumber,
positemID,
receiptText,
unitOfMeasureCode,
quantity,
actualUnitPrice,
extendedAmount,
extendedDiscountAmount,
grandExtendedAmount,
taxReceiptPrintCode
));
break;
case "TX":
// transaction line item REGISTRO ITEM IMPUESTO
var taxLineItemList = lineItem.TaxLineItemList;
if (encabezadoTaxImpreso == false)
{
encabezadoTaxImpreso = true;
Log.Information("-------------------------------------------------------------------------------------------------------------------------");
Log.Information(String.Format("{0,3} | {1,6} | {2,12} | {3,12} | {4,12} | {5,8}",
"tax",
"%",
"taxAmount",
"taxablAmount",
"net",
"taxName"
));
Log.Information("-------------------------------------------------------------------------------------------------------------------------");
}
foreach (var taxLine in taxLineItemList)
{
var taxableAmount = taxLine.TaxableAmount;
var taxPercent = taxLine.TaxPercent;
var taxAmount = taxLine.TaxAmount;
var taxAuthorityName = taxLine.TaxAuthorityName;
var receiptPrintCode = taxLine.ReceiptPrintCode;
Log.Information(String.Format("{0,-3} | {1,6} | {2,12:N2} | {3,12:N2} | {4,12:N2} | {5,8}",
receiptPrintCode,
taxPercent,
taxAmount,
taxableAmount,
taxableAmount - taxAmount,
taxAuthorityName
));
}
break;
default:
break;
}
}
var retailTransactionList = result.PrimaryEntry.Transaction.RetailTransactionList;
var dtoRetailTransactionTotalList = retailTransactionList[0].RetailTransactionTotalList;
double? total = 0.0;
double? subtotal = 0.0;
double? subtotalDcto = 0.0;
// Recorrer lista de totales y sacar valores
foreach (var tipoTotal in dtoRetailTransactionTotalList)
{
var k = tipoTotal.Key;
var valor = tipoTotal.Amount;
switch (k.TransactionTotalTypeCode)
{
case "TOTAL":
total = valor;
break;
case "SUBTOTAL":
subtotal = valor;
break;
case "SUBTOTAL_DISCOUNT":
subtotalDcto = valor;
break;
default:
break;
// throw new ApplicationException("Null content in response to POST method (TransactionTotalTypeCode).");
}
}
Entorno<EntornoGK>.Instancia.get().TransactionID = transactionId;
Log.Information("-------------------------------------------------------------------------------------------------------------------------");
Log.Information(String.Format("\t\tSUBTOTAL: {0,12:N2} -- SUBTOTAL_DISCOUNT: {1,12:N2} -- TOTAL: {2,12:N2}",
subtotal, subtotalDcto, total));
Log.Information("-------------------------------------------------------------------------------------------------------------------------");
//Valores que se mandan en chec
var date = DateTime.Now.ToString("dd/MM/yyyy");
CultureInfo culture = new CultureInfo("en-US");
culture.DateTimeFormat.AMDesignator = "AM";
culture.DateTimeFormat.PMDesignator = "PM";
var time = DateTime.Now.ToString("hh:mm tt", culture);
transactionStatusEvent = new TransactionStatusEvent(1, TipoMensaje.Event, requestId, "TRANSACTION_START", 1, "regularSale", "sales", date, time);
pOSReceiptEvent = new POSReceiptEvent(1, TipoMensaje.Event, requestId, "Customer", 0, "Body", requestId, 1, "center", "LineItem", "ItemSale", "XXX", "Add");
posReceiptEventHeader = new POSReceiptEventHeaderResponse(1, TipoMensaje.Event, requestId);
totalEvent = new TotalsEventResponse(1, TipoMensaje.Event, requestId, "", "", "", "", "0.00", "0.00", "0.00", "0.00", "0.00", 1, 0, "0.00", "0.00");
respuesta = new Respuestas { transactionStatusEvent, posReceiptEventHeader, pOSReceiptEvent, totalEvent };
return respuesta;
}
public IComando CreaCopia()
{
return (AddItemRequestCmdGk)this.MemberwiseClone();
}
public void CargaDTO(DTOBase addItemRequestDTO)
{
Request = (AddItemRequestDTO)addItemRequestDTO;
}
}
}
using EvaPOS_API_FRAME.DTO;
using EvaPOS_API_FRAME.RespuestasXML.TerminateLane;
using EvaPosSrvDTO;
using EvaPosSrvResp;
using Serilog;
using GatewaySCO;
using RestSharp;
using SCOGateway.POSGk;
using System.Text.Json;
namespace gatewayGK.ComandosGk
{
/// <summary>
/// Comando para cerrar la lane
/// </summary>
public class TerminateRequestCmdGk : IComando
{
public string Referencia { get; set; } = "scsns:Terminate";
/// <summary>
/// DTO con solicitud.
/// </summary>
public TerminateRequestDTO Destroy { get; private set; }
private string _urlLogout = Entorno<EntornoGK>.Instancia.get().UrlBase
+ "/com.gk_software.pos.api.service.session.PosSessionService/logout";
/// <summary>
/// Procesa y responde el evento Terminar.
/// </summary>
public Respuestas Ejecutar()
{
Log.Debug("Cmd TerminateRequestDTO ejecutado. TerminateRequest : {TerminateRequest}", Destroy.DestroySession);
var requestId = Destroy.DestroySession;
// --- cliente rest.
string sessionId = Entorno<EntornoGK>.Instancia.get().posSessionId;
var options = new RestClientOptions()
{
// TODO manejar el timeout como un parámetro de configuración.
MaxTimeout = -1,
RemoteCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true
};
string cookieValue = $"sessionid={sessionId}";
var request = new RestRequest(_urlLogout, Method.Post);
request.AddHeader("Accept", "application/json;Format=GK-PLAIN-JSON");
request.AddHeader("Content-Type", "application/json");
request.AddHeader("_pos_session_", sessionId);
var logoutReq = new LogoutReq
{
PosSessionId = new PosSessionId
{
id = sessionId
}
};
string json = JsonSerializer.Serialize(logoutReq);
Log.Verbose(">> GK logout - body {json}", json);
request.AddJsonBody(json);
var client = new RestClient(options);
Log.Information(">> GK logout - posSessionId {posSessionId}", sessionId);
var response = client.Execute(request);
Log.Debug("<< GK Logout - StatusCode {StatusCode}", response.StatusCode);
Log.Verbose("<< GK Logout - Headers {Headers}", response.Headers);
Log.Verbose("<< GK Logout - Content {Content}", response.Content);
if (response.IsSuccessful == false)
{
// TODO - interpretar la respuesta par amostrar el mensaje de error, ejemplo:
// {"errorCode":{"errorCode":"GKR-POS-000001","message":"Invalid session","messageKey":"com.gk_software.pos.utils.error.ErrorCodeMessages.MSG_INVALID_SESSION","arguments":[]},"timestamp":"2023-08-04T07:16:57.066","additionalContextInfoMap":{}}
Log.Error("<< GK logout failed: StatusCode {StatusCode}, Content {Content}",
response.StatusCode, response.Content);
throw new ApplicationException("Servicio POST 'Logout' en error.");
}
// var logoutResp = JsonSerializer.Deserialize<LogoutResp>(response.Content
// ?? throw new ApplicationException("Null content in response to POST method."))
// ?? throw new ApplicationException("logoutResp object not found in response POST method.");
// var success = logoutResp.success;
// ---- Usando JsonElement
var jsonElement = System.Text.Json.JsonSerializer.Deserialize<JsonElement>(response.Content
?? throw new ApplicationException("Null content in response to POST method."));
var transactionID = jsonElement
.GetProperty("primaryEntry")
.GetProperty("transaction")
.GetProperty("key")
.GetProperty("transactionID")
.GetString();
var success = jsonElement
.GetProperty("success")
.GetBoolean();
if (success)
Entorno<EntornoGK>.Instancia.get().posSessionId = "";
Log.Information("<< GK logout - success {success}, transactionID {transactionID}",
success, transactionID);
TerminateResponse terminateResponse = new TerminateResponse(1, TipoMensaje.Resp, requestId);
return (new Respuestas { terminateResponse });
}
public IComando CreaCopia()
{
return (TerminateRequestCmdGk)this.MemberwiseClone();
}
public void CargaDTO(DTOBase terminateRequest)
{
Destroy = (TerminateRequestDTO)terminateRequest;
}
}
}
......@@ -42,12 +42,12 @@ namespace EvaPOS_API_FRAME.DTO
}
[XmlRoot(ElementName = "AddItemRequest")]
public class AddItemRequest : DTOBase
public class AddItemRequestDTO : DTOBase
{
public AddItemRequest(int idSesion, TipoMensaje tipo) : base(idSesion, tipo)
public AddItemRequestDTO(int idSesion, TipoMensaje tipo) : base(idSesion, tipo)
{
}
public AddItemRequest()
public AddItemRequestDTO()
{
}
......
......@@ -28,6 +28,8 @@ En la siguiente lista se presentan los parámetros de configuración definidos.
La clase `Config.cs` mantienen los valores permitidos a usar como parámetros predefinidos en el archivo de configuración de la aplicación.
Cada nuevo parámetro de configuración debe ser agregado a esta clase.
Otras secciones del programa pueden requerir validar los valores recibidos por la configuración y según estos valores tomar acción. La clase `Config` mantiene los valores permitidos.
Un uso interesante de esta clase es generar un lista o copia de estructura de archivo configuración de ejemplo para ayudar en la configuración de uno de estos y en tener la lista de valores permitidos en sus parámetros.
......@@ -49,7 +51,9 @@ La siguiente es la secuencia de pasos que sigue el programa para procesar una so
Para soportar un nuevo tipo de POS, los pasos son:
1. Definir parámetro de configuración que indica el tipo de POS. En la clase `Constantes.cs` crear una constante con el valor esperado en el archivo de configuración `appsettings.json`, por ejemplo `gk_test`.
2. Editar el archivo `appsettings.json` y asignar al parámetro `GatewayConfig`:`POS` el valor que identifica el tipo de POS, por ejemplo `gk_test`.
1. Si es necesario, crear una clase con parémtros particulares de configuración para la nueva POS, por ejemplo, una clase `ConfigGk` para los parémtros propios de la POS Gk.
2. Crear en el archivo de configuración una sección para estos parámetros de configuración.
2. Editar el archivo `appsettings.json` y asignar al parámetro `GatewayConfig`:`POS` el valor que identifica el tipo de POS, por ejemplo `gk_test`. Agregar la sección particular de la nueva POS si es el caso, según se indica en el paso anterior.
3. Crear una clase factory de directorio de comandos implementando `IDispensaDirectorioCmds`. Nombrar la clase `DispensaDirectorioCmds<tipo_pos>.cs`.
4. Editar la clase factory `DirectorioCmdsFactory` y agregar el nuevo dispensador al método `CreaDirectorioCmds` para que según el valor del parámetro de configuración seleccione el factory adecuado. A las clases factory de directorio de comandos se pasa como parámetro el objeto tipo `Config` para brindar acceso a las clases factory a parámetros en el archivo de configuración que puedan ser requeridos.
5. Crear una carpeta para almacenar las clases de comando. Llamar la carpeta `Comandos<tipo_pos>`, por ejemplo `ComandosGkPruebas`.
......
/// <summary>
/// Clase que representa los parámetros de configuración de la aplicación
/// registrados en el archivo appsettings.json asociados a Gk Smart POS.
/// </summary>
public sealed class ConfigGk
{
public required string IpGkSmartPOS { get; set; } = "127.0.0.1";
public required int PortGkSmartPOS { get; set; } = 8443;
public required string TenantId { get; set; } = "";
public required string RetailStoreId { get; set; } = "";
public required string WorkstationId { get; set; } = "";
public required string WorkstationAddress { get; set; } = "";
public required string WorkstationTypeCode { get; set; } = "";
public required string LoginName { get; set; } = "";
public required string Password { get; set; } = "";
public required string BusinessUnitGroupID { get; set; } = "";
public required string TillID { get; set; } = "";
public override string ToString()
{
return base.ToString() + " - "
+ $"IpGkSmartPOS: '{IpGkSmartPOS}', "
+ $"PortGkSmartPOS: '{PortGkSmartPOS}', "
+ $"TenantId: '{TenantId}', "
+ $"RetailStoreId: '{RetailStoreId}', "
+ $"WorkstationId: '{WorkstationId}', "
+ $"WorkstationAddress: '{WorkstationAddress}', "
+ $"WorkstationTypeCode: '{WorkstationTypeCode}', "
+ $"LoginName: '{LoginName}', "
+ $"Password: '{Password}', "
+ $"BusinessUnitGroupID: '{BusinessUnitGroupID}', "
+ $"TillID: '{TillID}'";
}
}
\ No newline at end of file
......@@ -6,18 +6,18 @@ using GatewaySCO;
/// </summary>
public class DirectorioCmdsFactory
{
public static CreaDirectorioCmds CreaDirectorio(Config config)
public static CreaDirectorioCmds CreaDirectorio(string tipoPOS)
{
switch (config.POS)
switch (tipoPOS)
{
case "pruebas":
return DispensaDirectorioCmdsPruebas.Dispensa(config);
return DispensaDirectorioCmdsPruebas.Dispensa();
case "evapos":
return DispensaDirectorioCmdsEvaPOS.Dispensa(config);
return DispensaDirectorioCmdsEvaPOS.Dispensa();
case "gk":
return DispensaDirectorioCmdsGK.Dispensa(config);
return DispensaDirectorioCmdsGK.Dispensa();
case "gk_test":
return DispensaDirectorioCmdsGKPruebas.Dispensa(config);
return DispensaDirectorioCmdsGKPruebas.Dispensa();
default:
throw new ArgumentException("TipoPOS no válido", "tipoPOS");
}
......
......@@ -11,7 +11,7 @@ public class DispensaDirectorioCmdsEvaPOS : IDispensaDirectorioCmds
/// Retorna directorio de comandos instanciado y poblado de
/// comandos.
/// </summary>
public static CreaDirectorioCmds Dispensa(Config config)
public static CreaDirectorioCmds Dispensa()
{
Log.Information("Instancia comandos EvaPOS.");
throw new NotImplementedException();
......
......@@ -12,7 +12,7 @@ public class DispensaDirectorioCmdsGK : IDispensaDirectorioCmds
/// Retorna directorio de comandos instanciado y poblado de
/// comandos.
/// </summary>
public static CreaDirectorioCmds Dispensa(Config config)
public static CreaDirectorioCmds Dispensa()
{
Log.Information("Instancia comandos de GK Smart POS.");
return new IniciaDirectorioCmds()
......
......@@ -12,13 +12,9 @@ public class DispensaDirectorioCmdsGKPruebas : IDispensaDirectorioCmds
/// Retorna directorio de comandos instanciado y poblado de
/// comandos.
/// </summary>
public static CreaDirectorioCmds Dispensa(Config config)
public static CreaDirectorioCmds Dispensa()
{
Log.Information("Instancia comandos de GK de prueba.");
// Inicializa el entorno para los comandos.
EntornoGK e = new EntornoGK();
e.Language = config.Language;
Entorno<EntornoGK>.Instancia.setDatos(e);
return new IniciaDirectorioCmds()
.AgregaCmd(new Gk.InitializeRequestCmd())
......
......@@ -11,7 +11,7 @@ public class DispensaDirectorioCmdsPruebas : IDispensaDirectorioCmds
/// Retorna directorio de comandos instanciado y poblado de
/// comandos.
/// </summary>
public static CreaDirectorioCmds Dispensa(Config config)
public static CreaDirectorioCmds Dispensa()
{
Log.Information("Instancia comandos de prueba.");
return new IniciaDirectorioCmds()
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment