meta data de esta página
Diferencias
Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
lenguaje_c [2021/06/15 01:00] jsojo [PASO 1: Agregar referencia de servicio con la URL del servicio web de integración de TFHKA] |
lenguaje_c [2022/08/29 19:34] (actual) lmartinez |
||
---|---|---|---|
Línea 1: | Línea 1: | ||
====== Ejemplo en lenguaje CSharp ====== | ====== Ejemplo en lenguaje CSharp ====== | ||
- | Tiene como objetivo ejemplificar el proceso de conexión, acceso y uso de las propiedades y métodos ofrecidos por el //Servicio Web de Integración de TFHKA a través del lenguaje de programación C Sharp (C#) de la plataforma .Net. /// | + | Tiene como objetivo ejemplificar el proceso de conexión, acceso y uso de las propiedades y métodos ofrecidos por el //Servicio Web de Integración de //EBI //a través del lenguaje de programación C Sharp (C#) de la plataforma .Net. /// |
Independientemente del tipo de proyecto C# con el cual se trabaje: Consola, Winforms o WPF, lo más importante es establecer los pasos necesarios para realizar una integración exitosa. | Independientemente del tipo de proyecto C# con el cual se trabaje: Consola, Winforms o WPF, lo más importante es establecer los pasos necesarios para realizar una integración exitosa. | ||
Línea 7: | Línea 7: | ||
%%Criterios a tomar en cuenta:%% | %%Criterios a tomar en cuenta:%% | ||
- | * Establecer una referencia al Servicio Web de Integración de TFHKA | + | * Establecer una referencia al Servicio Web de Integración de EBI |
- | * Instanciar el objeto a través del cual se tendrá acceso a los métodos del Servicio Web de TFHKA. | + | * Instanciar el objeto a través del cual se tendrá acceso a los métodos del Servicio Web de EBI. |
- | * Construir / Armar el objeto Documento Electrónico (Factura) que se desea enviar al Servicio Web de Integración de TFHKA, a través de los objetos respectivos. | + | * Construir / Armar el objeto Documento Electrónico (Factura) que se desea enviar al Servicio Web de Integración de EBI, a través de los objetos respectivos. |
- | * Enviar el documento al Servicio Web de Integración de TFHKA para su procesamiento. | + | * Enviar el documento al Servicio Web de Integración de EBIpara |
- | * Recibir y procesar la respuesta del Servicio Web de TFHKA en nuestro proyecto, según sea requerido. | + | * Recibir y procesar la respuesta del Servicio Web de EBIen nuestro proyecto, según sea requerido. |
%%Pasos para realizar la integración: | %%Pasos para realizar la integración: | ||
- | PASO 1: Agregar una nueva Referencia de Servicio en su proyecto, utilizando la URL del Servicio Web de Integración de TFHKA referida | + | PASO 1: Agregar una nueva Referencia de Servicio en su proyecto, utilizando la URL del Servicio Web de Integración de EBIreferida |
- | PASO 2: Crear una instancia del objeto ' | + | PASO 2: Crear una instancia del objeto ' |
- | PASO 3: Construir el Documento Electrónico a enviar, en base a los objetos provistos por el Servicio Web de Integración de TFHKA. | + | PASO 3: Construir el Documento Electrónico a enviar, en base a los objetos provistos por el Servicio Web de Integración de EBI. |
- | PASO 4: Enviar el Documento Electrónico construído en el paso anterior al Servicio Web de Integración de TFHKA, utilizando los Tokens de Empresa y Password indicados en este documento. | + | PASO 4: Enviar el Documento Electrónico construído en el paso anterior al Servicio Web de Integración de EBI, utilizando los Tokens de Empresa y Password indicados en este documento. |
(el Servicio Web procesará su solicitud según las especificaciones de la DGI y retornará de inmediato los resultados). | (el Servicio Web procesará su solicitud según las especificaciones de la DGI y retornará de inmediato los resultados). | ||
- | PASO 5: Recibir y procesar la respuesta del Servicio Web de Integración de TFHKA. | + | PASO 5: Recibir y procesar la respuesta del Servicio Web de Integración de EBI. |
**IMPORTANTE**: | **IMPORTANTE**: | ||
- | Para mayor información y detalles sobre el proceso, puede consultar el **Manual de Integración de TFHKA** | + | Para mayor información y detalles sobre el proceso, puede consultar el **Manual de Integración de EBI** |
- | ===== PASO 1: Agregar referencia de servicio con la URL del servicio web de integración de TFHKA ===== | + | ===== PASO 1: Agregar referencia de servicio con la URL del servicio web de integración de EBI ===== |
Incluir lo siguiente: | Incluir lo siguiente: | ||
Línea 37: | Línea 37: | ||
<code -> | <code -> | ||
using System; | using System; | ||
+ | using EjemploIntegraciondirectaCSharp.EBIPaWebService; | ||
- | using EjemploIntegraciondirectaCSharp.TfhkaPaWebService; | ||
namespace EjemploIntegraciondirectaCSharp | namespace EjemploIntegraciondirectaCSharp | ||
- | |||
- | { | ||
- | |||
- | class DemoIntCSharpTfhka | ||
- | |||
{ | { | ||
+ | class DemoIntCSharpEBI | ||
+ | { | ||
</ | </ | ||
Línea 55: | Línea 52: | ||
* En la ventana desplegada, | * En la ventana desplegada, | ||
- | URL del Servicio Web de Integración de TFHKA: [[http://demoemision.thefactoryhka.com.pa/ | + | URL del Servicio Web de Integración de EBI: [[https://demointegracion.ebi-pac.com/ |
* Haga click sobre el botón " | * Haga click sobre el botón " | ||
Línea 61: | Línea 58: | ||
* Coloque la siguiente identificación en el campo " | * Coloque la siguiente identificación en el campo " | ||
- | Identificación de la Referencia: "TfhkaPaWebService" | + | Identificación de la Referencia: "EBIPaWebService" |
(Dicho nombre es referencial, | (Dicho nombre es referencial, | ||
Línea 67: | Línea 64: | ||
**IMPORTANTE**: | **IMPORTANTE**: | ||
- | TOKENS requeridos por el Servicio Web de Integración de TFHKA para enviar documentos electrónicos, | + | TOKENS requeridos por el Servicio Web de Integración de EBI para enviar documentos electrónicos, |
<code -> | <code -> | ||
- | public const string tokenEmpresa = ""; | + | public const string tokenEmpresa = ""; |
+ | public const string tokenPassword = ""; | ||
+ | static void Main(string[] args) | ||
+ | { | ||
+ | try | ||
+ | { | ||
+ | </ | ||
- | public const string tokenPassword | + | ===== PASO 2: Crear una instancia del objeto ' |
- | static void Main(string[] args) | + | A traves de esta instancia tendremos acceso a los métodos públicos disponibles |
- | { | + | (En este ejemplo, sólo utilizaremos el método ' |
- | try | + | <code -> |
+ | ServiceClient webService = new ServiceClient(); | ||
+ | | ||
- | { | + | Consola.mensaje(" |
+ | String numero = ""; | ||
+ | while (numero == "" | ||
+ | | ||
+ | Consola.mensaje(" | ||
+ | numero = Console.ReadLine(); | ||
+ | } | ||
</ | </ | ||
- | ===== PASO 2: Crear una instancia del objeto ' | + | ===== PASO 3: Construir el documento electrónico a enviar al servicio web de integración de EBI ===== |
- | A traves | + | %%Para mayor información y detalles sobre el proceso, puede consultar el %%**Manual |
- | (En este ejemplo, sólo utilizaremos | + | En este ejemplo utilizaremos |
+ | |||
+ | Sin embargo, esta estructura no es obligatoria. El desarrollador puede utilizar su propio estilo, siempre y cuando | ||
<code -> | <code -> | ||
- | ServiceClient webService | + | DocumentoElectronico documento |
- | + | </ | |
- | Consola.mensaje(" | + | |
- | String numero | + | ===== PASO 4: Enviar el documento electrónico construido en el paso 3 al servicio web de integración de EBI ===== |
- | while (numero == "" | + | Se requiere crear un objeto de tipo EnviarResponse en el cual será utilizado para almacenar la respuesta del Servicio Web |
- | { | + | Se utiliza el método Enviar provisto por el Servicio Web, incluyendo como parámetros los tokens de empresa y password referidos anteriormente, |
+ | |||
+ | <code -> | ||
+ | EnviarResponse respuestaWebService = new EnviarResponse(); | ||
+ | |||
+ | Consola.mensaje(" | ||
+ | |||
+ | respuestaWebService = webService.Enviar(tokenEmpresa, | ||
+ | </ | ||
+ | |||
+ | ===== PASO 5: Recibir y procesar la respuesta del servicio web de integración de EBI ===== | ||
+ | |||
+ | La respuesta del Servicio Web de EBI será enviada inmediatamente. | ||
+ | |||
+ | En este ejemplo, la respuesta del Servicio Web se muestra a través de la consola. | ||
+ | |||
+ | En caso de recibir una respuesta positiva para el envío del Documento Electrónico (código 200), los detalles serán mostrados a través de la página de Consulta de Facturas por Qr en su navegador de Internet. | ||
+ | |||
+ | La respuesta del Servicio Web de EBI incluye: código de la respuesta, resultado, mensaje, cufe y Qr, entre otros. (ver el Examinador de Objetos de VisualStudio) | ||
+ | |||
+ | <code -> | ||
+ | Consola.mensaje(" | ||
+ | |||
+ | if (respuestaWebService.codigo == " | ||
+ | | ||
+ | Consola.mensaje(" | ||
+ | |||
+ | System.Diagnostics.Process.Start(respuestaWebService.qr); | ||
+ | } | ||
+ | else { | ||
+ | Consola.mensaje(" | ||
+ | } | ||
+ | |||
+ | } | ||
+ | catch (Exception ex) | ||
+ | { | ||
+ | Consola.mensaje(" | ||
+ | } | ||
+ | |||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===== Clases para armar el documento electrónico y elementos componentes, | ||
+ | |||
+ | La definición de estas clases no es obligatoria ni requerida, pero sirven para ordenar la estructura de este documento y mostrar paso a paso la incorporación de los diferentes objetos que componen el objeto Documento Electrónico. | ||
+ | |||
+ | <code -> | ||
+ | public class Factura | ||
+ | { | ||
+ | public static DocumentoElectronico factura = new DocumentoElectronico(); | ||
+ | public static DocumentoElectronico armarFactura(string numero) | ||
+ | { | ||
+ | Consola.mensaje(" | ||
+ | |||
+ | //DATOS REFERENCIALES CON FINES DE PRUEBA | ||
+ | //Consultar Manual de Integracion EBI para ver detalles precisos | ||
+ | |||
+ | factura.codigoSucursalEmisor = " | ||
+ | factura.tipoSucursal = " | ||
+ | |||
+ | // Datos de la Transacción | ||
+ | DatosFactura datos = new DatosFactura(); | ||
+ | datosTransaccion datosFactura = datos.crearDatosFactura(numero); | ||
+ | factura.datosTransaccion = datosFactura; | ||
+ | Consola.mensaje(" | ||
+ | |||
+ | // Datos de los Productos / Items | ||
+ | factura.listaItems = new listaItems(); | ||
+ | factura.listaItems.Add(Producto.crearItem()); | ||
+ | Consola.mensaje(" | ||
+ | |||
+ | // Datos de los Totales y Sub-Totales | ||
+ | factura.totalesSubTotales = Totales.generarTotales(); | ||
+ | Consola.mensaje(" | ||
+ | |||
+ | Consola.mensaje(" | ||
+ | |||
+ | return factura; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | public class Cliente | ||
+ | { | ||
+ | public static cliente cliente = new cliente(); | ||
+ | public static cliente crearCliente() | ||
+ | { | ||
+ | //DATOS REFERENCIALES CON FINES DE PRUEBA | ||
+ | //Consultar Manual de Integracion EBI para ver detalles precisos | ||
+ | |||
+ | cliente.tipoClienteFE = " | ||
+ | cliente.tipoContribuyente = " | ||
+ | cliente.numeroRUC = " | ||
+ | cliente.digitoVerificadorRUC = " | ||
+ | cliente.razonSocial = "FE general"; | ||
+ | cliente.direccion = "Av. Balboa"; | ||
+ | cliente.codigoUbicacion = " | ||
+ | cliente.corregimiento = " | ||
+ | cliente.distrito = " | ||
+ | cliente.provincia = "Bocas del Toro"; | ||
+ | cliente.telefono1 = " | ||
+ | cliente.telefono2 = ""; | ||
+ | cliente.telefono3 = ""; | ||
+ | cliente.correoElectronico1 = " | ||
+ | cliente.pais = " | ||
+ | cliente.paisOtro = ""; | ||
+ | |||
+ | return cliente; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | public class DatosFactura | ||
+ | { | ||
+ | public static datosTransaccion datosFactura = new datosTransaccion(); | ||
+ | public datosTransaccion crearDatosFactura(string num) | ||
+ | { | ||
+ | //DATOS REFERENCIALES CON FINES DE PRUEBA | ||
+ | //Consultar Manual de Integracion EBI para ver detalles precisos | ||
+ | |||
+ | datosFactura.tipoEmision = " | ||
+ | datosFactura.tipoDocumento = " | ||
+ | datosFactura.numeroDocumentoFiscal = num; | ||
+ | datosFactura.puntoFacturacionFiscal = " | ||
+ | |||
+ | //Debe establecerse el formato solicitado para la fecha de emisión " | ||
+ | var fechaEmision = Convert.ToDateTime(DateTime.Today.ToString(" | ||
+ | datosFactura.fechaEmision = fechaEmision; | ||
+ | |||
+ | datosFactura.naturalezaOperacion = " | ||
+ | datosFactura.tipoOperacion = " | ||
+ | datosFactura.destinoOperacion = " | ||
+ | |||
+ | datosFactura.formatoCAFE = " | ||
+ | datosFactura.entregaCAFE = " | ||
+ | |||
+ | datosFactura.envioContenedor = " | ||
+ | datosFactura.procesoGeneracion = " | ||
+ | datosFactura.tipoVenta = " | ||
+ | datosFactura.informacionInteres = " | ||
+ | |||
+ | //Datos del Cliente | ||
+ | datosFactura.cliente = Cliente.crearCliente(); | ||
+ | Consola.mensaje(" | ||
+ | |||
+ | return datosFactura; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | public class Producto | ||
+ | { | ||
+ | public static Item item = new Item(); | ||
+ | public static Item crearItem() | ||
+ | { | ||
+ | //DATOS REFERENCIALES CON FINES DE PRUEBA | ||
+ | //Consultar Manual de Integracion EBI para ver detalles precisos | ||
+ | |||
+ | item.descripcion = " | ||
+ | item.codigo = " | ||
+ | item.unidadMedida = " | ||
+ | item.cantidad = " | ||
+ | item.fechaFabricacion = " | ||
+ | item.unidadMedidaCPBS = " | ||
+ | item.precioUnitario = " | ||
+ | item.precioUnitarioDescuento = " | ||
+ | item.precioAcarreo = " | ||
+ | item.precioSeguro = " | ||
+ | item.precioItem = " | ||
+ | item.valorTotal = " | ||
+ | item.codigoGTIN = " | ||
+ | item.cantGTINCom = " | ||
+ | item.codigoGTINInv = " | ||
+ | item.cantGTINComInv = " | ||
+ | item.tasaITBMS = " | ||
+ | item.valorITBMS = " | ||
+ | item.tasaISC = " | ||
+ | item.valorISC = " | ||
+ | item.codigoCPBS = " | ||
+ | |||
+ | return item; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | public class Totales | ||
+ | { | ||
+ | public static totalesSubTotales TotalesSubTotales = new totalesSubTotales(); | ||
+ | public static totalesSubTotales generarTotales() | ||
+ | { | ||
+ | |||
+ | //DATOS REFERENCIALES CON FINES DE PRUEBA | ||
+ | //Consultar Manual de Integracion EBI para ver detalles precisos | ||
+ | |||
+ | TotalesSubTotales.totalPrecioNeto = " | ||
+ | TotalesSubTotales.totalITBMS = " | ||
+ | TotalesSubTotales.totalISC = " | ||
+ | TotalesSubTotales.totalMontoGravado = " | ||
+ | TotalesSubTotales.totalDescuento = ""; | ||
+ | TotalesSubTotales.totalAcarreoCobrado = ""; | ||
+ | TotalesSubTotales.valorSeguroCobrado = ""; | ||
+ | TotalesSubTotales.totalFactura = " | ||
+ | TotalesSubTotales.totalValorRecibido = " | ||
+ | TotalesSubTotales.vuelto = " | ||
+ | TotalesSubTotales.tiempoPago = " | ||
+ | TotalesSubTotales.nroItems = " | ||
+ | TotalesSubTotales.totalTodosItems = " | ||
+ | |||
+ | TotalesSubTotales.listaFormaPago = new listaFormaPago(); | ||
+ | |||
+ | FormaPago formaPago1 = new FormaPago(); | ||
+ | formaPago1.formaPagoFact = " | ||
+ | formaPago1.valorCuotaPagada = " | ||
+ | formaPago1.descFormaPago = ""; | ||
+ | |||
+ | TotalesSubTotales.listaFormaPago.Add(formaPago1); | ||
+ | |||
+ | return TotalesSubTotales; | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===== Clase para mostrar los mensajes por consola ===== | ||
+ | |||
+ | <code -> | ||
+ | public class Consola | ||
+ | |||
+ | { | ||
+ | |||
+ | //CLASE SÓLO CON FINES ESTÉTICOS PARA LA PRESENTACIÓN DE MENSAJES AL USUARIO A TRAVÉS DE LA CONSOLA. NO OBLIGATORIA | ||
+ | |||
+ | public static void mensaje(string mensaje, int colorInicio, | ||
+ | |||
+ | { | ||
+ | |||
+ | //Se establece color de la línea actual | ||
+ | |||
+ | switch (colorInicio) | ||
+ | |||
+ | { | ||
+ | |||
+ | case 1: | ||
+ | |||
+ | Console.ForegroundColor = ConsoleColor.Cyan; | ||
+ | |||
+ | break; | ||
+ | |||
+ | case 2: | ||
+ | |||
+ | Console.ForegroundColor = ConsoleColor.Yellow; | ||
+ | |||
+ | break; | ||
+ | |||
+ | case 3: | ||
+ | |||
+ | Console.ForegroundColor = ConsoleColor.Gray; | ||
+ | |||
+ | break; | ||
+ | |||
+ | case 4: | ||
+ | |||
+ | Console.ForegroundColor = ConsoleColor.Green; | ||
+ | |||
+ | break; | ||
+ | |||
+ | case 5: | ||
+ | |||
+ | Console.ForegroundColor = ConsoleColor.Blue; | ||
+ | |||
+ | break; | ||
+ | |||
+ | case 6: | ||
+ | |||
+ | Console.ForegroundColor = ConsoleColor.Red; | ||
+ | |||
+ | break; | ||
+ | |||
+ | default: | ||
+ | |||
+ | Console.ForegroundColor = ConsoleColor.White; | ||
+ | |||
+ | break; | ||
+ | |||
+ | } | ||
+ | |||
+ | //Se muestra el Mensaje indicado | ||
+ | |||
+ | Console.WriteLine(mensaje); | ||
+ | |||
+ | //Se establece color de la línea siguiente | ||
+ | |||
+ | switch (colorFin) | ||
+ | |||
+ | { | ||
+ | |||
+ | case 1: | ||
+ | |||
+ | Console.ForegroundColor = ConsoleColor.Cyan; | ||
+ | |||
+ | break; | ||
+ | |||
+ | case 2: | ||
+ | |||
+ | Console.ForegroundColor = ConsoleColor.Yellow; | ||
+ | |||
+ | break; | ||
+ | |||
+ | case 3: | ||
+ | |||
+ | Console.ForegroundColor = ConsoleColor.Gray; | ||
+ | |||
+ | break; | ||
+ | |||
+ | case 4: | ||
+ | |||
+ | Console.ForegroundColor = ConsoleColor.Green; | ||
+ | |||
+ | break; | ||
+ | |||
+ | case 5: | ||
+ | |||
+ | Console.ForegroundColor = ConsoleColor.Blue; | ||
+ | |||
+ | break; | ||
+ | |||
+ | case 6: | ||
+ | |||
+ | Console.ForegroundColor = ConsoleColor.Red; | ||
+ | |||
+ | break; | ||
+ | |||
+ | default: | ||
+ | |||
+ | Console.ForegroundColor = ConsoleColor.White; | ||
+ | |||
+ | break; | ||
+ | |||
+ | } | ||
+ | |||
+ | if (leer == 1) | ||
+ | |||
+ | { | ||
+ | |||
+ | //Se espera por la pulsación de una tecla para continuar | ||
+ | |||
+ | Console.ReadKey(); | ||
+ | |||
+ | } | ||
+ | |||
+ | } | ||
- | Consola.mensaje(" | + | } |
- | numero = Console.ReadLine(); | + | #endregion |
} | } |