Documentacion Libreria Siat PHP
Documentacion de Desarrollador Libreria Siat V2 PHP
Para una mejor compresión de nuestra documentación, es necesario que el desarrollador tenga conocimiento del Anexo técnico Siat de Impuestos Nacionales de Bolivia.
Requerimientos
- Version de php 7.x o superior
- Modulo php soap
- Modulo php openssl
Carga de dependencias
La libreria cuenta con un archivo de auto carga de clases cumpliendo estandar PSR-4.
Bastará con solo incluir el archivo autoload.php
require_once LIB_SIAT_DIR . ‘/autoload.php’;
Donde LIB_SIAT_DIR, es la ruta donde se encuentra la libreria
Inicializacion de configuracion
$config = new Siatconfig([
'nombreSistema' => "SISTEMA MONOBUSINESS",
‘codigoSistema' => '6D32',
'nit' => 999999,
'razonSocial' => "EMPRESA. S.R.L.",
'modalidad' => ServicioSiat::MOD_COMPUTARIZADA_ENLINEA,
'ambiente' => ServicioSiat::AMBIENTE_PRUEBAS,
'tokenDelegado' => 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJOdWJldGljNTAyMCIsImNvZGlnb1Npc3RlbWEiOiI3MUU3NjM4RkZCRTBCRkI4NjUzMDZDNyIsIm5pdCI6Ikg0c0lBQUFBQUFBQUFETzJOREV5TURVd01nQUFVTGFfOXdrQUFBQT0iLCJpZCI6MTE2MDA1MywiZXhwIjoxNjgzNzYzMjAwLCJpYXQiOjE2NTIyOTA3NzYsIm5pdERlbGVnYWRvIjozOTQyMDUwMjAsInN1YnNpc3RlbWEiOiJTRkUifQ.tNdDO0ZqTlbPJ5pvJ2Tw3faVsPd3P8CB2tRS2a7KTyXuigguBQyFdcI5O5fehYGdqpi1IpaeXrR0y8b2kl-yOA',
'pubCert' => 'ruta_al_certificado.pem',
'privCert' => 'ruta_a_la_firma_digital.pem',
]);
Servicio de Codigos
Obtención de codigo CUIS
$config = obtenerConfiguracion();
$codigoPuntoVenta = 0;
$codigoSucursal = 0;
$serviceCodigos = new ServicioFacturacionCodigos(null, null, $config->tokenDelegado);
$serviceCodigos->setConfig((array)$config);
$resCuis = $serviceCodigos->cuis($codigoPuntoVenta, $codigoSucursal);
Obtención de código CUFD
Para poder obtener el CUFD, es necesario antes obtener el CUIS y asignarlo al servicio de obtencion de codigos
$config = obtenerConfiguracion();
$codigoPuntoVenta = 0;
$codigoSucursal = 0;
$serviceCodigos = new ServicioFacturacionCodigos(null, null, $config->tokenDelegado);
$serviceCodigos->setConfig((array)$config);
$serviceCodigos->cuis = $resCuis->RespuestaCuis->codigo;
$resCufd = $serviceCodigos->cufd($codigoPuntoVenta, $codigoSucursal);
Servicio de Sincronizacion
El servicio de sincronización obtiene parametricas e información importante para poder construir una factura
Para la utilización de este servicio, es necesario obtener el codigo CUIS antes de realizar cualquier operación
Ejemplo de obtención de listado de eventos significativos
$config = obtenerConfiguracion(); //funcion a implementar por el dev
$resCuis = obtenerCUIS($config); //funcion a implementar por el dev
//##obtener listado de eventos
$serviceSync = new ServicioFacturacionSincronizacion($resCuis->RespuestaCuis->codigo);
$serviceSync->setConfig((array)$config);
$eventsList = $serviceSync->sincronizarParametricaEventosSignificativos();
Servicio de Operaciones
El servicio de operaciones nos permite registrar puntos de venta, eventos de contingencia, etc.
Registro de un evento
Para poder registrar un evento es necesario obtener el CUIS antes, y en algunos casos es necesario el CUFD (revisar documentacion SIAT, anexo tecnico).
Tambien se debe obtener el codigo del evento que se quiere registrar (este evento se debe obtener utilizando el servicio de sincronizacion)
$config = obternetConfiguracion();
$resCuis = obtenerCUIS($config);
$resCufd = obtenerCUFD($config);
$event = obtenerEvento($config, $resCuis, $resCufd);
$serviceOps = new ServicioOperaciones($resCuis->RespuestaCuis->codigo, $resCufd->RespuestaCufd->codigo);
$serviceOps->setConfig((array)$config);
$fechaInicio = date('Y-m-dTH:i:s.v', time() - (86400 * 3)); //fecha anterior del evento
$fechaFin = date('Y-m-dT16:00:00', time() - (86400 * 1)); //fecha anterior del evento
//##este cufd es cuando paso el evento
$cufdAntiguo = '';
$resEvent = $serviceOps->registroEventoSignificativo($event->codigoClasificador, $event->descripcion, $cufdAntiguo, $fechaInicio, $fechaFin);
print_r($resEvent);
Obtencion del Servicio de Facturacion
$config = obternetConfiguracion();
$resCuis = obtenerCuis($codigoPuntoVenta, $codigoSucursal);
$resCufd = obtenerCufd($codigoPuntoVenta, $codigoSucursal, $resCuis->RespuestaCuis->codigo);
$service = SiatFactory::obtenerServicioFacturacion($config, $resCuis->RespuestaCuis->codigo, $resCufd->RespuestaCufd->codigo, $resCufd->RespuestaCufd->codigoControl);
Generacion de la Factura
$factura = new CompraVenta();
//##cabecera de la factura
$factura->cabecera->razonSocialEmisor = $config->razonSocial;
$factura->cabecera->municipio = 'La Paz';
$factura->cabecera->telefono = $config->telefono;
$factura->cabecera->numeroFactura = 10;
$factura->cabecera->codigoSucursal = $codigoSucursal;
$factura->cabecera->direccion = 'Direccion #109';
$factura->cabecera->codigoPuntoVenta = $codigoPuntoVenta;
$factura->cabecera->fechaEmision = date('Y-m-dTH:i:s.v');
$factura->cabecera->nombreRazonSocial = 'Perez';
$factura->cabecera->codigoTipoDocumentoIdentidad = 1; //CI - CEDULA DE IDENTIDAD
$factura->cabecera->numeroDocumento = 2287567;
$factura->cabecera->codigoCliente = 'CC-2287567';
$factura->cabecera->codigoMetodoPago = 1;
$factura->cabecera->montoTotal = $subTotal;
$factura->cabecera->montoTotalMoneda = $factura->cabecera->montoTotal;
$factura->cabecera->montoTotalSujetoIva = $factura->cabecera->montoTotal;
$factura->cabecera->descuentoAdicional = 0;
$factura->cabecera->codigoMoneda = 1; //BOLIVIANO
$factura->cabecera->tipoCambio = 1;
$factura->cabecera->usuario = 'MonoBusiness User 01';
//##detalle de la factura
$detalle = new InvoiceDetail();
$detalle->cantidad = 1;
$detalle->actividadEconomica = $codigoActividad;
$detalle->codigoProducto = 'D001-' . rand(1, 4000);
$detalle->codigoProductoSin = $codigoProductoSin;
$detalle->descripcion = 'Nombre del producto #0' . ($i + 1);
$detalle->precioUnitario = 10 * rand(1, 4000);
$detalle->montoDescuento = 0;
$detalle->subTotal = $detalle->cantidad * $detalle->precioUnitario;
//##adicionar el detalle a la factura
$factura->detalle[] = $detalle;
Facturacion Telecomunicaciones
$factura = new ElectronicaTelecomunicaciones();
//##cabecera de la factura
$factura->cabecera->razonSocialEmisor = $config->razonSocial;
$factura->cabecera->municipio = 'La Paz';
$factura->cabecera->telefono = $config->telefono;
$factura->cabecera->numeroFactura = 10;
$factura->cabecera->codigoSucursal = $codigoSucursal;
$factura->cabecera->direccion = 'Direccion #109';
$factura->cabecera->codigoPuntoVenta = $codigoPuntoVenta;
$factura->cabecera->fechaEmision = date('Y-m-dTH:i:s.v');
$factura->cabecera->nombreRazonSocial = 'Perez';
$factura->cabecera->codigoTipoDocumentoIdentidad = 1; //CI - CEDULA DE IDENTIDAD
$factura->cabecera->numeroDocumento = 2287567;
$factura->cabecera->codigoCliente = 'CC-2287567';
$factura->cabecera->codigoMetodoPago = 1;
$factura->cabecera->montoTotal = $subTotal;
$factura->cabecera->montoTotalMoneda = $factura->cabecera->montoTotal;
$factura->cabecera->montoTotalSujetoIva = $factura->cabecera->montoTotal;
$factura->cabecera->descuentoAdicional = 0;
$factura->cabecera->codigoMoneda = 1; //BOLIVIANO
$factura->cabecera->tipoCambio = 1;
$factura->cabecera->usuario = 'MonoBusiness User 01';
$factura->cabecera->nitConjunto = '34556542';
//##detalle de la factura
$detalle = new InvoiceDetail();
$detalle->cantidad = 1;
$detalle->actividadEconomica = $codigoActividad;
$detalle->codigoProducto = 'D001-' . rand(1, 4000);
$detalle->codigoProductoSin = $codigoProductoSin;
$detalle->descripcion = 'Nombre del producto #0' . ($i + 1);
$detalle->precioUnitario = 10 * rand(1, 4000);
$detalle->montoDescuento = 0;
$detalle->subTotal = $detalle->cantidad * $detalle->precioUnitario;
//##adicionar el detalle a la factura
$factura->detalle[] = $detalle;
Recepción de la Factura
Con el servicio de facturacion que obtuvimos anteriormente, podemos realizar el envio de la factura (recepcionFactura)
$res = $service->recepcionFactura($factura, SiatInvoice::TIPO_EMISION_ONLINE, SiatInvoice::FACTURA_DERECHO_CREDITO_FISCAL);
if( $res->RespuestaServicioFacturacion->codigoEstado == 908 )
{
print 'Factura emitida correctamente';
}
Anulación Factura
$config = obtenerConfiguracion();
$resCuis = obtenerCuis($codigoPuntoVenta, $codigoSucursal);
$resCufd = obtenerCufd($codigoPuntoVenta, $codigoSucursal, $resCuis->RespuestaCuis->codigo);
$service = SiatFactory::obtenerServicioFacturacion($config, $resCuis->RespuestaCuis->codigo, $resCufd->RespuestaCufd->codigo, $resCufd->RespuestaCufd->codigoControl);
$codigoMotivo = 1; //Factura mal emitida
$cuf = '39B372CA80B04B33C55A8FEFFC5121CE67DDD8606A444FF7146ECB6D74';
$sucursal = 0;
$puntoventa = 0;
$tipoFactura = SiatInvoice::FACTURA_DERECHO_CREDITO_FISCAL;
$tipoEmision = SiatInvoice::TIPO_EMISION_ONLINE;
$documentoSector = DocumentTypes::FACTURA_COMPRA_VENTA;
$res = $service->anulacionFactura($codigoMotivo, $cuf, $sucursal, $puntoventa, $tipoFactura, $tipoEmision, $documentoSector);
print_r($res);