diff --git a/modules/core/src/api/infrastructure/express/express-controller.ts b/modules/core/src/api/infrastructure/express/express-controller.ts
index 81141bb1..6e1e2939 100644
--- a/modules/core/src/api/infrastructure/express/express-controller.ts
+++ b/modules/core/src/api/infrastructure/express/express-controller.ts
@@ -34,9 +34,6 @@ export abstract class ExpressController {
} satisfies ApiErrorContext;
const body = toProblemJson(apiError, ctx);
-
- console.trace(body);
-
return res.type("application/problem+json").status(apiError.status).json(body);
}
diff --git a/modules/core/src/web/hooks/index.ts b/modules/core/src/web/hooks/index.ts
index be28752e..47fd0604 100644
--- a/modules/core/src/web/hooks/index.ts
+++ b/modules/core/src/web/hooks/index.ts
@@ -3,3 +3,4 @@ export * from "./use-pagination";
export * from "./use-query-key";
export * from "./use-toggle";
export * from "./use-unsaved-changes-notifier";
+export * from "./use-url-param-id";
diff --git a/modules/core/src/web/hooks/use-url-param-id.ts b/modules/core/src/web/hooks/use-url-param-id.ts
new file mode 100644
index 00000000..401ea693
--- /dev/null
+++ b/modules/core/src/web/hooks/use-url-param-id.ts
@@ -0,0 +1,6 @@
+import { useParams } from "react-router-dom";
+
+export const useUrlParamId = (): string | undefined => {
+ const { id } = useParams<{ id?: string }>();
+ return id;
+};
diff --git a/modules/customer-invoices/src/api/application/use-cases/report/reporter/templates/customer-invoice/logo1.jpg b/modules/customer-invoices/src/api/application/use-cases/report/reporter/templates/customer-invoice/logo1.jpg
new file mode 100755
index 00000000..75df86fa
Binary files /dev/null and b/modules/customer-invoices/src/api/application/use-cases/report/reporter/templates/customer-invoice/logo1.jpg differ
diff --git a/modules/customer-invoices/src/api/application/use-cases/report/reporter/templates/customer-invoice/template copy.hbs b/modules/customer-invoices/src/api/application/use-cases/report/reporter/templates/customer-invoice/template copy.hbs
new file mode 100644
index 00000000..a5f683cf
--- /dev/null
+++ b/modules/customer-invoices/src/api/application/use-cases/report/reporter/templates/customer-invoice/template copy.hbs
@@ -0,0 +1,254 @@
+
+
+
+
+
+
+
+
+
+ | Concepto |
+ Cantidad |
+ Precio unidad |
+ {{#if any_item_has_discount}}
+ Dto (%) |
+ {{/if}}
+ Importe total |
+
+
+
+ {{#each items}}
+
+ |
+ {{description}}
+ {{#if note}}{{note}} {{/if}}
+ |
+ {{quantity}} |
+ {{unit_price}} |
+ {{#if ../any_item_has_discount}}
+ {{discount}} |
+ {{/if}}
+ {{total_price}} |
+
+ {{/each}}
+
+
+
+ | * Precios en {{currency}}. |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{quote.default_legal_terms}}
+
+
+
+
+
+ {{!-- Helpers opcionales esperados por la plantilla --}}
+ {{!--
+ any_item_has_discount: boolean precomputado en tu código
+ payment_is_direct_debit: boolean si forma de pago es domiciliación
+ direct_debit_text: texto para el bloque de domiciliación bancaria
+ currency: ISO o símbolo (EUR, €, etc.)
+ --}}
+
+
+
\ No newline at end of file
diff --git a/modules/customer-invoices/src/api/application/use-cases/report/reporter/templates/customer-invoice/template.hbs b/modules/customer-invoices/src/api/application/use-cases/report/reporter/templates/customer-invoice/template.hbs
index 99052b75..49f5d87f 100644
--- a/modules/customer-invoices/src/api/application/use-cases/report/reporter/templates/customer-invoice/template.hbs
+++ b/modules/customer-invoices/src/api/application/use-cases/report/reporter/templates/customer-invoice/template.hbs
@@ -1,24 +1,87 @@
-
+
+
-
+
+
+
+
+
+
+
Forma de pago: {{payment_method}}
+
+
+
+
+
+
+
+
+ | Importe neto |
+ |
+ {{subtotal_price}} |
+
+
+ | % Descuento |
+ {{discount.amount}} |
+ {{discount_price}} |
+
+
+ | Base imponible |
+ |
+ {{before_tax_price}} |
+
+
+ | % IVA |
+ {{tax}} |
+ {{tax_price}} |
+
+
+ | Importe total |
+ |
+ {{total_price}} |
+
+
+
+
+
+
+ {{quote.default_legal_terms}}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/modules/customer-invoices/src/api/infrastructure/mappers/queries/invoice-recipient.list.mapper.ts b/modules/customer-invoices/src/api/infrastructure/mappers/queries/invoice-recipient.list.mapper.ts
index f707daf2..d5637b06 100644
--- a/modules/customer-invoices/src/api/infrastructure/mappers/queries/invoice-recipient.list.mapper.ts
+++ b/modules/customer-invoices/src/api/infrastructure/mappers/queries/invoice-recipient.list.mapper.ts
@@ -6,16 +6,12 @@ import {
Province,
Street,
TINNumber,
+ ValidationErrorDetail,
+ extractOrPushError,
maybeFromNullableVO,
} from "@repo/rdx-ddd";
-import {
- IQueryMapperWithBulk,
- MapperParamsType,
- SequelizeQueryMapper,
- ValidationErrorDetail,
- extractOrPushError,
-} from "@erp/core/api";
+import { IQueryMapperWithBulk, MapperParamsType, SequelizeQueryMapper } from "@erp/core/api";
import { Result } from "@repo/rdx-utils";
import { InvoiceRecipient } from "../../../domain";
diff --git a/modules/customer-invoices/src/common/dto/request/index.ts b/modules/customer-invoices/src/common/dto/request/index.ts
index 46c8ddd5..40defeed 100644
--- a/modules/customer-invoices/src/common/dto/request/index.ts
+++ b/modules/customer-invoices/src/common/dto/request/index.ts
@@ -3,3 +3,4 @@ export * from "./customer-invoices-list.request.dto";
export * from "./delete-customer-invoice-by-id.request.dto";
export * from "./get-customer-invoice-by-id.request.dto";
export * from "./report-customer-invoice-by-id.request.dto";
+export * from "./update-customer-invoice-by-id.request.dto";
diff --git a/modules/customer-invoices/src/common/dto/request/update-customer-invoice-by-id.request.dto.ts b/modules/customer-invoices/src/common/dto/request/update-customer-invoice-by-id.request.dto.ts
new file mode 100644
index 00000000..3457831c
--- /dev/null
+++ b/modules/customer-invoices/src/common/dto/request/update-customer-invoice-by-id.request.dto.ts
@@ -0,0 +1,9 @@
+import * as z from "zod/v4";
+
+export const UpdateCustomerInvoiceByIdParamsRequestSchema = z.object({
+ customer_id: z.string(),
+});
+
+export const UpdateCustomerByIdRequestSchema = z.object({});
+
+export type UpdateCustomerByIdRequestDTO = z.infer