From c285c2d8971d0eefc42d2aa568cf4bb957739f0c Mon Sep 17 00:00:00 2001 From: david Date: Tue, 16 Sep 2025 19:29:37 +0200 Subject: [PATCH] Clientes --- .../express/express-controller.ts | 3 - modules/core/src/web/hooks/index.ts | 1 + .../core/src/web/hooks/use-url-param-id.ts | 6 + .../templates/customer-invoice/logo1.jpg | Bin 0 -> 120528 bytes .../customer-invoice/template copy.hbs | 254 +++++++++++++ .../templates/customer-invoice/template.hbs | 264 ++++++++++++- .../customer-invoice/template.hbs_BAK | 152 ++++++++ .../queries/invoice-recipient.list.mapper.ts | 10 +- .../src/common/dto/request/index.ts | 1 + ...date-customer-invoice-by-id.request.dto.ts | 9 + .../update-customer-invoice.request.dto.ts | 0 modules/customer-invoices/src/common/index.ts | 1 + .../queries/list-customers.presenter.ts | 4 +- .../use-cases/list-customers.use-case.ts | 4 +- .../controllers/update-customer.controller.ts | 4 +- .../update-customer-by-id.request.dto.ts | 2 +- .../src/common/dto/response/index.ts | 2 +- ....dto.ts => list-customers.response.dto.ts} | 4 +- .../update-customer-by-id.response.dto.ts | 10 +- modules/customers/src/common/locales/en.json | 44 ++- modules/customers/src/common/locales/es.json | 38 +- .../src/web/components/client-selector.tsx | 4 +- .../web/components/customers-list-grid.tsx | 135 +++++-- modules/customers/src/web/customer-routes.tsx | 2 + modules/customers/src/web/hooks/index.ts | 4 + .../web/hooks/use-create-customer-mutation.ts | 5 +- .../src/web/hooks/use-customer-query.ts | 40 ++ .../src/web/hooks/use-customers-query.tsx | 13 +- .../customers/src/web/hooks/use-customers.bak | 75 ---- .../web/hooks/use-update-customer-mutation.ts | 38 ++ .../customers/src/web/pages/create/create.tsx | 6 +- .../web/pages/create/customer-edit-form.tsx | 4 +- .../src/web/pages/create/customer.schema.ts | 6 - .../web/pages/update/customer-edit-form.tsx | 354 ++++++++++++++++++ .../customers/src/web/pages/update/index.ts | 1 + .../customers/src/web/pages/update/update.tsx | 175 +++++++++ .../src/web/schemas/customer.schema.ts | 10 + modules/customers/src/web/schemas/index.ts | 1 + modules/customers/tsconfig.json | 2 +- 39 files changed, 1512 insertions(+), 176 deletions(-) create mode 100644 modules/core/src/web/hooks/use-url-param-id.ts create mode 100755 modules/customer-invoices/src/api/application/use-cases/report/reporter/templates/customer-invoice/logo1.jpg create mode 100644 modules/customer-invoices/src/api/application/use-cases/report/reporter/templates/customer-invoice/template copy.hbs create mode 100644 modules/customer-invoices/src/api/application/use-cases/report/reporter/templates/customer-invoice/template.hbs_BAK create mode 100644 modules/customer-invoices/src/common/dto/request/update-customer-invoice-by-id.request.dto.ts delete mode 100644 modules/customer-invoices/src/common/dto/request/update-customer-invoice.request.dto.ts create mode 100644 modules/customer-invoices/src/common/index.ts rename modules/customers/src/common/dto/response/{customer-list.response.dto.ts => list-customers.response.dto.ts} (81%) create mode 100644 modules/customers/src/web/hooks/use-customer-query.ts delete mode 100644 modules/customers/src/web/hooks/use-customers.bak create mode 100644 modules/customers/src/web/hooks/use-update-customer-mutation.ts delete mode 100644 modules/customers/src/web/pages/create/customer.schema.ts create mode 100644 modules/customers/src/web/pages/update/customer-edit-form.tsx create mode 100644 modules/customers/src/web/pages/update/index.ts create mode 100644 modules/customers/src/web/pages/update/update.tsx create mode 100644 modules/customers/src/web/schemas/customer.schema.ts create mode 100644 modules/customers/src/web/schemas/index.ts 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 0000000000000000000000000000000000000000..75df86fa07577b94f52f5d0e6481b952b2e181c1 GIT binary patch literal 120528 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JDc?uM zn$+Vo3s;C=ZO+$wm!67B6mCnncLU;Vrk-R;e= zsBM4~hjyRb=WkQQQ1FAs07!M}W_^ru>83HIGFW#zcQ1Edu-srGg9I#Av9K~fZ~xde znO3OJVYDoxsIj`0e?o2zbR6{%Rr4l#a(2(!7JK z?}!+7bZi=1QgDRGusvMiIMFDyq}(Ory=)aWjo9m&Z6TyOtD;9}?@fnDgvCR)f`ExG zviaRKT3)Aj^v=7iNr@^h4vWzYRRyNSS>n8Ld|$?lCV>2v*c3U z%rd#?WWH3xG8*$b1LG#?%xlTKCGHXkNIryFi*}gw(KS?!Y-TNj#?9*Tj+BBx`BVu^ zO+XnE{^ry^oce2x%&6&zOTu0}c`9F?yi4TK%~*)dAx7lgDC`TL{cWFvO7Y|9vzBZ9 zzo4Eu`kOP4CVnRN)YYl*jotr{$z{QbXxP73^U{X&PQbyUTHA8Jx9?CIxtLbmJ3WGT!ytJ7|V2ZG{75~?<`Uqb3ND%yeBaP^v;+r4U^R*pB7)ddyaJ7TKAua=(!$nlNwVlUmBjKLC`qcs{$u1eu&G-Sf&2zg;T-CS`eAYDI zP$xQ)j~rO)6fVd8N1O}PNO!bHkzsv5Uww7%i7?sbsos;Vk@uimv=p;qIFjRbryb|9 z?9y-3MObKZyGG2IpIBZ(P8^qz>?-zmY@m`xm)Tw=r|^}%h06mWxuD~w1guBRnsUp! zb2%fHHf$_u3E=q5N*VhC0=LRYV3_Lkw=DP zhPfC+^Q#W*jZTD|@j@v!7fLl97^8mGk*@s8U{d$xK08BBWlL7wb+j^zXW8ux6MJf& zM5ihfo@nLAW;NaQ$?;CT^)+A?@b z)fx4Lk-L8^Yt0xxc3iWE+JdXnI+8E$%n->(+x-&o!MVEf;e(ib8^_4>2&p^>7r1F1 zO-`M#L=aH1QTKqdA~X3@R~$K;Cf|Fk8X;qB@LhKohkxl62+>(dYGMOr!M{He-qV;N*HHx?L6F4?1QbeqAu#I{qC4VF=({8 zq%Gwhnd$y?V_N_3@9O`^uRuiPGB!JMcJ6K67o1nyY!%tAZ>#7M6zEYZ|KkKMpj#sg z4oN1|j1{rdFLjNIOh}eqGHR&fDq;w`pa0biJ}ntEwmo+-xI{y~&0QDkRLEzy$nARL z78MoGB;K|}Nusun@p*{s&${YCK+deNj3ha|h?b_9Ubh}Y2q7+WYw2(l5o^qI?7y&> ztTJM+J+~j{ZGe6hmoGnb%PvkJ>{CrY;iO&X;c3UC`Xleb4|Gl$rFa_Zj%Wsll1j%~z|6HERI!R!Fi&Vhs2 zN+Bn>kKrnqK1x2+@x_fIceRd;wEh-NE0rhK)U%@H%k@>|9Dp3CsHsLdTE-(hZ{74N z@5FlRAm`pd-t7G_DlLO*ek&Kv4qhqvJ@!2(wcY9{&$I|SL9zuNt3s}bjc1`{3DF$S zc1YAVFU#B3C}Wi`Gw0v9uB#{@Vgj``^6skNM{?f5ifR4ZrvEb%ak5)jN48pTFl{Vo_b*X!rVA9!Ocmxn9TVfeACYM>sHWBjTG>yyd<7Br6xbmF?^m~_1O5UeSTH{R%0Df4!)!x%p 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 K{|^ZKGygwg1IQEr literal 0 HcmV?d00001 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 @@ + + + + + + Factura #{{id}} + + + + + + +
+ +
+ + + + + + + {{#if any_item_has_discount}} + + {{/if}} + + + + + {{#each items}} + + + + + {{#if ../any_item_has_discount}} + + {{/if}} + + + {{/each}} + + + + + + +
ConceptoCantidadPrecio unidadDto (%)Importe total
+
{{description}}
+ {{#if note}}
{{note}}
{{/if}} +
{{quantity}}{{unit_price}}{{discount}}{{total_price}}
* Precios en {{currency}}.
+
+ + +
+ + + + + +
+ + + +
+ +
+ + {{!-- 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 @@ - + + - + - Presupuesto #{{id}} + Factura F26200 + + + + + +
+
+ + + + + + + + + + + + + {{#each items}} + + + + + + + + + {{/each}} + +
Cant.DescripciónPrec. UnitarioSubtotalDto (%)Importe total
{{quantity}}{{description}}{{unit_price}}{{subtotal_price}}{{discount}}{{total_price}}
+
+ +
+ +
+
+

Forma de pago: {{payment_method}}

+
+
+

Notas: {{notes}}

+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Importe neto{{subtotal_price}}
% Descuento{{discount.amount}}{{discount_price}}
Base imponible{{before_tax_price}}
% IVA{{tax}}{{tax_price}}
Importe total{{total_price}}
+
+
+ +
+
+ +
+ + + + \ 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; diff --git a/modules/customer-invoices/src/common/dto/request/update-customer-invoice.request.dto.ts b/modules/customer-invoices/src/common/dto/request/update-customer-invoice.request.dto.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/modules/customer-invoices/src/common/index.ts b/modules/customer-invoices/src/common/index.ts new file mode 100644 index 00000000..0392b1b4 --- /dev/null +++ b/modules/customer-invoices/src/common/index.ts @@ -0,0 +1 @@ +export * from "./dto"; diff --git a/modules/customers/src/api/application/presenters/queries/list-customers.presenter.ts b/modules/customers/src/api/application/presenters/queries/list-customers.presenter.ts index b151811b..8e5b89ab 100644 --- a/modules/customers/src/api/application/presenters/queries/list-customers.presenter.ts +++ b/modules/customers/src/api/application/presenters/queries/list-customers.presenter.ts @@ -3,7 +3,7 @@ import { CustomerListDTO } from "@erp/customer-invoices/api/infrastructure"; import { Criteria } from "@repo/rdx-criteria/server"; import { toEmptyString } from "@repo/rdx-ddd"; import { Collection } from "@repo/rdx-utils"; -import { CustomerListResponsetDTO } from "../../../../common/dto"; +import { ListCustomersResponseDTO } from "../../../../common/dto"; export class ListCustomersPresenter extends Presenter { protected _mapCustomer(customer: CustomerListDTO) { @@ -54,7 +54,7 @@ export class ListCustomersPresenter extends Presenter { toOutput(params: { customers: Collection; criteria: Criteria; - }): CustomerListResponsetDTO { + }): ListCustomersResponseDTO { const { customers, criteria } = params; const items = customers.map((customer) => this._mapCustomer(customer)); diff --git a/modules/customers/src/api/application/use-cases/list-customers.use-case.ts b/modules/customers/src/api/application/use-cases/list-customers.use-case.ts index 09e03377..66f81aba 100644 --- a/modules/customers/src/api/application/use-cases/list-customers.use-case.ts +++ b/modules/customers/src/api/application/use-cases/list-customers.use-case.ts @@ -3,7 +3,7 @@ import { Criteria } from "@repo/rdx-criteria/server"; import { UniqueID } from "@repo/rdx-ddd"; import { Result } from "@repo/rdx-utils"; import { Transaction } from "sequelize"; -import { CustomerListResponsetDTO } from "../../../common/dto"; +import { ListCustomersResponseDTO } from "../../../common/dto"; import { CustomerService } from "../../domain"; import { ListCustomersPresenter } from "../presenters"; @@ -21,7 +21,7 @@ export class ListCustomersUseCase { public execute( params: ListCustomersUseCaseInput - ): Promise> { + ): Promise> { const { criteria, companyId } = params; const presenter = this.presenterRegistry.getPresenter({ resource: "customer", diff --git a/modules/customers/src/api/infrastructure/express/controllers/update-customer.controller.ts b/modules/customers/src/api/infrastructure/express/controllers/update-customer.controller.ts index f3d69400..54097941 100644 --- a/modules/customers/src/api/infrastructure/express/controllers/update-customer.controller.ts +++ b/modules/customers/src/api/infrastructure/express/controllers/update-customer.controller.ts @@ -1,5 +1,5 @@ import { ExpressController, authGuard, forbidQueryFieldGuard, tenantGuard } from "@erp/core/api"; -import { UpdateCustomerRequestDTO } from "../../../../common/dto"; +import { UpdateCustomerByIdRequestDTO } from "../../../../common/dto"; import { UpdateCustomerUseCase } from "../../../application"; export class UpdateCustomerController extends ExpressController { @@ -15,7 +15,7 @@ export class UpdateCustomerController extends ExpressController { return this.forbiddenError("Tenant ID not found"); } const { customer_id } = this.req.params; - const dto = this.req.body as UpdateCustomerRequestDTO; + const dto = this.req.body as UpdateCustomerByIdRequestDTO; const result = await this.useCase.execute({ customer_id, companyId, dto }); diff --git a/modules/customers/src/common/dto/request/update-customer-by-id.request.dto.ts b/modules/customers/src/common/dto/request/update-customer-by-id.request.dto.ts index e97dcb4e..7cbb53b0 100644 --- a/modules/customers/src/common/dto/request/update-customer-by-id.request.dto.ts +++ b/modules/customers/src/common/dto/request/update-customer-by-id.request.dto.ts @@ -31,4 +31,4 @@ export const UpdateCustomerByIdRequestSchema = z.object({ currency_code: z.string().optional(), }); -export type UpdateCustomerRequestDTO = z.infer; +export type UpdateCustomerByIdRequestDTO = z.infer; diff --git a/modules/customers/src/common/dto/response/index.ts b/modules/customers/src/common/dto/response/index.ts index 4f76f304..2f08346a 100644 --- a/modules/customers/src/common/dto/response/index.ts +++ b/modules/customers/src/common/dto/response/index.ts @@ -1,4 +1,4 @@ export * from "./create-customer.result.dto"; -export * from "./customer-list.response.dto"; export * from "./get-customer-by-id.response.dto"; +export * from "./list-customers.response.dto"; export * from "./update-customer-by-id.response.dto"; diff --git a/modules/customers/src/common/dto/response/customer-list.response.dto.ts b/modules/customers/src/common/dto/response/list-customers.response.dto.ts similarity index 81% rename from modules/customers/src/common/dto/response/customer-list.response.dto.ts rename to modules/customers/src/common/dto/response/list-customers.response.dto.ts index bc4e63b1..65d068aa 100644 --- a/modules/customers/src/common/dto/response/customer-list.response.dto.ts +++ b/modules/customers/src/common/dto/response/list-customers.response.dto.ts @@ -1,7 +1,7 @@ import { MetadataSchema, createListViewResponseSchema } from "@erp/core"; import * as z from "zod/v4"; -export const CustomerListResponseSchema = createListViewResponseSchema( +export const ListCustomersResponseSchema = createListViewResponseSchema( z.object({ id: z.uuid(), company_id: z.uuid(), @@ -34,4 +34,4 @@ export const CustomerListResponseSchema = createListViewResponseSchema( }) ); -export type CustomerListResponsetDTO = z.infer; +export type ListCustomersResponseDTO = z.infer; diff --git a/modules/customers/src/common/dto/response/update-customer-by-id.response.dto.ts b/modules/customers/src/common/dto/response/update-customer-by-id.response.dto.ts index 9d1718bc..24551e70 100644 --- a/modules/customers/src/common/dto/response/update-customer-by-id.response.dto.ts +++ b/modules/customers/src/common/dto/response/update-customer-by-id.response.dto.ts @@ -18,15 +18,19 @@ export const UpdateCustomerByIdResponseSchema = z.object({ postal_code: z.string(), country: z.string(), - email: z.string(), - phone: z.string(), + email_primary: z.string(), + email_secondary: z.string(), + phone_primary: z.string(), + phone_secondary: z.string(), + mobile_primary: z.string(), + mobile_secondary: z.string(), + fax: z.string(), website: z.string(), legal_record: z.string(), default_taxes: z.string(), - status: z.string(), language_code: z.string(), currency_code: z.string(), diff --git a/modules/customers/src/common/locales/en.json b/modules/customers/src/common/locales/en.json index 868303b3..57acba91 100644 --- a/modules/customers/src/common/locales/en.json +++ b/modules/customers/src/common/locales/en.json @@ -10,7 +10,11 @@ "name": "Name", "trade_name": "Trade name", "status": "Status", - "email": "Email" + "email": "Email", + "phone": "Phone", + "city": "City", + "tin": "TIN", + "mobile": "Mobile" } }, "create": { @@ -71,15 +75,37 @@ "placeholder": "Select country", "description": "The country of the customer" }, - "email": { - "label": "Email", - "placeholder": "Enter email", - "description": "The email address of the customer" + "email_primary": { + "label": "Primary email", + "placeholder": "Enter primary email", + "description": "The primary email address of the customer" }, - "phone": { - "label": "Phone", - "placeholder": "Enter phone number", - "description": "The phone number of the customer" + "email_secondary": { + "label": "Secondary email", + "placeholder": "Enter secondary email", + "description": "The secondary email address of the customer" + }, + + "phone_primary": { + "label": "Primary phone", + "placeholder": "Enter primary phone number", + "description": "The primary phone number of the customer" + }, + "phone_secondary": { + "label": "Secondary phone", + "placeholder": "Enter secondary phone number ", + "description": "The secondary phone number of the customer" + }, + + "mobile_primary": { + "label": "Primary mobile", + "placeholder": "Enter primary mobile number", + "description": "The primary mobile number of the customer" + }, + "mobile_secondary": { + "label": "Secondary mobile", + "placeholder": "Enter secondary mobile number", + "description": "The secondary mobile number of the customer" }, "fax": { "label": "Fax", diff --git a/modules/customers/src/common/locales/es.json b/modules/customers/src/common/locales/es.json index 9001fa7a..88cb2ad9 100644 --- a/modules/customers/src/common/locales/es.json +++ b/modules/customers/src/common/locales/es.json @@ -10,7 +10,11 @@ "name": "Nombre", "trade_name": "Nombre comercial", "status": "Estado", - "email": "Correo electrónico" + "email": "Correo electrónico", + "phone": "Teléfono", + "city": "Ciudad", + "tin": "Nº Id.", + "mobile": "Móvil" } }, "create": { @@ -71,16 +75,40 @@ "placeholder": "Seleccione el país", "description": "El país del cliente" }, - "email": { - "label": "Correo electrónico", + + "email_primary": { + "label": "Email principal", "placeholder": "Ingrese el correo electrónico", - "description": "La dirección de correo electrónico del cliente" + "description": "La dirección de correo electrónico principal del cliente" }, - "phone": { + "email_secondary": { + "label": "Email secundario", + "placeholder": "Ingrese el correo electrónico", + "description": "La dirección de correo electrónico secundario del clientºe" + }, + + "phone_primary": { "label": "Teléfono", "placeholder": "Ingrese el número de teléfono", "description": "El número de teléfono del cliente" }, + "phone_secondary": { + "label": "Teléfono secundario", + "placeholder": "Ingrese el número de teléfono secundario", + "description": "El número de teléfono secundario del cliente" + }, + + "mobile_primary": { + "label": "Teléfono", + "placeholder": "Ingrese el número de teléfono", + "description": "El número de teléfono del cliente" + }, + "mobile_secondary": { + "label": "Teléfono secundario", + "placeholder": "Ingrese el número de teléfono secundario", + "description": "El número de teléfono secundario del cliente" + }, + "fax": { "label": "Fax", "placeholder": "Ingrese el número de fax", diff --git a/modules/customers/src/web/components/client-selector.tsx b/modules/customers/src/web/components/client-selector.tsx index 97854bc4..551d9e2d 100644 --- a/modules/customers/src/web/components/client-selector.tsx +++ b/modules/customers/src/web/components/client-selector.tsx @@ -18,10 +18,10 @@ import { } from "@repo/shadcn-ui/components"; import { Building, Calendar, Mail, MapPin, Phone, Plus, User } from "lucide-react"; import { useState } from "react"; -import { CustomerListResponsetDTO } from "../../common"; +import { ListCustomersResponseDTO } from "../../common"; import { useCustomersQuery } from "../hooks"; -type Customer = CustomerListResponsetDTO["items"][number]; +type Customer = ListCustomersResponseDTO["items"][number]; const columns: TableColumn[] = [ { diff --git a/modules/customers/src/web/components/customers-list-grid.tsx b/modules/customers/src/web/components/customers-list-grid.tsx index d85d08af..d1698160 100644 --- a/modules/customers/src/web/components/customers-list-grid.tsx +++ b/modules/customers/src/web/components/customers-list-grid.tsx @@ -1,59 +1,124 @@ -import { useState } from "react"; - import { AG_GRID_LOCALE_ES } from "@ag-grid-community/locale"; -// Grid -import type { ColDef, GridOptions, ValueFormatterParams } from "ag-grid-community"; -import { AllCommunityModule, ModuleRegistry } from "ag-grid-community"; +import type { ValueFormatterParams } from "ag-grid-community"; +import { + AllCommunityModule, + ColDef, + GridOptions, + ModuleRegistry, + SizeColumnsToContentStrategy, + SizeColumnsToFitGridStrategy, + SizeColumnsToFitProvidedWidthStrategy, +} from "ag-grid-community"; +import { useMemo, useState } from "react"; -ModuleRegistry.registerModules([AllCommunityModule]); - -// Core CSS +import { Button } from "@repo/shadcn-ui/components"; import { AgGridReact } from "ag-grid-react"; +import { ChevronRightIcon } from "lucide-react"; +import { useNavigate } from "react-router-dom"; import { useCustomersQuery } from "../hooks"; import { useTranslation } from "../i18n"; import { CustomerStatusBadge } from "./customer-status-badge"; +ModuleRegistry.registerModules([AllCommunityModule]); + // Create new GridExample component export const CustomersListGrid = () => { const { t } = useTranslation(); - const { data, isLoading, isPending, isError, error } = useCustomersQuery({}); + const navigate = useNavigate(); + + const { + data: customersData, + isLoading: isLoadingCustomers, + isError: isLoadError, + error: loadError, + } = useCustomersQuery(); // Column Definitions: Defines & controls grid columns. const [colDefs] = useState([ + { field: "name", headerName: t("pages.list.grid_columns.name"), minWidth: 300 }, + { + field: "tin", + headerName: t("pages.list.grid_columns.tin"), + maxWidth: 120, + }, + { + field: "city", + headerName: t("pages.list.grid_columns.city"), + }, + { + field: "email_primary", + headerName: t("pages.list.grid_columns.email"), + }, + { + field: "phone_primary", + headerName: t("pages.list.grid_columns.phone"), + maxWidth: 120, + }, + + { + field: "mobile_primary", + headerName: t("pages.list.grid_columns.mobile"), + maxWidth: 120, + }, { field: "status", - headerName: t("pages.list.grid_columns.status"), + maxWidth: 125, cellRenderer: (params: ValueFormatterParams) => { return ; }, }, - - { field: "name", headerName: t("pages.list.grid_columns.name") }, - { field: "trade_name", headerName: t("pages.list.grid_columns.trade_name") }, - { - field: "email", - headerName: t("pages.list.grid_columns.email"), + colId: "actions", + headerName: t("pages.list.grid_columns.actions", "Actions"), + cellRenderer: (params: ValueFormatterParams) => { + const { data } = params; + return ( + + ); + }, }, ]); - const gridOptions: GridOptions = { - columnDefs: colDefs, - defaultColDef: { - editable: true, - flex: 1, - minWidth: 100, - filter: false, - sortable: false, - resizable: true, - }, - pagination: true, - paginationPageSize: 10, - paginationPageSizeSelector: [10, 20, 30, 50], - localeText: AG_GRID_LOCALE_ES, - rowSelection: { mode: "multiRow" }, - }; + const autoSizeStrategy = useMemo< + | SizeColumnsToFitGridStrategy + | SizeColumnsToFitProvidedWidthStrategy + | SizeColumnsToContentStrategy + >(() => { + return { + type: "fitGridWidth", + defaultMinWidth: 100, + columnLimits: [{ colId: "actions", minWidth: 75, maxWidth: 75 }], + }; + }, []); + + const gridOptions: GridOptions = useMemo( + () => ({ + columnDefs: colDefs, + autoSizeStrategy: autoSizeStrategy, + defaultColDef: { + editable: false, + flex: 1, + filter: false, + sortable: false, + resizable: true, + }, + pagination: true, + paginationPageSize: 10, + paginationPageSizeSelector: [10, 20, 30, 50], + localeText: AG_GRID_LOCALE_ES, + }), + [autoSizeStrategy, colDefs] + ); // Container: Defines the grid's theme & dimensions. return ( @@ -64,7 +129,11 @@ export const CustomersListGrid = () => { width: "100%", }} > - + ); }; diff --git a/modules/customers/src/web/customer-routes.tsx b/modules/customers/src/web/customer-routes.tsx index 816a99cb..0d527300 100644 --- a/modules/customers/src/web/customer-routes.tsx +++ b/modules/customers/src/web/customer-routes.tsx @@ -1,6 +1,7 @@ import { ModuleClientParams } from "@erp/core/client"; import { lazy } from "react"; import { Outlet, RouteObject } from "react-router-dom"; +import { CustomerUpdate } from "./pages/update"; // Lazy load components const CustomersLayout = lazy(() => @@ -43,6 +44,7 @@ export const CustomerRoutes = (params: ModuleClientParams): RouteObject[] => { { path: "", index: true, element: }, // index { path: "list", element: }, { path: "create", element: }, + { path: ":id/edit", element: }, // /*{ path: "create", element: }, diff --git a/modules/customers/src/web/hooks/index.ts b/modules/customers/src/web/hooks/index.ts index ad82e29e..e7126993 100644 --- a/modules/customers/src/web/hooks/index.ts +++ b/modules/customers/src/web/hooks/index.ts @@ -1 +1,5 @@ +export * from "./use-create-customer-mutation"; +export * from "./use-customer-query"; +export * from "./use-customers-context"; export * from "./use-customers-query"; +export * from "./use-update-customer-mutation"; diff --git a/modules/customers/src/web/hooks/use-create-customer-mutation.ts b/modules/customers/src/web/hooks/use-create-customer-mutation.ts index c373d8f2..6275d3b8 100644 --- a/modules/customers/src/web/hooks/use-create-customer-mutation.ts +++ b/modules/customers/src/web/hooks/use-create-customer-mutation.ts @@ -1,13 +1,14 @@ import { useDataSource, useQueryKey } from "@erp/core/hooks"; import { useMutation, useQueryClient } from "@tanstack/react-query"; -import { UpdateCustomerRequestDTO } from "../../common/dto"; +import { UpdateCustomerByIdRequestDTO } from "../../common/dto"; export const useCreateCustomerMutation = () => { const queryClient = useQueryClient(); const dataSource = useDataSource(); const keys = useQueryKey(); - return useMutation>({ + return useMutation>({ + mutationKey: ["customer:create"], mutationFn: (data) => { console.log(data); return dataSource.createOne("customers", data); diff --git a/modules/customers/src/web/hooks/use-customer-query.ts b/modules/customers/src/web/hooks/use-customer-query.ts new file mode 100644 index 00000000..8b13575a --- /dev/null +++ b/modules/customers/src/web/hooks/use-customer-query.ts @@ -0,0 +1,40 @@ +import { useDataSource } from "@erp/core/hooks"; +import { GetCustomerByIdResponseDTO } from "@erp/customer-invoices/common"; +import { type QueryKey, type UseQueryOptions, useQuery } from "@tanstack/react-query"; + +export const CUSTOMER_QUERY_KEY = (id: string): QueryKey => ["customer", id] as const; + +type Options = Omit< + UseQueryOptions< + GetCustomerByIdResponseDTO, + Error, + GetCustomerByIdResponseDTO, + ReturnType + >, + "queryKey" | "queryFn" | "enabled" +> & { + enabled?: boolean; +}; + +export function useCustomerQuery(customerId?: string, options?: Options) { + const dataSource = useDataSource(); + const enabled = (options?.enabled ?? true) && !!customerId; + + return useQuery< + GetCustomerByIdResponseDTO, + Error, + GetCustomerByIdResponseDTO, + ReturnType + >({ + queryKey: CUSTOMER_QUERY_KEY(customerId ?? "unknown"), + enabled, + queryFn: async (context) => { + if (!customerId) throw new Error("customerId is required"); + + const { signal } = context; + const customer = await dataSource.getOne("customers", customerId); + return customer as GetCustomerByIdResponseDTO; + }, + ...options, + }); +} diff --git a/modules/customers/src/web/hooks/use-customers-query.tsx b/modules/customers/src/web/hooks/use-customers-query.tsx index e0281d8c..413ab111 100644 --- a/modules/customers/src/web/hooks/use-customers-query.tsx +++ b/modules/customers/src/web/hooks/use-customers-query.tsx @@ -1,21 +1,22 @@ import { useDataSource, useQueryKey } from "@erp/core/hooks"; +import { ListCustomersResponseDTO } from "@erp/customer-invoices/common"; import { useQuery } from "@tanstack/react-query"; -import { CustomerListResponsetDTO } from "../../common/dto"; // Obtener todas las facturas -export const useCustomersQuery = (params: any) => { +export const useCustomersQuery = (params?: any) => { const dataSource = useDataSource(); const keys = useQueryKey(); - return useQuery({ + return useQuery({ queryKey: keys().data().resource("customers").action("list").params(params).get(), - queryFn: (context) => { - console.log(dataSource.getBaseUrl()); + queryFn: async (context) => { const { signal } = context; - return dataSource.getList("customers", { + const customers = await dataSource.getList("customers", { signal, ...params, }); + + return customers as ListCustomersResponseDTO; }, }); }; diff --git a/modules/customers/src/web/hooks/use-customers.bak b/modules/customers/src/web/hooks/use-customers.bak deleted file mode 100644 index b4bfb751..00000000 --- a/modules/customers/src/web/hooks/use-customers.bak +++ /dev/null @@ -1,75 +0,0 @@ -import { useDataSource, useQueryKey } from "@erp/core/hooks"; -import { IListCustomersResponseDTO } from "@erp/customers/common/dto"; - -export type UseCustomersListParams = Omit & { - status?: string; - enabled?: boolean; - queryOptions?: Record; -}; - -export type UseCustomersListResponse = UseListQueryResult< - IListResponseDTO, - unknown ->; - -export type UseCustomersGetParamsType = { - enabled?: boolean; - queryOptions?: Record; -}; - -export type UseCustomersReportParamsType = { - enabled?: boolean; - queryOptions?: Record; -}; - -export const useCustomers = () => { - const actions = { - /** - * Hook para obtener la lista de facturas - * @param params - Parámetros para la consulta de la lista de facturas - * @returns - Respuesta de la consulta de la lista de facturas - */ - useList: (params: UseCustomersListParams): UseCustomersListResponse => { - const dataSource = useDataSource(); - const keys = useQueryKey(); - - const { - pagination, - status = "draft", - quickSearchTerm = undefined, - enabled = true, - queryOptions, - } = params; - - return useList({ - queryKey: keys().data().resource("customers").action("list").params(params).get(), - queryFn: () => { - return dataSource.getList({ - resource: "customers", - quickSearchTerm, - filters: - status !== "all" - ? [ - { - field: "status", - operator: "eq", - value: status, - }, - ] - : [ - { - field: "status", - operator: "ne", - value: "archived", - }, - ], - pagination, - }); - }, - enabled, - queryOptions, - }); - }, - }; - return actions; -}; diff --git a/modules/customers/src/web/hooks/use-update-customer-mutation.ts b/modules/customers/src/web/hooks/use-update-customer-mutation.ts new file mode 100644 index 00000000..a1b9089a --- /dev/null +++ b/modules/customers/src/web/hooks/use-update-customer-mutation.ts @@ -0,0 +1,38 @@ +import { useDataSource } from "@erp/core/hooks"; +import { + UpdateCustomerByIdRequestDTO, + UpdateCustomerByIdResponseDTO, +} from "@erp/customer-invoices/common"; +import { useMutation, useQueryClient } from "@tanstack/react-query"; +import { CUSTOMER_QUERY_KEY } from "./use-customer-query"; + +export const CUSTOMERS_LIST_KEY = ["customers"] as const; + +type MutationDeps = {}; + +export function useUpdateCustomerMutation(customerId: string, deps?: MutationDeps) { + const queryClient = useQueryClient(); + const dataSource = useDataSource(); + + return useMutation({ + mutationKey: ["customer:update", customerId], + mutationFn: async (input) => { + if (!customerId) throw new Error("customerId is required"); + const updated = await dataSource.updateOne("customers", customerId, input); + return updated as UpdateCustomerByIdResponseDTO; + }, + onSuccess: (updated) => { + // Refresca inmediatamente el detalle + queryClient.setQueryData( + CUSTOMER_QUERY_KEY(customerId), + updated + ); + + // Otra opción es invalidar el detalle para forzar refetch: + // queryClient.invalidateQueries({ queryKey: CUSTOMER_QUERY_KEY(customerId) }); + + // Invalida el listado para refrescar desde servidor + queryClient.invalidateQueries({ queryKey: CUSTOMERS_LIST_KEY }); + }, + }); +} diff --git a/modules/customers/src/web/pages/create/create.tsx b/modules/customers/src/web/pages/create/create.tsx index 85cf1436..b9a3a771 100644 --- a/modules/customers/src/web/pages/create/create.tsx +++ b/modules/customers/src/web/pages/create/create.tsx @@ -1,4 +1,4 @@ -import { AppBreadcrumb, AppContent, BackHistoryButton } from "@repo/rdx-ui/components"; +import { AppBreadcrumb, AppContent, BackHistoryButton, ButtonGroup } from "@repo/rdx-ui/components"; import { Button } from "@repo/shadcn-ui/components"; import { useNavigate } from "react-router-dom"; @@ -62,12 +62,12 @@ export const CustomerCreate = () => { {t("pages.create.description")}

-
+ -
+
diff --git a/modules/customers/src/web/pages/create/customer-edit-form.tsx b/modules/customers/src/web/pages/create/customer-edit-form.tsx index 528d39ae..5060d17b 100644 --- a/modules/customers/src/web/pages/create/customer-edit-form.tsx +++ b/modules/customers/src/web/pages/create/customer-edit-form.tsx @@ -22,7 +22,7 @@ import { import { useUnsavedChangesNotifier } from "@erp/core/hooks"; import { useTranslation } from "../../i18n"; -import { CustomerData, CustomerDataFormSchema } from "./customer.schema"; +import { CustomerData, CustomerDataUpdateUpdateSchema } from "../../schemas"; const defaultCustomerData = { id: "5e4dc5b3-96b9-4968-9490-14bd032fec5f", @@ -64,7 +64,7 @@ export const CustomerEditForm = ({ const { t } = useTranslation(); const form = useForm({ - resolver: zodResolver(CustomerDataFormSchema), + resolver: zodResolver(CustomerDataUpdateUpdateSchema), defaultValues: initialData, disabled: isPending, }); diff --git a/modules/customers/src/web/pages/create/customer.schema.ts b/modules/customers/src/web/pages/create/customer.schema.ts deleted file mode 100644 index 97bc0ed6..00000000 --- a/modules/customers/src/web/pages/create/customer.schema.ts +++ /dev/null @@ -1,6 +0,0 @@ -import * as z from "zod/v4"; - -import { UpdateCustomerByIdRequestSchema } from "../../../common"; - -export const CustomerDataFormSchema = UpdateCustomerByIdRequestSchema; -export type CustomerData = z.infer; diff --git a/modules/customers/src/web/pages/update/customer-edit-form.tsx b/modules/customers/src/web/pages/update/customer-edit-form.tsx new file mode 100644 index 00000000..04384e26 --- /dev/null +++ b/modules/customers/src/web/pages/update/customer-edit-form.tsx @@ -0,0 +1,354 @@ +import { zodResolver } from "@hookform/resolvers/zod"; +import { useForm } from "react-hook-form"; + +import { TaxesMultiSelectField } from "@erp/core/components"; +import { SelectField, TextAreaField, TextField } from "@repo/rdx-ui/components"; +import { + Button, + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, + RadioGroup, + RadioGroupItem, +} from "@repo/shadcn-ui/components"; + +import { useUnsavedChangesNotifier } from "@erp/core/hooks"; +import { GetCustomerByIdResponseDTO } from "@erp/customer-invoices/common"; +import { useTranslation } from "../../i18n"; +import { CustomerData, CustomerDataUpdateUpdateSchema } from "../../schemas"; + +interface CustomerFormProps { + formId: string; + data?: GetCustomerByIdResponseDTO; + isPending?: boolean; + /** + * Callback function to handle form submission. + * @param data - The customer data submitted by the form. + */ + onSubmit?: (data: CustomerData) => void; +} + +export const CustomerEditForm = ({ formId, data, onSubmit, isPending }: CustomerFormProps) => { + const { t } = useTranslation(); + + const form = useForm({ + resolver: zodResolver(CustomerDataUpdateUpdateSchema), + defaultValues: data, + disabled: isPending, + }); + + useUnsavedChangesNotifier({ + isDirty: form.formState.isDirty, + }); + + const handleSubmit = (data: CustomerData) => { + console.log("Datos del formulario:", data); + onSubmit?.(data); + }; + + const handleError = (errors: any) => { + console.error("Errores en el formulario:", errors); + // Aquí puedes manejar los errores, por ejemplo, mostrar un mensaje al usuario + }; + + const handleCancel = () => { + form.reset(data); + }; + + return ( +
+ +
+ {/* Información básica */} + + + {t("form_groups.basic_info.title")} + {t("form_groups.basic_info.description")} + + + ( + + {t("form_fields.customer_type.label")} + + + + + + + + {t("form_fields.customer_type.company")} + + + + + + + + + {t("form_fields.customer_type.individual")} + + + + + + + )} + /> + + + + + + + + + + + + {/* Dirección */} + + + {t("form_groups.address.title")} + {t("form_groups.address.description")} + + + + + + + + + + + + + + + {/* Contacto */} + + + {t("form_groups.contact_info.title")} + {t("form_groups.contact_info.description")} + + + + + + + + + + + + + + + + + + + + + {/* Configuraciones Adicionales */} + + + {t("form_groups.additional_config.title")} + {t("form_groups.additional_config.description")} + + + + + + + + + + + +
+ +
+ + ); +}; diff --git a/modules/customers/src/web/pages/update/index.ts b/modules/customers/src/web/pages/update/index.ts new file mode 100644 index 00000000..635be644 --- /dev/null +++ b/modules/customers/src/web/pages/update/index.ts @@ -0,0 +1 @@ +export * from "./update"; diff --git a/modules/customers/src/web/pages/update/update.tsx b/modules/customers/src/web/pages/update/update.tsx new file mode 100644 index 00000000..88013bcf --- /dev/null +++ b/modules/customers/src/web/pages/update/update.tsx @@ -0,0 +1,175 @@ +import { AppBreadcrumb, AppContent, BackHistoryButton, ButtonGroup } from "@repo/rdx-ui/components"; +import { Button } from "@repo/shadcn-ui/components"; +import { useNavigate } from "react-router-dom"; + +import { useUrlParamId } from "@erp/core/hooks"; +import { useCustomerQuery, useUpdateCustomerMutation } from "../../hooks"; +import { useTranslation } from "../../i18n"; +import { CustomerEditForm } from "./customer-edit-form"; + +export const CustomerUpdate = () => { + const { t } = useTranslation(); + const customerId = useUrlParamId(); + const navigate = useNavigate(); + + // 1) Estado de carga del cliente (query) + const { + data: customerData, + isLoading: isLoadingCustomer, + isError: isLoadError, + error: loadError, + } = useCustomerQuery(customerId, { enabled: !!customerId }); + + // 2) Estado de actualización (mutación) + const { + mutateAsync: updateAsync, + isPending: isUpdating, + isError: isUpdateError, + error: updateError, + } = useUpdateCustomerMutation(customerId || ""); + + // 3) Submit con navegación condicionada por éxito + const handleSubmit = async (formData: any) => { + try { + await updateAsync(formData); // solo navegamos si no lanza + // toast?.({ title: t('pages.update.successTitle'), description: t('pages.update.successMsg') }); + navigate("/customers/list"); + } catch (e) { + // toast?.({ variant: 'destructive', title: t('pages.update.errorTitle'), description: (e as Error).message }); + // No navegamos en caso de error + } + }; + + if (isLoadingCustomer) { + return ( + <> + + +
+
+
+
+
+
+ + +
+
+
+ {/* Skeleton simple para el formulario */} +
+
+
+
+ + + ); + } + + if (isLoadError) { + return ( + <> + + +
+

+ {t("pages.update.loadErrorTitle", "No se pudo cargar el cliente")} +

+

+ {(loadError as Error)?.message ?? + t("pages.update.loadErrorMsg", "Inténtalo de nuevo más tarde.")} +

+
+
+ +
+
+ + ); + } + + if (!customerData) { + return ( + <> + + +
+

+ {t("pages.update.notFoundTitle", "Cliente no encontrado")} +

+

+ {t("pages.update.notFoundMsg", "Revisa el identificador o vuelve al listado.")} +

+
+
+ +
+
+ + ); + } + + return ( + <> + + +
+
+

+ {t("pages.update.title")} +

+

+ {t("pages.update.description")} +

+
+ + + + +
+ {/* Alerta de error de actualización (si ha fallado el último intento) */} + {isUpdateError && ( +
+

+ {t("pages.update.errorTitle", "No se pudo guardar los cambios")} +

+

+ {(updateError as Error)?.message ?? + t("pages.update.errorMsg", "Revisa los datos e inténtalo de nuevo.")} +

+
+ )} + +
+ {/* Importante: proveemos un formId para que el botón del header pueda hacer submit */} + +
+
+ + ); +}; diff --git a/modules/customers/src/web/schemas/customer.schema.ts b/modules/customers/src/web/schemas/customer.schema.ts new file mode 100644 index 00000000..f23346b9 --- /dev/null +++ b/modules/customers/src/web/schemas/customer.schema.ts @@ -0,0 +1,10 @@ +import { + GetCustomerByIdResponseDTO, + UpdateCustomerByIdRequestDTO, + UpdateCustomerByIdRequestSchema, +} from "@erp/customers"; + +export type CustomerData = GetCustomerByIdResponseDTO; + +export const CustomerDataUpdateUpdateSchema = UpdateCustomerByIdRequestSchema; +export type CustomerDataFormUpdateDTO = UpdateCustomerByIdRequestDTO; diff --git a/modules/customers/src/web/schemas/index.ts b/modules/customers/src/web/schemas/index.ts new file mode 100644 index 00000000..4af663f8 --- /dev/null +++ b/modules/customers/src/web/schemas/index.ts @@ -0,0 +1 @@ +export * from "./customer.schema"; diff --git a/modules/customers/tsconfig.json b/modules/customers/tsconfig.json index ef8f21af..b4a95fde 100644 --- a/modules/customers/tsconfig.json +++ b/modules/customers/tsconfig.json @@ -28,6 +28,6 @@ "noFallthroughCasesInSwitch": true, "noUncheckedSideEffectImports": true }, - "include": ["src", "../../packages/rdx-ddd/src/helpers/extract-or-push-error.ts"], + "include": ["src"], "exclude": ["node_modules"] }