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
/// <summary>
/// Directorio de comandos.
/// Almacena instancia de comandos indexadas por su Referencia.
/// Usado para identificar el comando que procesa un mensaje particular
/// asociado por la propiedad Referencia del comando.
/// </summary>
public class CreaDirectorioCmds
{
private Dictionary<string, IComando> dir = new Dictionary<string, IComando>();
/// <summary>
/// Agrega un comando al directorio.
/// </summary>
public void AgregaComando(IComando cmd)
{
dir.Add(cmd.Referencia, cmd);
}
/// <summary>
/// Recupera una "shallow copy" del comando asociado al parámmetro.
/// </summary>
public IComando ObtieneComando(string referencia)
{
IComando cmd;
try
{
cmd = dir[referencia];
}
catch (KeyNotFoundException)
{
throw new Exception($"No se encuentra comando con referencia '{referencia}'.");
}
return cmd.CreaCopia();
}
}
\ No newline at end of file
using GatewaySCO;
/// <summary>
/// Factory que retorna un directorio de comandos instanciado
/// con los comandos apropiados según tipo de POS.
/// </summary>
public class DirectorioCmdsFactory
{
public static CreaDirectorioCmds CreaDirectorio(Config config)
{
switch (config.POS)
{
case "pruebas":
return DispensaDirectorioCmdsPruebas.Dispensa(config);
case "evapos":
return DispensaDirectorioCmdsEvaPOS.Dispensa(config);
case "gk":
return DispensaDirectorioCmdsGK.Dispensa(config);
case "gk_test":
return DispensaDirectorioCmdsGKPruebas.Dispensa(config);
default:
throw new ArgumentException("TipoPOS no válido", "tipoPOS");
}
}
}
using Serilog;
/// <summary>
/// Instancia directorio de comandos de EvaPOS con cada
/// uno de los comandos.
/// </summary>
public class DispensaDirectorioCmdsEvaPOS : IDispensaDirectorioCmds
{
/// <summary>
/// Retorna directorio de comandos instanciado y poblado de
/// comandos.
/// </summary>
public static CreaDirectorioCmds Dispensa(Config config)
{
Log.Information("Instancia comandos EvaPOS.");
throw new NotImplementedException();
}
}
\ No newline at end of file
using Serilog;
/// <summary>
/// Instancia directorio de comandos de GK Smart POS con cada
/// uno de los comandos.
/// </summary>
public class DispensaDirectorioCmdsGK : IDispensaDirectorioCmds
{
/// <summary>
/// Retorna directorio de comandos instanciado y poblado de
/// comandos.
/// </summary>
public static CreaDirectorioCmds Dispensa(Config config)
{
Log.Information("Instancia comandos de GK Smart POS.");
return new IniciaDirectorioCmds()
//.AgregaCmd(new Gk.InitializeRequestCmd())
.DirectorioCmds;
}
}
\ No newline at end of file
using GatewaySCO;
using Serilog;
using Gk = SCOGateway.POSGkPruebas;
/// <summary>
/// Instancia directorio de comandos de prueba de GK con cada
/// uno de los comandos.
/// </summary>
public class DispensaDirectorioCmdsGKPruebas : IDispensaDirectorioCmds
{
/// <summary>
/// Retorna directorio de comandos instanciado y poblado de
/// comandos.
/// </summary>
public static CreaDirectorioCmds Dispensa(Config config)
{
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())
.DirectorioCmds;
}
}
\ No newline at end of file
using EvaPOS_API_FRAME.Comandos;
using Serilog;
/// <summary>
/// Instancia directorio de comandos de prueba con cada
/// uno de los comandos.
/// </summary>
public class DispensaDirectorioCmdsPruebas : IDispensaDirectorioCmds
{
/// <summary>
/// Retorna directorio de comandos instanciado y poblado de
/// comandos.
/// </summary>
public static CreaDirectorioCmds Dispensa(Config config)
{
Log.Information("Instancia comandos de prueba.");
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())
.DirectorioCmds;
}
}
\ No newline at end of file
using Serilog;
namespace GatewaySCO
{
/// <summary>
/// Clase singleton que mantiene valores y objetos de interes global.
/// </summary>
public sealed class Entorno<T>
{
/// <summary>
/// Instanciador singleton.
/// </summary>
private static readonly Lazy<Entorno<T>> lazy = new Lazy<Entorno<T>>(() => new Entorno<T>());
/// <summary>
/// Acceso a instancia del singleton.
/// </summary>
public static Entorno<T> Instancia { get { return lazy.Value; } }
/// <summary>
/// Datos particulares de cada implementación de POS.
/// </summary>
private static T? _datos;
/// <summary>
/// Constructor privado.
/// </summary>
private Entorno()
{
Log.Debug("Entorno inicializado.");
}
/// <summary>
/// Obtener datos de entorno.
/// </summary>
public T getDatos()
{
if (_datos == null)
{
throw new ApplicationException("Datos de entorno no inicializados.");
}
return _datos;
}
/// <summary>
/// Fijar datos de entorno.
/// </summary>
public void setDatos(T datos)
{
_datos = datos;
}
}
}
using System;
using System.IO;
using System.Xml;
namespace EvaPosUtil
namespace GatewaySCO
{
/// <summary>
/// Clase Utilistarios para operaciones sobre mensajes.
......
using Serilog;
using EvaPosSrvDTO;
using EvaPosSrvResp;
using System.Collections.Generic;
using System;
using System.Threading.Tasks;
// Comandos que procesan las DTOs.
namespace EvaPosSrvCmd
{
/// <summary>
/// Interface de definición de comandos.
/// </summary>
public interface IComando
/// <summary>
/// Interface de definición de comandos.
/// </summary>
public interface IComando
{
/// <summary>
/// Identifica el mensaje al cual el comando responde.
......@@ -38,39 +30,4 @@ namespace EvaPosSrvCmd
/// Retorna una "shallow copy" del objeto.
/// </summary>
public IComando CreaCopia();
}
/// <summary>
/// Directorio de comandos.
/// Almacena instancia de comandos indexadas por su Referencia.
/// Usado para identificar el comando que procesa un mensaje particular
/// asociado por la propiedad Referencia del comando.
/// </summary>
public class DirectorioCmds
{
private Dictionary<string, IComando> dir = new Dictionary<string, IComando>();
/// <summary>
/// Agrega un comando al directorio.
/// </summary>
public void AgregaComando(IComando cmd)
{
dir.Add(cmd.Referencia, cmd);
}
/// <summary>
/// Recupera una "shallow copy" del comando asociado al parámmetro.
/// </summary>
public IComando ObtieneComando(string referencia)
{
IComando cmd;
try {
cmd = dir[referencia];
} catch (KeyNotFoundException)
{
throw new Exception($"No se encuentra comando con referencia '{referencia}'.");
}
return cmd.CreaCopia();
}
}
}
\ No newline at end of file
}
\ No newline at end of file
/// <summary>
/// Interface para definir las clases que instancian
/// directorios de comandos según el tipo de POS.
/// </summary>
public interface IDispensaDirectorioCmds
{
/// <summary>
/// Dispensa un directorio de comandos inicializados.
/// </summary>
static abstract CreaDirectorioCmds Dispensa(Config config);
}
\ No newline at end of file
/// <summary>
/// Clase para inicializar el directorio de comandos.
/// Se crear una instancia de cada comando según el tipo de POS.
/// </summary>
/// <remarks>
/// Evaluar modificar la definición de comandos para que el mismo
/// comando se instancie.
/// </remarks
public class IniciaDirectorioCmds
{
public CreaDirectorioCmds DirectorioCmds { get; private set; } = new CreaDirectorioCmds();
public IniciaDirectorioCmds AgregaCmd(IComando cmd)
{
DirectorioCmds.AgregaComando(cmd);
return this;
}
}
\ No newline at end of file
using System.Text.Json.Serialization;
namespace SCOGateway.POSGk
{
/// <summary>
/// Registro para solicitar autenticación a cliente Smart POS GK.
/// </summary>
record AutenticationReq
{
[JsonPropertyName("loginName")] public string LoginName { get; set; } = "";
[JsonPropertyName("password")] public string Password { get; set; } = "";
[JsonPropertyName("businessUnitId")] public string BusinessUnitId { get; set; } = "";
[JsonPropertyName("passwordRequired")] public bool PasswordRequired { get; set; } = true;
}
}
\ No newline at end of file
using System.Text.Json.Serialization;
namespace SCOGateway.POSGk
{
record AuthenticateResp
{
[JsonPropertyName("operatorID")] public string OperatorID { get; set; } = "";
[JsonPropertyName("workerID")] public string WorkerID { get; set; } = "";
[JsonPropertyName("firstName")] public string FirstName { get; set; } = "";
[JsonPropertyName("lastName")] public string LastName { get; set; } = "";
[JsonPropertyName("languageID")] public string LanguageID { get; set; } = "";
[JsonPropertyName("realmId")] public string RealmId { get; set; } = "";
[JsonPropertyName("expirationCountDays")] public int ExpirationCountDays { get; set; } = 0;
[JsonPropertyName("passwordBeforeExpiration")] public bool PasswordBeforeExpiration { get; set; } = true;
}
}
\ No newline at end of file
namespace SCOGateway.POSGk
{
/// <summary>
/// Constantes del ambiente Gk Smart POS.
/// </summary>
public static class ConstantesGK
{
/// <summary>
/// Url base ambiente de pruebas Gk maqueta.
/// </summary>
public const string UrlBaseMaqueta = "https://julia.redsis.com/castlemock/mock/rest/project/KdLiqe/application/l4KAuU";
}
}
\ No newline at end of file
/// <summary>
/// Esta clase almacena valores requeridos
/// para la operación del SCO con la operación de la POS GK,
/// valores que deben ser compartidos entre comandos.
/// </summary>
public class EntornoGK
{
/// <summary>
/// Gk - seguridad usuario.
/// </summary>
public string RealmId { get; set; } = "";
/// <summary>
/// Gk - días expiración realmId.
/// </summary>
public int ExpirationCountDays { get; set; } = 0;
/// <summary>
/// GK Language.
/// </summary>
public string Language { get; set; } = "en";
}
\ No newline at end of file
using Serilog;
using static System.Net.Mime.MediaTypeNames;
using Microsoft.Extensions.Configuration;
using EvaPosSCOSrv;
using EvaPosSrvAplicacionImp;
using EvaPosCmdImp;
using EvaPosSrvRespImp;
using System;
/// <summary>
/// EvaPos-API : servidor api, sockets y rest.
......@@ -14,24 +12,46 @@ class Program
{
static void Main(string[] args)
{
Console.WriteLine();
Console.WriteLine("Version: {0}", Environment.Version.ToString());
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.Console()
.WriteTo.File("C:\\GK-Gateway\\log\\evapos-api.log", rollingInterval: RollingInterval.Day)
.CreateLogger();
try
{
Console.WriteLine("*** Gateway SCO ***");
// Instancia objeto de configuración, usa proveedor json y variables ambiente.
IConfigurationRoot config = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.AddEnvironmentVariables()
.Build();
// Lee archivo de configuración.
Config? configuracion = config.GetRequiredSection("GatewayConfig").Get<Config>();
if (configuracion is null)
{
throw new ApplicationException("Error en archivo de configuración, sección 'GatewayConfig' no encontrada.");
}
// TODO - opción de incluir la activación en la cadena de configuración.
// TODO - aunque hace uso de una "invocación fluida" no parece ser el tipo de api que se beneficia de ese esquema.
ServidorSocket servidor = new ServidorSocket()
//.ConIp("127.0.0.1")
.ConIp("192.168.101.70")
.EnPuerto(6697)
.AgregaDispensadorAdaptadores(IniciaDirectorioAdaptadores.Cargar().DirectorioAdaptadores)
.AgregaDispensadorComandos(IniciaDirectorioCmds.Cargar().DirectorioCmds)
.AgregaProcesadorAplicacion(new Aplicacion())
.Activa();
// TODO Sacar la ruta de logs del objeto de configuración adecuadamente.
string? rutaLogs = config["Serilog:WriteTo:1:Args:path"];
Console.WriteLine($"Archivo de logs en {rutaLogs}");
// Instancia Serilog según parámetros en archivo de configuración.
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(config)
.CreateLogger();
Log.Information(configuracion.ToString());
// TODO - opción de incluir la activación en la cadena de configuración.
// TODO - aunque hace uso de una "invocación fluida" no parece ser el tipo de api que se beneficia de ese esquema.
ServidorSocket servidor = new ServidorSocket()
.ConIp(configuracion.IpSCO)
.EnPuerto(configuracion.PortSCO)
.AgregaDispensadorAdaptadores(IniciaDirectorioAdaptadores.Cargar().DirectorioAdaptadores)
.AgregaDirectorioCmds(DirectorioCmdsFactory.CreaDirectorio(configuracion))
.AgregaProcesadorAplicacion(new Aplicacion())
.Activa();
}
catch (Exception e)
{
Log.Error($"Excepción: {e}");
Environment.Exit(1);
}
}
}
\ No newline at end of file
using EvaPosSrvCmd;
using EvaPosSrvResp;
using System.Threading.Tasks;
namespace EvaPosSrvAplicacion
{
......
using EvaPosSrvCmd;
using EvaPosSrvResp;
using EvaPosSrvAplicacion;
using System.Threading.Tasks;
namespace EvaPosSrvAplicacionImp
{
......
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