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 PHP
Lo más importante es establecer los pasos necesarios para realizar una integración exitosa.
Criterios a tomar en cuenta:
Pasos para realizar la integración:
PASO 1: Definir variables con la ruta y los tokens requeridos por el Servicio Web de Integración de TFHKA.
PASO 2: Construir el Documento Electrónico a enviar al Servicio Web de Integración de TFHKA.
PASO 3: Enviar el Documento Electrónico construido en el paso 3 al Servicio Web de Integración de TFHKA.
PASO 4: Recibir y procesar la Respuesta del Servicio Web de Integración de TFHKA.
IMPORTANTE: El Documento procesado será almacenado en la NUBE para que pueda ser consultado en cualquier momento.
Para mayor información y detalles sobre el proceso, puede consultar el Manual de Integración de TFHKA
A continuación definiremos la ruta y los TOKENS requeridos por el Servicio Web de Integración de TFHKA para enviar documentos electrónicos, así como para utilizar otros métodos públicos expuestos $ruta = “https://demoemision.thefactoryhka.com.pa/ws/obj/v1.0/Service.svc?singleWsdl”; url del servicio
$tokenEmpresa = “SOLICITAR”;
$tokenPassword = “SOLICITAR”;
En este ejemplo utilizaremos Clases, Atributos y Métodos creados con la finalidad de organizar mejor la estructura del archivo y del cuerpo de código fuente en general.
Sin embargo, esta estructura no es obligatoria. El desarrollador puede utilizar su propio estilo, siempre y cuando logre establecer los valores requeridos para los diferentes objetos que sub-componen al objeto DocumentoElectrónico a enviar al Servicio Web.
A continuación se define una variable para establecer el Número de Documento Electrónico a enviar
$numeroDocFiscal = “0000000000”;
Mensajero::InfoNumero($numeroDocFiscal);
$factura = new DocumentoElectronico();
$cliente = new Cliente();
$datos = new DatosTransaccion();
$datos→cliente = $cliente;
- Debe establecerse el formato solicitado para la fecha de emisión “yyyy-MM-ddTHH:mm:ss-05:00”
$datos→fechaEmision = (new \DateTime('America/Panama'))→format('Y-m-d\TH:i:s-05:00');
$datos→numeroDocumentoFiscal = $numeroDocFiscal;
$factura→datosTransaccion = $datos;
$item = new Item();
$factura→listaItems = array($item);
$totales = new Totales();
$formaPago = new FormaPago();
$totales→listaFormaPago = array($formaPago);
$factura→totalesSubTotales = $totales;
- Ya teniendo listo el documento, es posible enviarlo al Servicio Web de Integración de TFHKA
A continuación definiremos la ruta y los TOKENS requeridos por el Servicio Web de Integración de TFHKA para enviar documentos electrónicos, así como para utilizar otros métodos públicos expuestos.
try { $wsPa = new SoapClient($ruta); $parametros = array( 'tokenEmpresa' => $tokenEmpresa, 'tokenPassword' => $tokenPassword, 'documento' => $factura, ); - A continuación, enviamos el documento al método "Enviar" del Servicio Web de Integración de TFHKA $respWsPa = json_decode(json_encode($wsPa->__soapCall('Enviar', array($parametros))), true); } catch (\Exception $e) { die($e); }
La respuesta del Servicio Web de TFHKA será enviada inmediatamente.
En este ejemplo, la respuesta del Servicio Web se muestra directamente a través de la pantalla.
En caso de recibir una respuesta positiva para el envío del Documento Electrónico (código 200), se presentará un enlace para observar los detalles a través de la página de Consulta de Facturas por Qr en una pestaña adicional de su navegador web.
La respuesta del Servicio Web de TFHKA incluye: código de la respuesta, resultado, mensaje, cufe y Qr, entre otros.
Para mayor detalle de la respuesta del Servicio Web, podría visualizar el resultado a través de la siguiente instrucción: var_dump($respWsPa[“EnviarResult”]);
Mensajero:MostrarRespuesta($respWsPa);
class DocumentoElectronico { public $codigoSucursalEmisor = "0000"; public $tipoSucursal = "1"; public $datosTransaccion; public $listaItems; public $totalesSubTotales; } class Cliente { public $tipoClienteFE = "01"; public $tipoContribuyente = "2"; public $numeroRUC = "155596713-2-2015"; public $digitoVerificadorRUC = "59"; public $razonSocial = "FE general"; public $direccion = "Av. Balboa"; public $codigoUbicacion = "1-2-3"; public $corregimiento = "Guabito"; public $distrito = "Changuinola"; public $provincia = "Bocas del Toro"; public $telefono1 = "997-8243"; public $telefono2 = ""; public $telefono3 = ""; public $correoElectronico1 = "fep@gmail.com"; public $pais = "PA"; public $paisOtro = ""; } class DatosTransaccion { public $tipoEmision = "01"; public $tipoDocumento = "01"; public $numeroDocumentoFiscal; public $puntoFacturacionFiscal = "001"; public $fechaEmision; public $naturalezaOperacion = "01"; public $tipoOperacion = "1"; public $destinoOperacion = "1"; public $formatoCAFE = "1"; public $entregaCAFE = "1"; public $envioContenedor = "1"; public $procesoGeneracion = "1"; public $tipoVenta = "1"; public $informacionInteres = "Prueba de Información de interés"; public $cliente; } class Item { public $descripcion = "Cuadernos"; public $codigo = "T"; public $unidadMedida = "und"; public $cantidad = "2.00"; public $fechaFabricacion = "2020-12-25"; public $unidadMedidaCPBS = "cm"; public $precioUnitario = "69.00"; public $precioUnitarioDescuento = "0.00"; public $precioAcarreo = "1.01"; public $precioSeguro = "12.01"; public $precioItem = "138.00"; public $valorTotal = "171.72"; public $codigoGTIN = "0"; public $cantGTINCom = "0.99"; public $codigoGTINInv = "0"; public $cantGTINComInv = "1.00"; public $tasaITBMS = "03"; public $valorITBMS = "20.70"; public $tasaISC = "0.00"; public $valorISC = "0.00"; public $codigoCPBS = "1410"; } class Totales { public $totalPrecioNeto = "138.00"; public $totalITBMS = "20.70"; public $totalISC = "0.00"; public $totalMontoGravado = "20.70"; public $totalDescuento = ""; public $totalAcarreoCobrado = ""; public $valorSeguroCobrado = ""; public $totalFactura = "171.72"; public $totalValorRecibido = "171.72"; public $vuelto = "0.00"; public $tiempoPago = "1"; public $nroItems = "1"; public $totalTodosItems = "171.72"; public $listaFormaPago; } class FormaPago { public $formaPagoFact = "02"; public $valorCuotaPagada = "171.72"; public $descFormaPago = ""; }
class Mensajero { public static function Encabezado() { echo ("<div class='encabezado'>The Factory HKA C.A.</div><div class='encabezado6'>EJEMPLO DE INTEGRACIÓN DIRECTA PHP (v7 o superior)</div>"); } public static function InfoNumero($numero) { echo ("<span class='texto3'>Número de Documento Fiscal a enviar:</span><span class='texto4'>" . $numero . "</span> <br> <center> <div class='encabezado2'> <ul> <li>Puede cambiar el Número de Documento Fiscal a enviar en la línea 67 del código fuente de esta página.</li> <li>Guarde el cambio realizado y haga Click en el siguiente botón para actualizar y enviar nuevamente.</li> </ul> </div> <div class='encabezado4'> <button onClick='window.location.reload();'>Actualizar</button> </div> </center>"); } public static function MostrarRespuesta($respWsPa) { echo " <center> <div class='encabezado5'> <span class='texto2'>RESULTADOS</span> <hr> <p class='encabezado3'> <u>CÓDIGO</u>: " . $respWsPa["EnviarResult"]['codigo'] . "<br> <u>RESULTADO</u>: " . $respWsPa["EnviarResult"]['resultado'] . "<br> <u>MENSAJE</u>: " . $respWsPa["EnviarResult"]['mensaje'] . "<br> <u>CUFE</u>: " . $respWsPa["EnviarResult"]['cufe'] . "</p> </div> </center>"; if ($respWsPa["EnviarResult"]['codigo'] == "200" || $respWsPa["EnviarResult"]['codigo'] == "102") { echo " <center> <div class='encabezado4'> <a href='" . $respWsPa["EnviarResult"]['qr'] . "' target='_blank'> Consultar Información </a> </div> </center>"; } } }
<style type="text/css"> .texto2 { color: #990000; font-size: 1rem; } .texto3 { color: #002d99; font-size: 1.8rem; padding-left: 265px; } .texto4 { color: #d52d06; font-size: 1.5rem; padding-left: 10px; } .texto6 { color: #fff; font-size: 1.5rem; padding-left: 50px; } .encabezado { margin: 10 0 5px 0; padding: 15px; border-top: 1px solid #E9ECEF; background: #5077a3; background: -webkit-linear-gradient(to bottom right, rgb(2, 66, 179) 0%, rgb(0, 47, 134) 100%); background: linear-gradient(to bottom right, rgb(2, 66, 179) 0%, rgb(0, 47, 134) 100%); box-shadow: 0px 1px 3px -1px rgba(41, 70, 97, 0.2); position: relative; border-bottom: 1px solid #E9ECEF; color: #fff; font-size: 1.9rem; padding-left: 60px; } .encabezado2 { width: 60%; margin-top: 20px; border: 2px solid #c8dbff; background-color: #eef6ff; position: relative; color: #002d99; font-size: 1rem; border-radius: 10px; padding: 5px; line-height: 30px; text-align: left; text-indent: 50px; } .encabezado3 { width: 100% margin-top: 10px; background-color: #eef6ff; position: relative; color: #002d99; font-size: 1rem; border-radius: 5px; padding: 5px; line-height: 30px; text-align: left; padding-left: 40px } .encabezado4 { width: 60%; margin-top: 20px; border: 2px solid #c8dbff; border-radius: 10px; } .encabezado5 { width: 60%; margin-top: 50px; border: 2px solid #c8dbff; border-radius: 10px; } .encabezado6 { margin: 10 0 30px 0; padding: 0 30px; border-top: 1px solid #c8dbff; background-color: #eef6ff; box-shadow: 0px 1px 3px -1px rgba(41, 70, 97, 0.2); position: relative; border-bottom: 1px solid #c8dbff; color: #990000; font-size: 1.6rem; text-indent: 50px; } ul { list-style: none; } li { margin: 0px 0px 1px 0px; } button { position: relative; display: inline-block; padding: 8px 10px; background-image: linear-gradient(to bottom right, rgb(2, 66, 179) 0%, rgb(0, 47, 134) 100%); background-image: -webkit-linear-gradient(to bottom right, rgb(2, 66, 179) 0%, rgb(0, 47, 134) 100%); text-decoration: none; color: #fff; font-size: 15px; font-family: sans-serif; font-weight: 100; border-radius: 5px; float: right; } button:hover { background: -webkit-linear-gradient(to bottom right, rgb(1, 85, 232) 0%, rgb(0, 81, 232) 100%); background: linear-gradient(to bottom right, rgb(1, 85, 232) 0%, rgb(0, 81, 232) 100%); color: #fff; } a { position: relative; display: inline-block; padding: 8px 10px; background-image: linear-gradient(to bottom right, rgb(2, 66, 179) 0%, rgb(0, 47, 134) 100%); background-image: -webkit-linear-gradient(to bottom right, rgb(2, 66, 179) 0%, rgb(0, 47, 134) 100%); text-decoration: none; color: #fff; font-size: 15px; font-family: sans-serif; font-weight: 100; border-radius: 5px; float: right; } a:hover { background: -webkit-linear-gradient(to bottom right, rgb(1, 85, 232) 0%, rgb(0, 81, 232) 100%); background: linear-gradient(to bottom right, rgb(1, 85, 232) 0%, rgb(0, 81, 232) 100%); color: #fff; } hr { border: 2px solid #c8dbff; background-color: #eef6ff; } </style>