- API REST para gestion de facturas electronicas mexicanas (CFDI) - Laravel 9 con autenticacion OAuth 2.0 (Passport) - Integracion con Syntage, Clerk y Facturama - 30 modelos Eloquent, 39 controladores - Documentacion completa en /docs Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
593 lines
9.9 KiB
Markdown
593 lines
9.9 KiB
Markdown
# Documentacion de API - Horux Backend
|
|
|
|
Esta documentacion describe todos los endpoints disponibles en la API de Horux.
|
|
|
|
## Base URL
|
|
|
|
```
|
|
Produccion: https://horuxfin.com/api
|
|
Desarrollo: http://localhost:8000/api
|
|
```
|
|
|
|
## Autenticacion
|
|
|
|
La API utiliza OAuth 2.0 mediante Laravel Passport. Todos los endpoints protegidos requieren un token Bearer en el header:
|
|
|
|
```
|
|
Authorization: Bearer {access_token}
|
|
```
|
|
|
|
---
|
|
|
|
## Endpoints Publicos
|
|
|
|
### POST /auth
|
|
Autenticacion mediante Clerk OAuth.
|
|
|
|
**Request Body:**
|
|
```json
|
|
{
|
|
"code": "authorization_code_from_clerk"
|
|
}
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"token_type": "Bearer",
|
|
"expires_in": 31536000,
|
|
"access_token": "eyJ0...",
|
|
"refresh_token": "def50..."
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### GET /retenciones
|
|
Obtener retenciones fiscales.
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"data": [...]
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### POST /invoice-endpoint
|
|
Endpoint para recibir facturas (rate limited).
|
|
|
|
**Middleware:** `throttle:custom-origin`
|
|
|
|
---
|
|
|
|
### GET /obtener-ingresos
|
|
Obtener ingresos desde Syntage API.
|
|
|
|
**Query Parameters:**
|
|
| Parametro | Tipo | Requerido | Descripcion |
|
|
|-----------|------|-----------|-------------|
|
|
| rfc | string | Si | RFC del contribuyente |
|
|
| year | integer | No | Ano fiscal |
|
|
|
|
---
|
|
|
|
### POST /obtener-egresos
|
|
Obtener egresos desde Syntage API.
|
|
|
|
**Request Body:**
|
|
```json
|
|
{
|
|
"rfc": "RFC123456789",
|
|
"year": 2024
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### GET /ivaAFavor
|
|
Calcular IVA a favor.
|
|
|
|
**Query Parameters:**
|
|
| Parametro | Tipo | Requerido | Descripcion |
|
|
|-----------|------|-----------|-------------|
|
|
| rfc | string | Si | RFC del contribuyente |
|
|
|
|
---
|
|
|
|
### GET /utilidadBrutaVsIndustria
|
|
Comparar utilidad bruta vs industria.
|
|
|
|
---
|
|
|
|
### GET /risk
|
|
Consultar riesgos fiscales del contribuyente.
|
|
|
|
---
|
|
|
|
### POST /consultarmetrica
|
|
Consultar metricas almacenadas.
|
|
|
|
---
|
|
|
|
### POST /insertmetrica
|
|
Insertar nuevas metricas.
|
|
|
|
---
|
|
|
|
### POST /consultarcomparativo
|
|
Consultar comparativo mensual.
|
|
|
|
---
|
|
|
|
### POST /insertcomparativo
|
|
Insertar comparativo mensual.
|
|
|
|
---
|
|
|
|
### POST /usuariosat
|
|
Registrar usuario SAT.
|
|
|
|
---
|
|
|
|
## Endpoints Protegidos
|
|
|
|
Todos estos endpoints requieren autenticacion (`middleware: auth:api`).
|
|
|
|
---
|
|
|
|
## Gestion de RFCs
|
|
|
|
### POST /insertar-rfc
|
|
Asociar un RFC al usuario autenticado.
|
|
|
|
**Request Body:**
|
|
```json
|
|
{
|
|
"rfc": "RFC123456789",
|
|
"razon_social": "Empresa SA de CV"
|
|
}
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"message": "RFC insertado correctamente",
|
|
"data": {
|
|
"id": 1,
|
|
"rfc": "RFC123456789",
|
|
"razon_social": "Empresa SA de CV"
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### GET /obtener-rfcs
|
|
Obtener todos los RFCs asociados al usuario.
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"data": [
|
|
{
|
|
"id": 1,
|
|
"rfc": "RFC123456789",
|
|
"razon_social": "Empresa SA de CV"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Catalogos Fiscales
|
|
|
|
### GET /tipos-factura
|
|
Obtener catalogo de tipos de factura.
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"data": [
|
|
{"id": 1, "code": "I", "name": "Ingreso"},
|
|
{"id": 2, "code": "E", "name": "Egreso"},
|
|
{"id": 3, "code": "T", "name": "Traslado"},
|
|
{"id": 4, "code": "N", "name": "Nomina"},
|
|
{"id": 5, "code": "P", "name": "Pago"}
|
|
]
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### GET /uso-factura
|
|
Obtener catalogo de usos de factura (CFDI).
|
|
|
|
---
|
|
|
|
### GET /tipos-pago
|
|
Obtener catalogo de tipos de pago.
|
|
|
|
---
|
|
|
|
### GET /metodos-pago
|
|
Obtener catalogo de metodos de pago.
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"data": [
|
|
{"id": 1, "code": "PUE", "name": "Pago en una sola exhibicion"},
|
|
{"id": 2, "code": "PPD", "name": "Pago en parcialidades o diferido"}
|
|
]
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### GET /monedas
|
|
Obtener catalogo de monedas.
|
|
|
|
---
|
|
|
|
### GET /regimenes-fiscales
|
|
Obtener catalogo de regimenes fiscales.
|
|
|
|
---
|
|
|
|
### GET /codigos-prod-serv
|
|
Obtener catalogo de codigos de productos/servicios SAT.
|
|
|
|
---
|
|
|
|
### GET /codigos-unidad
|
|
Obtener catalogo de codigos de unidad SAT.
|
|
|
|
---
|
|
|
|
### GET /impuestos
|
|
Obtener catalogo de impuestos.
|
|
|
|
---
|
|
|
|
### GET /tasas-impuesto
|
|
Obtener catalogo de tasas de impuesto.
|
|
|
|
---
|
|
|
|
## Gestion de Facturas
|
|
|
|
### GET /obtener-facturas
|
|
Obtener todas las facturas del RFC.
|
|
|
|
**Query Parameters:**
|
|
| Parametro | Tipo | Requerido | Descripcion |
|
|
|-----------|------|-----------|-------------|
|
|
| rfc | string | Si | RFC del contribuyente |
|
|
| fecha_inicio | date | No | Fecha inicio (YYYY-MM-DD) |
|
|
| fecha_fin | date | No | Fecha fin (YYYY-MM-DD) |
|
|
| tipo | string | No | Tipo de factura (I, E, T, N, P) |
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"data": [
|
|
{
|
|
"id": 1,
|
|
"uuid": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
|
|
"serie": "A",
|
|
"folio": "123",
|
|
"fecha": "2024-01-15",
|
|
"subtotal": 1000.00,
|
|
"total": 1160.00,
|
|
"emisor_rfc": "RFC123456789",
|
|
"emisor_nombre": "Empresa Emisora",
|
|
"receptor_rfc": "RFC987654321",
|
|
"receptor_nombre": "Empresa Receptora",
|
|
"tipo_comprobante": "I",
|
|
"metodo_pago": "PUE"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### GET /endpoint-facturas
|
|
Endpoint alternativo para obtener facturas.
|
|
|
|
---
|
|
|
|
### GET /facturas-emitidas
|
|
Obtener facturas emitidas por el RFC.
|
|
|
|
**Query Parameters:**
|
|
| Parametro | Tipo | Requerido | Descripcion |
|
|
|-----------|------|-----------|-------------|
|
|
| rfc | string | Si | RFC del emisor |
|
|
| year | integer | No | Ano fiscal |
|
|
| month | integer | No | Mes (1-12) |
|
|
|
|
---
|
|
|
|
### GET /facturas-emitidas-conciliadas
|
|
Obtener facturas emitidas ya conciliadas.
|
|
|
|
---
|
|
|
|
### GET /facturas-recibidas
|
|
Obtener facturas recibidas por el RFC.
|
|
|
|
---
|
|
|
|
### GET /facturas-recibidas-conciliadas
|
|
Obtener facturas recibidas ya conciliadas.
|
|
|
|
---
|
|
|
|
### POST /conciliar-facturas
|
|
Marcar facturas como conciliadas.
|
|
|
|
**Request Body:**
|
|
```json
|
|
{
|
|
"invoice_ids": [1, 2, 3],
|
|
"rfc": "RFC123456789"
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### GET /descargar-factura
|
|
Descargar CFDI en formato XML.
|
|
|
|
**Query Parameters:**
|
|
| Parametro | Tipo | Requerido | Descripcion |
|
|
|-----------|------|-----------|-------------|
|
|
| uuid | string | Si | UUID de la factura |
|
|
|
|
**Response:** Archivo XML del CFDI.
|
|
|
|
---
|
|
|
|
## Complementos de Pago
|
|
|
|
### GET /obtener-complementos-pago
|
|
Obtener complementos de pago (facturas PPD).
|
|
|
|
**Query Parameters:**
|
|
| Parametro | Tipo | Requerido | Descripcion |
|
|
|-----------|------|-----------|-------------|
|
|
| rfc | string | Si | RFC del contribuyente |
|
|
|
|
---
|
|
|
|
## Contribuyentes
|
|
|
|
### GET /obtener-contribuyente
|
|
Obtener informacion del contribuyente desde Syntage.
|
|
|
|
**Query Parameters:**
|
|
| Parametro | Tipo | Requerido | Descripcion |
|
|
|-----------|------|-----------|-------------|
|
|
| rfc | string | Si | RFC a consultar |
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"data": {
|
|
"rfc": "RFC123456789",
|
|
"razon_social": "Empresa SA de CV",
|
|
"regimen_fiscal": "601",
|
|
"actividades_economicas": [...],
|
|
"riesgos": [...]
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Lineas de Facturas
|
|
|
|
### GET /obtener-lineas-facturas
|
|
Obtener lineas/conceptos de facturas.
|
|
|
|
---
|
|
|
|
### GET /obtener-facturas-conceptos
|
|
Obtener facturas con sus conceptos.
|
|
|
|
---
|
|
|
|
## Calculos Financieros
|
|
|
|
### GET /ingreso-tipo-i
|
|
Calcular ingresos tipo I (facturas de ingreso).
|
|
|
|
---
|
|
|
|
### GET /gasto-tipo-i
|
|
Calcular gastos tipo I.
|
|
|
|
---
|
|
|
|
### GET /ingreso-tipo-e
|
|
Calcular ingresos tipo E (notas de credito).
|
|
|
|
---
|
|
|
|
### GET /gasto-tipo-e
|
|
Calcular gastos tipo E.
|
|
|
|
---
|
|
|
|
### GET /gasto-tipo-n
|
|
Calcular gastos tipo N (nomina).
|
|
|
|
---
|
|
|
|
### GET /ingreso-ppd
|
|
Calcular ingresos PPD (pagos en parcialidades).
|
|
|
|
---
|
|
|
|
### GET /gasto-ppd
|
|
Calcular gastos PPD.
|
|
|
|
---
|
|
|
|
### GET /adquisicion-pue
|
|
Calcular adquisiciones PUE.
|
|
|
|
---
|
|
|
|
### GET /adquisicion-ppd
|
|
Calcular adquisiciones PPD.
|
|
|
|
---
|
|
|
|
## Metricas
|
|
|
|
### GET /obtener-metricas
|
|
Obtener metricas globales del RFC.
|
|
|
|
**Query Parameters:**
|
|
| Parametro | Tipo | Requerido | Descripcion |
|
|
|-----------|------|-----------|-------------|
|
|
| rfc | string | Si | RFC del contribuyente |
|
|
| year | integer | No | Ano fiscal |
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"data": {
|
|
"ingresos_totales": 1000000.00,
|
|
"egresos_totales": 600000.00,
|
|
"iva_trasladado": 160000.00,
|
|
"iva_acreditable": 96000.00,
|
|
"iva_a_favor": 64000.00,
|
|
"isr_retenido": 50000.00
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### GET /obtener-metricas-mensuales
|
|
Obtener metricas desglosadas por mes.
|
|
|
|
---
|
|
|
|
## Importacion Masiva
|
|
|
|
### POST /importar-facturas
|
|
Importar facturas desde archivo Excel.
|
|
|
|
**Request:**
|
|
- Content-Type: `multipart/form-data`
|
|
- Campo: `file` (archivo .xlsx o .xls)
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"message": "Se importaron 150 facturas correctamente",
|
|
"imported": 150,
|
|
"errors": 0
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### POST /importar-lineas-facturas
|
|
Importar lineas de facturas desde Excel.
|
|
|
|
---
|
|
|
|
### POST /importar-codigos-prod-serv
|
|
Importar catalogo de codigos de productos/servicios.
|
|
|
|
---
|
|
|
|
### POST /importar-codigos-unidad
|
|
Importar catalogo de codigos de unidad.
|
|
|
|
---
|
|
|
|
## Codigos de Error
|
|
|
|
| Codigo | Descripcion |
|
|
|--------|-------------|
|
|
| 200 | Exito |
|
|
| 201 | Recurso creado |
|
|
| 400 | Solicitud invalida |
|
|
| 401 | No autenticado |
|
|
| 403 | No autorizado |
|
|
| 404 | Recurso no encontrado |
|
|
| 422 | Error de validacion |
|
|
| 429 | Demasiadas solicitudes (rate limit) |
|
|
| 500 | Error interno del servidor |
|
|
|
|
---
|
|
|
|
## Rate Limiting
|
|
|
|
Algunos endpoints tienen rate limiting configurado:
|
|
- `/invoice-endpoint`: Limitado por origen (middleware `throttle:custom-origin`)
|
|
|
|
---
|
|
|
|
## Ejemplos de Uso
|
|
|
|
### Autenticacion con cURL
|
|
|
|
```bash
|
|
# 1. Obtener token
|
|
curl -X POST https://horuxfin.com/api/auth \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"code": "clerk_authorization_code"}'
|
|
|
|
# 2. Usar token en peticiones
|
|
curl -X GET https://horuxfin.com/api/obtener-rfcs \
|
|
-H "Authorization: Bearer {access_token}"
|
|
```
|
|
|
|
### Obtener facturas con JavaScript
|
|
|
|
```javascript
|
|
const response = await fetch('https://horuxfin.com/api/obtener-facturas?rfc=RFC123456789', {
|
|
method: 'GET',
|
|
headers: {
|
|
'Authorization': `Bearer ${accessToken}`,
|
|
'Content-Type': 'application/json'
|
|
}
|
|
});
|
|
|
|
const data = await response.json();
|
|
console.log(data);
|
|
```
|
|
|
|
### Importar facturas con PHP
|
|
|
|
```php
|
|
$client = new GuzzleHttp\Client();
|
|
|
|
$response = $client->post('https://horuxfin.com/api/importar-facturas', [
|
|
'headers' => [
|
|
'Authorization' => 'Bearer ' . $accessToken,
|
|
],
|
|
'multipart' => [
|
|
[
|
|
'name' => 'file',
|
|
'contents' => fopen('/path/to/facturas.xlsx', 'r'),
|
|
'filename' => 'facturas.xlsx'
|
|
]
|
|
]
|
|
]);
|
|
|
|
$result = json_decode($response->getBody(), true);
|
|
```
|