Skip to content

Commit 963cc3c

Browse files
committed
Ejemplos de descarga masiva agregados
1 parent a6f25a4 commit 963cc3c

10 files changed

Lines changed: 682 additions & 9 deletions

README.md

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,53 @@
55

66
**SDK oficial de FiscalAPI para PHP**, la API de facturación CFDI y otros servicios fiscales en México. Simplifica la integración con los servicios de facturación electrónica, eliminando las complejidades del SAT y facilitando la generación de facturas, notas de crédito, complementos de pago, nómina, carta porte, y más. ¡Factura sin dolor!
77

8-
## 🚀 Características
98

10-
- Soporte completo para **CFDI 4.0**
11-
- Compatible con **PHP 7.4** y superiores
12-
- Operaciones asíncronas y sincrónicas
13-
- Dos modos de operación: **Por valores** o **Por referencias**
14-
- Manejo simplificado de errores
15-
- Búsqueda en catálogos del SAT
16-
- Documentación completa y ejemplos prácticos
9+
## 📋 Facturación CFDI 4.0
10+
- **Soporte completo para CFDI 4.0** con todas las especificaciones oficiales
11+
- **Timbrado de facturas de ingreso** con validación automática
12+
- **Timbrado de notas de crédito** (facturas de egreso)
13+
- **Timbrado de complementos de pago** en MXN, USD y EUR.
14+
- **Consulta del estatus de facturas** en el SAT en tiempo real
15+
- **Cancelación de facturas**
16+
- **Generación de archivos PDF** de las facturas con formato profesional
17+
- **Personalización de logos y colores** en los PDF generados
18+
- **Envío de facturas por correo electrónico** automatizado
19+
- **Descarga de archivos XML** con estructura completa
20+
- **Almacenamiento y recuperación** de facturas por 5 años.
21+
- Dos [modos de operación](https://docs.fiscalapi.com/modes-of-operation): **Por valores** o **Por referencias**
22+
23+
## 📥 Descarga Masiva
24+
- **Acceso a catálogos de descarga masiva** del SAT
25+
- **Descarga de CFDI y Metadatos** en lotes grandes
26+
- **Descarga masiva XML** con filtros personalizados
27+
- **Reglas de descarga automática por RFC**
28+
- **Solicitudes de descarga** via API y Dashboard.
29+
- **Automatización de solicitudes de descarga**
30+
31+
## 👥 Gestión de Personas
32+
- **Administración de personas** (emisores, receptores, clientes, usuarios, etc.)
33+
- **Gestión de certificados CSD y FIEL** (subir archivos .cer y .key a FiscalAPI)
34+
- **Configuración de datos fiscales** (RFC, domicilio fiscal, régimen fiscal)
35+
36+
## 🛍️ Gestión de Productos/Servicios
37+
- **Gestión de productos y servicios** con catálogo personalizable
38+
- **Administración de impuestos aplicables** (IVA, ISR, IEPS)
39+
40+
## 📚 Consulta de Catálogos SAT
41+
- **Consulta en catálogos oficiales del SAT** actualizados
42+
- **Consulta en catálogos oficiales de Descarga masiva del SAT** actualizados
43+
- **Búsqueda de información** en catálogos del SAT con filtros avanzados
44+
- **Acceso y búsqueda** en catálogos completos
45+
46+
## 📖 Recursos Adicionales
47+
- **Cientos de ejemplos de código** disponibles en múltiples lenguajes de programación
48+
- Documentación completa con guías paso a paso
49+
- Ejemplos prácticos para casos de uso comunes
50+
- Soporte técnico especializado
51+
- Actualizaciones regulares conforme a cambios del SAT
1752

1853
## 📦 Instalación
54+
Compatible con **PHP 7.4** y superiores
1955

2056
**Composer**:
2157

examples.php

Lines changed: 101 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010

1111
// Crea las configuraciones del cliente http fiscalapi.
12-
// Lea como obtener sus credenciales: https://docs.fiscalapi.com/credentials-info
12+
// Lea como obtener sus credenciales: https://docs.fiscalapi.com/credentials-info
1313

1414
//Ambiente de pruebas
1515
$settings = new FiscalApiSettings(
@@ -1456,6 +1456,106 @@
14561456
// consoleLog($apiResponse);
14571457

14581458

1459+
// *******DESCARGA MASIVA **************//
1460+
1461+
// Obtener todos los catálogos de descarga masiva disponibles
1462+
// $apiResponse = $client->getDownloadCatalogService()->getList();
1463+
// consoleLog($apiResponse);
1464+
1465+
// Listar los registros del catálogo 'SatInvoiceStatuses' de descarga masiva
1466+
// $apiResponse = $client->getDownloadCatalogService()->listCatalog('SatInvoiceStatuses');
1467+
// consoleLog($apiResponse);
1468+
1469+
// *******REGLAS DE DESCARGA MASIVA **************//
1470+
1471+
// Obtener lista paginada de reglas de descarga masiva (pageNumber=1, pageSize=2)
1472+
// $apiResponse = $client->getDownloadRuleService()->list(1, 2);
1473+
// consoleLog($apiResponse);
1474+
1475+
// Obtener regla de descarga por ID
1476+
// $apiResponse = $client->getDownloadRuleService()->get('a339a292-37fe-422e-a28a-f93e6025c72f');
1477+
// consoleLog($apiResponse);
1478+
1479+
// Crear regla de descarga - Regla para descargar CFDI recibidos y vigentes
1480+
// $downloadRuleData = [
1481+
// 'personId' => 'b0c1cf6c-153a-464e-99df-5741f45d6695', // Persona que recibió los CFDI
1482+
// 'description' => 'Regla descarga demo ...',
1483+
// 'satQueryTypeId' => 'CFDI',
1484+
// 'downloadTypeId' => 'Recibidos',
1485+
// 'satInvoiceStatusId' => 'Vigente'
1486+
// ];
1487+
// $apiResponse = $client->getDownloadRuleService()->create($downloadRuleData);
1488+
// consoleLog($apiResponse);
1489+
1490+
1491+
// Crear regla de solicitud de prueba
1492+
// $apiResponse = $client->getDownloadRuleService()->createTestRule();
1493+
// consoleLog($apiResponse);
1494+
1495+
// Actualizar regla de descarga masiva - Actualizar descripción
1496+
// $updateData = [
1497+
// 'id' => 'e9d633a8-1c27-4a85-8924-4bfa7bec8dc5',
1498+
// 'description' => 'Regla descarga actualizada'
1499+
// ];
1500+
// $apiResponse = $client->getDownloadRuleService()->update($updateData);
1501+
// consoleLog($apiResponse);
1502+
1503+
// Eliminar regla de descarga
1504+
// $apiResponse = $client->getDownloadRuleService()->delete('e9d633a8-1c27-4a85-8924-4bfa7bec8dc5');
1505+
// consoleLog($apiResponse);
1506+
1507+
1508+
/**********SOLICITUDES DE DESCARGA MASIVA ***********/
1509+
1510+
// Obtener lista paginada de solicitudes de descarga masiva (pageNumber=1, pageSize=2)
1511+
// $apiResponse = $client->getDownloadRequestService()->list(1, 2);
1512+
// consoleLog($apiResponse);
1513+
1514+
// Obtener solicitud de descarga por ID
1515+
// $apiResponse = $client->getDownloadRequestService()->get('bf8f0fc8-1733-447a-955c-7de59bacc437');
1516+
// consoleLog($apiResponse);
1517+
1518+
1519+
// Listar xmls descargados asociados a una solicitud de descarga
1520+
// $apiResponse = $client->getDownloadRequestService()->getXmls('d1dfc248-75bb-43ab-85f7-03232d00b931');
1521+
// consoleLog($apiResponse);
1522+
1523+
// Listar metadatos descargados asociados a una solicitud de descarga
1524+
// $apiResponse = $client->getDownloadRequestService()->getMetadataItems('d1dfc248-75bb-43ab-85f7-03232d00b931');
1525+
// consoleLog($apiResponse);
1526+
1527+
// Descargar paquete (.zip file) de una solicitud de descarga masiva
1528+
// $apiResponse = $client->getDownloadRequestService()->downloadPackage('d1dfc248-75bb-43ab-85f7-03232d00b931');
1529+
// consoleLog($apiResponse);
1530+
1531+
1532+
// Descargar SAT request (.xml file) de una solicitud de descarga masiva (debug/testing)
1533+
// $apiResponse = $client->getDownloadRequestService()->downloadSatRequest('d1dfc248-75bb-43ab-85f7-03232d00b931');
1534+
// consoleLog($apiResponse);
1535+
1536+
// Descargar SAT response (.xml file) de una solicitud de descarga masiva (debug/testing)
1537+
// $apiResponse = $client->getDownloadRequestService()->downloadSatResponse('d1dfc248-75bb-43ab-85f7-03232d00b931');
1538+
// consoleLog($apiResponse);
1539+
1540+
// Crear solicitud de descarga masiva - Solicitud para descargar facturas de los últimos 5 días
1541+
// $downloadRequestData = [
1542+
// 'downloadRuleId' => '15766a23-4a33-4a9a-b627-6bfc431a4dd1',
1543+
// 'downloadRequestTypeId' => 'Manual',
1544+
// 'startDate' => date('Y-m-d', strtotime('-5 days')),
1545+
// 'endDate' => date('Y-m-d')
1546+
// ];
1547+
// $apiResponse = $client->getDownloadRequestService()->create($downloadRequestData);
1548+
// consoleLog($apiResponse);
1549+
1550+
// Eliminar solicitud de descarga masiva
1551+
// $apiResponse = $client->getDownloadRequestService()->delete('5259a336-ffd2-4097-8f0f-db23884f009f');
1552+
// consoleLog($apiResponse);
1553+
1554+
// Buscar solicitud de descarga masiva por fecha de creación (hoy)
1555+
// $apiResponse = $client->getDownloadRequestService()->search(date('Y-m-d'));
1556+
// consoleLog($apiResponse);
1557+
1558+
14591559
} catch (\Exception $e) {
14601560
consoleError($e);
14611561
}
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace Fiscalapi\Services;
5+
6+
use BadMethodCallException;
7+
use Fiscalapi\Http\FiscalApiHttpClientInterface;
8+
use Fiscalapi\Http\FiscalApiHttpResponseInterface;
9+
10+
/**
11+
* Implementación del servicio de descarga masiva de catálogos
12+
*/
13+
class DownloadCatalogService extends AbstractService implements DownloadCatalogServiceInterface
14+
{
15+
/**
16+
* Constructor del servicio de catálogos de descarga masiva.
17+
*
18+
* @param FiscalApiHttpClientInterface $httpClient Cliente HTTP
19+
*/
20+
public function __construct(FiscalApiHttpClientInterface $httpClient)
21+
{
22+
parent::__construct($httpClient, 'download-catalogs');
23+
}
24+
25+
/**
26+
* Recupera todos los nombres de los catálogos de descarga masiva disponibles para listarlos por nombre.
27+
*
28+
* @return FiscalApiHttpResponseInterface
29+
*/
30+
public function getList(): FiscalApiHttpResponseInterface
31+
{
32+
return $this->httpClient->get($this->buildResourceUrl());
33+
}
34+
35+
/**
36+
* Lista todos los registros de un catálogo pasando el nombre del catálogo.
37+
*
38+
* @param string $catalogName Nombre del catálogo
39+
* @return FiscalApiHttpResponseInterface
40+
*/
41+
public function listCatalog(string $catalogName): FiscalApiHttpResponseInterface
42+
{
43+
$path = sprintf('%s', $catalogName);
44+
return $this->httpClient->get($this->buildResourceUrl(null, $path));
45+
}
46+
47+
/**
48+
* No se implementa la paginación. Utiliza getList y listCatalog en su lugar.
49+
*
50+
* @param int $pageNumber Número de página
51+
* @param int $pageSize Tamaño de página
52+
* @return FiscalApiHttpResponseInterface
53+
* @throws BadMethodCallException
54+
*/
55+
public function list(int $pageNumber = 1, int $pageSize = 10): FiscalApiHttpResponseInterface
56+
{
57+
throw new BadMethodCallException('Utiliza getList y listCatalog en su lugar.');
58+
}
59+
60+
/**
61+
* No se implementa. Utiliza getList y listCatalog en su lugar.
62+
*
63+
* @param string $id Id del recurso
64+
* @param bool $details indica si debe recuperar los registros relacionados
65+
* @return FiscalApiHttpResponseInterface
66+
* @throws BadMethodCallException
67+
*/
68+
public function get(string $id, bool $details = false): FiscalApiHttpResponseInterface
69+
{
70+
throw new BadMethodCallException('Utiliza getList y listCatalog en su lugar.');
71+
}
72+
73+
/**
74+
* No se implementa. Utiliza getList y listCatalog en su lugar.
75+
*
76+
* @param array $data Datos del recurso
77+
* @return FiscalApiHttpResponseInterface
78+
* @throws BadMethodCallException
79+
*/
80+
public function create(array $data): FiscalApiHttpResponseInterface
81+
{
82+
throw new BadMethodCallException('Utiliza getList y listCatalog en su lugar.');
83+
}
84+
85+
/**
86+
* No se implementa. Utiliza getList y listCatalog en su lugar.
87+
*
88+
* @param array $data Datos a actualizar
89+
* @return FiscalApiHttpResponseInterface
90+
* @throws BadMethodCallException
91+
*/
92+
public function update(array $data): FiscalApiHttpResponseInterface
93+
{
94+
throw new BadMethodCallException('Utiliza getList y listCatalog en su lugar.');
95+
}
96+
97+
/**
98+
* No se implementa. Utiliza getList y listCatalog en su lugar.
99+
*
100+
* @param string $id Id del recurso
101+
* @return FiscalApiHttpResponseInterface
102+
* @throws BadMethodCallException
103+
*/
104+
public function delete(string $id): FiscalApiHttpResponseInterface
105+
{
106+
throw new BadMethodCallException('Utiliza getList y listCatalog en su lugar.');
107+
}
108+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace Fiscalapi\Services;
5+
6+
use Fiscalapi\Http\FiscalApiHttpResponseInterface;
7+
8+
/**
9+
* Interfaz para el servicio de descarga masiva de catálogos
10+
*/
11+
interface DownloadCatalogServiceInterface extends FiscalApiServiceInterface
12+
{
13+
/**
14+
* Recupera todos los nombres de los catálogos de descarga masiva disponibles para listarlos por nombre.
15+
*
16+
* @return FiscalApiHttpResponseInterface
17+
*/
18+
public function getList(): FiscalApiHttpResponseInterface;
19+
20+
/**
21+
* Lista todos los registros de un catálogo pasando el nombre del catálogo.
22+
*
23+
* @param string $catalogName Nombre del catálogo
24+
* @return FiscalApiHttpResponseInterface
25+
*/
26+
public function listCatalog(string $catalogName): FiscalApiHttpResponseInterface;
27+
28+
/**
29+
* No se implementa la paginación. Utiliza getList y listCatalog en su lugar.
30+
*
31+
* @param int $pageNumber Número de página
32+
* @param int $pageSize Tamaño de página
33+
* @throws \BadMethodCallException
34+
*/
35+
public function list(int $pageNumber = 1, int $pageSize = 10): FiscalApiHttpResponseInterface;
36+
37+
/**
38+
* No se implementa. Utiliza getList y listCatalog en su lugar.
39+
*
40+
* @param string $id Id del recurso
41+
* @param bool $details indica si debe recuperar los registros relacionados
42+
* @throws \BadMethodCallException
43+
*/
44+
public function get(string $id, bool $details = false): FiscalApiHttpResponseInterface;
45+
46+
/**
47+
* No se implementa. Utiliza getList y listCatalog en su lugar.
48+
*
49+
* @param array $data Datos del recurso
50+
* @throws \BadMethodCallException
51+
*/
52+
public function create(array $data): FiscalApiHttpResponseInterface;
53+
54+
/**
55+
* No se implementa. Utiliza getList y listCatalog en su lugar.
56+
*
57+
* @param array $data Datos a actualizar
58+
* @throws \BadMethodCallException
59+
*/
60+
public function update(array $data): FiscalApiHttpResponseInterface;
61+
62+
/**
63+
* No se implementa. Utiliza getList y listCatalog en su lugar.
64+
*
65+
* @param string $id Id del recurso
66+
* @throws \BadMethodCallException
67+
*/
68+
public function delete(string $id): FiscalApiHttpResponseInterface;
69+
}

0 commit comments

Comments
 (0)