Skip to content

P1 (backend) — Partes de trabajo + conversión idempotente a factura - #2

Merged
R0b3r7DEV merged 1 commit into
masterfrom
feat/p1-partes-backend
Jul 11, 2026
Merged

P1 (backend) — Partes de trabajo + conversión idempotente a factura#2
R0b3r7DEV merged 1 commit into
masterfrom
feat/p1-partes-backend

Conversation

@R0b3r7DEV

Copy link
Copy Markdown
Owner

Segundo PR del PLAN-v2. Backend del P1 — partes de trabajo (el 80% del trabajo real de un electricista: avisos y reparaciones).

Qué añade

  • WorkOrder + WorkOrderLine: cliente, título, descripción, estado (pendiente→en_curso→terminado→facturado), fecha, mano de obra (horas × precio + IVA) y líneas de material en céntimos enteros. Solo tablas nuevas → la cadena de hash de facturas no se toca.
  • WorkOrderService::convert() reutiliza el patrón de QuoteService::convert(): el enlace convertedInvoice lo hace idempotente (convertir dos veces = misma factura). Materiales → líneas; mano de obra → una línea "Mano de obra (N h)". Se emite por InvoiceService::create() → hereda numeración sin huecos + registro de la cadena y respeta el modo de facturación (ADR 0004).
  • WorkOrderController: CRUD + /convert, acotado al usuario; parte facturado inmutable (409).

Verificación

  • 91 tests, 401 aserciones (verde). Incluye: convertir dos veces ⇒ una sola factura con el total correcto (materiales + mano de obra), aislamiento por usuario, inmutabilidad tras facturar.
  • Migración aplicada + doctrine:schema:validate en sync. Frontend build verde (sin cambios).

Alcance

Este PR es backend. La UI móvil, las fotos y la firma del cliente van en el siguiente PR (P1 PR2), como en el plan.

Docs: guía 39, DEVLOG 049.

🤖 Generated with Claude Code

…(P1 backend)

ES
--
El 80% del trabajo de un electricista son avisos y reparaciones, no instalaciones
nuevas. Este PR añade el backend de los partes de trabajo.

- Entidades WorkOrder + WorkOrderLine: cliente, título, descripción, estado
  (pendiente→en_curso→terminado→facturado), fecha, mano de obra (horas × precio +
  IVA) y líneas de material en céntimos enteros. Solo tablas nuevas: la cadena de
  hash de facturas no se toca.
- WorkOrderService::convert() reutiliza el patrón de QuoteService::convert(): el
  enlace convertedInvoice lo hace idempotente (convertir dos veces = misma
  factura). Materiales → líneas; mano de obra → una línea "Mano de obra (N h)".
  Se emite por InvoiceService::create(), así que hereda numeración sin huecos + el
  registro de la cadena y respeta el modo de facturación (ADR 0004).
- WorkOrderController: CRUD + /convert, acotado al usuario; parte facturado
  inmutable (409).
- Tests: WorkOrderServiceTest + integración que convierte dos veces y comprueba
  UNA sola factura (total = materiales + mano de obra), aislamiento e
  inmutabilidad. 91 tests, 401 aserciones.

La UI móvil, las fotos y la firma del cliente van en el siguiente PR.

EN
--
80% of an electrician's work is call-outs and repairs. This PR adds the work-order
backend: WorkOrder + WorkOrderLine entities, an idempotent convert-to-invoice
(reusing QuoteService::convert()'s convertedInvoice link — convert twice = same
invoice), CRUD scoped per user, and tests (convert twice ⇒ one invoice, isolation,
invoiced-immutability). New tables only; the invoice hash chain is untouched.
91 tests, 401 assertions. Mobile UI, photos and signature come next.

Docs: guide 39, DEVLOG 049.
@vercel

vercel Bot commented Jul 11, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
cuentia Ready Ready Preview, Comment Jul 11, 2026 10:26am

@R0b3r7DEV
R0b3r7DEV merged commit 542af85 into master Jul 11, 2026
5 checks passed
@R0b3r7DEV
R0b3r7DEV deleted the feat/p1-partes-backend branch July 11, 2026 10:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant