diff --git a/apps/server/src/app.ts b/apps/server/src/app.ts index 2add315b..d74354ae 100644 --- a/apps/server/src/app.ts +++ b/apps/server/src/app.ts @@ -67,14 +67,5 @@ export function createApp(): Application { next(); }); - // Registrar rutas de la API - // app.use("/api/v1", v1Routes()); - //initModules(app, database); - - // Gestión global de errores. - // Siempre al final de la cadena de middlewares - // y después de las rutas. - //app.use(globalErrorHandler); - return app; } diff --git a/apps/server/src/index.ts b/apps/server/src/index.ts index ae9539db..f30048c6 100644 --- a/apps/server/src/index.ts +++ b/apps/server/src/index.ts @@ -75,7 +75,7 @@ const serverConnection = (conn: any) => { //const sequelizeConn = createSequelizeAdapter(); //const firebirdConn = createFirebirdAdapter(); -// Cargar paquetes de la aplicación +// Cargar paquetes de la aplicación: customers, invoices, routes... registerModules(); const app = createApp(); diff --git a/apps/server/src/routes/index.ts b/apps/server/src/routes/index.ts index df87e0a6..71f3973e 100644 --- a/apps/server/src/routes/index.ts +++ b/apps/server/src/routes/index.ts @@ -1 +1,25 @@ export * from "./v1.routes"; + +import { Router } from "express"; + +export const v1Routes = (): Router => { + const routes = Router({ mergeParams: true }); + + routes.get("/hello", (req, res) => { + res.send("Hello world!"); + }); + + //authRouter(routes); + //usersRouter(routes); + //accountsRouter(routes); + + // Sales + //invoicesRouter(routes); + + return routes; +}; + +// Gestión global de errores. +// Siempre al final de la cadena de middlewares +// y después de las rutas. +//app.use(globalErrorHandler); diff --git a/apps/server/src/routes/invoices.routes.ts b/apps/server/src/routes/invoices.routes.ts deleted file mode 100644 index f947b732..00000000 --- a/apps/server/src/routes/invoices.routes.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { getDatabase } from "@/config"; - -import { - buildGetInvoiceController, - buildListInvoicesController, -} from "@/contexts/invoices/presentation"; -import { NextFunction, Request, Response, Router } from "express"; - -export const invoicesRouter = (appRouter: Router) => { - const routes: Router = Router({ mergeParams: true }); - const database = getDatabase(); - - routes.get( - "/", - //checkTabContext, - //checkUser, - (req: Request, res: Response, next: NextFunction) => { - buildListInvoicesController(database).execute(req, res, next); - } - ); - - routes.get( - "/:invoiceId", - //checkTabContext, - //checkUser, - (req: Request, res: Response, next: NextFunction) => { - buildGetInvoiceController(database).execute(req, res, next); - } - ); - - /*routes.post( - "/", - validateAndParseBody(ICreateInvoiceRequestSchema, { sanitize: false }), - //checkTabContext, - //checkUser, - (req: Request, res: Response, next: NextFunction) => { - buildCreateInvoiceController(database).execute(req, res, next); - } - );*/ - - /* - routes.put( - "/:invoiceId", - validateAndParseBody(IUpdateInvoiceRequestSchema), - checkTabContext, - //checkUser, - (req: Request, res: Response, next: NextFunction) => { - buildUpdateInvoiceController().execute(req, res, next); - } - ); - - routes.delete( - "/:invoiceId", - validateAndParseBody(IDeleteInvoiceRequestSchema), - checkTabContext, - //checkUser, - (req: Request, res: Response, next: NextFunction) => { - buildDeleteInvoiceController().execute(req, res, next); - } - );*/ - - appRouter.use("/invoices", routes); -}; diff --git a/modules/core/src/api/infrastructure/express/middlewares/validate-request.ts b/modules/core/src/api/infrastructure/express/middlewares/validate-request.ts index 3c9800bd..e2ed9ac3 100644 --- a/modules/core/src/api/infrastructure/express/middlewares/validate-request.ts +++ b/modules/core/src/api/infrastructure/express/middlewares/validate-request.ts @@ -1,5 +1,5 @@ // src/common/middlewares/validate-dto.ts -import { ExpressController, ValidationApiError } from "@erp/core/api"; +import { ExpressController, InternalApiError, ValidationApiError } from "@erp/core/api"; import { RequestHandler } from "express"; import { ZodSchema } from "zod/v4"; @@ -42,28 +42,41 @@ export const validateRequest = ( return async (req, res, next) => { console.debug(`Validating request ${source} with schema.`); console.debug(req[source]); - const result = schema.safeParse(req[source]); - if (!result.success) { - // Construye errores detallados - const validationErrors = result.error.issues.map((err) => ({ - field: err.path.join("."), - message: err.message, - })); - - console.debug(validationErrors); - - return ExpressController.errorResponse( - new ValidationApiError("Validation failed", validationErrors), - res - ); + if (!schema) { + console.debug("ERROR: Undefined schema!!"); + return ExpressController.errorResponse(new InternalApiError("Undefined schema"), res); } - // Si pasa la validación, opcionalmente reescribe req.body - if (options?.sanitize ?? true) { - req[source] = result.data; - } + try { + const result = schema.safeParse(req[source]); - next(); + if (!result.success) { + // Construye errores detallados + const validationErrors = result.error.issues.map((err) => ({ + field: err.path.join("."), + message: err.message, + })); + + console.debug(validationErrors); + + return ExpressController.errorResponse( + new ValidationApiError("Validation failed", validationErrors), + res + ); + } + + // Si pasa la validación, opcionalmente reescribe req.body + if (options?.sanitize ?? true) { + req[source] = result.data; + } + + next(); + } catch (err) { + const error = err as Error; + console.error(error); + + return ExpressController.errorResponse(new InternalApiError(error.message), res); + } }; }; diff --git a/modules/core/src/common/dto/index.ts b/modules/core/src/common/dto/index.ts index d119e338..7ec54e01 100644 --- a/modules/core/src/common/dto/index.ts +++ b/modules/core/src/common/dto/index.ts @@ -1,6 +1,6 @@ export * from "./critera.dto"; export * from "./error.dto"; -export * from "./list.view.dto"; +export * from "./list-view.response.dto"; export * from "./metadata.dto"; export * from "./money.dto"; export * from "./percentage.dto"; diff --git a/modules/core/src/common/dto/list.view.dto.ts b/modules/core/src/common/dto/list-view.response.dto.ts similarity index 88% rename from modules/core/src/common/dto/list.view.dto.ts rename to modules/core/src/common/dto/list-view.response.dto.ts index 05b88d86..e9c29b8d 100644 --- a/modules/core/src/common/dto/list.view.dto.ts +++ b/modules/core/src/common/dto/list-view.response.dto.ts @@ -7,7 +7,7 @@ import { MetadataSchema } from "./metadata.dto"; * @param itemSchema Esquema Zod del elemento T * @returns Zod schema para ListViewDTO */ -export const createListViewResultSchema = (itemSchema: T) => +export const createListViewResponseSchema = (itemSchema: T) => z.object({ page: z.number().int().min(1, "Page must be a positive integer"), per_page: z.number().int().min(1, "Items per page must be a positive integer"), diff --git a/modules/customer-invoices/src/api/application/list-customer-invoices/list-customer-invoices.use-case.ts b/modules/customer-invoices/src/api/application/list-customer-invoices/list-customer-invoices.use-case.ts index 3ed104c0..dfff3f1c 100644 --- a/modules/customer-invoices/src/api/application/list-customer-invoices/list-customer-invoices.use-case.ts +++ b/modules/customer-invoices/src/api/application/list-customer-invoices/list-customer-invoices.use-case.ts @@ -1,5 +1,5 @@ import { ITransactionManager } from "@erp/core/api"; -import { ListCustomerInvoicesResultDTO } from "@erp/customer-invoices/common/dto"; +import { CustomerInvoiceListResponseDTO } from "@erp/customer-invoices/common/dto"; import { Criteria } from "@repo/rdx-criteria/server"; import { Result } from "@repo/rdx-utils"; import { Transaction } from "sequelize"; @@ -13,7 +13,7 @@ export class ListCustomerInvoicesUseCase { private readonly presenter: ListCustomerInvoicesPresenter ) {} - public execute(criteria: Criteria): Promise> { + public execute(criteria: Criteria): Promise> { return this.transactionManager.complete(async (transaction: Transaction) => { try { const result = await this.customerInvoiceService.findByCriteria(criteria, transaction); @@ -22,7 +22,7 @@ export class ListCustomerInvoicesUseCase { return Result.fail(result.error); } - const dto: ListCustomerInvoicesResultDTO = this.presenter.toDTO(result.data, criteria); + const dto: CustomerInvoiceListResponseDTO = this.presenter.toDTO(result.data, criteria); return Result.ok(dto); } catch (error: unknown) { return Result.fail(error as Error); diff --git a/modules/customer-invoices/src/api/application/list-customer-invoices/presenter/list-invoices.presenter.ts b/modules/customer-invoices/src/api/application/list-customer-invoices/presenter/list-invoices.presenter.ts index 9827d2ea..f97f03e0 100644 --- a/modules/customer-invoices/src/api/application/list-customer-invoices/presenter/list-invoices.presenter.ts +++ b/modules/customer-invoices/src/api/application/list-customer-invoices/presenter/list-invoices.presenter.ts @@ -1,20 +1,20 @@ import { Criteria } from "@repo/rdx-criteria/server"; import { Collection } from "@repo/rdx-utils"; -import { ListCustomerInvoicesResultDTO } from "../../../../common/dto"; +import { CustomerInvoiceListResponseDTO } from "../../../../common/dto"; import { CustomerInvoice } from "../../../domain"; export interface ListCustomerInvoicesPresenter { toDTO: ( customerInvoices: Collection, criteria: Criteria - ) => ListCustomerInvoicesResultDTO; + ) => CustomerInvoiceListResponseDTO; } export const listCustomerInvoicesPresenter: ListCustomerInvoicesPresenter = { toDTO: ( customerInvoices: Collection, criteria: Criteria - ): ListCustomerInvoicesResultDTO => { + ): CustomerInvoiceListResponseDTO => { const items = customerInvoices.map((invoice) => { return { id: invoice.id.toPrimitive(), diff --git a/modules/customer-invoices/src/api/infrastructure/express/customer-invoices.routes.ts b/modules/customer-invoices/src/api/infrastructure/express/customer-invoices.routes.ts index f4465bf0..3c3e211f 100644 --- a/modules/customer-invoices/src/api/infrastructure/express/customer-invoices.routes.ts +++ b/modules/customer-invoices/src/api/infrastructure/express/customer-invoices.routes.ts @@ -3,6 +3,7 @@ import { Application, NextFunction, Request, Response, Router } from "express"; import { Sequelize } from "sequelize"; import { CreateCustomerInvoiceCommandSchema, + CustomerInvoiceListRequestSchema, DeleteCustomerInvoiceByIdQuerySchema, DeleteCustomerInvoiceByIdQuerySchema as GetCustomerInvoiceByIdQuerySchema, } from "../../../common/dto"; @@ -27,7 +28,7 @@ export const customerInvoicesRouter = (params: ModuleParams) => { "/", //checkTabContext, //checkUser, - validateRequest(CustomerInvoiceListCriteriaSchema, "params"), + validateRequest(CustomerInvoiceListRequestSchema, "params"), (req: Request, res: Response, next: NextFunction) => { buildListCustomerInvoicesController(database).execute(req, res, next); } diff --git a/modules/customer-invoices/src/common/dto/customer-invoices.request.dto.ts b/modules/customer-invoices/src/common/dto/customer-invoices.request.dto.ts deleted file mode 100644 index b1766dbf..00000000 --- a/modules/customer-invoices/src/common/dto/customer-invoices.request.dto.ts +++ /dev/null @@ -1,24 +0,0 @@ -export interface IUpdateCustomerInvoiceRequestDTO { - is_freelancer: boolean; - name: string; - trade_name: string; - tin: string; - - street: string; - city: string; - state: string; - postal_code: string; - country: string; - - email: string; - phone: string; - fax: string; - website: string; - - legal_record: string; - - default_tax: number; - lang_code: string; - currency_code: string; - logo: string; -} diff --git a/modules/customer-invoices/src/common/dto/customer-invoices.response.dto.ts b/modules/customer-invoices/src/common/dto/customer-invoices.response.dto.ts deleted file mode 100644 index f3c58d73..00000000 --- a/modules/customer-invoices/src/common/dto/customer-invoices.response.dto.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { IMetadataDTO, IMoneyDTO, IQuantityDTO } from "@erp/core"; - -export interface IListCustomerInvoicesResponseDTO { - id: string; - - invoice_status: string; - invoice_number: string; - invoice_series: string; - issue_date: string; - operation_date: string; - language_code: string; - currency: string; - - subtotal: IMoneyDTO; - total: IMoneyDTO; - - metadata?: IMetadataDTO; -} - -export interface IGetCustomerInvoiceResponseDTO { - id: string; - - invoice_status: string; - invoice_number: string; - invoice_series: string; - issue_date: string; - operation_date: string; - language_code: string; - currency: string; - - subtotal: IMoneyDTO; - total: IMoneyDTO; - - items: { - description: string; - quantity: IQuantityDTO; - unit_measure: string; - unit_price: IMoneyDTO; - subtotal: IMoneyDTO; - //tax_amount: IMoneyDTO; - total: IMoneyDTO; - }[]; - - //customer: - - metadata?: IMetadataDTO; -} - -export interface ICreateCustomerInvoiceResponseDTO { - id: string; - - invoice_status: string; - invoice_number: string; - invoice_series: string; - issue_date: string; - operation_date: string; - language_code: string; - currency: string; - - subtotal: IMoneyDTO; - total: IMoneyDTO; -} - -// Inferir el tipo en TypeScript desde el esquema Zod -//export type IUpdateAcccountResponseDTO = z.infer; - -export interface IUpdateCustomerInvoiceResponseDTO { - id: string; - - invoice_status: string; - invoice_number: string; - invoice_series: string; - issue_date: string; - operation_date: string; - language_code: string; - currency: string; - - subtotal: IMoneyDTO; - total: IMoneyDTO; -} diff --git a/modules/customer-invoices/src/common/dto/customer-invoices.schemas.ts b/modules/customer-invoices/src/common/dto/customer-invoices.schemas.ts deleted file mode 100644 index 4445e4a9..00000000 --- a/modules/customer-invoices/src/common/dto/customer-invoices.schemas.ts +++ /dev/null @@ -1,43 +0,0 @@ -import * as z from "zod/v4"; - -export const ICreateCustomerInvoiceRequestSchema = z.object({ - id: z.uuid(), - customerInvoice_number: z.string().min(1), - customerInvoice_series: z.string().min(1), - issue_date: z.string().refine((date) => { - const dateStr = z.string().regex(/^\d{4}-\d{2}-\d{2}$/, "Invalid YYYY-MM-DD format"); - return dateStr.safeParse(date).success; - }), - operation_date: z.string().refine((date) => { - const dateStr = z.string().regex(/^\d{4}-\d{2}-\d{2}$/, "Invalid YYYY-MM-DD format"); - return dateStr.safeParse(date).success; - }), - //customerId: z.string().uuid(), - lang_code: z.string().min(1), - currency_code: z.string().min(1), - - items: z - .array( - z.object({ - //id: z.string().uuid(), - description: z.string().optional(), - unit_price: z - .object({ - amount: z.number().positive(), - scale: z.number().positive(), - }) - .optional(), - quantity: z - .object({ - amount: z.number().positive(), - scale: z.number().positive(), - }) - .optional(), - }) - ) - .optional(), -}); - -export const IUpdateCustomerInvoiceRequestSchema = z.object({}); - -export const IDeleteCustomerInvoiceRequestSchema = z.object({}); diff --git a/modules/customer-invoices/src/common/dto/request/create-customer-invoice.command.dto.ts b/modules/customer-invoices/src/common/dto/request/create-customer-invoice.request.dto.ts similarity index 90% rename from modules/customer-invoices/src/common/dto/request/create-customer-invoice.command.dto.ts rename to modules/customer-invoices/src/common/dto/request/create-customer-invoice.request.dto.ts index 8d0bbf6b..d9faa67f 100644 --- a/modules/customer-invoices/src/common/dto/request/create-customer-invoice.command.dto.ts +++ b/modules/customer-invoices/src/common/dto/request/create-customer-invoice.request.dto.ts @@ -1,6 +1,6 @@ import * as z from "zod/v4"; -export const CreateCustomerInvoiceCommandSchema = z.object({ +export const CreateCustomerInvoiceRequestSchema = z.object({ id: z.uuid(), invoice_status: z.string(), invoice_number: z.string().min(1, "Customer invoice number is required"), @@ -33,4 +33,4 @@ export const CreateCustomerInvoiceCommandSchema = z.object({ ), }); -export type CreateCustomerInvoiceCommandDTO = z.infer; +export type CreateCustomerInvoiceRequestDTO = z.infer; diff --git a/modules/customer-invoices/src/common/dto/request/customer-invoices-list.request.dto.ts b/modules/customer-invoices/src/common/dto/request/customer-invoices-list.request.dto.ts new file mode 100644 index 00000000..2b97caba --- /dev/null +++ b/modules/customer-invoices/src/common/dto/request/customer-invoices-list.request.dto.ts @@ -0,0 +1,5 @@ +import { CriteriaSchema } from "@erp/core"; +import * as z from "zod/v4"; + +export const CustomerInvoiceListRequestSchema = CriteriaSchema; +export type CustomerInvoiceListRequestDTO = z.infer; diff --git a/modules/customer-invoices/src/common/dto/request/delete-customer-invoice-by-id.command.dto.ts b/modules/customer-invoices/src/common/dto/request/delete-customer-invoice-by-id.request.dto.ts similarity index 50% rename from modules/customer-invoices/src/common/dto/request/delete-customer-invoice-by-id.command.dto.ts rename to modules/customer-invoices/src/common/dto/request/delete-customer-invoice-by-id.request.dto.ts index 1dbd3aea..ddde1a9e 100644 --- a/modules/customer-invoices/src/common/dto/request/delete-customer-invoice-by-id.command.dto.ts +++ b/modules/customer-invoices/src/common/dto/request/delete-customer-invoice-by-id.request.dto.ts @@ -6,10 +6,8 @@ import * as z from "zod/v4"; * */ -export const DeleteCustomerInvoiceByIdQuerySchema = z.object({ +export const DeleteCustomerByIdRequestSchema = z.object({ id: z.string(), }); -export type DeleteCustomerInvoiceByIdQueryDTO = z.infer< - typeof DeleteCustomerInvoiceByIdQuerySchema ->; +export type DeleteCustomerByIdRequestDTO = z.infer; diff --git a/modules/customer-invoices/src/common/dto/request/get-customer-invoice-by-id.query.dto.ts b/modules/customer-invoices/src/common/dto/request/get-customer-invoice-by-id.query.dto.ts deleted file mode 100644 index 5f840aff..00000000 --- a/modules/customer-invoices/src/common/dto/request/get-customer-invoice-by-id.query.dto.ts +++ /dev/null @@ -1,13 +0,0 @@ -import * as z from "zod/v4"; - -/** - * Este DTO es utilizado por el endpoint: - * `GET /customer-invoices/:id` (consultar una factura por ID). - * - */ - -export const GetCustomerInvoiceByIdQuerySchema = z.object({ - id: z.string(), -}); - -export type GetCustomerInvoiceByIdQueryDTO = z.infer; diff --git a/modules/customer-invoices/src/common/dto/request/get-customer-invoice-by-id.request.dto.ts b/modules/customer-invoices/src/common/dto/request/get-customer-invoice-by-id.request.dto.ts new file mode 100644 index 00000000..e7f84ec6 --- /dev/null +++ b/modules/customer-invoices/src/common/dto/request/get-customer-invoice-by-id.request.dto.ts @@ -0,0 +1,7 @@ +import * as z from "zod/v4"; + +export const GetCustomerInvoiceByIdRequestSchema = z.object({ + id: z.string(), +}); + +export type GetCustomerInvoiceByIdRequestDTO = z.infer; diff --git a/modules/customer-invoices/src/common/dto/request/index.ts b/modules/customer-invoices/src/common/dto/request/index.ts index 8f92104a..49796206 100644 --- a/modules/customer-invoices/src/common/dto/request/index.ts +++ b/modules/customer-invoices/src/common/dto/request/index.ts @@ -1,4 +1,4 @@ -export * from "./create-customer-invoice.command.dto"; -export * from "./delete-customer-invoice-by-id.command.dto"; -export * from "./get-customer-invoice-by-id.query.dto"; -export * from "./list-customer-invoices.query.dto"; +export * from "./create-customer-invoice.request.dto"; +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"; diff --git a/modules/customer-invoices/src/common/dto/request/list-customer-invoices.query.dto.ts b/modules/customer-invoices/src/common/dto/request/list-customer-invoices.query.dto.ts deleted file mode 100644 index ff5734a1..00000000 --- a/modules/customer-invoices/src/common/dto/request/list-customer-invoices.query.dto.ts +++ /dev/null @@ -1,8 +0,0 @@ -import * as z from "zod/v4"; - -import { criteriaSchema } from "@erp/core/criteria"; // El esquema genérico validado antes - -export const CustomerInvoiceListCriteriaSchema = criteriaSchema; -export type CustomerInvoiceListCriteria = z.infer; - -export type ListCustomerInvoicesQueryDTO = z.infer; diff --git a/modules/customer-invoices/src/common/dto/request/update-customer-invoice.command.dto.ts b/modules/customer-invoices/src/common/dto/request/update-customer-invoice.request.dto.ts similarity index 100% rename from modules/customer-invoices/src/common/dto/request/update-customer-invoice.command.dto.ts rename to modules/customer-invoices/src/common/dto/request/update-customer-invoice.request.dto.ts diff --git a/modules/customer-invoices/src/common/dto/response/get-customer-invoice-by-id.result.dto.ts b/modules/customer-invoices/src/common/dto/response/customer-invoice-creation.response.dto.ts similarity index 68% rename from modules/customer-invoices/src/common/dto/response/get-customer-invoice-by-id.result.dto.ts rename to modules/customer-invoices/src/common/dto/response/customer-invoice-creation.response.dto.ts index 47dfece1..0f6f0665 100644 --- a/modules/customer-invoices/src/common/dto/response/get-customer-invoice-by-id.result.dto.ts +++ b/modules/customer-invoices/src/common/dto/response/customer-invoice-creation.response.dto.ts @@ -1,7 +1,7 @@ import { MetadataSchema } from "@erp/core"; import * as z from "zod/v4"; -export const GetCustomerInvoiceByIdResultSchema = z.object({ +export const CustomerInvoicesCreationResponseSchema = z.object({ id: z.uuid(), invoice_status: z.string(), invoice_number: z.string(), @@ -14,4 +14,6 @@ export const GetCustomerInvoiceByIdResultSchema = z.object({ metadata: MetadataSchema.optional(), }); -export type GetCustomerInvoiceByIdResultDTO = z.infer; +export type CustomerInvoicesCreationResponseDTO = z.infer< + typeof CustomerInvoicesCreationResponseSchema +>; diff --git a/modules/customer-invoices/src/common/dto/response/list-customer-invoices.result.dto.ts b/modules/customer-invoices/src/common/dto/response/customer-invoices-list.response.dto.ts similarity index 71% rename from modules/customer-invoices/src/common/dto/response/list-customer-invoices.result.dto.ts rename to modules/customer-invoices/src/common/dto/response/customer-invoices-list.response.dto.ts index 451e9b91..d8d30001 100644 --- a/modules/customer-invoices/src/common/dto/response/list-customer-invoices.result.dto.ts +++ b/modules/customer-invoices/src/common/dto/response/customer-invoices-list.response.dto.ts @@ -1,7 +1,7 @@ -import { MetadataSchema, createListViewResultSchema } from "@erp/core"; +import { MetadataSchema, createListViewResponseSchema } from "@erp/core"; import * as z from "zod/v4"; -export const ListCustomerInvoicesResultSchema = createListViewResultSchema( +export const CustomerInvoiceListResponseSchema = createListViewResponseSchema( z.object({ id: z.uuid(), invoice_status: z.string(), @@ -28,4 +28,4 @@ export const ListCustomerInvoicesResultSchema = createListViewResultSchema( }) ); -export type ListCustomerInvoicesResultDTO = z.infer; +export type CustomerInvoiceListResponseDTO = z.infer; diff --git a/modules/customer-invoices/src/common/dto/response/customer-invoice-creation.result.dto.ts b/modules/customer-invoices/src/common/dto/response/get-customer-invoice-by-id.response.dto.ts similarity index 69% rename from modules/customer-invoices/src/common/dto/response/customer-invoice-creation.result.dto.ts rename to modules/customer-invoices/src/common/dto/response/get-customer-invoice-by-id.response.dto.ts index 3d2b5ead..5a0746ef 100644 --- a/modules/customer-invoices/src/common/dto/response/customer-invoice-creation.result.dto.ts +++ b/modules/customer-invoices/src/common/dto/response/get-customer-invoice-by-id.response.dto.ts @@ -1,7 +1,7 @@ import { MetadataSchema } from "@erp/core"; import * as z from "zod/v4"; -export const CustomerInvoicesCreationResultSchema = z.object({ +export const GetCustomerInvoiceByIdResponseSchema = z.object({ id: z.uuid(), invoice_status: z.string(), invoice_number: z.string(), @@ -14,6 +14,6 @@ export const CustomerInvoicesCreationResultSchema = z.object({ metadata: MetadataSchema.optional(), }); -export type CustomerInvoicesCreationResultDTO = z.infer< - typeof CustomerInvoicesCreationResultSchema +export type GetCustomerInvoiceByIdResponseDTO = z.infer< + typeof GetCustomerInvoiceByIdResponseSchema >; diff --git a/modules/customer-invoices/src/common/dto/response/index.ts b/modules/customer-invoices/src/common/dto/response/index.ts index 39bd0969..c4d86161 100644 --- a/modules/customer-invoices/src/common/dto/response/index.ts +++ b/modules/customer-invoices/src/common/dto/response/index.ts @@ -1,3 +1,3 @@ -export * from "./customer-invoice-creation.result.dto"; -export * from "./get-customer-invoice-by-id.result.dto"; -export * from "./list-customer-invoices.result.dto"; +export * from "./customer-invoice-creation.response.dto"; +export * from "./customer-invoices-list.response.dto"; +export * from "./get-customer-invoice-by-id.response.dto"; diff --git a/modules/customer-invoices/src/web/hooks/use-customer-invoices-query.tsx b/modules/customer-invoices/src/web/hooks/use-customer-invoices-query.tsx index ab32da20..eaa8d98c 100644 --- a/modules/customer-invoices/src/web/hooks/use-customer-invoices-query.tsx +++ b/modules/customer-invoices/src/web/hooks/use-customer-invoices-query.tsx @@ -1,18 +1,18 @@ import { useDataSource, useQueryKey } from "@erp/core/client"; import { useQuery } from "@tanstack/react-query"; -import { ListCustomerInvoicesResultDTO } from "../../common/dto"; +import { CustomerInvoiceListResponseDTO } from "../../common/dto"; // Obtener todas las facturas export const useCustomerInvoicesQuery = (params: any) => { const dataSource = useDataSource(); const keys = useQueryKey(); - return useQuery({ + return useQuery({ queryKey: keys().data().resource("customer-invoices").action("list").params(params).get(), queryFn: (context) => { console.log(dataSource.getBaseUrl()); const { signal } = context; - return dataSource.getList("customer-invoices", { + return dataSource.getList("customer-invoices", { signal, ...params, }); diff --git a/modules/customers/src/api/controllers/get-customer/index.ts b/modules/customers/src/api/controllers/get-customer/index.ts index 2d22a0bd..66906698 100644 --- a/modules/customers/src/api/controllers/get-customer/index.ts +++ b/modules/customers/src/api/controllers/get-customer/index.ts @@ -2,13 +2,13 @@ import { SequelizeTransactionManager } from "@erp/core/api"; import { Sequelize } from "sequelize"; import { GetCustomerUseCase, getCustomerPresenter } from "../../application"; import { CustomerService } from "../../domain"; -import { customerMapper } from "../../infrastructure"; +import { CustomerRepository, customerMapper } from "../../infrastructure"; import { GetCustomerController } from "./get-invoice.controller"; export const buildGetCustomerController = (database: Sequelize) => { const transactionManager = new SequelizeTransactionManager(database); const repository = new CustomerRepository(database, customerMapper); - const customerService = new CustomerService(customerRepository); + const customerService = new CustomerService(repository); const presenter = getCustomerPresenter; const useCase = new GetCustomerUseCase(customerService, transactionManager, presenter); diff --git a/modules/customers/src/api/index.ts b/modules/customers/src/api/index.ts index 5a927c2e..629b2ef0 100644 --- a/modules/customers/src/api/index.ts +++ b/modules/customers/src/api/index.ts @@ -1,6 +1,5 @@ import { IModuleServer, ModuleParams } from "@erp/core/api"; import { customersRouter, models } from "./infrastructure"; -//import { customersRouter, models } from "./infrastructure"; export const customersAPIModule: IModuleServer = { name: "customers", diff --git a/modules/customers/src/api/infrastructure/express/customers.routes.ts b/modules/customers/src/api/infrastructure/express/customers.routes.ts index 644030c3..a73ea7ec 100644 --- a/modules/customers/src/api/infrastructure/express/customers.routes.ts +++ b/modules/customers/src/api/infrastructure/express/customers.routes.ts @@ -2,10 +2,10 @@ import { ILogger, ModuleParams, validateRequest } from "@erp/core/api"; import { Application, NextFunction, Request, Response, Router } from "express"; import { Sequelize } from "sequelize"; import { - CreateCustomerCommandSchema, - CustomerListCriteriaSchema, - DeleteCustomerByIdQuerySchema, - GetCustomerByIdQuerySchema, + CreateCustomerRequestSchema, + CustomerListRequestSchema, + DeleteCustomerByIdRequestSchema, + GetCustomerByIdRequestSchema, } from "../../../common/dto"; import { buildCreateCustomersController, @@ -28,7 +28,7 @@ export const customersRouter = (params: ModuleParams) => { "/", //checkTabContext, //checkUser, - validateRequest(CustomerListCriteriaSchema, "params"), + validateRequest(CustomerListRequestSchema, "params"), (req: Request, res: Response, next: NextFunction) => { buildListCustomersController(database).execute(req, res, next); } @@ -38,7 +38,7 @@ export const customersRouter = (params: ModuleParams) => { "/:id", //checkTabContext, //checkUser, - validateRequest(GetCustomerByIdQuerySchema, "params"), + validateRequest(GetCustomerByIdRequestSchema, "params"), (req: Request, res: Response, next: NextFunction) => { buildGetCustomerController(database).execute(req, res, next); } @@ -48,7 +48,7 @@ export const customersRouter = (params: ModuleParams) => { "/", //checkTabContext, //checkUser, - validateRequest(CreateCustomerCommandSchema), + validateRequest(CreateCustomerRequestSchema), (req: Request, res: Response, next: NextFunction) => { buildCreateCustomersController(database).execute(req, res, next); } @@ -68,7 +68,7 @@ export const customersRouter = (params: ModuleParams) => { "/:id", //checkTabContext, //checkUser, - validateRequest(DeleteCustomerByIdQuerySchema, "params"), + validateRequest(DeleteCustomerByIdRequestSchema, "params"), (req: Request, res: Response, next: NextFunction) => { buildDeleteCustomerController(database).execute(req, res, next); } diff --git a/modules/customers/src/common/dto/request/create-customer.command.dto.ts b/modules/customers/src/common/dto/request/create-customer.request.dto.ts similarity index 91% rename from modules/customers/src/common/dto/request/create-customer.command.dto.ts rename to modules/customers/src/common/dto/request/create-customer.request.dto.ts index 77d03193..b50be40f 100644 --- a/modules/customers/src/common/dto/request/create-customer.command.dto.ts +++ b/modules/customers/src/common/dto/request/create-customer.request.dto.ts @@ -1,6 +1,6 @@ import * as z from "zod/v4"; -export const CreateCustomerCommandSchema = z.object({ +export const CreateCustomerRequestSchema = z.object({ id: z.uuid(), invoice_status: z.string(), invoice_number: z.string().min(1, "Customer invoice number is required"), @@ -33,4 +33,4 @@ export const CreateCustomerCommandSchema = z.object({ ), }); -export type CreateCustomerCommandDTO = z.infer; +export type CreateCustomerRequestDTO = z.infer; diff --git a/modules/customers/src/common/dto/request/customer-list.criteria.dto.ts b/modules/customers/src/common/dto/request/customer-list.criteria.dto.ts deleted file mode 100644 index 6f2cf837..00000000 --- a/modules/customers/src/common/dto/request/customer-list.criteria.dto.ts +++ /dev/null @@ -1,33 +0,0 @@ -import * as z from "zod/v4"; - -/** - * DTO que transporta los parámetros de la consulta (paginación, filtros, etc.) - * para la búsqueda de facturas de cliente. - * - * Este DTO es utilizado por el endpoint: - * `GET /customers` (listado / búsqueda de facturas). - * - */ - -export const CustomerListCriteriaSchema = z.object({ - page: z.number().int().min(1).default(1), - pageSize: z.number().int().min(1).max(100).default(25), - fromDate: z - .string() - .optional() - .refine((val) => !val || !Number.isNaN(Date.parse(val)), { - message: "Invalid date format for fromDate", - }), - toDate: z - .string() - .optional() - .refine((val) => !val || !Number.isNaN(Date.parse(val)), { - message: "Invalid date format for toDate", - }), - status: z.enum(["DRAFT", "POSTED", "PAID", "CANCELLED"]).default("DRAFT"), - customerId: z.string().optional(), - sortBy: z.enum(["issueDate", "totalAmount", "number"]).default("issueDate"), - sortDir: z.enum(["ASC", "DESC"]).default("DESC"), -}); - -export type ListCustomersQueryDTO = z.infer; diff --git a/modules/customers/src/common/dto/request/customer-list.request.dto.ts b/modules/customers/src/common/dto/request/customer-list.request.dto.ts new file mode 100644 index 00000000..c0058271 --- /dev/null +++ b/modules/customers/src/common/dto/request/customer-list.request.dto.ts @@ -0,0 +1,5 @@ +import { CriteriaSchema } from "@erp/core"; +import * as z from "zod/v4"; + +export const CustomerListRequestSchema = CriteriaSchema; +export type CustomerListRequestDTO = z.infer; diff --git a/modules/customers/src/common/dto/request/delete-customer-by-id.params.dto.ts b/modules/customers/src/common/dto/request/delete-customer-by-id.request.dto.ts similarity index 52% rename from modules/customers/src/common/dto/request/delete-customer-by-id.params.dto.ts rename to modules/customers/src/common/dto/request/delete-customer-by-id.request.dto.ts index dacf331e..70bb4b9c 100644 --- a/modules/customers/src/common/dto/request/delete-customer-by-id.params.dto.ts +++ b/modules/customers/src/common/dto/request/delete-customer-by-id.request.dto.ts @@ -6,8 +6,8 @@ import * as z from "zod/v4"; * */ -export const DeleteCustomerByIdParamsSchema = z.object({ +export const DeleteCustomerByIdRequestSchema = z.object({ id: z.string(), }); -export type DeleteCustomerByIdParamsDTO = z.infer; +export type DeleteCustomerByIdRequestDTO = z.infer; diff --git a/modules/customers/src/common/dto/request/get-customer-by-id.params.dto.ts b/modules/customers/src/common/dto/request/get-customer-by-id.request.dto.ts similarity index 53% rename from modules/customers/src/common/dto/request/get-customer-by-id.params.dto.ts rename to modules/customers/src/common/dto/request/get-customer-by-id.request.dto.ts index fe4ce811..9f868337 100644 --- a/modules/customers/src/common/dto/request/get-customer-by-id.params.dto.ts +++ b/modules/customers/src/common/dto/request/get-customer-by-id.request.dto.ts @@ -6,8 +6,8 @@ import * as z from "zod/v4"; * */ -export const GetCustomerByIdParamsSchema = z.object({ +export const GetCustomerByIdRequestSchema = z.object({ id: z.string(), }); -export type GetCustomerByIdParamsDTO = z.infer; +export type GetCustomerByIdRequestDTO = z.infer; diff --git a/modules/customers/src/common/dto/request/index.ts b/modules/customers/src/common/dto/request/index.ts index bf6798a6..0fc768db 100644 --- a/modules/customers/src/common/dto/request/index.ts +++ b/modules/customers/src/common/dto/request/index.ts @@ -1 +1,5 @@ -export * from "./list-customers.query.dto"; +export * from "./create-customer.request.dto"; +export * from "./customer-list.request.dto"; +export * from "./delete-customer-by-id.request.dto"; +export * from "./get-customer-by-id.request.dto"; +export * from "./update-customer.request.dto"; diff --git a/modules/customers/src/common/dto/request/update-customer.command.dto.ts b/modules/customers/src/common/dto/request/update-customer.request.dto.ts similarity index 100% rename from modules/customers/src/common/dto/request/update-customer.command.dto.ts rename to modules/customers/src/common/dto/request/update-customer.request.dto.ts diff --git a/modules/customers/src/common/dto/response/get-customer-by-id.result.dto.ts b/modules/customers/src/common/dto/response/customer-creation.result.dto.ts similarity index 72% rename from modules/customers/src/common/dto/response/get-customer-by-id.result.dto.ts rename to modules/customers/src/common/dto/response/customer-creation.result.dto.ts index 362a75f9..746343e4 100644 --- a/modules/customers/src/common/dto/response/get-customer-by-id.result.dto.ts +++ b/modules/customers/src/common/dto/response/customer-creation.result.dto.ts @@ -1,7 +1,7 @@ import { MetadataSchema } from "@erp/core"; import * as z from "zod/v4"; -export const GetCustomerByIdResultSchema = z.object({ +export const CustomerCreationResponseSchema = z.object({ id: z.uuid(), invoice_status: z.string(), invoice_number: z.string(), @@ -14,4 +14,4 @@ export const GetCustomerByIdResultSchema = z.object({ metadata: MetadataSchema.optional(), }); -export type GetCustomerByIdResultDTO = z.infer; +export type CustomerCreationResponseDTO = z.infer; diff --git a/modules/customers/src/common/dto/response/customer-list.response.dto.ts b/modules/customers/src/common/dto/response/customer-list.response.dto.ts index e9d0df4b..7846c99e 100644 --- a/modules/customers/src/common/dto/response/customer-list.response.dto.ts +++ b/modules/customers/src/common/dto/response/customer-list.response.dto.ts @@ -1,7 +1,7 @@ -import { MetadataSchema, createListViewResultSchema } from "@erp/core"; +import { MetadataSchema, createListViewResponseSchema } from "@erp/core"; import * as z from "zod/v4"; -export const CustomerListResponseSchema = createListViewResultSchema( +export const CustomerListResponseSchema = createListViewResponseSchema( z.object({ id: z.string(), reference: z.string(), diff --git a/modules/customers/src/common/dto/response/customer-created.response.dto.ts b/modules/customers/src/common/dto/response/get-customer-by-id.response.dto.ts similarity index 72% rename from modules/customers/src/common/dto/response/customer-created.response.dto.ts rename to modules/customers/src/common/dto/response/get-customer-by-id.response.dto.ts index 5bb77a9e..1ae2fbc5 100644 --- a/modules/customers/src/common/dto/response/customer-created.response.dto.ts +++ b/modules/customers/src/common/dto/response/get-customer-by-id.response.dto.ts @@ -1,7 +1,7 @@ import { MetadataSchema } from "@erp/core"; import * as z from "zod/v4"; -export const CustomerCreatedResponseSchema = z.object({ +export const GetCustomerByIdResponseSchema = z.object({ id: z.uuid(), invoice_status: z.string(), invoice_number: z.string(), @@ -14,4 +14,4 @@ export const CustomerCreatedResponseSchema = z.object({ metadata: MetadataSchema.optional(), }); -export type CustomerCreatedResponseDTO = z.infer; +export type GetCustomerByIdResponseDTO = z.infer; diff --git a/modules/customers/src/common/dto/response/index.ts b/modules/customers/src/common/dto/response/index.ts index 4210e3f1..14ef180c 100644 --- a/modules/customers/src/common/dto/response/index.ts +++ b/modules/customers/src/common/dto/response/index.ts @@ -1 +1,3 @@ +export * from "./customer-creation.result.dto"; export * from "./customer-list.response.dto"; +export * from "./get-customer-by-id.response.dto";