Commit 17d006dc authored by Jose Hugo Torres's avatar Jose Hugo Torres
Browse files

gateway sco gk

Modificaciones para gateway con sco y gk
parent 2e963f0b
using EvaPOS_API_FRAME.DTO;
using EvaPOS_API_FRAME.RespuestasXML;
using EvaPosSrvCmd;
using EvaPosSrvDTO;
using EvaPosSrvResp;
using Serilog;
......
using EvaPOS_API_FRAME.DTO;
using EvaPOS_API_FRAME.RespuestasXML;
using EvaPosSrvCmd;
using EvaPosSrvDTO;
using EvaPosSrvResp;
using Serilog;
......
......@@ -2,7 +2,6 @@
using EvaPOS_API_FRAME.DTO.Intercambio;
using EvaPOS_API_FRAME.RespuestasXML;
using EvaPOS_API_FRAME.RespuestasXML.CancelDatafono;
using EvaPosSrvCmd;
using EvaPosSrvDTO;
using EvaPosSrvResp;
using Serilog;
......
using EvaPOS_API_FRAME.RespuestasXML.CancelDatafono;
using EvaPosSrvCmd;
using EvaPosSrvDTO;
using EvaPosSrvResp;
using Serilog;
......
using EvaPosSrvCmd;
using EvaPosSrvDTO;
using EvaPosSrvDTO;
using EvaPosSrvResp;
using System;
using System.Collections.Generic;
......
using EvaPOS_API_FRAME.DTO;
using EvaPOS_API_FRAME.DTO.Intercambio;
using EvaPOS_API_FRAME.RespuestasXML;
using EvaPosSrvCmd;
using EvaPosSrvDTO;
using EvaPosSrvResp;
using Serilog;
......
using EvaPOS_API_FRAME.DTO.Intercambio;
using EvaPOS_API_FRAME.RespuestasXML;
using EvaPOS_API_FRAME.RespuestasXML.Printer;
using EvaPosSrvCmd;
using EvaPosSrvDTO;
using EvaPosSrvResp;
using Serilog;
......@@ -29,8 +28,6 @@ namespace EvaPOS_API_FRAME.Comandos
/// <summary>
/// Procesa y responde InitializeRequest.
/// </summary>
public Respuestas Ejecutar()
{
int terminalNumber = Request.TerminalNumber;
......
using EvaPOS_API_FRAME.DTO;
using EvaPOS_API_FRAME.RespuestasXML;
using EvaPOS_API_FRAME.RespuestasXML.Printer;
using EvaPosSrvCmd;
using EvaPosSrvDTO;
using EvaPosSrvResp;
using Serilog;
......
using EvaPOS_API_FRAME.DTO;
using EvaPOS_API_FRAME.RespuestasXML;
using EvaPosSrvCmd;
using EvaPosSrvDTO;
using EvaPosSrvResp;
using Serilog;
......
using EvaPOS_API_FRAME.DTO;
using EvaPOS_API_FRAME.RespuestasXML;
using EvaPosSrvCmd;
using EvaPosSrvDTO;
using EvaPosSrvResp;
using Serilog;
......
using EvaPOS_API_FRAME.DTO;
using EvaPosSrvCmd;
using EvaPosSrvDTO;
using EvaPosSrvResp;
using Serilog;
......
using EvaPOS_API_FRAME.DTO;
using EvaPOS_API_FRAME.RespuestasXML;
using EvaPOS_API_FRAME.RespuestasXML.Reprint;
using EvaPosSrvCmd;
using EvaPosSrvDTO;
using EvaPosSrvResp;
using Serilog;
......
using EvaPOS_API_FRAME.DTO;
using EvaPOS_API_FRAME.RespuestasXML;
using EvaPOS_API_FRAME.RespuestasXML.Printer;
using EvaPosSrvCmd;
using EvaPosSrvDTO;
using EvaPosSrvResp;
using Serilog;
......
using EvaPOS_API_FRAME.DTO;
using EvaPOS_API_FRAME.RespuestasXML.Suspend;
using EvaPosSrvCmd;
using EvaPosSrvDTO;
using EvaPosSrvResp;
using Serilog;
......
using EvaPOS_API_FRAME.DTO;
using EvaPOS_API_FRAME.RespuestasXML.TerminateLane;
using EvaPosSrvCmd;
using EvaPosSrvDTO;
using EvaPosSrvResp;
using Serilog;
......
using EvaPOS_API_FRAME.DTO;
using EvaPOS_API_FRAME.RespuestasXML.CancelTransaction;
using EvaPosSrvCmd;
using EvaPosSrvDTO;
using EvaPosSrvResp;
using Serilog;
......
using EvaPOS_API_FRAME.Comandos;
using EvaPOS_API_FRAME.RespuestasXML;
using EvaPosSrvCmd;
using EvaPosSrvDTO;
using EvaPosSrvResp;
using EvaPosSrvRespImp;
using Serilog;
/******************************************************************
ESPACIO DE NOMBRES PARA IMPLEMENTAR COMANDOS.
*******************************************************************/
namespace EvaPosCmdImp
{
/// <summary>
/// Clase para inicializar el directorio de comandos.
/// </summary>
public class IniciaDirectorioCmds
{
public DirectorioCmds DirectorioCmds {get; private set;} = new DirectorioCmds();
public IniciaDirectorioCmds AgregaCmd(IComando cmd)
{
DirectorioCmds.AgregaComando(cmd);
return this;
}
// TODO - Evaluar eliminar este paso por una forma automática en el mismo comando.
/// <summary>
/// Este método instancia cada comando y lo agrega al directorio de comandos.
/// Agregar cada comando aquí.
/// </summary>
public static IniciaDirectorioCmds Cargar()
{
return new IniciaDirectorioCmds()
.AgregaCmd(new ErrorCmd())
.AgregaCmd(new AddItemRequestCmd())
.AgregaCmd(new InitializeRequestCmd())
.AgregaCmd(new QueryStatusRequestCmd())
.AgregaCmd(new ReportStatusEventsRequestCmd())
.AgregaCmd(new SignOffResponseCmd())
.AgregaCmd(new AddReceiptLinesRequestCmd())
.AgregaCmd(new GetTotalsRequestCmd())
.AgregaCmd(new AddTenderDebitCmd())
.AgregaCmd(new PrintCurrentReceiptsRequestCmd())
.AgregaCmd(new ReprintReceiptsCmd())
.AgregaCmd(new TerminateRequestCmd())
.AgregaCmd(new VoidTransactionCmd())
.AgregaCmd(new RemoveReceiptLinesCmd())
.AgregaCmd(new CancelActionCmd())
.AgregaCmd(new AddCustomerBirthdateCmd())
.AgregaCmd(new AddCustomerCmd())
.AgregaCmd(new SuspendTransactionRequestCmd());
}
}
}
\ No newline at end of file
# SCO Gateway - Guía de programación
## Entorno global
La clase `Entorno` mantiene variables y objetos de acceso global que mantienen información para acceder en diversos puntos del programa.
Es un "singleton".
Agregar a `Entorno` cualquier variable u objeto visible a todo el programa.
## Información de configuración
Archivo configuración: `appsettings.json`
La aplicación espera el archivo de configuación con los parámetros de operación. Archivo ubicado en la raíz de carpeta con programa ejecutable.
### Parámetros de configuración
En la siguiente lista se presentan los parámetros de configuración definidos. En la siguiente lista, los parámetros y sus valores.
- Indicar tipos de POS, según el tipo se activan los comandos adecuados.
- 'POS' valores: 'pruebas', 'gk', 'evapos'.
- Ubicación del SCO.
- 'IpSCO': string, dirección IP del SCO.
- 'PortSCO': string, puerto IP del SCO.
### Programación de la configuración
La clase `Config.cs` mantienen los valores permitidos a usar como parámetros predefinidos en el archivo de configuración de la aplicación.
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.
## Procesar solicitudes del SCO
La siguiente es la secuencia de pasos que sigue el programa para procesar una solicitud (mensaje) remitido por el SCO.
- Inicialización de adaptadores y comandos, según el tipo de POS.
- El servidor SCO inicia y queda en modo escucha.
- Para cada mensaje que ingresa, el ciclo es:
- Se determina el tipo de mensaje.
- Según el tipo de mensaje se obtiene el comando adecuado y su adaptador. El factory de creación del directorio de comandos se encargga de inicializar los comandos adecuados al tipo de POS.
- Se ejecuta el comando.
## Agregar soporte a una nueva POS
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`.
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`.
6. Crear los comandos en la carpeta. Usar un espacio de nombres dedicado para cada tipo de POS, con el patrón `SCOGateway.Comandos.<tipo_pos>`, por ejemplo `SCOGateway.Comandos.GkPruebas`.
7. Instanciar los comandos en el método adecuado de la case factory.
8. Si se requiere almacenar valores que deben ser manetenidos entres comandos o entre interacciónes, se usa el singleton `Entorno<T>`. Este singleton es una clase que maneja tipos genéricos y mantiene un atributo tipo `T` genérico al cual la implementación de POS puede asociar un objeto con los datos que debe mantener. La implementación de POS particular puede crear una clase con los datos de su necesidad y vincularla al `Entorno<T>` usando los métodos `setDatos` / `getDatos`. Un buen punto para inicializar el entorno con el contenedor de datos apropiado para el tipo de POS es la clase dispensadora de comandos, la cual es invocada por el factory de dispensadores al inicio del gateway. Por ejemplo, para almacenar datos a un tipo_pos se crea una clase que almacen los datos particulares, sea por ejemplo `TipoPOS`, se instancia el entorno con `Entorno<TipoPOS>.Instancia.setDatos(new TiposPOS())`, se puede fijar y leer datos particulares de este tipo de POS con `Entorno<TipoPOS>.Instancia.getDatos().DatoParticularDelTipoPOS = valor;`
## Integración con GK Smart POS
Para integrar GK Smart POS se tienen dos implementaciones en el código:
- Una maqueta de servicios web de Smart POS, esta estará identificada por el sufijo `GkPruebas`. S
- La integración con Smart POS propiamente dicha, estará indentificada por el sufijo `Gk`.
Espacios de nombres:
- `SCOGateway.POSGk` contiene el código para la integración oficial con Smart POS Gk.
- `SCOGateway.POSGkPruebas` contiene el código para la integración con el servidor maqueta de los servicios web de Smart POS Gk.
Carpetas de código asociado con GK Smart POS:
- `ComandosGkPruebas` y `ComandosGk` contiene los comandos para ambos tipos de ambientes de Gk.
- `POSGk` contiene código especializado para GK Smart POS.
/// <summary>
/// Clase que representa los parámetros de configuración de la aplicación
/// registrados en el archivo appsettings.json (o equivalente definido).
/// </summary>
public sealed class Config
{
public required string POS { get; set; } = "pruebas";
public required string IpSCO { get; set; } = "127.0.0.1";
public required int PortSCO { get; set; } = 6697;
public required string Language { get; set; } = "en";
public override string ToString()
{
return base.ToString() + " - " + $"POS: '{POS}', IpSCO: '{IpSCO}', PortSCO: '{PortSCO}', Language: '{Language}'";
}
}
\ No newline at end of file
/// <summary>
/// Esta clase reune la definición de constantes globales
/// requeridas por el programa. Particularmente, valores
/// predefinidos de configuración.
/// </summary>
public static class Const
{
/// <summary>
/// Configuración. Indica tipo de pos de pruebas, para instanciar
/// comandos de prueba internos (dummy).
/// </summary>
public const string PosPruebas = "pruebas";
/// <summary>
/// Configuración. Indica tipo de pos GK, para instanciar
/// comandos para acceder Smart POS de GK.
/// </summary>
public const string PosGK = "gk";
/// <summary>
/// Configuración. Indica tipo de pos GK pruebas, para instanciar
/// comandos de prueba Smart POS de GK simulada.
/// </summary>
public const string PosGKPruebas = "gk_test";
/// <summary>
/// Configuración. Indica tipo de pos EvaPOS, para instanciar
/// comandos para acceder EvaPOS.
/// </summary>
public const string PosEvaPOS = "evapos";
}
\ No newline at end of file
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