Invoices y pagos¶
Disponible para: Owner, Accounting, Project Manager (solo vista)
Los Invoices se crean cuando un Job alcanza el estado Completed / Needs Invoice. Representan el documento de facturación formal enviado al cliente y registran los pagos recibidos contra el monto total adeudado.
Un Invoice por Job¶
Cada Job puede tener exactamente un Invoice.
Si intenta crear un segundo Invoice para un Job, la API lo rechazará. Si un Invoice debe corregirse, debe editarse — no reemplazarse.
Campos del Invoice¶
| Field | Description |
|---|---|
invoice_number |
Generado automáticamente al crear. Formato: INV-YYYYMMDD-HHMMSS (ej. INV-20240415-143022). Único por inquilino. |
invoice_date |
Fecha en que se emitió el Invoice. Por defecto la fecha de creación. |
due_date |
Fecha de vencimiento del pago. Manual o calculada según términos del inquilino. |
subtotal |
Monto base antes de impuestos. Suele igualar el precio del Bid. |
tax_rate |
Tomado de CompanySettings al crear el Invoice. Guardado en el Invoice para exactitud histórica. |
tax_amount |
Calculado: subtotal × tax_rate. |
total_amount |
Calculado: subtotal + tax_amount. |
amount_paid |
Total acumulado de todos los pagos registrados contra este Invoice. |
balance_due |
Calculado: total_amount − amount_paid. |
status |
Estado actual del Invoice. Vea la máquina de estados abajo. |
La aplicabilidad del impuesto se define en el Bid de origen (campo taxable). Si taxable es falso, tax_rate se guarda como 0 y no se calcula impuesto.
Cálculo de impuestos¶
Las tasas se configuran a nivel de inquilino en CompanySettings.tax_rate.
Al crear un Invoice:
- El sistema lee
CompanySettings.tax_ratedel inquilino actual. - La tasa se copia al Invoice**** en el momento de la creación.
- Los cambios futuros a
CompanySettings.tax_rateno afectan Invoices existentes.
Así se preserva la historia fiscal — la tasa aplicada queda fijada al crear el Invoice.
Máquina de estados¶
| Status | Description | Who Can Set |
|---|---|---|
Invoice Submitted |
Invoice creado y enviado al cliente. | Accounting, Owner |
Partially Paid |
Uno o más pagos registrados; sigue habiendo saldo. | Sistema (automático al pagar) |
Paid |
Saldo total pagado. balance_due es cero. |
Sistema (automático al pagar) |
Workflow Complete |
Invoice resuelto y flujo del Job cerrado. | Sistema (automático al pasar a Paid) |
Invoice Submitted → Partially Paid (on first partial payment)
→ Paid (if full payment recorded in one entry)
Partially Paid → Paid (on final payment)
Paid → Workflow Complete (system-set automatically)
Las transiciones después de Invoice Submitted las impulsa el sistema según los totales de pago. No establece manualmente Paid ni Workflow Complete.
Seguimiento de pagos¶
Un solo Invoice puede tener varios pagos registrados (pagos parciales totalmente admitidos).
Campos del pago¶
| Field | Description |
|---|---|
amount |
Monto en dólares de este pago. |
payment_date |
Fecha en que se recibió el pago. |
payment_method |
Forma de pago (ej. cheque, ACH, transferencia, tarjeta). Texto libre. |
notes |
Notas opcionales del pago (ej. número de cheque, ID de referencia). |
Cómo funcionan los pagos¶
- Accounting u Owner registra un pago contra un Invoice.
amount_paiddel Invoice se actualiza a la suma de todos los pagos.- Se recalcula
balance_due. - Si
balance_duellega a cero, el estado del Invoice pasa automáticamente aPaidy luegoWorkflow Complete. - Todos los registros de pago se conservan — los pagos no se eliminan ni editan una vez registrados.
Registre pagos parciales conforme lleguen. El sistema llevará el avance hacia el saldo total.
Vista de lista de Invoices¶
La lista de Invoices muestra las columnas:
Bid ID | Job ID | Status | Client | PO Number | Invoice Date | Invoice # | PM | Subtotal | Tax | Total | Balance Due | Due Date
Las fechas de vencimiento tienen código de color según estado:
- Verde — pagado o Workflow Complete
- Amarillo — vence pronto (dentro del umbral configurado)
- Rojo — vencido
Acceso por rol¶
| Action | Owner | Accounting | PM | Supervisor | Badge Worker |
|---|---|---|---|---|---|
| Create invoice | Yes | Yes | No | No | No |
| Edit invoice | Yes | Yes | No | No | No |
| Record payment | Yes | Yes | No | No | No |
| View invoice | Yes | Yes | Yes | No | No |
| View payment history | Yes | Yes | Yes | No | No |
Las ediciones de Invoice quedan en el ActivityLog con tipo de acción invoice_edit. El registro captura un diff JSON de los campos modificados.