Una liquidación agrupada de comisiones y pagos entre la plataforma y un Provider, una Branch o una Account, por un período. Reúne una lista de GeneralInvoiceItem (una por orden / cargo pendiente) y define cuánto se le debe pagar (o cobrar) a ese destinatario.
related)Relación polimórfica (related_type / related_id, ambos ocultos). related_type puede ser
App\Provider, App\Branch o App\Account; en las rutas se usa el segmento providers,
branches o accounts.
status)pending — recién creada, todavía editable.processing — conciliación en curso.conciliated — cerrada: los montos quedaron firmes y se movió el balance correspondiente.flags)flags es un bitmask; los flags booleanos derivados se definen en onInitializeBitMaskBags().
Cubren dos ciclos paralelos:
is_payment_requested → is_payment_sent → is_payment_successful /
is_payment_failed; payment_try_count cuenta los intentos y payment_index el número de pago.is_invoice_doc_requested → is_invoice_doc_sent →
is_invoice_doc_successful / is_invoice_doc_failed.is_ignored_for_balance — la factura no impacta el balance del destinatario.payment_status / payment_error / payment_via son la vista legible del ciclo de pago.
conciliate cierra la factura (pasa a conciliated); luego send-payment (o
batch-send-payments) dispara el pago al destinatario y set-paid lo marca pagado
manualmente. PATCH solo aplica mientras está pending.
Cada monto tiene su versión formateada (string) y su versión _e2 (entero = monto × 100):
subtotal (base de las órdenes), fee (comisión de la plataforma), discount (descuentos),
delivery (envío) y total. total_to_pay_e2 es lo que finalmente se transfiere;
fiscal_base_e2 la base imponible; branch_subtotal_e2 el subtotal de cara al comercio.
| Atributo | Tipo | Descripción |
|---|---|---|
id |
int |
|
number |
int |
Número correlativo de la factura |
status |
string |
pending | processing | conciliated |
count |
int |
Cantidad de ítems (órdenes) incluidos |
total_e2 |
int |
Total de la factura (× 100) |
subtotal |
string |
Subtotal formateado |
fee |
string |
Comisión de la plataforma, formateada |
total |
string |
Total formateado |
related_type |
string |
Tipo del destinatario (App\Provider | App\Branch | App\Account) — oculto |
related_id |
int |
Id del destinatario (oculto) |
paid_at |
string\|null |
Momento en que se marcó pagada |
notes |
string\|null |
Notas de la factura |
created_at |
datetime\|null |
|
updated_at |
datetime\|null |
|
discount |
string |
Descuentos, formateados |
flags |
int |
Bitmask del ciclo de pago y de documento fiscal (ver "Flags") |
payment |
array\|null |
Datos del pago realizado al destinatario |
config |
array |
Configuración de la factura (parámetros de generación / pago) |
total_to_pay_e2 |
int\|null |
Monto que se transfiere efectivamente al destinatario (× 100) |
company_id |
int\|null |
Company de la factura |
payment_ref |
string\|null |
Referencia del pago |
city_id |
int\|null |
Ciudad de la factura (para el balance de ciudad) |
currency_conversion_factor |
float\|null |
Factor de conversión aplicado |
currency_iso |
string\|null |
Moneda de la factura |
delivery |
string\|null |
Montos de envío, formateados |
delivery_base_e2 |
int\|null |
Base del envío (× 100) |
delivery_discount_e2 |
int\|null |
Descuento del envío (× 100) |
delivery_e2 |
int\|null |
Envío neto (× 100) |
delivery_fee_e2 |
int\|null |
Comisión de envío (× 100) |
discount_e2 |
int\|null |
Descuentos (× 100) |
fee_e2 |
int\|null |
Comisión de la plataforma (× 100) |
fiscal_base_e2 |
int\|null |
Base imponible (× 100) |
subtotal_e2 |
int\|null |
Subtotal de las órdenes (× 100) |
is_payment_requested |
bool |
BitMask (({@link self::flags} & 0x1) !== 0) |
is_payment_sent |
bool |
BitMask (({@link self::flags} & 0x2) !== 0) |
is_payment_successful |
bool |
BitMask (({@link self::flags} & 0x4) !== 0) |
is_payment_failed |
bool |
BitMask (({@link self::flags} & 0x8) !== 0) |
payment_try_count |
int |
BitMask (({@link self::flags} & 0xf0) >> 4) |
payment_index |
int |
BitMask (({@link self::flags} & 0xf00) >> 8) |
is_invoice_doc_requested |
bool |
BitMask (({@link self::flags} & 0x1000) !== 0) |
is_invoice_doc_sent |
bool |
BitMask (({@link self::flags} & 0x2000) !== 0) |
is_invoice_doc_successful |
bool |
BitMask (({@link self::flags} & 0x4000) !== 0) |
is_invoice_doc_failed |
bool |
BitMask (({@link self::flags} & 0x8000) !== 0) |
is_ignored_for_balance |
bool |
BitMask (({@link self::flags} & 0x10000) !== 0) |
admin_url |
string |
|
allLogs |
ApiLog> |
|
balanceMovement |
BalanceMovement\|null |
Movimiento de balance generado al conciliar |
branch_subtotal_e2 |
int\|null |
Subtotal de cara al comercio (× 100) |
breakdown |
array\|null |
Desglose detallado de la factura |
city |
City\|null |
|
cityBalanceMovement |
BalanceMovement\|null |
Movimiento de balance de ciudad generado al conciliar |
conciliations |
PendingFeeConciliation> |
Conciliaciones de cargos incluidas |
currency |
Currency\|null |
|
delivery_fee_commited_for_client_e2 |
int |
Envío comprometido a cubrir al cliente (× 100) |
delivery_fee_paid_for_client_e2 |
int |
Envío efectivamente cubierto al cliente (× 100) |
internal_ref |
string\|null |
Referencia interna de la factura |
invoiceDocumentItem |
InvoiceDocumentItem\|null |
Ítem del documento fiscal asociado |
items |
GeneralInvoiceItem> |
Ítems (una fila por orden / cargo) |
logs |
ApiLog> |
|
message_array |
array |
Mensaje de estado para mostrar |
money |
Money\|null |
Total como objeto Money |
payment_error |
string\|null |
Motivo del último fallo de pago |
payment_object |
PayoutAccount\|null |
Cuenta de payout usada para el pago |
payment_status |
string |
Estado legible del ciclo de pago |
payment_via |
string\|null |
Medio por el que se pagó |
payout_accounts |
array |
Cuentas de payout disponibles del destinatario |
related |
Model\|Eloquent |
Destinatario de la factura ({@link Provider} / {@link Branch} / {@link Account}) |
subtotal_paid_for_client_e2 |
int |
Subtotal cubierto al cliente (× 100) |
{
"id": 23,
"number": 1,
"status": "conciliated",
"count": 7,
"total_e2": 24792,
"subtotal": "USD 271.56",
"fee": "USD -23.64",
"total": "USD 247.92",
"paid_at": "2022-02-21 19:21:02",
"notes": null,
"created_at": "2022-02-21 19:05:18",
"updated_at": "2025-04-10 16:47:23",
"discount": "USD 0.00",
"payment": null,
"config": {
"total_e2": 24792,
"subtotal_e2": 27156,
"fee_e2": -2364,
"discount_e2": 0,
"fiscal_base_e2": 34656
},
"total_to_pay_e2": 24792,
"company_id": 116,
"payment_ref": null,
"city_id": 30,
"is_payment_requested": false,
"is_payment_sent": false,
"is_payment_successful": false,
"is_payment_failed": false,
"payment_try_count": 0,
"payment_index": 0,
"is_invoice_doc_requested": false,
"is_invoice_doc_sent": false,
"is_invoice_doc_successful": false,
"is_invoice_doc_failed": false,
"is_ignored_for_balance": false,
"payment_status": "not_available",
"payment_error": null,
"fiscal_base_e2": 34656,
"subtotal_e2": 27156,
"fee_e2": -2364,
"branch_subtotal_e2": 27156,
"discount_e2": 0,
"delivery_base_e2": 0,
"delivery_discount_e2": 0,
"delivery_e2": 0,
"delivery_fee_e2": 0,
"breakdown": {
"fiscal_tax_name": "IVA",
"fiscal_tax_prc": 0.16,
"total": {
"amount_e2": 22270684,
"currency_iso": "VES",
"formatted_iso": "VES 222.706,84",
"formatted": "222.706,84Bs"
},
"fiscal_base": {
"amount_e2": 28421448,
"currency_iso": "VES",
"formatted_iso": "VES 284.214,48",
"formatted": "284.214,48Bs"
},
"service_fee": {
"amount_e2": 1671311,
"currency_iso": "VES",
"formatted_iso": "VES 16.713,11",
"formatted": "16.713,11Bs"
},
"service_fee_taxes": {
"amount_e2": 267410,
"currency_iso": "VES",
"formatted_iso": "VES 2.674,10",
"formatted": "2.674,10Bs"
},
"service_fee_total": {
"amount_e2": 1938721,
"currency_iso": "VES",
"formatted_iso": "VES 19.387,21",
"formatted": "19.387,21Bs"
},
"total_to_pay": {
"amount_e2": 20331964,
"currency_iso": "VES",
"formatted_iso": "VES 203.319,64",
"formatted": "203.319,64Bs"
},
"currency_rate": 820.1018
}
}
Crear factura para un destinatario
Genera una GeneralInvoice en estado pending para el destinatario indicado por el
prefijo {relatedType}/{relatedId} (providers, branches o accounts), con los cargos
pendientes del período. Requiere el rol de gestión de facturas.
| Método | URI | Cabeceras |
|---|---|---|
| POST | /companies/{companyId}/{relatedType}/{relatedId}/general-invoices |
Authorization |
{
"notes": "nullable|string",
"order_ids": [
"integer"
],
"related_type": "string|in:providers,branches,accounts",
"currency_conversion_factor": "nullable|numeric|min:0.000001"
}
| Código | HTTP | Cuándo ocurre |
|---|---|---|
ER404 |
404 | El related_type indicado no es válido. |
EF601 |
400 | Ya existe una factura pendiente para ese destinatario; conciliarla o eliminarla primero. |
{info} Soporta: Paginación Filters Carga dinámica
Listar facturas
Lista las GeneralInvoice de la company. Con el prefijo {relatedType}/{relatedId}
(providers, branches o accounts) filtra por destinatario.
| Método | URI | Cabeceras |
|---|---|---|
| GET | /companies/{companyId}/{relatedType}/{relatedId}/general-invoices |
Authorization |
| Código | HTTP | Cuándo ocurre |
|---|---|---|
ER404 |
404 | El related_type indicado no es válido. |
{info} Soporta: Paginación Filters Carga dinámica
Listar facturas
Lista las GeneralInvoice de la company. Con el prefijo {relatedType}/{relatedId}
(providers, branches o accounts) filtra por destinatario.
| Método | URI | Cabeceras |
|---|---|---|
| GET | /companies/{companyId}/{relatedType}/{relatedId}/general-invoices |
Authorization |
| Código | HTTP | Cuándo ocurre |
|---|---|---|
ER404 |
404 | El related_type indicado no es válido. |
{info} Soporta: Paginación Filters Carga dinámica
Mostrar factura
Devuelve la GeneralInvoice por su id, con sus ítems, montos y estado de pago.
| Método | URI | Cabeceras |
|---|---|---|
| GET | /companies/{companyId}/general-invoices/{generalInvoiceId} |
Authorization |
{info} Soporta: Paginación Filters Carga dinámica
Actualizar factura
Actualiza datos editables de una GeneralInvoice (notes, paid_at,
currency_iso, currency_conversion_factor). Solo mientras está pending. Requiere el rol
de gestión de facturas.
| Método | URI | Cabeceras |
|---|---|---|
| PATCH | /companies/{companyId}/general-invoices/{generalInvoiceId} |
Authorization |
{
"notes": "nullable|string",
"currency_conversion_factor": "nullable|numeric|min:0.000001"
}
Eliminar factura
Elimina una GeneralInvoice. Requiere el rol de gestión de facturas.
| Método | URI | Cabeceras |
|---|---|---|
| DELETE | /companies/{companyId}/general-invoices/{generalInvoiceId} |
Authorization |
| Código | HTTP | Cuándo ocurre |
|---|---|---|
EF600 |
400 | La factura ya está conciliada y no se puede eliminar. |
EF608 |
409 | Ya se solicitó el documento fiscal de la factura. |
Genera una GeneralInvoice pendiente para varios destinatarios a la vez (todos del
tipo providers, branches o accounts). Requiere el rol de gestión de facturas.
| Método | URI | Cabeceras |
|---|---|---|
| POST | /companies/{companyId}/general-invoices |
Authorization |
{
"notes": "nullable|string",
"order_ids": [
"integer"
],
"related_type": "string|in:providers,branches,accounts",
"currency_conversion_factor": "nullable|numeric|min:0.000001"
}
| Código | HTTP | Cuándo ocurre |
|---|---|---|
ER404 |
404 | El related_type indicado no es válido. |
EF601 |
400 | Alguno de los destinatarios ya tiene una factura pendiente. |
{info} Soporta: Paginación Filters Carga dinámica
Devuelve, sin ejecutar nada, qué GeneralInvoice se pagarían y por cuánto con los
filtros dados. Útil para revisar antes de disparar batch-send-payments.
| Método | URI | Cabeceras |
|---|---|---|
| GET | /companies/{companyId}/general-invoices/batch-send-payments |
Authorization |
{
"type": "required|string|in:providers,branches,accounts",
"mode": "required|string|in:pending,conciliated,failed,ids",
"ids": [
"integer|min:1"
],
"date_beg": "date",
"date_end": "date"
}
{info} Soporta: Paginación Filters Carga dinámica
Dispara el pago automatizado de varias GeneralInvoice conciliadas a la vez (campo
ids). Devuelve el resultado por factura.
| Método | URI | Cabeceras |
|---|---|---|
| POST | /companies/{companyId}/general-invoices/batch-send-payments |
Authorization |
{
"type": "required|string|in:providers,branches,accounts",
"mode": "required|string|in:pending,conciliated,failed,ids",
"ids": [
"integer|min:1"
],
"date_beg": "date",
"date_end": "date"
}
| Código | HTTP | Cuándo ocurre |
|---|---|---|
ER404 |
404 | Alguno de los ids no corresponde a una factura de la company. |
{info} Soporta: Paginación Filters Carga dinámica
Una vez conciliada una factura, ésta no puede ser modificada. Si se envía el parámetro send_payment = true,
entonces se realizará un pago automatizado a los datos registrados del comercio o repartidor.
| Método | URI | Cabeceras |
|---|---|---|
| POST | /companies/{companyId}/general-invoices/{generalInvoiceId}/conciliate |
Authorization |
{
"paid_at": "nullable|date",
"notes": "nullable|string",
"send_payment": "nullable|boolean",
"payout_index": "nullable|integer"
}
| Código | HTTP | Cuándo ocurre |
|---|---|---|
EF600 |
400 | La factura ya está conciliada. |
EF607 |
400 | El destinatario no tiene cuentas de payout configuradas (con send_payment). |
{info} Soporta: Paginación Filters Carga dinámica
Para usar este endpoint, la orden debe estar en status = conciliated y el payment_status debe ser
not_available o failed.
El atributo payment_status revela información del estado actual de la solicitud de pago. Los valores posibles
son:
not_available: Indica que no se ha solicitado un pago.requested: La solicitud de pago ha sido enviada, pero aún no ha sido procesada por el sistema.sent: La solicitud de pago ha sido procesada y enviada. En espera de confirmación.failed: El pago ha fallado. La solicitud de pago ha terminado con un error.successful: El pago ha sido procesado con éxito.| Método | URI | Cabeceras |
|---|---|---|
| POST | /companies/{companyId}/general-invoices/{generalInvoiceId}/send-payment |
Authorization |
{
"payout_index": "nullable|integer"
}
| Código | HTTP | Cuándo ocurre |
|---|---|---|
EF606 |
400 | La factura no está conciliada. |
EF603 |
409 | El pago de la factura ya fue enviado. |
EF604 |
409 | La factura ya está pagada. |
EF605 |
400 | La conciliación de la factura venció; ya no se puede pagar. |
EF607 |
400 | El destinatario no tiene cuentas de payout configuradas. |
{info} Soporta: Paginación Filters Carga dinámica
Útil para que el sistema marque las facturas como pagadas cuando el API externo responde con algun error.
| Método | URI | Cabeceras |
|---|---|---|
| POST | /companies/{companyId}/general-invoices/{generalInvoiceId}/set-paid |
Authorization |
{
"ref": "required|min:6|max:32"
}
| Código | HTTP | Cuándo ocurre |
|---|---|---|
EF606 |
400 | La factura no está conciliada. |
EF603 |
409 | El pago de la factura ya fue enviado. |
EF604 |
409 | La factura ya está pagada. |
EF613 |
409 | El pago de la factura no está en estado fallido. |
Elimina varias GeneralInvoice a la vez (campo ids). Cada una debe poder
eliminarse (no conciliada, sin documento fiscal solicitado).
| Método | URI | Cabeceras |
|---|---|---|
| DELETE | /companies/{companyId}/general-invoices/batch-delete |
Authorization |
[
"integer"
]
allLogs HasMany ApiLogbalanceMovement HasOne BalanceMovementcity BelongsTo CitycityBalanceMovement HasOne BalanceMovementconciliations HasMany PendingFeeConciliationinvoiceDocumentItem HasOne InvoiceDocumentItemitems HasMany GeneralInvoiceItemlogs HasMany ApiLogrelated BelongsTo Branch