nexconnect / dgii-consultas
Consulta de RNC a partir del listado público de la DGII (República Dominicana), guardado en tu equipo.
Requires
- php: >=8.1
- php-64bit: *
- ext-zip: *
Requires (Dev)
- phpunit/phpunit: ^10.5
Suggests
- ext-openssl: Necesaria para descargar el listado con actualizar() (la DGII usa https). importar() no la usa.
Provides
None
Conflicts
None
Replaces
None
README
Consulta de RNC a partir del listado público de la DGII (República Dominicana). El listado se guarda en tu equipo y las consultas no usan la red ni servicios intermedios. Requiere PHP 8.1 o superior, de 64 bits, con la extensión zip. No tiene otras dependencias de ejecución.
No está afiliado a la DGII. Es un proyecto independiente que lee un archivo que la DGII publica en su sitio. No lo respalda, no lo mantiene ni lo patrocina la Dirección General de Impuestos Internos.
Instalación
composer require nexconnect/dgii-consultas
actualizar() descarga por https con los flujos de PHP: necesita la extensión openssl y allow_url_fopen activado (lo normal). Con importar() no hace falta ninguna de las dos.
Una consulta
use NexConnect\DgiiConsultas\Listado; $listado = new Listado(); $listado->actualizar(); // descarga el listado si cambió; solo esto usa la red $c = $listado->buscar('990-00000-1'); // null si no está if ($c !== null) { echo $c->razon_social, ' ', $c->estado, ' ', $c->fecha_listado->format('Y-m-d'); }
fecha_listado es la fecha del listado consultado (hora de Santo Domingo, UTC-4): revísala, porque el listado puede estar viejo. Las fechas son DateTimeImmutable a medianoche en UTC-4, sin depender de la zona horaria por defecto de PHP, que la librería nunca cambia.
Contribuyente
rnc, razon_social, nombre_comercial, actividad, fecha_inicio (DateTimeImmutable o null), estado, regimen_pago y fecha_listado. Todos los de texto pueden ser null. Son propiedades public readonly: el objeto es inmutable.
Listado
| Método | Qué hace |
|---|---|
new Listado(?string $carpeta = null, string $url = Listado::URL_DGII) |
$carpeta es la caché (por omisión, DGII_CONSULTAS_CACHE o la del sistema). Detrás de un servidor web, pásala siempre. |
actualizar(bool $aceptar_corto = false): bool |
Hace un HEAD y baja el listado solo si hace falta. Devuelve true si cargó un listado, lo que no garantiza datos nuevos: compara la fecha si te importa. |
importar(string $ruta, bool $aceptar_corto = false): void |
Carga un DGII_RNC.zip bajado a mano. |
buscar(mixed $rnc): ?Contribuyente |
Acepta espacios y guiones; 9 u 11 dígitos ASCII. Lo que no sea texto da RncInvalido. Nunca usa la red. |
fecha(): ?DateTimeImmutable, filas(): ?int, descartadas(): ?int |
Datos del listado en uso, o null si no hay. |
Los errores viven en NexConnect\DgiiConsultas\Errores y son hijos de ErrorDgii: RncInvalido, ListadoNoDisponible, ErrorDescarga y ListadoRechazado. Un listado rechazado (no es un zip, falla el CRC, trae demasiadas pocas filas) nunca reemplaza al que ya tenías.
Si la DGII bloquea la descarga
Si responde HTTP 403, baja DGII_RNC.zip con tu navegador y cárgalo con $listado->importar('DGII_RNC.zip').
Dónde se guarda
En DGII_CONSULTAS_CACHE si existe; si no, en ~/Library/Caches/dgii-consultas (macOS), %LOCALAPPDATA%\dgii-consultas (Windows) o $XDG_CACHE_HOME/dgii-consultas o ~/.cache/dgii-consultas (el resto). El formato es el mismo que usan las otras librerías del proyecto, así que pueden compartir la carpeta.
Detrás de un servidor web, pasa la misma carpeta en el cron y en la web, con new Listado('/var/cache/dgii-consultas'): PHP-FPM limpia el entorno y el usuario no suele ser el del cron, así que sin carpeta explícita cada uno usaría una distinta. El usuario del cron debe poder escribir en ella y el del servidor web, leerla.
Cada consulta hace una búsqueda binaria sobre el índice sin cargarlo en memoria, así que cada proceso de PHP (una petición web, por ejemplo) gasta muy poca: la carga de un listado completo (unas 800 mil filas) cabe en el memory_limit de 128 MB que PHP trae por omisión.
Desarrollo
composer install
vendor/bin/phpunit # ninguna prueba sale de 127.0.0.1
composer validate --strict
Créditos
Reconocemos el trabajo previo de developersdo/dgii-consultas, un proyecto con el mismo nombre dentro de la comunidad de desarrolladores dominicanos.
Hecho por NexConnect, que desarrolla facturación electrónica (e-CF) para empresas dominicanas. El código y la documentación completa están en github.com/NexConnect-SRL/dgii-consultas.