From edecf0121b67071147300ad3a4e76d8127adfc30 Mon Sep 17 00:00:00 2001 From: david Date: Thu, 11 Sep 2025 17:14:51 +0200 Subject: [PATCH] Facturas de cliente --- .../catalogs/taxes/spain-tax-catalog.json | 18 +++++++++ .../core/src/web/lib/helpers/money-funcs.ts | 2 +- .../assembler/list-invoices.assembler.ts | 3 ++ .../domain/value-objects/invoice-amount.ts | 1 + .../list-customer-invoices.controller.ts | 14 ++++++- .../sequelize/customer-invoice.repository.ts | 4 +- ...get-customer-invoice-by-id.response.dto.ts | 5 +-- .../src/common/dto/response/index.ts | 2 +- ...=> list-customer-invoices.response.dto.ts} | 7 +++- .../src/common/locales/en.json | 6 +-- .../customer-invoices-list-grid.tsx | 39 +++++++++++++++---- packages/rdx-criteria/src/critera.ts | 9 ++++- 12 files changed, 87 insertions(+), 23 deletions(-) rename modules/customer-invoices/src/common/dto/response/{customer-invoices-list.response.dto.ts => list-customer-invoices.response.dto.ts} (79%) diff --git a/modules/core/src/common/catalogs/taxes/spain-tax-catalog.json b/modules/core/src/common/catalogs/taxes/spain-tax-catalog.json index 15e575cf..da480483 100644 --- a/modules/core/src/common/catalogs/taxes/spain-tax-catalog.json +++ b/modules/core/src/common/catalogs/taxes/spain-tax-catalog.json @@ -8,6 +8,24 @@ "description": "IVA general. Tipo estándar nacional.", "aeat_code": "01" }, + { + "name": "IVA 18%", + "code": "iva_18", + "value": 1800, + "scale": 2, + "group": "IVA", + "description": "IVA general. Tipo estándar nacional hasta finales de 2011", + "aeat_code": null + }, + { + "name": "IVA 16%", + "code": "iva_16", + "value": 1600, + "scale": 2, + "group": "IVA", + "description": "IVA general. Tipo estándar nacional hasta finales de 2009.", + "aeat_code": null + }, { "name": "IVA 10%", "code": "iva_10", diff --git a/modules/core/src/web/lib/helpers/money-funcs.ts b/modules/core/src/web/lib/helpers/money-funcs.ts index b035bb7f..9e462ea7 100644 --- a/modules/core/src/web/lib/helpers/money-funcs.ts +++ b/modules/core/src/web/lib/helpers/money-funcs.ts @@ -3,7 +3,7 @@ import { MoneyDTO } from "../../../common"; export const formatMoney = (value: MoneyDTO) => { const money = DineroFactory({ - amount: Number(value.amount), + amount: Number(value.value), currency: value.currency_code as Currency, precision: Number(value.scale), }); diff --git a/modules/customer-invoices/src/api/application/list-customer-invoices/assembler/list-invoices.assembler.ts b/modules/customer-invoices/src/api/application/list-customer-invoices/assembler/list-invoices.assembler.ts index 9742bdc3..b708e07f 100644 --- a/modules/customer-invoices/src/api/application/list-customer-invoices/assembler/list-invoices.assembler.ts +++ b/modules/customer-invoices/src/api/application/list-customer-invoices/assembler/list-invoices.assembler.ts @@ -29,6 +29,9 @@ export class ListCustomerInvoicesAssembler { ...recipientDTO, }, + language_code: invoice.languageCode.code, + currency_code: invoice.currencyCode.code, + taxes: invoice.taxes, subtotal_amount: invoice.subtotalAmount.toObjectString(), diff --git a/modules/customer-invoices/src/api/domain/value-objects/invoice-amount.ts b/modules/customer-invoices/src/api/domain/value-objects/invoice-amount.ts index de6a4758..a00f9d14 100644 --- a/modules/customer-invoices/src/api/domain/value-objects/invoice-amount.ts +++ b/modules/customer-invoices/src/api/domain/value-objects/invoice-amount.ts @@ -27,6 +27,7 @@ export class InvoiceAmount extends MoneyValue { return { value: String(this.value), scale: String(this.scale), + currency_code: this.currencyCode, }; } diff --git a/modules/customer-invoices/src/api/infrastructure/express/controllers/list-customer-invoices.controller.ts b/modules/customer-invoices/src/api/infrastructure/express/controllers/list-customer-invoices.controller.ts index c57cebe9..d8849af4 100644 --- a/modules/customer-invoices/src/api/infrastructure/express/controllers/list-customer-invoices.controller.ts +++ b/modules/customer-invoices/src/api/infrastructure/express/controllers/list-customer-invoices.controller.ts @@ -1,4 +1,5 @@ import { ExpressController, authGuard, forbidQueryFieldGuard, tenantGuard } from "@erp/core/api"; +import { Criteria } from "@repo/rdx-criteria/server"; import { ListCustomerInvoicesUseCase } from "../../../application"; export class ListCustomerInvoicesController extends ExpressController { @@ -8,9 +9,20 @@ export class ListCustomerInvoicesController extends ExpressController { this.useGuards(authGuard(), tenantGuard(), forbidQueryFieldGuard("companyId")); } + private _xxxx() { + if (this.criteria.hasOrder()) { + return this.criteria; + } + + const { filters, pageSize, pageNumber } = this.criteria.toPrimitives(); + return Criteria.fromPrimitives(filters, "invoice_date", "DESC", pageSize, pageNumber); + } + protected async executeImpl() { const companyId = this.getTenantId()!; // garantizado por tenantGuard - const result = await this.useCase.execute({ criteria: this.criteria, companyId }); + + const criteria = this._xxxx(); + const result = await this.useCase.execute({ criteria, companyId }); return result.match( (data) => diff --git a/modules/customer-invoices/src/api/infrastructure/sequelize/customer-invoice.repository.ts b/modules/customer-invoices/src/api/infrastructure/sequelize/customer-invoice.repository.ts index 9bdbc76c..023b6a17 100644 --- a/modules/customer-invoices/src/api/infrastructure/sequelize/customer-invoice.repository.ts +++ b/modules/customer-invoices/src/api/infrastructure/sequelize/customer-invoice.repository.ts @@ -214,12 +214,12 @@ export class CustomerInvoiceRepository }, ]; - const raws = await CustomerInvoiceModel.findAll({ + const { rows, count } = await CustomerInvoiceModel.findAndCountAll({ ...query, transaction, }); - return mapper.mapToDTOCollection(raws, raws.length); + return mapper.mapToDTOCollection(rows, count); } catch (err: unknown) { return Result.fail(translateSequelizeError(err)); } diff --git a/modules/customer-invoices/src/common/dto/response/get-customer-invoice-by-id.response.dto.ts b/modules/customer-invoices/src/common/dto/response/get-customer-invoice-by-id.response.dto.ts index 3c56e010..80a7c6e1 100644 --- a/modules/customer-invoices/src/common/dto/response/get-customer-invoice-by-id.response.dto.ts +++ b/modules/customer-invoices/src/common/dto/response/get-customer-invoice-by-id.response.dto.ts @@ -17,13 +17,12 @@ export const GetCustomerInvoiceByIdResponseSchema = z.object({ language_code: z.string(), currency_code: z.string(), + taxes: z.string(), + subtotal_amount: AmountSchema, discount_percentage: PercentageSchema, discount_amount: AmountSchema, taxable_amount: AmountSchema, - - taxes: z.string(), - total_amount: AmountSchema, items: z.array( diff --git a/modules/customer-invoices/src/common/dto/response/index.ts b/modules/customer-invoices/src/common/dto/response/index.ts index 3b44a30f..a0d6acaa 100644 --- a/modules/customer-invoices/src/common/dto/response/index.ts +++ b/modules/customer-invoices/src/common/dto/response/index.ts @@ -1,4 +1,4 @@ export * from "./create-customer-invoice.response.dto"; -export * from "./customer-invoices-list.response.dto"; export * from "./get-customer-invoice-by-id.response.dto"; +export * from "./list-customer-invoices.response.dto"; export * from "./update-customer-invoice-by-id.response.dto"; diff --git a/modules/customer-invoices/src/common/dto/response/customer-invoices-list.response.dto.ts b/modules/customer-invoices/src/common/dto/response/list-customer-invoices.response.dto.ts similarity index 79% rename from modules/customer-invoices/src/common/dto/response/customer-invoices-list.response.dto.ts rename to modules/customer-invoices/src/common/dto/response/list-customer-invoices.response.dto.ts index 6c84a2c6..163e7da3 100644 --- a/modules/customer-invoices/src/common/dto/response/customer-invoices-list.response.dto.ts +++ b/modules/customer-invoices/src/common/dto/response/list-customer-invoices.response.dto.ts @@ -1,7 +1,7 @@ import { AmountSchema, MetadataSchema, createListViewResponseSchema } from "@erp/core"; import * as z from "zod/v4"; -export const CustomerInvoiceListResponseSchema = createListViewResponseSchema( +export const ListCustomerInvoiceResponseSchema = createListViewResponseSchema( z.object({ id: z.uuid(), company_id: z.uuid(), @@ -14,6 +14,9 @@ export const CustomerInvoiceListResponseSchema = createListViewResponseSchema( invoice_date: z.string(), operation_date: z.string(), + language_code: z.string(), + currency_code: z.string(), + recipient: { tin: z.string(), name: z.string(), @@ -37,4 +40,4 @@ export const CustomerInvoiceListResponseSchema = createListViewResponseSchema( }) ); -export type CustomerInvoiceListResponseDTO = z.infer; +export type CustomerInvoiceListResponseDTO = z.infer; diff --git a/modules/customer-invoices/src/common/locales/en.json b/modules/customer-invoices/src/common/locales/en.json index ee32c2ad..eab82b97 100644 --- a/modules/customer-invoices/src/common/locales/en.json +++ b/modules/customer-invoices/src/common/locales/en.json @@ -15,10 +15,10 @@ "description": "List all customer invoices", "grid_columns": { "invoice_number": "Inv. number", - "invoice_series": "Serie", - "invoice_status": "Status", + "series": "Serie", + "status": "Status", "invoice_date": "Date", - "total_price": "Total price" + "total_amount": "Total price" } }, "create": { diff --git a/modules/customer-invoices/src/web/components/customer-invoices-list-grid.tsx b/modules/customer-invoices/src/web/components/customer-invoices-list-grid.tsx index acf3ddd5..bf99df61 100644 --- a/modules/customer-invoices/src/web/components/customer-invoices-list-grid.tsx +++ b/modules/customer-invoices/src/web/components/customer-invoices-list-grid.tsx @@ -23,16 +23,16 @@ export const CustomerInvoicesListGrid = () => { // Column Definitions: Defines & controls grid columns. const [colDefs] = useState([ { - field: "invoice_status", + field: "status", filter: true, - headerName: t("pages.list.grid_columns.invoice_status"), + headerName: t("pages.list.grid_columns.status"), cellRenderer: (params: ValueFormatterParams) => { return ; }, }, { field: "invoice_number", headerName: t("pages.list.grid_columns.invoice_number") }, - { field: "invoice_series", headerName: t("pages.list.grid_columns.invoice_series") }, + { field: "series", headerName: t("pages.list.grid_columns.series") }, { field: "invoice_date", @@ -41,9 +41,32 @@ export const CustomerInvoicesListGrid = () => { return formatDate(params.value); }, }, + { field: "recipient.tin" }, + { field: "recipient.name" }, + + { field: "recipient.city" }, + { field: "recipient.province" }, + { field: "recipient.postal_code" }, { - field: "total_price", - headerName: t("pages.list.grid_columns.total_price"), + field: "taxable_amount", + headerName: t("pages.list.grid_columns.taxable_amount"), + valueFormatter: (params: ValueFormatterParams) => { + const rawValue: MoneyDTO = params.value; + return formatMoney(rawValue); + }, + }, + { + field: "taxes_amount", + headerName: t("pages.list.grid_columns.taxable_amount"), + valueFormatter: (params: ValueFormatterParams) => { + const rawValue: MoneyDTO = params.value; + return formatMoney(rawValue); + }, + }, + + { + field: "total_amount", + headerName: t("pages.list.grid_columns.total_amount"), valueFormatter: (params: ValueFormatterParams) => { const rawValue: MoneyDTO = params.value; return formatMoney(rawValue); @@ -54,11 +77,11 @@ export const CustomerInvoicesListGrid = () => { const gridOptions: GridOptions = { columnDefs: colDefs, defaultColDef: { - editable: true, + editable: false, flex: 1, minWidth: 100, - filter: false, - sortable: false, + filter: true, + sortable: true, resizable: true, }, pagination: true, diff --git a/packages/rdx-criteria/src/critera.ts b/packages/rdx-criteria/src/critera.ts index 80e19733..c2c5f11d 100644 --- a/packages/rdx-criteria/src/critera.ts +++ b/packages/rdx-criteria/src/critera.ts @@ -35,12 +35,17 @@ export class Criteria extends BaseCriteria { ); } - toJSON(): Record { + toPrimitives() { return { filters: this.filters.toPrimitives(), - //order: this.order. + orderBy: this.order.orderBy.value, + orderType: this.order.orderType.value, pageSize: this.pageSize, pageNumber: this.pageNumber, }; } + + toJSON() { + return this.toPrimitives(); + } }