Facturas (/admin/invoices) es el listado de facturación por período de obra. La grilla permanece vacía hasta que apliques Este mes, Mes anterior, Filtro o una búsqueda de tres o más caracteres — la misma barrera que el listado Symfony (Apply a filter to view invoices).
Permisos: FunctionId INVOICE (11), menú Gestión de proyectos → Facturas (function.url = invoice). View abre el listado y el wizard de solo lectura. Add muestra Nuevo. Edit muestra ⋮ Editar, Cambiar número, Exportar Excel, Exportar PDF y Enviar email. Delete muestra ⋮ Eliminar y el borrado masivo. El atajo $ de pagos necesita FunctionId PAYMENT (33) View.
Diseño de la pantalla
Figura: listado FoodHub — título Invoices, subtítulo Manage Invoices, New en la cabecera, ? de ayuda; tarjeta con Search invoices…, Filter, Previous Month, This Month, Export, columnas Number, Company, C&G Project Number, Project, From, To, Amount, Notes, Status, Created At, ⋮ de fila y paginación.
| Zona | Qué ves |
|---|---|
| Barra de página | Título Invoices, subtítulo Manage Invoices, New (Invoice Add) y el icono ? (este artículo). |
| Tarjeta de datos | Búsqueda, Filter, This Month / Previous Month, Export (Copiar / Excel / CSV de la página actual), columnas ordenables, Amount en dinero US, Status Yes/No (pagada), estrella de override, checkboxes (Delete), barra masiva, Sort by en móvil, paginación (30 por defecto). |
| Barrera vacía | Icono de filtro con búsqueda y el texto Apply a filter to view invoices hasta que corra un atajo, Aplicar del filtro o una búsqueda de 3+ caracteres. |
| Wizard de factura | Superficie B en la URL del listado (?create=1 / ?edit= / ?view=) — pills General, Items, Attachments. |
Orden por defecto: From descendente.
Columnas del listado
| Columna | Significado |
|---|---|
| Number | Input en la celda (Edit) para cambiar el número al salir del campo — igual que la grilla Symfony. Una ★ dorada indica un override de pago en este período. Al pasar el mouse, si hay historial, muestra el último email. Fija a la izquierda en escritorio. |
| Company | Compañía del proyecto. Ordenable. |
| C&G Project Number | Número de proyecto. Enlace al wizard de proyecto (?edit= / ?view=). Ordenable. |
| Project | Descripción/nombre del proyecto. El mismo enlace. Ordenable. |
| From / To | Período de la factura (m/d/Y). Ordenable. |
| Amount | Final Amount This Period (cantidad facturada del período + QBF) × precio. Formato US $1,234.00. El Bond no entra en este total de grilla; se guarda y se muestra en Excel. |
| Notes | Notas recortadas. |
| Status | Yes si está pagada, No si no. |
| Created At | Fecha de creación (m/d/Y). Ordenable. |
| Actions | Solo ⋮ (Edit, Export Excel, Export PDF, Send email, Payments, Delete). Sin icono $ al lado del menú. |
Filtros
This Month y Previous Month cargan facturas cuya Created At cae en ese mes calendario (JS vivo, no el período de la factura). El popover Filter puede cambiar el campo de fecha:
- Company, Project (los proyectos se cargan después de Company).
- Email — Todos / Enviado / No enviado (historial
invoice_email). - Date field — Invoice period (inicio ≥ From y fin ≤ To, contención) o Created At.
- Rango From / To.
Apply / Reset viven en Filter. Reset vuelve a la barrera vacía.
Búsqueda (3+ caracteres): número, notas, número/nombre/descripción de proyecto, compañía, PO, contactos.
Acciones de fila
| Acción | Quién | Qué hace |
|---|---|---|
| View | View (sin Edit) | Abre el wizard de solo lectura (?view=). |
| Edit | Edit | Abre el wizard (?edit=). |
| Export Excel | Edit | Completa la plantilla anclada invoice.xlsx (columnas A–S, SUM del pie, retención, CURRENT AMOUNT DUE) y abre el archivo. Legal apaisado. |
| Export PDF | Edit | Convierte ese libro con LibreOffice (soffice). Si falla, usa un PDF previo en uploads si existe; si no, Could not generate the invoice PDF/Excel file. |
| Send email | Edit | Asunto/cuerpo, contactos del proyecto, adjuntar PDF y/o Excel, historial de envíos. |
| Payments | PAYMENT View | Va a /admin/payments?invoice_id= y abre esa factura en el wizard de Pagos. |
| Delete | Delete | Borrado permanente si la factura no está bloqueada por pagos. |
Nueva factura
New abre New Invoice: en /admin/invoices?create=1. Desde Data Tracking, New Invoice exige el proyecto de la barra y abre el mismo wizard con ese projectId y el mes calendario siguiente ya cargado (día 1 al último). El tab Invoices del wizard de Projects View (ojo) abre ?view= — nunca crea una factura.
El alta tiene las mismas tres pills que la edición (General / Items / Attachments). Los adjuntos necesitan la factura guardada; Save (quedarse abierto) deja el wizard para agregar archivos.
Wizard — General
Misma disposición que Symfony: Company (4) *, Project (6) *, Number (2) *. Fila siguiente: Invoice Date *, Start Date *, End Date *. Notes a todo el ancho. Number es obligatorio para crear o actualizar una factura.
El * rojo y This field is required usan FormField required como el resto de wizards admin. Next y Save se quedan en General hasta completar esos campos. En alta, Invoice Date arranca en hoy. Al cambiar Project se carga el período siguiente y los pay items de ese rango.
Título de edición: Update Invoice: Job No: {project} - Invoice #{n} | {start} - {end}.
También copian el inglés del legado: solapamiento, número duplicado y fecha incorrecta.
Wizard — Items
Cajas KPI (se ocultan si ~0): Contract, Total To Date, Unpaid, This Period, Final Period, Current retainage, Bond Total Amount, Bond Qty (5 decimales). Los totales siguen el origen: contrato del proyecto; Total To Date / This Period / Final Period suman el Bond con signo; retención y Bond se recalcan en vivo al cambiar Quantity Brought Forward.
Columnas (set del origen, celdas de color): Code, Item, Unit, Unit Price, Contract Quantity, Contract Amount, Total Quantity / Amount (azul), Unpaid Quantity / Amount (rojo), Quantity / Amount This Period (naranja), Quantity Brought Forward (amarillo, editable si no está paga), Final Invoiced Quantity / Amount (verde). El encabezado de cada columna ordena dentro de cada grupo. Code e Item quedan fijas al desplazar las columnas numéricas (FixedColumns start: 2 del origen). Quantity Brought Forward usa un input blanco con texto oscuro para leerse sobre la celda amarilla.
- Item muestra badges R (retainage), B (bond/bonded) y el
+de historial de change order / add-on, igual que Projects y Data Tracking. - Cantidad de contrato y precio unitario muestran el mismo historial
+cuando el pay item tiene cambios. - Los pay items regulares van primero, sin barra de grupo. Change Order y Add-On son grupos plegables (chevron, cantidad de ítems, Expandir todo / Contraer todo), el mismo chrome que las cotizaciones de Estimates. La barra del grupo queda fija junto a Code e Item al desplazar las columnas numéricas. Las filas hijas de desglose de precio aparecen bajo el pay item si Data Tracking usó más de un precio en el período.
- Qty this period sale de la cantidad facturable de Data Tracking. QBF no puede superar impago + QBF actual. Guardar exige al menos un ítem visible.
En el header: Save / Save and close / Save and Export. Save and Export muestra una barra de progreso mientras guarda la factura y genera el Excel, y recién entonces abre Guardar como.
Wizard — Attachments
Tabla FoodHub (Search, Export, orden, paginación). Ojo de vista previa, eliminar, New (nombre, archivo, nota). Los archivos viven en uploads/invoice/.
Formato Excel y PDF
Export Excel y Export PDF muestran una barra de progreso mientras se genera el archivo y después lo descargan una sola vez (Guardar como si el navegador pregunta dónde guardar). No abren una pestaña.
La exportación no redibuja un libro nuevo. Completa la plantilla original del producto (apps/api/assets/excel/invoice.xlsx):
- Encabezado: fecha y número de factura, período, compañía, inspector, condados, proyecto, notas.
- Filas de ítems A–S, incluidos encabezados de change order y add-on, y bond.
- Desglose de precio cuando Data Tracking usó más de un precio unitario en el período (y el QBF neto es cero).
- Pie
SUMen columnas de dinero, retención al porcentaje efectivo (cero cuando lo facturado supera el contrato), CURRENT AMOUNT DUE. - Área de impresión Legal, apaisado, ajustar a una página.
El PDF es ese mismo libro convertido por LibreOffice.
Asunto y cuerpo arrancan de la plantilla de proyecto/compañía. Elegí contactos (o agregá uno rápido), adjuntá PDF y/o Excel y enviá. Los errores que nombran destinatarios conservan el texto inglés del legado.