Facturas de cliente

This commit is contained in:
David Arranz 2025-06-12 08:55:17 +02:00
parent 7bf24c8f91
commit 3a881c554f
66 changed files with 572 additions and 495 deletions

View File

@ -40,8 +40,8 @@
"typescript": "^5.8.3" "typescript": "^5.8.3"
}, },
"dependencies": { "dependencies": {
"@erp/core": "workspace:*",
"@erp/auth": "workspace:*", "@erp/auth": "workspace:*",
"@erp/core": "workspace:*",
"@erp/customer-invoices": "workspace:*", "@erp/customer-invoices": "workspace:*",
"bcrypt": "^5.1.1", "bcrypt": "^5.1.1",
"cls-rtracer": "^2.6.3", "cls-rtracer": "^2.6.3",
@ -49,6 +49,7 @@
"dinero.js": "^1.9.1", "dinero.js": "^1.9.1",
"dotenv": "^16.5.0", "dotenv": "^16.5.0",
"express": "^4.18.2", "express": "^4.18.2",
"express-list-routes": "^1.3.1",
"helmet": "^8.0.0", "helmet": "^8.0.0",
"http": "0.0.1-security", "http": "0.0.1-security",
"jsonwebtoken": "^9.0.2", "jsonwebtoken": "^9.0.2",
@ -73,9 +74,14 @@
"node": ">=22" "node": ">=22"
}, },
"tsup": { "tsup": {
"entry": ["src/index.ts"], "entry": [
"src/index.ts"
],
"outDir": "dist", "outDir": "dist",
"format": ["esm", "cjs"], "format": [
"esm",
"cjs"
],
"target": "es2020", "target": "es2020",
"sourcemap": true, "sourcemap": true,
"clean": true, "clean": true,

View File

@ -134,8 +134,6 @@ process.on("uncaughtException", (error: Error) => {
await initModules({ app, database, baseRoutePath: API_BASE_PATH, logger }); await initModules({ app, database, baseRoutePath: API_BASE_PATH, logger });
console.log(listRoutes(app._router, API_BASE_PATH));
server.listen(currentState.port, () => { server.listen(currentState.port, () => {
server.emit("listening"); server.emit("listening");
@ -166,6 +164,7 @@ process.on("uncaughtException", (error: Error) => {
logger.info(`Server path: ${currentState.appPath}`); logger.info(`Server path: ${currentState.appPath}`);
logger.info(`Server environment: ${currentState.environment}`); logger.info(`Server environment: ${currentState.environment}`);
logger.info("To shut down your server, press <CTRL> + C at any time"); logger.info("To shut down your server, press <CTRL> + C at any time");
logger.info(JSON.stringify(listRoutes(app._router, API_BASE_PATH), null, 3));
}); });
} catch (error) { } catch (error) {
serverError(error as NodeJS.ErrnoException); serverError(error as NodeJS.ErrnoException);

View File

@ -1,30 +1,5 @@
// Función para listar rutas // Función para listar rutas
export function listRoutes(appOrRouter, basePath = "") { export function listRoutes(app, basePath = "") {
const routes = []; const expressListRoutes = require("express-list-routes");
return expressListRoutes(app, { logger: false, prefix: basePath });
appOrRouter.stack.forEach((middleware) => {
if (middleware.route) {
// Es una ruta directa
const methods = Object.keys(middleware.route.methods).map((m) => m.toUpperCase());
routes.push({
path: basePath + middleware.route.path,
methods,
});
} else if (middleware.name === "router" && middleware.handle.stack) {
// Es un router anidado
const newBasePath =
basePath +
(middleware.regexp?.source !== "^\\/?$"
? middleware.regexp
?.toString()
.replace(/^\/\^\\/, "")
.replace(/\\\/\?\(\?=\\\/\|\$\)\/i$/, "")
.replace(/\\\//g, "/")
: "");
const childRoutes = listRoutes(middleware.handle, basePath + (middleware?.path || ""));
routes.push(...childRoutes);
}
});
return routes;
} }

View File

@ -1,4 +1,4 @@
import { ILogger } from "@erp/core"; import { ILogger } from "@erp/core/api";
export class ConsoleLogger implements ILogger { export class ConsoleLogger implements ILogger {
info(message: string, meta?: any) { info(message: string, meta?: any) {

View File

@ -1,4 +1,4 @@
import { ILogger } from "@erp/core"; import { ILogger } from "@erp/core/api";
export class SentryLogger implements ILogger { export class SentryLogger implements ILogger {
// biome-ignore lint/complexity/noUselessConstructor: <explanation> // biome-ignore lint/complexity/noUselessConstructor: <explanation>

View File

@ -1,4 +1,4 @@
import { ILogger } from "@erp/core"; import { ILogger } from "@erp/core/api";
import rTracer from "cls-rtracer"; import rTracer from "cls-rtracer";
import { createLogger, format, transports } from "winston"; import { createLogger, format, transports } from "winston";
@ -17,7 +17,7 @@ const winston = createLogger({
let message = info.message; let message = info.message;
if (typeof message === "object") { if (typeof message === "object") {
message = JSON.stringify(message, null, 3); message = JSON.stringify(message);
} }
let out = `${timestamp}`; let out = `${timestamp}`;
@ -46,6 +46,9 @@ const winston = createLogger({
}); });
export class WinstonLogger implements ILogger { export class WinstonLogger implements ILogger {
debug(message: string, meta?: any): void {
winston.debug(message, meta ?? {});
}
info(message: string, meta?: any) { info(message: string, meta?: any) {
winston.info(message, meta ?? {}); winston.info(message, meta ?? {});
} }

View File

@ -1,8 +1,8 @@
import { authAPIModule } from "@erp/auth/api"; import { authAPIModule } from "@erp/auth/api";
import { invoicesAPIModule } from "@erp/customer-invoices/api"; import { customerInvoicesAPIModule } from "@erp/customer-invoices/api";
import { registerModule } from "./lib"; import { registerModule } from "./lib";
export const registerModules = () => { export const registerModules = () => {
registerModule(authAPIModule); registerModule(authAPIModule);
registerModule(invoicesAPIModule); registerModule(customerInvoicesAPIModule);
}; };

View File

@ -21,3 +21,5 @@ export const authAPIModule: IModuleServer = {
}; };
}, },
}; };
export default authAPIModule;

View File

@ -1 +1,2 @@
export * from "./dto";
export * from "./types"; export * from "./types";

View File

@ -17,7 +17,7 @@ export const createAxiosDataSource = (client: AxiosInstance): IDataSource => {
getBaseUrl: getBaseUrlOrFail, getBaseUrl: getBaseUrlOrFail,
getList: async <T>(resource: string, params?: Record<string, any>) => { getList: async <T>(resource: string, params?: Record<string, any>) => {
const res = await client.get<T[]>(resource, { params }); const res = await client.get<T[]>(resource, params);
return res.data; return res.data;
}, },

View File

@ -1,13 +1,13 @@
import { UniqueID, UtcDate } from "@/core/common/domain"; import { UniqueID, UtcDate } from "@/core/common/domain";
import { import {
type ICustomerInvoiceProps,
type ICustomerInvoiceService,
type CustomerInvoice, type CustomerInvoice,
CustomerInvoiceNumber, CustomerInvoiceNumber,
CustomerInvoiceSerie, CustomerInvoiceSerie,
CustomerInvoiceStatus, CustomerInvoiceStatus,
} from "@/contexts/customerCustomerInvoices/domain"; type ICustomerInvoiceProps,
type ICustomerInvoiceService,
} from "@/contexts/customer-invoices/domain";
import { ITransactionManager } from "@/core/common/infrastructure/database"; import { ITransactionManager } from "@/core/common/infrastructure/database";
import { logger } from "@/core/logger"; import { logger } from "@/core/logger";
import { Result } from "@repo/rdx-utils"; import { Result } from "@repo/rdx-utils";
@ -15,12 +15,12 @@ import { ICreateCustomerInvoiceRequestDTO } from "../../common/dto";
export class CreateCustomerInvoiceUseCase { export class CreateCustomerInvoiceUseCase {
constructor( constructor(
private readonly customerCustomerInvoiceService: ICustomerInvoiceService, private readonly customerInvoiceService: ICustomerInvoiceService,
private readonly transactionManager: ITransactionManager private readonly transactionManager: ITransactionManager
) {} ) {}
public execute( public execute(
customerCustomerInvoiceID: UniqueID, customerInvoiceID: UniqueID,
dto: ICreateCustomerInvoiceRequestDTO dto: ICreateCustomerInvoiceRequestDTO
): Promise<Result<CustomerInvoice, Error>> { ): Promise<Result<CustomerInvoice, Error>> {
return this.transactionManager.complete(async (transaction) => { return this.transactionManager.complete(async (transaction) => {
@ -32,8 +32,12 @@ export class CreateCustomerInvoiceUseCase {
const data = validOrErrors.data; const data = validOrErrors.data;
// Update customerCustomerInvoice with dto // Update customerInvoice with dto
return await this.customerCustomerInvoiceService.createCustomerInvoice(customerCustomerInvoiceID, data, transaction); return await this.customerInvoiceService.createCustomerInvoice(
customerInvoiceID,
data,
transaction
);
} catch (error: unknown) { } catch (error: unknown) {
logger.error(error as Error); logger.error(error as Error);
return Result.fail(error as Error); return Result.fail(error as Error);
@ -41,17 +45,19 @@ export class CreateCustomerInvoiceUseCase {
}); });
} }
private validateCustomerInvoiceData(dto: ICreateCustomerInvoiceRequestDTO): Result<ICustomerInvoiceProps, Error> { private validateCustomerInvoiceData(
dto: ICreateCustomerInvoiceRequestDTO
): Result<ICustomerInvoiceProps, Error> {
const errors: Error[] = []; const errors: Error[] = [];
const customerCustomerInvoiceNumerOrError = CustomerInvoiceNumber.create(dto.customerCustomerInvoice_number); const customerInvoiceNumerOrError = CustomerInvoiceNumber.create(dto.customerInvoice_number);
const customerCustomerInvoiceSeriesOrError = CustomerInvoiceSerie.create(dto.customerCustomerInvoice_series); const customerInvoiceSeriesOrError = CustomerInvoiceSerie.create(dto.customerInvoice_series);
const issueDateOrError = UtcDate.create(dto.issue_date); const issueDateOrError = UtcDate.create(dto.issue_date);
const operationDateOrError = UtcDate.create(dto.operation_date); const operationDateOrError = UtcDate.create(dto.operation_date);
const result = Result.combine([ const result = Result.combine([
customerCustomerInvoiceNumerOrError, customerInvoiceNumerOrError,
customerCustomerInvoiceSeriesOrError, customerInvoiceSeriesOrError,
issueDateOrError, issueDateOrError,
operationDateOrError, operationDateOrError,
]); ]);
@ -62,11 +68,11 @@ export class CreateCustomerInvoiceUseCase {
const validatedData: ICustomerInvoiceProps = { const validatedData: ICustomerInvoiceProps = {
status: CustomerInvoiceStatus.createDraft(), status: CustomerInvoiceStatus.createDraft(),
customerCustomerInvoiceNumber: customerCustomerInvoiceNumerOrError.data, customerInvoiceNumber: customerInvoiceNumerOrError.data,
customerCustomerInvoiceSeries: customerCustomerInvoiceSeriesOrError.data, customerInvoiceSeries: customerInvoiceSeriesOrError.data,
issueDate: issueDateOrError.data, issueDate: issueDateOrError.data,
operationDate: operationDateOrError.data, operationDate: operationDateOrError.data,
customerCustomerInvoiceCurrency: dto.currency, customerInvoiceCurrency: dto.currency,
}; };
/*if (errors.length > 0) { /*if (errors.length > 0) {
@ -75,14 +81,14 @@ export class CreateCustomerInvoiceUseCase {
}*/ }*/
return Result.ok(validatedData); return Result.ok(validatedData);
/*let customerCustomerInvoice_status = CustomerInvoiceStatus.create(dto.status).object; /*let customerInvoice_status = CustomerInvoiceStatus.create(dto.status).object;
if (customerCustomerInvoice_status.isEmpty()) { if (customerInvoice_status.isEmpty()) {
customerCustomerInvoice_status = CustomerInvoiceStatus.createDraft(); customerInvoice_status = CustomerInvoiceStatus.createDraft();
} }
let customerCustomerInvoice_series = CustomerInvoiceSeries.create(dto.customerCustomerInvoice_series).object; let customerInvoice_series = CustomerInvoiceSeries.create(dto.customerInvoice_series).object;
if (customerCustomerInvoice_series.isEmpty()) { if (customerInvoice_series.isEmpty()) {
customerCustomerInvoice_series = CustomerInvoiceSeries.create(dto.customerCustomerInvoice_series).object; customerInvoice_series = CustomerInvoiceSeries.create(dto.customerInvoice_series).object;
} }
let issue_date = CustomerInvoiceDate.create(dto.issue_date).object; let issue_date = CustomerInvoiceDate.create(dto.issue_date).object;
@ -95,16 +101,16 @@ export class CreateCustomerInvoiceUseCase {
operation_date = CustomerInvoiceDate.createCurrentDate().object; operation_date = CustomerInvoiceDate.createCurrentDate().object;
} }
let customerCustomerInvoiceCurrency = Currency.createFromCode(dto.currency).object; let customerInvoiceCurrency = Currency.createFromCode(dto.currency).object;
if (customerCustomerInvoiceCurrency.isEmpty()) { if (customerInvoiceCurrency.isEmpty()) {
customerCustomerInvoiceCurrency = Currency.createDefaultCode().object; customerInvoiceCurrency = Currency.createDefaultCode().object;
} }
let customerCustomerInvoiceLanguage = Language.createFromCode(dto.language_code).object; let customerInvoiceLanguage = Language.createFromCode(dto.language_code).object;
if (customerCustomerInvoiceLanguage.isEmpty()) { if (customerInvoiceLanguage.isEmpty()) {
customerCustomerInvoiceLanguage = Language.createDefaultCode().object; customerInvoiceLanguage = Language.createDefaultCode().object;
} }
const items = new Collection<CustomerInvoiceItem>( const items = new Collection<CustomerInvoiceItem>(
@ -122,26 +128,26 @@ export class CreateCustomerInvoiceUseCase {
) )
); );
if (!customerCustomerInvoice_status.isDraft()) { if (!customerInvoice_status.isDraft()) {
throw Error("Error al crear una factura que no es borrador"); throw Error("Error al crear una factura que no es borrador");
} }
return DraftCustomerInvoice.create( return DraftCustomerInvoice.create(
{ {
customerCustomerInvoiceSeries: customerCustomerInvoice_series, customerInvoiceSeries: customerInvoice_series,
issueDate: issue_date, issueDate: issue_date,
operationDate: operation_date, operationDate: operation_date,
customerCustomerInvoiceCurrency, customerInvoiceCurrency,
language: customerCustomerInvoiceLanguage, language: customerInvoiceLanguage,
customerCustomerInvoiceNumber: CustomerInvoiceNumber.create(undefined).object, customerInvoiceNumber: CustomerInvoiceNumber.create(undefined).object,
//notes: Note.create(customerCustomerInvoiceDTO.notes).object, //notes: Note.create(customerInvoiceDTO.notes).object,
//senderId: UniqueID.create(null).object, //senderId: UniqueID.create(null).object,
recipient, recipient,
items, items,
}, },
customerCustomerInvoiceId customerInvoiceId
);*/ );*/
} }
} }

View File

@ -6,14 +6,17 @@ import { ICustomerInvoiceService } from "../domain";
export class DeleteCustomerInvoiceUseCase { export class DeleteCustomerInvoiceUseCase {
constructor( constructor(
private readonly customerCustomerInvoiceService: ICustomerInvoiceService, private readonly customerInvoiceService: ICustomerInvoiceService,
private readonly transactionManager: ITransactionManager private readonly transactionManager: ITransactionManager
) {} ) {}
public execute(customerCustomerInvoiceID: UniqueID): Promise<Result<boolean, Error>> { public execute(customerInvoiceID: UniqueID): Promise<Result<boolean, Error>> {
return this.transactionManager.complete(async (transaction) => { return this.transactionManager.complete(async (transaction) => {
try { try {
return await this.customerCustomerInvoiceService.deleteCustomerInvoiceById(customerCustomerInvoiceID, transaction); return await this.customerInvoiceService.deleteCustomerInvoiceById(
customerInvoiceID,
transaction
);
} catch (error: unknown) { } catch (error: unknown) {
logger.error(error as Error); logger.error(error as Error);
return Result.fail(error as Error); return Result.fail(error as Error);

View File

@ -2,18 +2,21 @@ import { UniqueID } from "@/core/common/domain";
import { ITransactionManager } from "@/core/common/infrastructure/database"; import { ITransactionManager } from "@/core/common/infrastructure/database";
import { logger } from "@/lib/logger"; import { logger } from "@/lib/logger";
import { Result } from "@repo/rdx-utils"; import { Result } from "@repo/rdx-utils";
import { ICustomerInvoiceService, CustomerInvoice } from "../domain"; import { CustomerInvoice, ICustomerInvoiceService } from "../domain";
export class GetCustomerInvoiceUseCase { export class GetCustomerInvoiceUseCase {
constructor( constructor(
private readonly customerCustomerInvoiceService: ICustomerInvoiceService, private readonly customerInvoiceService: ICustomerInvoiceService,
private readonly transactionManager: ITransactionManager private readonly transactionManager: ITransactionManager
) {} ) {}
public execute(customerCustomerInvoiceID: UniqueID): Promise<Result<CustomerInvoice, Error>> { public execute(customerInvoiceID: UniqueID): Promise<Result<CustomerInvoice, Error>> {
return this.transactionManager.complete(async (transaction) => { return this.transactionManager.complete(async (transaction) => {
try { try {
return await this.customerCustomerInvoiceService.findCustomerInvoiceById(customerCustomerInvoiceID, transaction); return await this.customerInvoiceService.findCustomerInvoiceById(
customerInvoiceID,
transaction
);
} catch (error: unknown) { } catch (error: unknown) {
logger.error(error as Error); logger.error(error as Error);
return Result.fail(error as Error); return Result.fail(error as Error);

View File

@ -2,18 +2,18 @@ import { ITransactionManager } from "@erp/core/api";
import { Criteria } from "@repo/rdx-criteria/server"; import { Criteria } from "@repo/rdx-criteria/server";
import { Collection, Result } from "@repo/rdx-utils"; import { Collection, Result } from "@repo/rdx-utils";
import { Transaction } from "sequelize"; import { Transaction } from "sequelize";
import { ICustomerInvoiceService, CustomerInvoice } from "../domain"; import { CustomerInvoice, ICustomerInvoiceService } from "../domain";
export class ListCustomerInvoicesUseCase { export class ListCustomerInvoicesUseCase {
constructor( constructor(
private readonly customerCustomerInvoiceService: ICustomerInvoiceService, private readonly customerInvoiceService: ICustomerInvoiceService,
private readonly transactionManager: ITransactionManager private readonly transactionManager: ITransactionManager
) {} ) {}
public execute(criteria: Criteria): Promise<Result<Collection<CustomerInvoice>, Error>> { public execute(criteria: Criteria): Promise<Result<Collection<CustomerInvoice>, Error>> {
return this.transactionManager.complete(async (transaction: Transaction) => { return this.transactionManager.complete(async (transaction: Transaction) => {
try { try {
return await this.customerCustomerInvoiceService.findCustomerInvoices(criteria, transaction); return await this.customerInvoiceService.findCustomerInvoices(criteria, transaction);
} catch (error: unknown) { } catch (error: unknown) {
return Result.fail(error as Error); return Result.fail(error as Error);
} }

View File

@ -1,7 +1,7 @@
/* import { IAdapter, RepositoryBuilder } from "@/contexts/common/domain"; /* import { IAdapter, RepositoryBuilder } from "@/contexts/common/domain";
import { UniqueID } from "@shared/contexts"; import { UniqueID } from "@shared/contexts";
import { ICustomerInvoiceParticipantRepository } from "../../domain"; import { ICustomerInvoiceParticipantRepository } from "../../domain";
import { CustomerInvoiceCustomer } from "../../domain/entities/customerCustomerInvoice-customer/customerCustomerInvoice-customer"; import { CustomerInvoiceCustomer } from "../../domain/entities/customer-invoice-customer/customer-invoice-customer";
export const participantFinder = async ( export const participantFinder = async (
participantId: UniqueID, participantId: UniqueID,

View File

@ -2,16 +2,16 @@ import { UniqueID } from "@/core/common/domain";
import { ITransactionManager } from "@/core/common/infrastructure/database"; import { ITransactionManager } from "@/core/common/infrastructure/database";
import { Result } from "@repo/rdx-utils"; import { Result } from "@repo/rdx-utils";
import { IUpdateCustomerInvoiceRequestDTO } from "../../common/dto"; import { IUpdateCustomerInvoiceRequestDTO } from "../../common/dto";
import { ICustomerInvoiceService, CustomerInvoice } from "../domain"; import { CustomerInvoice, ICustomerInvoiceService } from "../domain";
export class CreateCustomerInvoiceUseCase { export class CreateCustomerInvoiceUseCase {
constructor( constructor(
private readonly customerCustomerInvoiceService: ICustomerInvoiceService, private readonly customerInvoiceService: ICustomerInvoiceService,
private readonly transactionManager: ITransactionManager private readonly transactionManager: ITransactionManager
) {} ) {}
public execute( public execute(
customerCustomerInvoiceID: UniqueID, customerInvoiceID: UniqueID,
dto: Partial<IUpdateCustomerInvoiceRequestDTO> dto: Partial<IUpdateCustomerInvoiceRequestDTO>
): Promise<Result<CustomerInvoice, Error>> { ): Promise<Result<CustomerInvoice, Error>> {
return this.transactionManager.complete(async (transaction) => { return this.transactionManager.complete(async (transaction) => {
@ -25,8 +25,8 @@ export class CreateCustomerInvoiceUseCase {
const data = validOrErrors.data; const data = validOrErrors.data;
// Update customerCustomerInvoice with dto // Update customerInvoice with dto
return await this.customerCustomerInvoiceService.updateCustomerInvoiceById(customerCustomerInvoiceID, data, transaction); return await this.customerInvoiceService.updateCustomerInvoiceById(customerInvoiceID, data, transaction);
} catch (error: unknown) { } catch (error: unknown) {
logger.error(error as Error); logger.error(error as Error);
return Result.fail(error as Error); return Result.fail(error as Error);
@ -41,41 +41,41 @@ export class CreateCustomerInvoiceUseCase {
const errors: Error[] = []; const errors: Error[] = [];
const validatedData: Partial<ICustomerInvoiceProps> = {}; const validatedData: Partial<ICustomerInvoiceProps> = {};
// Create customerCustomerInvoice // Create customerInvoice
let customerCustomerInvoice_status = CustomerInvoiceStatus.create(customerCustomerInvoiceDTO.status).object; let customerInvoice_status = CustomerInvoiceStatus.create(customerInvoiceDTO.status).object;
if (customerCustomerInvoice_status.isEmpty()) { if (customerInvoice_status.isEmpty()) {
customerCustomerInvoice_status = CustomerInvoiceStatus.createDraft(); customerInvoice_status = CustomerInvoiceStatus.createDraft();
} }
let customerCustomerInvoice_series = CustomerInvoiceSeries.create(customerCustomerInvoiceDTO.customerCustomerInvoice_series).object; let customerInvoice_series = CustomerInvoiceSeries.create(customerInvoiceDTO.customerInvoice_series).object;
if (customerCustomerInvoice_series.isEmpty()) { if (customerInvoice_series.isEmpty()) {
customerCustomerInvoice_series = CustomerInvoiceSeries.create(customerCustomerInvoiceDTO.customerCustomerInvoice_series).object; customerInvoice_series = CustomerInvoiceSeries.create(customerInvoiceDTO.customerInvoice_series).object;
} }
let issue_date = CustomerInvoiceDate.create(customerCustomerInvoiceDTO.issue_date).object; let issue_date = CustomerInvoiceDate.create(customerInvoiceDTO.issue_date).object;
if (issue_date.isEmpty()) { if (issue_date.isEmpty()) {
issue_date = CustomerInvoiceDate.createCurrentDate().object; issue_date = CustomerInvoiceDate.createCurrentDate().object;
} }
let operation_date = CustomerInvoiceDate.create(customerCustomerInvoiceDTO.operation_date).object; let operation_date = CustomerInvoiceDate.create(customerInvoiceDTO.operation_date).object;
if (operation_date.isEmpty()) { if (operation_date.isEmpty()) {
operation_date = CustomerInvoiceDate.createCurrentDate().object; operation_date = CustomerInvoiceDate.createCurrentDate().object;
} }
let customerCustomerInvoiceCurrency = Currency.createFromCode(customerCustomerInvoiceDTO.currency).object; let customerInvoiceCurrency = Currency.createFromCode(customerInvoiceDTO.currency).object;
if (customerCustomerInvoiceCurrency.isEmpty()) { if (customerInvoiceCurrency.isEmpty()) {
customerCustomerInvoiceCurrency = Currency.createDefaultCode().object; customerInvoiceCurrency = Currency.createDefaultCode().object;
} }
let customerCustomerInvoiceLanguage = Language.createFromCode(customerCustomerInvoiceDTO.language_code).object; let customerInvoiceLanguage = Language.createFromCode(customerInvoiceDTO.language_code).object;
if (customerCustomerInvoiceLanguage.isEmpty()) { if (customerInvoiceLanguage.isEmpty()) {
customerCustomerInvoiceLanguage = Language.createDefaultCode().object; customerInvoiceLanguage = Language.createDefaultCode().object;
} }
const items = new Collection<CustomerInvoiceItem>( const items = new Collection<CustomerInvoiceItem>(
customerCustomerInvoiceDTO.items?.map( customerInvoiceDTO.items?.map(
(item) => (item) =>
CustomerInvoiceSimpleItem.create({ CustomerInvoiceSimpleItem.create({
description: Description.create(item.description).object, description: Description.create(item.description).object,
@ -89,26 +89,26 @@ export class CreateCustomerInvoiceUseCase {
) )
); );
if (!customerCustomerInvoice_status.isDraft()) { if (!customerInvoice_status.isDraft()) {
throw Error("Error al crear una factura que no es borrador"); throw Error("Error al crear una factura que no es borrador");
} }
return DraftCustomerInvoice.create( return DraftCustomerInvoice.create(
{ {
customerCustomerInvoiceSeries: customerCustomerInvoice_series, customerInvoiceSeries: customerInvoice_series,
issueDate: issue_date, issueDate: issue_date,
operationDate: operation_date, operationDate: operation_date,
customerCustomerInvoiceCurrency, customerInvoiceCurrency,
language: customerCustomerInvoiceLanguage, language: customerInvoiceLanguage,
customerCustomerInvoiceNumber: CustomerInvoiceNumber.create(undefined).object, customerInvoiceNumber: CustomerInvoiceNumber.create(undefined).object,
//notes: Note.create(customerCustomerInvoiceDTO.notes).object, //notes: Note.create(customerInvoiceDTO.notes).object,
//senderId: UniqueID.create(null).object, //senderId: UniqueID.create(null).object,
recipient, recipient,
items, items,
}, },
customerCustomerInvoiceId customerInvoiceId
); );
} */ } */
} }
@ -152,39 +152,39 @@ export class UpdateCustomerInvoiceUseCase2
id: UniqueID; id: UniqueID;
data: IUpdateCustomerInvoice_DTO; data: IUpdateCustomerInvoice_DTO;
}): Promise<UpdateCustomerInvoiceResponseOrError> { }): Promise<UpdateCustomerInvoiceResponseOrError> {
const { id, data: customerCustomerInvoiceDTO } = request; const { id, data: customerInvoiceDTO } = request;
// Validaciones // Validaciones
const customerCustomerInvoiceDTOOrError = ensureUpdateCustomerInvoice_DTOIsValid(customerCustomerInvoiceDTO); const customerInvoiceDTOOrError = ensureUpdateCustomerInvoice_DTOIsValid(customerInvoiceDTO);
if (customerCustomerInvoiceDTOOrError.isFailure) { if (customerInvoiceDTOOrError.isFailure) {
return this.handleValidationFailure(customerCustomerInvoiceDTOOrError.error); return this.handleValidationFailure(customerInvoiceDTOOrError.error);
} }
const transaction = this._adapter.startTransaction(); const transaction = this._adapter.startTransaction();
const customerCustomerInvoiceRepoBuilder = this.getRepository<ICustomerInvoiceRepository>("CustomerInvoice"); const customerInvoiceRepoBuilder = this.getRepository<ICustomerInvoiceRepository>("CustomerInvoice");
let customerCustomerInvoice: CustomerInvoice | null = null; let customerInvoice: CustomerInvoice | null = null;
try { try {
await transaction.complete(async (t) => { await transaction.complete(async (t) => {
customerCustomerInvoice = await customerCustomerInvoiceRepoBuilder({ transaction: t }).getById(id); customerInvoice = await customerInvoiceRepoBuilder({ transaction: t }).getById(id);
}); });
if (customerCustomerInvoice === null) { if (customerInvoice === null) {
return Result.fail<IUseCaseError>( return Result.fail<IUseCaseError>(
UseCaseError.create(UseCaseError.NOT_FOUND_ERROR, `CustomerInvoice not found`, { UseCaseError.create(UseCaseError.NOT_FOUND_ERROR, `CustomerInvoice not found`, {
id: request.id.toString(), id: request.id.toString(),
entity: "customerCustomerInvoice", entity: "customerInvoice",
}) })
); );
} }
return Result.ok<CustomerInvoice>(customerCustomerInvoice); return Result.ok<CustomerInvoice>(customerInvoice);
} catch (error: unknown) { } catch (error: unknown) {
const _error = error as Error; const _error = error as Error;
if (customerCustomerInvoiceRepoBuilder().isRepositoryError(_error)) { if (customerInvoiceRepoBuilder().isRepositoryError(_error)) {
return this.handleRepositoryError(error as BaseError, customerCustomerInvoiceRepoBuilder()); return this.handleRepositoryError(error as BaseError, customerInvoiceRepoBuilder());
} else { } else {
return this.handleUnexceptedError(error); return this.handleUnexceptedError(error);
} }
@ -192,7 +192,7 @@ export class UpdateCustomerInvoiceUseCase2
// Recipient validations // Recipient validations
const recipientIdOrError = ensureParticipantIdIsValid( const recipientIdOrError = ensureParticipantIdIsValid(
customerCustomerInvoiceDTO?.recipient?.id, customerInvoiceDTO?.recipient?.id,
); );
if (recipientIdOrError.isFailure) { if (recipientIdOrError.isFailure) {
return this.handleValidationFailure( return this.handleValidationFailure(
@ -203,7 +203,7 @@ export class UpdateCustomerInvoiceUseCase2
const recipientId = recipientIdOrError.object; const recipientId = recipientIdOrError.object;
const recipientBillingIdOrError = ensureParticipantAddressIdIsValid( const recipientBillingIdOrError = ensureParticipantAddressIdIsValid(
customerCustomerInvoiceDTO?.recipient?.billing_address_id, customerInvoiceDTO?.recipient?.billing_address_id,
); );
if (recipientBillingIdOrError.isFailure) { if (recipientBillingIdOrError.isFailure) {
return this.handleValidationFailure( return this.handleValidationFailure(
@ -214,7 +214,7 @@ export class UpdateCustomerInvoiceUseCase2
const recipientBillingId = recipientBillingIdOrError.object; const recipientBillingId = recipientBillingIdOrError.object;
const recipientShippingIdOrError = ensureParticipantAddressIdIsValid( const recipientShippingIdOrError = ensureParticipantAddressIdIsValid(
customerCustomerInvoiceDTO?.recipient?.shipping_address_id, customerInvoiceDTO?.recipient?.shipping_address_id,
); );
if (recipientShippingIdOrError.isFailure) { if (recipientShippingIdOrError.isFailure) {
return this.handleValidationFailure( return this.handleValidationFailure(
@ -236,18 +236,18 @@ export class UpdateCustomerInvoiceUseCase2
); );
} }
// Crear customerCustomerInvoice // Crear customerInvoice
const customerCustomerInvoiceOrError = await this.tryUpdateCustomerInvoiceInstance( const customerInvoiceOrError = await this.tryUpdateCustomerInvoiceInstance(
customerCustomerInvoiceDTO, customerInvoiceDTO,
customerCustomerInvoiceIdOrError.object, customerInvoiceIdOrError.object,
//senderId, //senderId,
//senderBillingId, //senderBillingId,
//senderShippingId, //senderShippingId,
recipientContact, recipientContact,
); );
if (customerCustomerInvoiceOrError.isFailure) { if (customerInvoiceOrError.isFailure) {
const { error: domainError } = customerCustomerInvoiceOrError; const { error: domainError } = customerInvoiceOrError;
let errorCode = ""; let errorCode = "";
let message = ""; let message = "";
@ -269,46 +269,46 @@ export class UpdateCustomerInvoiceUseCase2
); );
} }
return this.saveCustomerInvoice(customerCustomerInvoiceOrError.object); return this.saveCustomerInvoice(customerInvoiceOrError.object);
} }
private async tryUpdateCustomerInvoiceInstance(customerCustomerInvoiceDTO, customerCustomerInvoiceId, recipient) { private async tryUpdateCustomerInvoiceInstance(customerInvoiceDTO, customerInvoiceId, recipient) {
// Create customerCustomerInvoice // Create customerInvoice
let customerCustomerInvoice_status = CustomerInvoiceStatus.create(customerCustomerInvoiceDTO.status).object; let customerInvoice_status = CustomerInvoiceStatus.create(customerInvoiceDTO.status).object;
if (customerCustomerInvoice_status.isEmpty()) { if (customerInvoice_status.isEmpty()) {
customerCustomerInvoice_status = CustomerInvoiceStatus.createDraft(); customerInvoice_status = CustomerInvoiceStatus.createDraft();
} }
let customerCustomerInvoice_series = CustomerInvoiceSeries.create(customerCustomerInvoiceDTO.customerCustomerInvoice_series).object; let customerInvoice_series = CustomerInvoiceSeries.create(customerInvoiceDTO.customerInvoice_series).object;
if (customerCustomerInvoice_series.isEmpty()) { if (customerInvoice_series.isEmpty()) {
customerCustomerInvoice_series = CustomerInvoiceSeries.create(customerCustomerInvoiceDTO.customerCustomerInvoice_series).object; customerInvoice_series = CustomerInvoiceSeries.create(customerInvoiceDTO.customerInvoice_series).object;
} }
let issue_date = CustomerInvoiceDate.create(customerCustomerInvoiceDTO.issue_date).object; let issue_date = CustomerInvoiceDate.create(customerInvoiceDTO.issue_date).object;
if (issue_date.isEmpty()) { if (issue_date.isEmpty()) {
issue_date = CustomerInvoiceDate.createCurrentDate().object; issue_date = CustomerInvoiceDate.createCurrentDate().object;
} }
let operation_date = CustomerInvoiceDate.create(customerCustomerInvoiceDTO.operation_date).object; let operation_date = CustomerInvoiceDate.create(customerInvoiceDTO.operation_date).object;
if (operation_date.isEmpty()) { if (operation_date.isEmpty()) {
operation_date = CustomerInvoiceDate.createCurrentDate().object; operation_date = CustomerInvoiceDate.createCurrentDate().object;
} }
let customerCustomerInvoiceCurrency = Currency.createFromCode(customerCustomerInvoiceDTO.currency).object; let customerInvoiceCurrency = Currency.createFromCode(customerInvoiceDTO.currency).object;
if (customerCustomerInvoiceCurrency.isEmpty()) { if (customerInvoiceCurrency.isEmpty()) {
customerCustomerInvoiceCurrency = Currency.createDefaultCode().object; customerInvoiceCurrency = Currency.createDefaultCode().object;
} }
let customerCustomerInvoiceLanguage = Language.createFromCode(customerCustomerInvoiceDTO.language_code).object; let customerInvoiceLanguage = Language.createFromCode(customerInvoiceDTO.language_code).object;
if (customerCustomerInvoiceLanguage.isEmpty()) { if (customerInvoiceLanguage.isEmpty()) {
customerCustomerInvoiceLanguage = Language.createDefaultCode().object; customerInvoiceLanguage = Language.createDefaultCode().object;
} }
const items = new Collection<CustomerInvoiceItem>( const items = new Collection<CustomerInvoiceItem>(
customerCustomerInvoiceDTO.items?.map( customerInvoiceDTO.items?.map(
(item) => (item) =>
CustomerInvoiceSimpleItem.create({ CustomerInvoiceSimpleItem.create({
description: Description.create(item.description).object, description: Description.create(item.description).object,
@ -322,26 +322,26 @@ export class UpdateCustomerInvoiceUseCase2
) )
); );
if (!customerCustomerInvoice_status.isDraft()) { if (!customerInvoice_status.isDraft()) {
throw Error("Error al crear una factura que no es borrador"); throw Error("Error al crear una factura que no es borrador");
} }
return DraftCustomerInvoice.create( return DraftCustomerInvoice.create(
{ {
customerCustomerInvoiceSeries: customerCustomerInvoice_series, customerInvoiceSeries: customerInvoice_series,
issueDate: issue_date, issueDate: issue_date,
operationDate: operation_date, operationDate: operation_date,
customerCustomerInvoiceCurrency, customerInvoiceCurrency,
language: customerCustomerInvoiceLanguage, language: customerInvoiceLanguage,
customerCustomerInvoiceNumber: CustomerInvoiceNumber.create(undefined).object, customerInvoiceNumber: CustomerInvoiceNumber.create(undefined).object,
//notes: Note.create(customerCustomerInvoiceDTO.notes).object, //notes: Note.create(customerInvoiceDTO.notes).object,
//senderId: UniqueID.create(null).object, //senderId: UniqueID.create(null).object,
recipient, recipient,
items, items,
}, },
customerCustomerInvoiceId customerInvoiceId
); );
} }
@ -361,21 +361,21 @@ export class UpdateCustomerInvoiceUseCase2
return contact; return contact;
} }
private async saveCustomerInvoice(customerCustomerInvoice: DraftCustomerInvoice) { private async saveCustomerInvoice(customerInvoice: DraftCustomerInvoice) {
const transaction = this._adapter.startTransaction(); const transaction = this._adapter.startTransaction();
const customerCustomerInvoiceRepoBuilder = this.getRepository<ICustomerInvoiceRepository>("CustomerInvoice"); const customerInvoiceRepoBuilder = this.getRepository<ICustomerInvoiceRepository>("CustomerInvoice");
try { try {
await transaction.complete(async (t) => { await transaction.complete(async (t) => {
const customerCustomerInvoiceRepo = customerCustomerInvoiceRepoBuilder({ transaction: t }); const customerInvoiceRepo = customerInvoiceRepoBuilder({ transaction: t });
await customerCustomerInvoiceRepo.save(customerCustomerInvoice); await customerInvoiceRepo.save(customerInvoice);
}); });
return Result.ok<DraftCustomerInvoice>(customerCustomerInvoice); return Result.ok<DraftCustomerInvoice>(customerInvoice);
} catch (error: unknown) { } catch (error: unknown) {
const _error = error as Error; const _error = error as Error;
if (customerCustomerInvoiceRepoBuilder().isRepositoryError(_error)) { if (customerInvoiceRepoBuilder().isRepositoryError(_error)) {
return this.handleRepositoryError(error as BaseError, customerCustomerInvoiceRepoBuilder()); return this.handleRepositoryError(error as BaseError, customerInvoiceRepoBuilder());
} else { } else {
return this.handleUnexceptedError(error); return this.handleUnexceptedError(error);
} }

View File

@ -1,11 +1,15 @@
import { AggregateRoot, MoneyValue, UniqueID, UtcDate } from "@repo/rdx-ddd"; import { AggregateRoot, MoneyValue, UniqueID, UtcDate } from "@repo/rdx-ddd";
import { Collection, Result } from "@repo/rdx-utils"; import { Collection, Result } from "@repo/rdx-utils";
import { CustomerInvoiceCustomer, CustomerInvoiceItem, CustomerInvoiceItems } from "../entities"; import { CustomerInvoiceCustomer, CustomerInvoiceItem, CustomerInvoiceItems } from "../entities";
import { CustomerInvoiceNumber, CustomerInvoiceSerie, CustomerInvoiceStatus } from "../value-objects"; import {
CustomerInvoiceNumber,
CustomerInvoiceSerie,
CustomerInvoiceStatus,
} from "../value-objects";
export interface ICustomerInvoiceProps { export interface ICustomerInvoiceProps {
customerCustomerInvoiceNumber: CustomerInvoiceNumber; customerInvoiceNumber: CustomerInvoiceNumber;
customerCustomerInvoiceSeries: CustomerInvoiceSerie; customerInvoiceSeries: CustomerInvoiceSerie;
status: CustomerInvoiceStatus; status: CustomerInvoiceStatus;
@ -15,7 +19,7 @@ export interface ICustomerInvoiceProps {
//dueDate: UtcDate; // ? --> depende de la forma de pago //dueDate: UtcDate; // ? --> depende de la forma de pago
//tax: Tax; // ? --> detalles? //tax: Tax; // ? --> detalles?
customerCustomerInvoiceCurrency: string; customerInvoiceCurrency: string;
//language: Language; //language: Language;
@ -33,8 +37,8 @@ export interface ICustomerInvoiceProps {
export interface ICustomerInvoice { export interface ICustomerInvoice {
id: UniqueID; id: UniqueID;
customerCustomerInvoiceNumber: CustomerInvoiceNumber; customerInvoiceNumber: CustomerInvoiceNumber;
customerCustomerInvoiceSeries: CustomerInvoiceSerie; customerInvoiceSeries: CustomerInvoiceSerie;
status: CustomerInvoiceStatus; status: CustomerInvoiceStatus;
@ -49,7 +53,7 @@ export interface ICustomerInvoice {
//tax: Tax; //tax: Tax;
//language: Language; //language: Language;
customerCustomerInvoiceCurrency: string; customerInvoiceCurrency: string;
//purchareOrderNumber: string; //purchareOrderNumber: string;
//notes: Note; //notes: Note;
@ -64,7 +68,10 @@ export interface ICustomerInvoice {
calculateTotal: () => MoneyValue; calculateTotal: () => MoneyValue;
} }
export class CustomerInvoice extends AggregateRoot<ICustomerInvoiceProps> implements ICustomerInvoice { export class CustomerInvoice
extends AggregateRoot<ICustomerInvoiceProps>
implements ICustomerInvoice
{
private _items!: Collection<CustomerInvoiceItem>; private _items!: Collection<CustomerInvoiceItem>;
//protected _status: CustomerInvoiceStatus; //protected _status: CustomerInvoiceStatus;
@ -75,25 +82,25 @@ export class CustomerInvoice extends AggregateRoot<ICustomerInvoiceProps> implem
} }
static create(props: ICustomerInvoiceProps, id?: UniqueID): Result<CustomerInvoice, Error> { static create(props: ICustomerInvoiceProps, id?: UniqueID): Result<CustomerInvoice, Error> {
const customerCustomerInvoice = new CustomerInvoice(props, id); const customerInvoice = new CustomerInvoice(props, id);
// Reglas de negocio / validaciones // Reglas de negocio / validaciones
// ... // ...
// ... // ...
// 🔹 Disparar evento de dominio "CustomerInvoiceAuthenticatedEvent" // 🔹 Disparar evento de dominio "CustomerInvoiceAuthenticatedEvent"
//const { customerCustomerInvoice } = props; //const { customerInvoice } = props;
//user.addDomainEvent(new CustomerInvoiceAuthenticatedEvent(id, customerCustomerInvoice.toString())); //user.addDomainEvent(new CustomerInvoiceAuthenticatedEvent(id, customerInvoice.toString()));
return Result.ok(customerCustomerInvoice); return Result.ok(customerInvoice);
} }
get customerCustomerInvoiceNumber() { get customerInvoiceNumber() {
return this.props.customerCustomerInvoiceNumber; return this.props.customerInvoiceNumber;
} }
get customerCustomerInvoiceSeries() { get customerInvoiceSeries() {
return this.props.customerCustomerInvoiceSeries; return this.props.customerInvoiceSeries;
} }
get issueDate() { get issueDate() {
@ -152,8 +159,8 @@ export class CustomerInvoice extends AggregateRoot<ICustomerInvoiceProps> implem
return this.props.shipTo; return this.props.shipTo;
}*/ }*/
get customerCustomerInvoiceCurrency() { get customerInvoiceCurrency() {
return this.props.customerCustomerInvoiceCurrency; return this.props.customerInvoiceCurrency;
} }
/*get notes() { /*get notes() {
@ -174,29 +181,29 @@ export class CustomerInvoice extends AggregateRoot<ICustomerInvoiceProps> implem
}*/ }*/
calculateSubtotal(): MoneyValue { calculateSubtotal(): MoneyValue {
const customerCustomerInvoiceSubtotal = MoneyValue.create({ const customerInvoiceSubtotal = MoneyValue.create({
amount: 0, amount: 0,
currency_code: this.props.customerCustomerInvoiceCurrency, currency_code: this.props.customerInvoiceCurrency,
scale: 2, scale: 2,
}).data; }).data;
return this._items.getAll().reduce((subtotal, item) => { return this._items.getAll().reduce((subtotal, item) => {
return subtotal.add(item.calculateTotal()); return subtotal.add(item.calculateTotal());
}, customerCustomerInvoiceSubtotal); }, customerInvoiceSubtotal);
} }
// Method to calculate the total tax in the customerCustomerInvoice // Method to calculate the total tax in the customerInvoice
calculateTaxTotal(): MoneyValue { calculateTaxTotal(): MoneyValue {
const taxTotal = MoneyValue.create({ const taxTotal = MoneyValue.create({
amount: 0, amount: 0,
currency_code: this.props.customerCustomerInvoiceCurrency, currency_code: this.props.customerInvoiceCurrency,
scale: 2, scale: 2,
}).data; }).data;
return taxTotal; return taxTotal;
} }
// Method to calculate the total customerCustomerInvoice amount, including taxes // Method to calculate the total customerInvoice amount, including taxes
calculateTotal(): MoneyValue { calculateTotal(): MoneyValue {
return this.calculateSubtotal().add(this.calculateTaxTotal()); return this.calculateSubtotal().add(this.calculateTaxTotal());
} }

View File

@ -1 +1 @@
export * from "./customerCustomerInvoice"; export * from "./customer-invoice";

View File

@ -1,2 +1,2 @@
export * from "./customerCustomerInvoice-customer"; export * from "./invoice-customer";
export * from "./customerCustomerInvoice-items"; export * from "./invoice-items";

View File

@ -1,2 +1 @@
export * from "./customerCustomerInvoice-address"; export * from "./invoice-customer";
export * from "./customerCustomerInvoice-customer";

View File

@ -1,6 +1,6 @@
import { DomainEntity, Name, TINNumber, UniqueID } from "@repo/rdx-ddd"; import { DomainEntity, Name, TINNumber, UniqueID } from "@repo/rdx-ddd";
import { Result } from "@repo/rdx-utils"; import { Result } from "@repo/rdx-utils";
import { CustomerInvoiceAddress } from "./customerCustomerInvoice-address"; import { CustomerInvoiceAddress } from "./customer-invoice-address";
export interface ICustomerInvoiceCustomerProps { export interface ICustomerInvoiceCustomerProps {
tin: TINNumber; tin: TINNumber;

View File

@ -1,2 +1,2 @@
export * from "./customerCustomerInvoice-item"; export * from "./invoice-item";
export * from "./customerCustomerInvoice-items"; export * from "./invoice-items";

View File

@ -1,6 +1,6 @@
import { MoneyValue, Percentage, Quantity } from "@/core/common/domain"; import { MoneyValue, Percentage, Quantity } from "@/core/common/domain";
import { CustomerInvoiceItemDescription } from "../../value-objects"; import { CustomerInvoiceItemDescription } from "../../value-objects";
import { CustomerInvoiceItem } from "./customerCustomerInvoice-item"; import { CustomerInvoiceItem } from "./customer-invoice-item";
describe("CustomerInvoiceItem", () => { describe("CustomerInvoiceItem", () => {
it("debería calcular correctamente el subtotal (unitPrice * quantity)", () => { it("debería calcular correctamente el subtotal (unitPrice * quantity)", () => {
@ -14,8 +14,8 @@ describe("CustomerInvoiceItem", () => {
const result = CustomerInvoiceItem.create(props); const result = CustomerInvoiceItem.create(props);
expect(result.isOk()).toBe(true); expect(result.isOk()).toBe(true);
const customerCustomerInvoiceItem = result.unwrap(); const customerInvoiceItem = result.unwrap();
expect(customerCustomerInvoiceItem.subtotalPrice.value).toBe(100); // 50 * 2 expect(customerInvoiceItem.subtotalPrice.value).toBe(100); // 50 * 2
}); });
it("debería calcular correctamente el total con descuento", () => { it("debería calcular correctamente el total con descuento", () => {
@ -29,8 +29,8 @@ describe("CustomerInvoiceItem", () => {
const result = CustomerInvoiceItem.create(props); const result = CustomerInvoiceItem.create(props);
expect(result.isOk()).toBe(true); expect(result.isOk()).toBe(true);
const customerCustomerInvoiceItem = result.unwrap(); const customerInvoiceItem = result.unwrap();
expect(customerCustomerInvoiceItem.totalPrice.value).toBe(81); // (30 * 3) - 10% de (30 * 3) expect(customerInvoiceItem.totalPrice.value).toBe(81); // (30 * 3) - 10% de (30 * 3)
}); });
it("debería devolver los valores correctos de las propiedades", () => { it("debería devolver los valores correctos de las propiedades", () => {
@ -44,11 +44,11 @@ describe("CustomerInvoiceItem", () => {
const result = CustomerInvoiceItem.create(props); const result = CustomerInvoiceItem.create(props);
expect(result.isOk()).toBe(true); expect(result.isOk()).toBe(true);
const customerCustomerInvoiceItem = result.unwrap(); const customerInvoiceItem = result.unwrap();
expect(customerCustomerInvoiceItem.description.value).toBe("Producto C"); expect(customerInvoiceItem.description.value).toBe("Producto C");
expect(customerCustomerInvoiceItem.quantity.value).toBe(1); expect(customerInvoiceItem.quantity.value).toBe(1);
expect(customerCustomerInvoiceItem.unitPrice.value).toBe(100); expect(customerInvoiceItem.unitPrice.value).toBe(100);
expect(customerCustomerInvoiceItem.discount.value).toBe(5); expect(customerInvoiceItem.discount.value).toBe(5);
}); });
it("debería manejar correctamente un descuento del 0%", () => { it("debería manejar correctamente un descuento del 0%", () => {
@ -62,8 +62,8 @@ describe("CustomerInvoiceItem", () => {
const result = CustomerInvoiceItem.create(props); const result = CustomerInvoiceItem.create(props);
expect(result.isOk()).toBe(true); expect(result.isOk()).toBe(true);
const customerCustomerInvoiceItem = result.unwrap(); const customerInvoiceItem = result.unwrap();
expect(customerCustomerInvoiceItem.totalPrice.value).toBe(100); // 25 * 4 expect(customerInvoiceItem.totalPrice.value).toBe(100); // 25 * 4
}); });
it("debería manejar correctamente un descuento del 100%", () => { it("debería manejar correctamente un descuento del 100%", () => {
@ -77,7 +77,7 @@ describe("CustomerInvoiceItem", () => {
const result = CustomerInvoiceItem.create(props); const result = CustomerInvoiceItem.create(props);
expect(result.isOk()).toBe(true); expect(result.isOk()).toBe(true);
const customerCustomerInvoiceItem = result.unwrap(); const customerInvoiceItem = result.unwrap();
expect(customerCustomerInvoiceItem.totalPrice.value).toBe(0); // (50 * 2) - 100% de (50 * 2) expect(customerInvoiceItem.totalPrice.value).toBe(0); // (50 * 2) - 100% de (50 * 2)
}); });
}); });

View File

@ -28,11 +28,17 @@ export interface ICustomerInvoiceItem {
totalPrice: CustomerInvoiceItemTotalPrice; totalPrice: CustomerInvoiceItemTotalPrice;
} }
export class CustomerInvoiceItem extends DomainEntity<ICustomerInvoiceItemProps> implements ICustomerInvoiceItem { export class CustomerInvoiceItem
extends DomainEntity<ICustomerInvoiceItemProps>
implements ICustomerInvoiceItem
{
private _subtotalPrice!: CustomerInvoiceItemSubtotalPrice; private _subtotalPrice!: CustomerInvoiceItemSubtotalPrice;
private _totalPrice!: CustomerInvoiceItemTotalPrice; private _totalPrice!: CustomerInvoiceItemTotalPrice;
public static create(props: ICustomerInvoiceItemProps, id?: UniqueID): Result<CustomerInvoiceItem, Error> { public static create(
props: ICustomerInvoiceItemProps,
id?: UniqueID
): Result<CustomerInvoiceItem, Error> {
const item = new CustomerInvoiceItem(props, id); const item = new CustomerInvoiceItem(props, id);
// Reglas de negocio / validaciones // Reglas de negocio / validaciones
@ -40,8 +46,8 @@ export class CustomerInvoiceItem extends DomainEntity<ICustomerInvoiceItemProps>
// ... // ...
// 🔹 Disparar evento de dominio "CustomerInvoiceItemCreatedEvent" // 🔹 Disparar evento de dominio "CustomerInvoiceItemCreatedEvent"
//const { customerCustomerInvoice } = props; //const { customerInvoice } = props;
//user.addDomainEvent(new CustomerInvoiceAuthenticatedEvent(id, customerCustomerInvoice.toString())); //user.addDomainEvent(new CustomerInvoiceAuthenticatedEvent(id, customerInvoice.toString()));
return Result.ok(item); return Result.ok(item);
} }

View File

@ -1,5 +1,5 @@
import { Collection } from "@repo/rdx-utils"; import { Collection } from "@repo/rdx-utils";
import { CustomerInvoiceItem } from "./customerCustomerInvoice-item"; import { CustomerInvoiceItem } from "./customer-invoice-item";
export class CustomerInvoiceItems extends Collection<CustomerInvoiceItem> { export class CustomerInvoiceItems extends Collection<CustomerInvoiceItem> {
public static create(items?: CustomerInvoiceItem[]): CustomerInvoiceItems { public static create(items?: CustomerInvoiceItem[]): CustomerInvoiceItems {

View File

@ -4,10 +4,13 @@ import { Collection, Result } from "@repo/rdx-utils";
import { CustomerInvoice } from "../aggregates"; import { CustomerInvoice } from "../aggregates";
export interface ICustomerInvoiceRepository { export interface ICustomerInvoiceRepository {
findAll(criteria: Criteria, transaction?: any): Promise<Result<Collection<CustomerInvoice>, Error>>; findAll(
criteria: Criteria,
transaction?: any
): Promise<Result<Collection<CustomerInvoice>, Error>>;
getById(id: UniqueID, transaction?: any): Promise<Result<CustomerInvoice, Error>>; getById(id: UniqueID, transaction?: any): Promise<Result<CustomerInvoice, Error>>;
deleteById(id: UniqueID, transaction?: any): Promise<Result<boolean, Error>>; deleteById(id: UniqueID, transaction?: any): Promise<Result<boolean, Error>>;
create(customerCustomerInvoice: CustomerInvoice, transaction?: any): Promise<void>; create(customerInvoice: CustomerInvoice, transaction?: any): Promise<void>;
update(customerCustomerInvoice: CustomerInvoice, transaction?: any): Promise<void>; update(customerInvoice: CustomerInvoice, transaction?: any): Promise<void>;
} }

View File

@ -1 +1 @@
export * from "./customerCustomerInvoice-repository.interface"; export * from "./customer-invoice-repository.interface";

View File

@ -1,23 +1,32 @@
import { Criteria } from "@repo/rdx-criteria/server"; import { Criteria } from "@repo/rdx-criteria/server";
import { UniqueID } from "@repo/rdx-ddd"; import { UniqueID } from "@repo/rdx-ddd";
import { Collection, Result } from "@repo/rdx-utils"; import { Collection, Result } from "@repo/rdx-utils";
import { ICustomerInvoiceProps, CustomerInvoice } from "../aggregates"; import { CustomerInvoice, ICustomerInvoiceProps } from "../aggregates";
export interface ICustomerInvoiceService { export interface ICustomerInvoiceService {
findCustomerInvoices(criteria: Criteria, transaction?: any): Promise<Result<Collection<CustomerInvoice>, Error>>; findCustomerInvoices(
findCustomerInvoiceById(customerCustomerInvoiceId: UniqueID, transaction?: any): Promise<Result<CustomerInvoice>>; criteria: Criteria,
transaction?: any
): Promise<Result<Collection<CustomerInvoice>, Error>>;
findCustomerInvoiceById(
customerInvoiceId: UniqueID,
transaction?: any
): Promise<Result<CustomerInvoice>>;
updateCustomerInvoiceById( updateCustomerInvoiceById(
customerCustomerInvoiceId: UniqueID, customerInvoiceId: UniqueID,
data: Partial<ICustomerInvoiceProps>, data: Partial<ICustomerInvoiceProps>,
transaction?: any transaction?: any
): Promise<Result<CustomerInvoice, Error>>; ): Promise<Result<CustomerInvoice, Error>>;
createCustomerInvoice( createCustomerInvoice(
customerCustomerInvoiceId: UniqueID, customerInvoiceId: UniqueID,
data: ICustomerInvoiceProps, data: ICustomerInvoiceProps,
transaction?: any transaction?: any
): Promise<Result<CustomerInvoice, Error>>; ): Promise<Result<CustomerInvoice, Error>>;
deleteCustomerInvoiceById(customerCustomerInvoiceId: UniqueID, transaction?: any): Promise<Result<boolean, Error>>; deleteCustomerInvoiceById(
customerInvoiceId: UniqueID,
transaction?: any
): Promise<Result<boolean, Error>>;
} }

View File

@ -2,9 +2,9 @@ import { Criteria } from "@repo/rdx-criteria/server";
import { UniqueID } from "@repo/rdx-ddd"; import { UniqueID } from "@repo/rdx-ddd";
import { Collection, Result } from "@repo/rdx-utils"; import { Collection, Result } from "@repo/rdx-utils";
import { Transaction } from "sequelize"; import { Transaction } from "sequelize";
import { ICustomerInvoiceProps, CustomerInvoice } from "../aggregates"; import { CustomerInvoice, ICustomerInvoiceProps } from "../aggregates";
import { ICustomerInvoiceRepository } from "../repositories"; import { ICustomerInvoiceRepository } from "../repositories";
import { ICustomerInvoiceService } from "./customerCustomerInvoice-service.interface"; import { ICustomerInvoiceService } from "./customer-invoice-service.interface";
export class CustomerInvoiceService implements ICustomerInvoiceService { export class CustomerInvoiceService implements ICustomerInvoiceService {
constructor(private readonly repo: ICustomerInvoiceRepository) {} constructor(private readonly repo: ICustomerInvoiceRepository) {}
@ -13,39 +13,42 @@ export class CustomerInvoiceService implements ICustomerInvoiceService {
criteria: Criteria, criteria: Criteria,
transaction?: Transaction transaction?: Transaction
): Promise<Result<Collection<CustomerInvoice>, Error>> { ): Promise<Result<Collection<CustomerInvoice>, Error>> {
const customerCustomerInvoicesOrError = await this.repo.findAll(criteria, transaction); const customerInvoicesOrError = await this.repo.findAll(criteria, transaction);
if (customerCustomerInvoicesOrError.isFailure) { if (customerInvoicesOrError.isFailure) {
return Result.fail(customerCustomerInvoicesOrError.error); return Result.fail(customerInvoicesOrError.error);
} }
// Solo devolver usuarios activos // Solo devolver usuarios activos
//const allCustomerInvoices = customerCustomerInvoicesOrError.data.filter((customerCustomerInvoice) => customerCustomerInvoice.isActive); //const allCustomerInvoices = customerInvoicesOrError.data.filter((customerInvoice) => customerInvoice.isActive);
//return Result.ok(new Collection(allCustomerInvoices)); //return Result.ok(new Collection(allCustomerInvoices));
return customerCustomerInvoicesOrError; return customerInvoicesOrError;
} }
async findCustomerInvoiceById(customerCustomerInvoiceId: UniqueID, transaction?: Transaction): Promise<Result<CustomerInvoice>> { async findCustomerInvoiceById(
return await this.repo.getById(customerCustomerInvoiceId, transaction); customerInvoiceId: UniqueID,
transaction?: Transaction
): Promise<Result<CustomerInvoice>> {
return await this.repo.getById(customerInvoiceId, transaction);
} }
async updateCustomerInvoiceById( async updateCustomerInvoiceById(
customerCustomerInvoiceId: UniqueID, customerInvoiceId: UniqueID,
data: Partial<ICustomerInvoiceProps>, data: Partial<ICustomerInvoiceProps>,
transaction?: Transaction transaction?: Transaction
): Promise<Result<CustomerInvoice, Error>> { ): Promise<Result<CustomerInvoice, Error>> {
// Verificar si la factura existe // Verificar si la factura existe
const customerCustomerInvoiceOrError = await this.repo.getById(customerCustomerInvoiceId, transaction); const customerInvoiceOrError = await this.repo.getById(customerInvoiceId, transaction);
if (customerCustomerInvoiceOrError.isFailure) { if (customerInvoiceOrError.isFailure) {
return Result.fail(new Error("CustomerInvoice not found")); return Result.fail(new Error("CustomerInvoice not found"));
} }
return Result.fail(new Error("No implementado")); return Result.fail(new Error("No implementado"));
/*const updatedCustomerInvoiceOrError = CustomerInvoice.update(customerCustomerInvoiceOrError.data, data); /*const updatedCustomerInvoiceOrError = CustomerInvoice.update(customerInvoiceOrError.data, data);
if (updatedCustomerInvoiceOrError.isFailure) { if (updatedCustomerInvoiceOrError.isFailure) {
return Result.fail( return Result.fail(
new Error(`Error updating customerCustomerInvoice: ${updatedCustomerInvoiceOrError.error.message}`) new Error(`Error updating customerInvoice: ${updatedCustomerInvoiceOrError.error.message}`)
); );
} }
@ -56,19 +59,21 @@ export class CustomerInvoiceService implements ICustomerInvoiceService {
} }
async createCustomerInvoice( async createCustomerInvoice(
customerCustomerInvoiceId: UniqueID, customerInvoiceId: UniqueID,
data: ICustomerInvoiceProps, data: ICustomerInvoiceProps,
transaction?: Transaction transaction?: Transaction
): Promise<Result<CustomerInvoice, Error>> { ): Promise<Result<CustomerInvoice, Error>> {
// Verificar si la factura existe // Verificar si la factura existe
const customerCustomerInvoiceOrError = await this.repo.getById(customerCustomerInvoiceId, transaction); const customerInvoiceOrError = await this.repo.getById(customerInvoiceId, transaction);
if (customerCustomerInvoiceOrError.isSuccess) { if (customerInvoiceOrError.isSuccess) {
return Result.fail(new Error("CustomerInvoice exists")); return Result.fail(new Error("CustomerInvoice exists"));
} }
const newCustomerInvoiceOrError = CustomerInvoice.create(data, customerCustomerInvoiceId); const newCustomerInvoiceOrError = CustomerInvoice.create(data, customerInvoiceId);
if (newCustomerInvoiceOrError.isFailure) { if (newCustomerInvoiceOrError.isFailure) {
return Result.fail(new Error(`Error creating customerCustomerInvoice: ${newCustomerInvoiceOrError.error.message}`)); return Result.fail(
new Error(`Error creating customerInvoice: ${newCustomerInvoiceOrError.error.message}`)
);
} }
const newCustomerInvoice = newCustomerInvoiceOrError.data; const newCustomerInvoice = newCustomerInvoiceOrError.data;
@ -78,9 +83,9 @@ export class CustomerInvoiceService implements ICustomerInvoiceService {
} }
async deleteCustomerInvoiceById( async deleteCustomerInvoiceById(
customerCustomerInvoiceId: UniqueID, customerInvoiceId: UniqueID,
transaction?: Transaction transaction?: Transaction
): Promise<Result<boolean, Error>> { ): Promise<Result<boolean, Error>> {
return this.repo.deleteById(customerCustomerInvoiceId, transaction); return this.repo.deleteById(customerInvoiceId, transaction);
} }
} }

View File

@ -1,2 +1,2 @@
export * from "./customerCustomerInvoice-service.interface"; export * from "./customer-invoice-service.interface";
export * from "./customerCustomerInvoice.service"; export * from "./customer-invoice.service";

View File

@ -1,10 +1,10 @@
export * from "./customerCustomerInvoice-address-type"; export * from "./customer-invoice-address-type";
export * from "./customerCustomerInvoice-item-description"; export * from "./customer-invoice-item-description";
export * from "./customerCustomerInvoice-item-discount"; export * from "./customer-invoice-item-discount";
export * from "./customerCustomerInvoice-item-quantity"; export * from "./customer-invoice-item-quantity";
export * from "./customerCustomerInvoice-item-subtotal-price"; export * from "./customer-invoice-item-subtotal-price";
export * from "./customerCustomerInvoice-item-total-price"; export * from "./customer-invoice-item-total-price";
export * from "./customerCustomerInvoice-item-unit-price"; export * from "./customer-invoice-item-unit-price";
export * from "./customerCustomerInvoice-number"; export * from "./customer-invoice-number";
export * from "./customerCustomerInvoice-serie"; export * from "./customer-invoice-serie";
export * from "./customerCustomerInvoice-status"; export * from "./customer-invoice-status";

View File

@ -1,20 +1,22 @@
import { IModuleServer, ModuleParams } from "@erp/core/api"; import { IModuleServer, ModuleParams } from "@erp/core/api";
import { customerCustomerInvoicesRouter, models } from "./infrastructure"; import { customerInvoicesRouter, models } from "./infrastructure";
export const customerCustomerInvoicesAPIModule: IModuleServer = { export const customerInvoicesAPIModule: IModuleServer = {
name: "customerCustomerInvoices", name: "customer-invoices",
version: "1.0.0", version: "1.0.0",
dependencies: [], dependencies: [],
init(params: ModuleParams) { init(params: ModuleParams) {
// const contacts = getService<ContactsService>("contacts"); // const contacts = getService<ContactsService>("contacts");
const { logger } = params; const { logger } = params;
customerCustomerInvoicesRouter(params); customerInvoicesRouter(params);
logger.info("🚀 CustomerInvoices module initialized", { label: "customerCustomerInvoices" }); logger.info("🚀 CustomerInvoices module initialized", { label: "customer-invoices" });
}, },
registerDependencies(params) { registerDependencies(params) {
const { database, logger } = params; const { database, logger } = params;
logger.info("🚀 CustomerInvoices module dependencies registered", { label: "customerCustomerInvoices" }); logger.info("🚀 CustomerInvoices module dependencies registered", {
label: "customer-invoices",
});
return { return {
models, models,
services: { services: {
@ -24,3 +26,5 @@ export const customerCustomerInvoicesAPIModule: IModuleServer = {
}; };
}, },
}; };
export default customerInvoicesAPIModule;

View File

@ -1,13 +1,14 @@
import { ModuleParams } from "@erp/core/api"; import { ILogger, ModuleParams } from "@erp/core/api";
import { Application, NextFunction, Request, Response, Router } from "express"; import { Application, NextFunction, Request, Response, Router } from "express";
import { Sequelize } from "sequelize"; import { Sequelize } from "sequelize";
import { buildListCustomerInvoicesController } from "../../presentation"; import { buildListCustomerInvoicesController } from "../../presentation";
export const customerCustomerInvoicesRouter = (params: ModuleParams) => { export const customerInvoicesRouter = (params: ModuleParams) => {
const { app, database, baseRoutePath } = params as { const { app, database, baseRoutePath, logger } = params as {
app: Application; app: Application;
database: Sequelize; database: Sequelize;
baseRoutePath: string; baseRoutePath: string;
logger: ILogger;
}; };
const routes: Router = Router({ mergeParams: true }); const routes: Router = Router({ mergeParams: true });
@ -21,10 +22,10 @@ export const customerCustomerInvoicesRouter = (params: ModuleParams) => {
} }
); );
app.use(`${baseRoutePath}/customerCustomerInvoices`, routes); app.use(`${baseRoutePath}/customer-invoices`, routes);
/*routes.get( /*routes.get(
"/:customerCustomerInvoiceId", "/:customerInvoiceId",
//checkTabContext, //checkTabContext,
//checkUser, //checkUser,
(req: Request, res: Response, next: NextFunction) => { (req: Request, res: Response, next: NextFunction) => {
@ -43,7 +44,7 @@ export const customerCustomerInvoicesRouter = (params: ModuleParams) => {
); );
routes.put( routes.put(
"/:customerCustomerInvoiceId", "/:customerInvoiceId",
validateAndParseBody(IUpdateCustomerInvoiceRequestSchema), validateAndParseBody(IUpdateCustomerInvoiceRequestSchema),
checkTabContext, checkTabContext,
//checkUser, //checkUser,
@ -53,7 +54,7 @@ export const customerCustomerInvoicesRouter = (params: ModuleParams) => {
); );
routes.delete( routes.delete(
"/:customerCustomerInvoiceId", "/:customerInvoiceId",
validateAndParseBody(IDeleteCustomerInvoiceRequestSchema), validateAndParseBody(IDeleteCustomerInvoiceRequestSchema),
checkTabContext, checkTabContext,
//checkUser, //checkUser,

View File

@ -1 +1 @@
export * from "./customerInvoices.routes"; export * from "./customer-invoices.routes";

View File

@ -10,13 +10,25 @@ import {
CustomerInvoiceItemQuantity, CustomerInvoiceItemQuantity,
CustomerInvoiceItemUnitPrice, CustomerInvoiceItemUnitPrice,
} from "../../domain"; } from "../../domain";
import { CustomerInvoiceItemCreationAttributes, CustomerInvoiceItemModel, CustomerInvoiceModel } from "../sequelize"; import {
CustomerInvoiceItemCreationAttributes,
CustomerInvoiceItemModel,
CustomerInvoiceModel,
} from "../sequelize";
export interface ICustomerInvoiceItemMapper export interface ICustomerInvoiceItemMapper
extends ISequelizeMapper<CustomerInvoiceItemModel, CustomerInvoiceItemCreationAttributes, CustomerInvoiceItem> {} extends ISequelizeMapper<
CustomerInvoiceItemModel,
CustomerInvoiceItemCreationAttributes,
CustomerInvoiceItem
> {}
export class CustomerInvoiceItemMapper export class CustomerInvoiceItemMapper
extends SequelizeMapper<CustomerInvoiceItemModel, CustomerInvoiceItemCreationAttributes, CustomerInvoiceItem> extends SequelizeMapper<
CustomerInvoiceItemModel,
CustomerInvoiceItemCreationAttributes,
CustomerInvoiceItem
>
implements ICustomerInvoiceItemMapper implements ICustomerInvoiceItemMapper
{ {
public mapToDomain( public mapToDomain(
@ -50,7 +62,7 @@ export class CustomerInvoiceItemMapper
const unitPriceOrError = CustomerInvoiceItemUnitPrice.create({ const unitPriceOrError = CustomerInvoiceItemUnitPrice.create({
amount: source.unit_price_amount, amount: source.unit_price_amount,
scale: source.unit_price_scale, scale: source.unit_price_scale,
currency_code: sourceParent.customerCustomerInvoice_currency, currency_code: sourceParent.invoice_currency,
}); });
if (unitPriceOrError.isFailure) { if (unitPriceOrError.isFailure) {
return Result.fail(unitPriceOrError.error); return Result.fail(unitPriceOrError.error);
@ -101,7 +113,7 @@ export class CustomerInvoiceItemMapper
const lineData = { const lineData = {
parent_id: undefined, parent_id: undefined,
customerCustomerInvoice_id: sourceParent.id.toPrimitive(), invoice_id: sourceParent.id.toPrimitive(),
item_type: "simple", item_type: "simple",
position: index, position: index,

View File

@ -1,37 +1,49 @@
import { ISequelizeMapper, MapperParamsType, SequelizeMapper } from "@erp/core/api"; import { ISequelizeMapper, MapperParamsType, SequelizeMapper } from "@erp/core/api";
import { UniqueID, UtcDate } from "@repo/rdx-ddd"; import { UniqueID, UtcDate } from "@repo/rdx-ddd";
import { Result } from "@repo/rdx-utils"; import { Result } from "@repo/rdx-utils";
import { CustomerInvoice, CustomerInvoiceNumber, CustomerInvoiceSerie, CustomerInvoiceStatus } from "../../domain"; import {
CustomerInvoice,
CustomerInvoiceNumber,
CustomerInvoiceSerie,
CustomerInvoiceStatus,
} from "../../domain";
import { CustomerInvoiceCreationAttributes, CustomerInvoiceModel } from "../sequelize"; import { CustomerInvoiceCreationAttributes, CustomerInvoiceModel } from "../sequelize";
import { CustomerInvoiceItemMapper } from "./customerCustomerInvoice-item.mapper"; import { CustomerInvoiceItemMapper } from "./customer-invoice-item.mapper";
export interface ICustomerInvoiceMapper export interface ICustomerInvoiceMapper
extends ISequelizeMapper<CustomerInvoiceModel, CustomerInvoiceCreationAttributes, CustomerInvoice> {} extends ISequelizeMapper<
CustomerInvoiceModel,
CustomerInvoiceCreationAttributes,
CustomerInvoice
> {}
export class CustomerInvoiceMapper export class CustomerInvoiceMapper
extends SequelizeMapper<CustomerInvoiceModel, CustomerInvoiceCreationAttributes, CustomerInvoice> extends SequelizeMapper<CustomerInvoiceModel, CustomerInvoiceCreationAttributes, CustomerInvoice>
implements ICustomerInvoiceMapper implements ICustomerInvoiceMapper
{ {
private customerCustomerInvoiceItemMapper: CustomerInvoiceItemMapper; private customerInvoiceItemMapper: CustomerInvoiceItemMapper;
constructor() { constructor() {
super(); super();
this.customerCustomerInvoiceItemMapper = new CustomerInvoiceItemMapper(); // Instanciar el mapper de items this.customerInvoiceItemMapper = new CustomerInvoiceItemMapper(); // Instanciar el mapper de items
} }
public mapToDomain(source: CustomerInvoiceModel, params?: MapperParamsType): Result<CustomerInvoice, Error> { public mapToDomain(
source: CustomerInvoiceModel,
params?: MapperParamsType
): Result<CustomerInvoice, Error> {
const idOrError = UniqueID.create(source.id); const idOrError = UniqueID.create(source.id);
const statusOrError = CustomerInvoiceStatus.create(source.customerCustomerInvoice_status); const statusOrError = CustomerInvoiceStatus.create(source.invoice_status);
const customerCustomerInvoiceSeriesOrError = CustomerInvoiceSerie.create(source.customerCustomerInvoice_series); const customerInvoiceSeriesOrError = CustomerInvoiceSerie.create(source.invoice_series);
const customerCustomerInvoiceNumberOrError = CustomerInvoiceNumber.create(source.customerCustomerInvoice_number); const customerInvoiceNumberOrError = CustomerInvoiceNumber.create(source.invoice_number);
const issueDateOrError = UtcDate.create(source.issue_date); const issueDateOrError = UtcDate.create(source.issue_date);
const operationDateOrError = UtcDate.create(source.operation_date); const operationDateOrError = UtcDate.create(source.operation_date);
const result = Result.combine([ const result = Result.combine([
idOrError, idOrError,
statusOrError, statusOrError,
customerCustomerInvoiceSeriesOrError, customerInvoiceSeriesOrError,
customerCustomerInvoiceNumberOrError, customerInvoiceNumberOrError,
issueDateOrError, issueDateOrError,
operationDateOrError, operationDateOrError,
]); ]);
@ -41,7 +53,7 @@ export class CustomerInvoiceMapper
} }
// Mapear los items de la factura // Mapear los items de la factura
const itemsOrErrors = this.customerCustomerInvoiceItemMapper.mapArrayToDomain(source.items, { const itemsOrErrors = this.customerInvoiceItemMapper.mapArrayToDomain(source.items, {
sourceParent: source, sourceParent: source,
...params, ...params,
}); });
@ -50,37 +62,40 @@ export class CustomerInvoiceMapper
return Result.fail(itemsOrErrors.error); return Result.fail(itemsOrErrors.error);
} }
const customerCustomerInvoiceCurrency = source.customerCustomerInvoice_currency || "EUR"; const customerInvoiceCurrency = source.invoice_currency || "EUR";
return CustomerInvoice.create( return CustomerInvoice.create(
{ {
status: statusOrError.data, status: statusOrError.data,
customerCustomerInvoiceSeries: customerCustomerInvoiceSeriesOrError.data, customerInvoiceSeries: customerInvoiceSeriesOrError.data,
customerCustomerInvoiceNumber: customerCustomerInvoiceNumberOrError.data, customerInvoiceNumber: customerInvoiceNumberOrError.data,
issueDate: issueDateOrError.data, issueDate: issueDateOrError.data,
operationDate: operationDateOrError.data, operationDate: operationDateOrError.data,
customerCustomerInvoiceCurrency, customerInvoiceCurrency,
items: itemsOrErrors.data, items: itemsOrErrors.data,
}, },
idOrError.data idOrError.data
); );
} }
public mapToPersistence(source: CustomerInvoice, params?: MapperParamsType): CustomerInvoiceCreationAttributes { public mapToPersistence(
source: CustomerInvoice,
params?: MapperParamsType
): CustomerInvoiceCreationAttributes {
const subtotal = source.calculateSubtotal(); const subtotal = source.calculateSubtotal();
const total = source.calculateTotal(); const total = source.calculateTotal();
const items = this.customerCustomerInvoiceItemMapper.mapCollectionToPersistence(source.items, params); const items = this.customerInvoiceItemMapper.mapCollectionToPersistence(source.items, params);
return { return {
id: source.id.toString(), id: source.id.toString(),
customerCustomerInvoice_status: source.status.toPrimitive(), invoice_status: source.status.toPrimitive(),
customerCustomerInvoice_series: source.customerCustomerInvoiceSeries.toPrimitive(), invoice_series: source.customerInvoiceSeries.toPrimitive(),
customerCustomerInvoice_number: source.customerCustomerInvoiceNumber.toPrimitive(), invoice_number: source.customerInvoiceNumber.toPrimitive(),
issue_date: source.issueDate.toPrimitive(), issue_date: source.issueDate.toPrimitive(),
operation_date: source.operationDate.toPrimitive(), operation_date: source.operationDate.toPrimitive(),
customerCustomerInvoice_language: "es", invoice_language: "es",
customerCustomerInvoice_currency: source.customerCustomerInvoiceCurrency || "EUR", invoice_currency: source.customerInvoiceCurrency || "EUR",
subtotal_amount: subtotal.amount, subtotal_amount: subtotal.amount,
subtotal_scale: subtotal.scale, subtotal_scale: subtotal.scale,
@ -93,5 +108,5 @@ export class CustomerInvoiceMapper
} }
} }
const customerCustomerInvoiceMapper: CustomerInvoiceMapper = new CustomerInvoiceMapper(); const customerInvoiceMapper: CustomerInvoiceMapper = new CustomerInvoiceMapper();
export { customerCustomerInvoiceMapper }; export { customerInvoiceMapper };

View File

@ -12,7 +12,7 @@ import { CustomerInvoiceParticipant_Model, TCreationCustomerInvoiceParticipant_M
import { import {
ICustomerInvoiceParticipantAddressMapper, ICustomerInvoiceParticipantAddressMapper,
createCustomerInvoiceParticipantAddressMapper, createCustomerInvoiceParticipantAddressMapper,
} from "./customerCustomerInvoiceParticipantAddress.mapper"; } from "./customer-invoiceParticipantAddress.mapper";
export interface ICustomerInvoiceParticipantMapper export interface ICustomerInvoiceParticipantMapper
extends ISequelizeMapper< extends ISequelizeMapper<
@ -99,7 +99,7 @@ class CustomerInvoiceParticipantMapper
const { sourceParent } = params; const { sourceParent } = params;
return { return {
customerCustomerInvoice_id: sourceParent.id.toPrimitive(), customerInvoice_id: sourceParent.id.toPrimitive(),
participant_id: source.id.toPrimitive(), participant_id: source.id.toPrimitive(),
tin: source.tin.toPrimitive(), tin: source.tin.toPrimitive(),

View File

@ -1 +1 @@
export * from "./customerCustomerInvoice.mapper"; export * from "./customer-invoice.mapper";

View File

@ -7,19 +7,19 @@ import {
NonAttribute, NonAttribute,
Sequelize, Sequelize,
} from "sequelize"; } from "sequelize";
import { CustomerInvoiceModel } from "./customerCustomerInvoice.model"; import { CustomerInvoiceModel } from "./customer-invoice.model";
export type CustomerInvoiceItemCreationAttributes = InferCreationAttributes< export type CustomerInvoiceItemCreationAttributes = InferCreationAttributes<
CustomerInvoiceItemModel, CustomerInvoiceItemModel,
{ omit: "customerCustomerInvoice" } { omit: "invoice" }
>; >;
export class CustomerInvoiceItemModel extends Model< export class CustomerInvoiceItemModel extends Model<
InferAttributes<CustomerInvoiceItemModel>, InferAttributes<CustomerInvoiceItemModel>,
InferCreationAttributes<CustomerInvoiceItemModel, { omit: "customerCustomerInvoice" }> InferCreationAttributes<CustomerInvoiceItemModel, { omit: "invoice" }>
> { > {
declare item_id: string; declare item_id: string;
declare customerCustomerInvoice_id: string; declare invoice_id: string;
declare parent_id: CreationOptional<string>; declare parent_id: CreationOptional<string>;
declare position: number; declare position: number;
@ -42,14 +42,14 @@ export class CustomerInvoiceItemModel extends Model<
declare total_amount: CreationOptional<number>; declare total_amount: CreationOptional<number>;
declare total_scale: CreationOptional<number>; declare total_scale: CreationOptional<number>;
declare customerCustomerInvoice: NonAttribute<CustomerInvoiceModel>; declare invoice: NonAttribute<CustomerInvoiceModel>;
static associate(database: Sequelize) { static associate(database: Sequelize) {
/*const { CustomerInvoice_Model, CustomerInvoiceItem_Model } = connection.models; /*const { Invoice_Model, CustomerInvoiceItem_Model } = connection.models;
CustomerInvoiceItem_Model.belongsTo(CustomerInvoice_Model, { CustomerInvoiceItem_Model.belongsTo(Invoice_Model, {
as: "customerCustomerInvoice", as: "customerInvoice",
foreignKey: "customerCustomerInvoice_id", foreignKey: "invoice_id",
onDelete: "CASCADE", onDelete: "CASCADE",
});*/ });*/
} }
@ -62,7 +62,7 @@ export default (database: Sequelize) => {
type: new DataTypes.UUID(), type: new DataTypes.UUID(),
primaryKey: true, primaryKey: true,
}, },
customerCustomerInvoice_id: { invoice_id: {
type: new DataTypes.UUID(), type: new DataTypes.UUID(),
primaryKey: true, primaryKey: true,
}, },
@ -159,7 +159,7 @@ export default (database: Sequelize) => {
}, },
{ {
sequelize: database, sequelize: database,
tableName: "customerCustomerInvoice_items", tableName: "customer_invoice_items",
defaultScope: {}, defaultScope: {},

View File

@ -7,9 +7,15 @@ import {
NonAttribute, NonAttribute,
Sequelize, Sequelize,
} from "sequelize"; } from "sequelize";
import { CustomerInvoiceItemCreationAttributes, CustomerInvoiceItemModel } from "./customerCustomerInvoice-item.model"; import {
CustomerInvoiceItemCreationAttributes,
CustomerInvoiceItemModel,
} from "./customer-invoice-item.model";
export type CustomerInvoiceCreationAttributes = InferCreationAttributes<CustomerInvoiceModel, { omit: "items" }> & { export type CustomerInvoiceCreationAttributes = InferCreationAttributes<
CustomerInvoiceModel,
{ omit: "items" }
> & {
items?: CustomerInvoiceItemCreationAttributes[]; items?: CustomerInvoiceItemCreationAttributes[];
}; };
@ -19,13 +25,13 @@ export class CustomerInvoiceModel extends Model<
> { > {
declare id: string; declare id: string;
declare customerCustomerInvoice_status: string; declare invoice_status: string;
declare customerCustomerInvoice_series: CreationOptional<string>; declare invoice_series: CreationOptional<string>;
declare customerCustomerInvoice_number: CreationOptional<string>; declare invoice_number: CreationOptional<string>;
declare issue_date: CreationOptional<string>; declare issue_date: CreationOptional<string>;
declare operation_date: CreationOptional<string>; declare operation_date: CreationOptional<string>;
declare customerCustomerInvoice_language: string; declare invoice_language: string;
declare customerCustomerInvoice_currency: string; declare invoice_currency: string;
// Subtotal // Subtotal
declare subtotal_amount: CreationOptional<number>; declare subtotal_amount: CreationOptional<number>;
@ -44,7 +50,7 @@ export class CustomerInvoiceModel extends Model<
CustomerInvoiceModel.hasMany(CustomerInvoiceItemModel, { CustomerInvoiceModel.hasMany(CustomerInvoiceItemModel, {
as: "items", as: "items",
foreignKey: "customerCustomerInvoice_id", foreignKey: "invoice_id",
onDelete: "CASCADE", onDelete: "CASCADE",
}); });
} }
@ -58,18 +64,18 @@ export default (database: Sequelize) => {
primaryKey: true, primaryKey: true,
}, },
customerCustomerInvoice_status: { invoice_status: {
type: new DataTypes.STRING(), type: new DataTypes.STRING(),
allowNull: false, allowNull: false,
}, },
customerCustomerInvoice_series: { invoice_series: {
type: new DataTypes.STRING(), type: new DataTypes.STRING(),
allowNull: true, allowNull: true,
defaultValue: null, defaultValue: null,
}, },
customerCustomerInvoice_number: { invoice_number: {
type: new DataTypes.STRING(), type: new DataTypes.STRING(),
allowNull: true, allowNull: true,
defaultValue: null, defaultValue: null,
@ -87,12 +93,12 @@ export default (database: Sequelize) => {
defaultValue: null, defaultValue: null,
}, },
customerCustomerInvoice_language: { invoice_language: {
type: new DataTypes.STRING(), type: new DataTypes.STRING(),
allowNull: false, allowNull: false,
}, },
customerCustomerInvoice_currency: { invoice_currency: {
type: new DataTypes.STRING(3), // ISO 4217 type: new DataTypes.STRING(3), // ISO 4217
allowNull: false, allowNull: false,
}, },
@ -121,7 +127,7 @@ export default (database: Sequelize) => {
}, },
{ {
sequelize: database, sequelize: database,
tableName: "customerCustomerInvoices", tableName: "customer_invoices",
paranoid: true, // softs deletes paranoid: true, // softs deletes
timestamps: true, timestamps: true,
@ -130,7 +136,7 @@ export default (database: Sequelize) => {
updatedAt: "updated_at", updatedAt: "updated_at",
deletedAt: "deleted_at", deletedAt: "deleted_at",
indexes: [{ unique: true, fields: ["customerCustomerInvoice_number"] }], indexes: [{ unique: true, fields: ["invoice_number"] }],
whereMergeStrategy: "and", // <- cómo tratar el merge de un scope whereMergeStrategy: "and", // <- cómo tratar el merge de un scope

View File

@ -3,12 +3,15 @@ import { Criteria } from "@repo/rdx-criteria/server";
import { UniqueID } from "@repo/rdx-ddd"; import { UniqueID } from "@repo/rdx-ddd";
import { Collection, Result } from "@repo/rdx-utils"; import { Collection, Result } from "@repo/rdx-utils";
import { Sequelize, Transaction } from "sequelize"; import { Sequelize, Transaction } from "sequelize";
import { ICustomerInvoiceRepository, CustomerInvoice } from "../../domain"; import { CustomerInvoice, ICustomerInvoiceRepository } from "../../domain";
import { ICustomerInvoiceMapper } from "../mappers/customerCustomerInvoice.mapper"; import { ICustomerInvoiceMapper } from "../mappers/customer-invoice.mapper";
import { CustomerInvoiceItemModel } from "./customerCustomerInvoice-item.model"; import { CustomerInvoiceItemModel } from "./customer-invoice-item.model";
import { CustomerInvoiceModel } from "./customerCustomerInvoice.model"; import { CustomerInvoiceModel } from "./customer-invoice.model";
export class CustomerInvoiceRepository extends SequelizeRepository<CustomerInvoice> implements ICustomerInvoiceRepository { export class CustomerInvoiceRepository
extends SequelizeRepository<CustomerInvoice>
implements ICustomerInvoiceRepository
{
private readonly _mapper!: ICustomerInvoiceMapper; private readonly _mapper!: ICustomerInvoiceMapper;
/** /**
@ -27,11 +30,14 @@ export class CustomerInvoiceRepository extends SequelizeRepository<CustomerInvoi
this._mapper = mapper; this._mapper = mapper;
} }
async customerCustomerInvoiceExists(id: UniqueID, transaction?: Transaction): Promise<Result<boolean, Error>> { async customerInvoiceExists(
id: UniqueID,
transaction?: Transaction
): Promise<Result<boolean, Error>> {
try { try {
const _customerCustomerInvoice = await this._getById(CustomerInvoiceModel, id, {}, transaction); const _customerInvoice = await this._getById(CustomerInvoiceModel, id, {}, transaction);
return Result.ok(Boolean(id.equals(_customerCustomerInvoice.id))); return Result.ok(Boolean(id.equals(_customerInvoice.id)));
} catch (error: any) { } catch (error: any) {
return this._handleDatabaseError(error, this._customErrorMapper); return this._handleDatabaseError(error, this._customErrorMapper);
} }
@ -53,8 +59,6 @@ export class CustomerInvoiceRepository extends SequelizeRepository<CustomerInvoi
...this.convertCriteria(criteria), ...this.convertCriteria(criteria),
}); });
console.error("aqui");
return this._mapper.mapArrayToDomain(rawCustomerInvoices); return this._mapper.mapArrayToDomain(rawCustomerInvoices);
} catch (error: unknown) { } catch (error: unknown) {
console.error("Error in findAll", error); console.error("Error in findAll", error);
@ -95,13 +99,25 @@ export class CustomerInvoiceRepository extends SequelizeRepository<CustomerInvoi
} }
} }
async create(customerCustomerInvoice: CustomerInvoice, transaction?: Transaction): Promise<void> { async create(customerInvoice: CustomerInvoice, transaction?: Transaction): Promise<void> {
const customerCustomerInvoiceData = this._mapper.mapToPersistence(customerCustomerInvoice); const customerInvoiceData = this._mapper.mapToPersistence(customerInvoice);
await this._save(CustomerInvoiceModel, customerCustomerInvoice.id, customerCustomerInvoiceData, {}, transaction); await this._save(
CustomerInvoiceModel,
customerInvoice.id,
customerInvoiceData,
{},
transaction
);
} }
async update(customerCustomerInvoice: CustomerInvoice, transaction?: Transaction): Promise<void> { async update(customerInvoice: CustomerInvoice, transaction?: Transaction): Promise<void> {
const customerCustomerInvoiceData = this._mapper.mapToPersistence(customerCustomerInvoice); const customerInvoiceData = this._mapper.mapToPersistence(customerInvoice);
await this._save(CustomerInvoiceModel, customerCustomerInvoice.id, customerCustomerInvoiceData, {}, transaction); await this._save(
CustomerInvoiceModel,
customerInvoice.id,
customerInvoiceData,
{},
transaction
);
} }
} }

View File

@ -7,15 +7,15 @@ import {
NonAttribute, NonAttribute,
Sequelize, Sequelize,
} from "sequelize"; } from "sequelize";
import { CustomerInvoiceModel } from "./customerCustomerInvoice.model"; import { CustomerInvoiceModel } from "./customer-invoice.model";
import { import {
CustomerInvoiceParticipantAddress_Model, CustomerInvoiceParticipantAddress_Model,
TCreationCustomerInvoiceParticipantAddress_Model, TCreationCustomerInvoiceParticipantAddress_Model,
} from "./customerCustomerInvoiceParticipantAddress.mo.del.ts.bak"; } from "./customer-invoiceParticipantAddress.mo.del.ts.bak";
export type TCreationCustomerInvoiceParticipant_Model = InferCreationAttributes< export type TCreationCustomerInvoiceParticipant_Model = InferCreationAttributes<
CustomerInvoiceParticipant_Model, CustomerInvoiceParticipant_Model,
{ omit: "shippingAddress" | "billingAddress" | "customerCustomerInvoice" } { omit: "shippingAddress" | "billingAddress" | "customerInvoice" }
> & { > & {
billingAddress: TCreationCustomerInvoiceParticipantAddress_Model; billingAddress: TCreationCustomerInvoiceParticipantAddress_Model;
shippingAddress: TCreationCustomerInvoiceParticipantAddress_Model; shippingAddress: TCreationCustomerInvoiceParticipantAddress_Model;
@ -24,11 +24,11 @@ export type TCreationCustomerInvoiceParticipant_Model = InferCreationAttributes<
export class CustomerInvoiceParticipant_Model extends Model< export class CustomerInvoiceParticipant_Model extends Model<
InferAttributes< InferAttributes<
CustomerInvoiceParticipant_Model, CustomerInvoiceParticipant_Model,
{ omit: "shippingAddress" | "billingAddress" | "customerCustomerInvoice" } { omit: "shippingAddress" | "billingAddress" | "customerInvoice" }
>, >,
InferCreationAttributes< InferCreationAttributes<
CustomerInvoiceParticipant_Model, CustomerInvoiceParticipant_Model,
{ omit: "shippingAddress" | "billingAddress" | "customerCustomerInvoice" } { omit: "shippingAddress" | "billingAddress" | "customerInvoice" }
> >
> { > {
static associate(connection: Sequelize) { static associate(connection: Sequelize) {
@ -36,8 +36,8 @@ export class CustomerInvoiceParticipant_Model extends Model<
connection.models; connection.models;
CustomerInvoiceParticipant_Model.belongsTo(CustomerInvoice_Model, { CustomerInvoiceParticipant_Model.belongsTo(CustomerInvoice_Model, {
as: "customerCustomerInvoice", as: "customerInvoice",
foreignKey: "customerCustomerInvoice_id", foreignKey: "customerInvoice_id",
onDelete: "CASCADE", onDelete: "CASCADE",
}); });
@ -55,7 +55,7 @@ export class CustomerInvoiceParticipant_Model extends Model<
} }
declare participant_id: string; declare participant_id: string;
declare customerCustomerInvoice_id: string; declare customerInvoice_id: string;
declare tin: CreationOptional<string>; declare tin: CreationOptional<string>;
declare company_name: CreationOptional<string>; declare company_name: CreationOptional<string>;
declare first_name: CreationOptional<string>; declare first_name: CreationOptional<string>;
@ -64,7 +64,7 @@ export class CustomerInvoiceParticipant_Model extends Model<
declare shippingAddress?: NonAttribute<CustomerInvoiceParticipantAddress_Model>; declare shippingAddress?: NonAttribute<CustomerInvoiceParticipantAddress_Model>;
declare billingAddress?: NonAttribute<CustomerInvoiceParticipantAddress_Model>; declare billingAddress?: NonAttribute<CustomerInvoiceParticipantAddress_Model>;
declare customerCustomerInvoice?: NonAttribute<CustomerInvoiceModel>; declare customerInvoice?: NonAttribute<CustomerInvoiceModel>;
} }
export default (sequelize: Sequelize) => { export default (sequelize: Sequelize) => {
@ -74,7 +74,7 @@ export default (sequelize: Sequelize) => {
type: new DataTypes.UUID(), type: new DataTypes.UUID(),
primaryKey: true, primaryKey: true,
}, },
customerCustomerInvoice_id: { customerInvoice_id: {
type: new DataTypes.UUID(), type: new DataTypes.UUID(),
primaryKey: true, primaryKey: true,
}, },
@ -97,7 +97,7 @@ export default (sequelize: Sequelize) => {
}, },
{ {
sequelize, sequelize,
tableName: "customerCustomerInvoice_participants", tableName: "customerInvoice_participants",
timestamps: false, timestamps: false,
} }
); );

View File

@ -7,7 +7,7 @@ import {
NonAttribute, NonAttribute,
Sequelize, Sequelize,
} from "sequelize"; } from "sequelize";
import { CustomerInvoiceParticipant_Model } from "./customerCustomerInvoiceParticipant.mo.del.ts.bak"; import { CustomerInvoiceParticipant_Model } from "./customer-invoiceParticipant.mo.del.ts.bak";
export type TCreationCustomerInvoiceParticipantAddress_Model = InferCreationAttributes< export type TCreationCustomerInvoiceParticipantAddress_Model = InferCreationAttributes<
CustomerInvoiceParticipantAddress_Model, CustomerInvoiceParticipantAddress_Model,
@ -86,7 +86,7 @@ export default (sequelize: Sequelize) => {
}, },
{ {
sequelize, sequelize,
tableName: "customerCustomerInvoice_participant_addresses", tableName: "customerInvoice_participant_addresses",
} }
); );

View File

@ -1,9 +1,9 @@
import customerCustomerInvoiceItemModelInit from "./customerCustomerInvoice-item.model"; import customerInvoiceItemModelInit from "./customer-invoice-item.model";
import customerCustomerInvoiceModelInit from "./customerCustomerInvoice.model"; import customerInvoiceModelInit from "./customer-invoice.model";
export * from "./customerCustomerInvoice-item.model"; // exporta las clases, tipos export * from "./customer-invoice-item.model"; // exporta las clases, tipos
export * from "./customerCustomerInvoice.model"; export * from "./customer-invoice.model";
export * from "./customerCustomerInvoice.repository"; export * from "./customer-invoice.repository";
// Array de inicializadores para que registerModels() lo use // Array de inicializadores para que registerModels() lo use
export const models = [customerCustomerInvoiceItemModelInit, customerCustomerInvoiceModelInit]; export const models = [customerInvoiceItemModelInit, customerInvoiceModelInit];

View File

@ -1,4 +1,4 @@
import { DeleteCustomerInvoiceUseCase } from "@/contexts/customerCustomerInvoices/application"; import { DeleteCustomerInvoiceUseCase } from "@/contexts/customer-invoices/application";
import { ExpressController } from "@/core/common/presentation"; import { ExpressController } from "@/core/common/presentation";
export class DeleteCustomerInvoiceController extends ExpressController { export class DeleteCustomerInvoiceController extends ExpressController {

View File

@ -1,14 +1,14 @@
import { DeleteCustomerInvoiceUseCase } from "@/contexts/customerCustomerInvoices/application"; import { DeleteCustomerInvoiceUseCase } from "@/contexts/customer-invoices/application";
import { CustomerInvoiceService } from "@/contexts/customerCustomerInvoices/domain"; import { CustomerInvoiceService } from "@/contexts/customer-invoices/domain";
import { customerCustomerInvoiceRepository } from "@/contexts/customerCustomerInvoices/intrastructure"; import { customerInvoiceRepository } from "@/contexts/customer-invoices/intrastructure";
import { SequelizeTransactionManager } from "@/core/common/infrastructure"; import { SequelizeTransactionManager } from "@/core/common/infrastructure";
import { DeleteCustomerInvoiceController } from "./delete-customer-invoice.controller"; import { DeleteCustomerInvoiceController } from "./delete-customer-invoice.controller";
export const buildDeleteCustomerInvoiceController = () => { export const buildDeleteCustomerInvoiceController = () => {
const transactionManager = new SequelizeTransactionManager(); const transactionManager = new SequelizeTransactionManager();
const customerCustomerInvoiceService = new CustomerInvoiceService(customerCustomerInvoiceRepository); const customerInvoiceService = new CustomerInvoiceService(customerInvoiceRepository);
const useCase = new DeleteCustomerInvoiceUseCase(customerCustomerInvoiceService, transactionManager); const useCase = new DeleteCustomerInvoiceUseCase(customerInvoiceService, transactionManager);
return new DeleteCustomerInvoiceController(useCase); return new DeleteCustomerInvoiceController(useCase);
}; };

View File

@ -12,19 +12,22 @@ export class GetCustomerInvoiceController extends ExpressController {
} }
protected async executeImpl() { protected async executeImpl() {
const { customerCustomerInvoiceId } = this.req.params; const { customerInvoiceId } = this.req.params;
// Validar ID // Validar ID
const customerCustomerInvoiceIdOrError = UniqueID.create(customerCustomerInvoiceId); const customerInvoiceIdOrError = UniqueID.create(customerInvoiceId);
if (customerCustomerInvoiceIdOrError.isFailure) return this.invalidInputError("CustomerInvoice ID not valid"); if (customerInvoiceIdOrError.isFailure)
return this.invalidInputError("CustomerInvoice ID not valid");
const customerCustomerInvoiceOrError = await this.getCustomerInvoice.execute(customerCustomerInvoiceIdOrError.data); const customerInvoiceOrError = await this.getCustomerInvoice.execute(
customerInvoiceIdOrError.data
);
if (customerCustomerInvoiceOrError.isFailure) { if (customerInvoiceOrError.isFailure) {
return this.handleError(customerCustomerInvoiceOrError.error); return this.handleError(customerInvoiceOrError.error);
} }
return this.ok(this.presenter.toDTO(customerCustomerInvoiceOrError.data)); return this.ok(this.presenter.toDTO(customerInvoiceOrError.data));
} }
private handleError(error: Error) { private handleError(error: Error) {

View File

@ -1,23 +1,18 @@
import { SequelizeTransactionManager } from "@erp/core/api"; import { SequelizeTransactionManager } from "@erp/core/api";
import { Sequelize } from "sequelize"; import { Sequelize } from "sequelize";
import { CustomerInvoiceService } from "../../domain"; import { CustomerInvoiceService } from "../../domain";
import { CustomerInvoiceRepository, customerCustomerInvoiceMapper } from "../../infrastructure"; import { CustomerInvoiceRepository, customerInvoiceMapper } from "../../infrastructure";
import { GetCustomerInvoiceUseCase } from "../../application"; import { GetCustomerInvoiceUseCase } from "../../application";
import { GetCustomerInvoiceController } from "./get-customer-invoice.controller"; import { GetCustomerInvoiceController } from "./get-invoice.controller";
import { getCustomerInvoicePresenter } from "./presenter"; import { getCustomerInvoicePresenter } from "./presenter";
export const buildGetCustomerInvoiceController = (database: Sequelize) => { export const buildGetCustomerInvoiceController = (database: Sequelize) => {
const transactionManager = new SequelizeTransactionManager(database); const transactionManager = new SequelizeTransactionManager(database);
const customerCustomerInvoiceRepository = new CustomerInvoiceRepository( const customerInvoiceRepository = new CustomerInvoiceRepository(database, customerInvoiceMapper);
database, const customerInvoiceService = new CustomerInvoiceService(customerInvoiceRepository);
customerCustomerInvoiceMapper
);
const customerCustomerInvoiceService = new CustomerInvoiceService(
customerCustomerInvoiceRepository
);
const useCase = new GetCustomerInvoiceUseCase(customerCustomerInvoiceService, transactionManager); const useCase = new GetCustomerInvoiceUseCase(customerInvoiceService, transactionManager);
const presenter = getCustomerInvoicePresenter; const presenter = getCustomerInvoicePresenter;
return new GetCustomerInvoiceController(useCase, presenter); return new GetCustomerInvoiceController(useCase, presenter);

View File

@ -2,7 +2,7 @@ import { CustomerInvoiceItem } from "#/server/domain";
import { IInvoicingContext } from "#/server/intrastructure"; import { IInvoicingContext } from "#/server/intrastructure";
import { Collection } from "@rdx/core"; import { Collection } from "@rdx/core";
export const customerCustomerInvoiceItemPresenter = (items: Collection<CustomerInvoiceItem>, context: IInvoicingContext) => export const customerInvoiceItemPresenter = (items: Collection<CustomerInvoiceItem>, context: IInvoicingContext) =>
items.totalCount > 0 items.totalCount > 0
? items.items.map((item: CustomerInvoiceItem) => ({ ? items.items.map((item: CustomerInvoiceItem) => ({
description: item.description.toString(), description: item.description.toString(),

View File

@ -1,27 +1,27 @@
import { IGetCustomerInvoiceResponseDTO } from "../../../../../common/dto"; import { IGetCustomerInvoiceResponseDTO } from "../../../../common/dto";
import { CustomerInvoice, CustomerInvoiceItem } from "../../../../domain"; import { CustomerInvoice, CustomerInvoiceItem } from "../../../domain";
export interface IGetCustomerInvoicePresenter { export interface IGetCustomerInvoicePresenter {
toDTO: (customerCustomerInvoice: CustomerInvoice) => IGetCustomerInvoiceResponseDTO; toDTO: (customerInvoice: CustomerInvoice) => IGetCustomerInvoiceResponseDTO;
} }
export const getCustomerInvoicePresenter: IGetCustomerInvoicePresenter = { export const getCustomerInvoicePresenter: IGetCustomerInvoicePresenter = {
toDTO: (customerCustomerInvoice: CustomerInvoice): IGetCustomerInvoiceResponseDTO => ({ toDTO: (customerInvoice: CustomerInvoice): IGetCustomerInvoiceResponseDTO => ({
id: customerCustomerInvoice.id.toPrimitive(), id: customerInvoice.id.toPrimitive(),
customerCustomerInvoice_status: customerCustomerInvoice.status.toString(), customerInvoice_status: customerInvoice.status.toString(),
customerCustomerInvoice_number: customerCustomerInvoice.customerCustomerInvoiceNumber.toString(), customerInvoice_number: customerInvoice.customerInvoiceNumber.toString(),
customerCustomerInvoice_series: customerCustomerInvoice.customerCustomerInvoiceSeries.toString(), customerInvoice_series: customerInvoice.customerInvoiceSeries.toString(),
issue_date: customerCustomerInvoice.issueDate.toDateString(), issue_date: customerInvoice.issueDate.toDateString(),
operation_date: customerCustomerInvoice.operationDate.toDateString(), operation_date: customerInvoice.operationDate.toDateString(),
language_code: "ES", language_code: "ES",
currency: customerCustomerInvoice.customerCustomerInvoiceCurrency.toString(), currency: customerInvoice.customerInvoiceCurrency.toString(),
subtotal: customerCustomerInvoice.calculateSubtotal().toPrimitive(), subtotal: customerInvoice.calculateSubtotal().toPrimitive(),
total: customerCustomerInvoice.calculateTotal().toPrimitive(), total: customerInvoice.calculateTotal().toPrimitive(),
items: items:
customerCustomerInvoice.items.size() > 0 customerInvoice.items.size() > 0
? customerCustomerInvoice.items.map((item: CustomerInvoiceItem) => ({ ? customerInvoice.items.map((item: CustomerInvoiceItem) => ({
description: item.description.toString(), description: item.description.toString(),
quantity: item.quantity.toPrimitive(), quantity: item.quantity.toPrimitive(),
unit_measure: "", unit_measure: "",
@ -32,10 +32,10 @@ export const getCustomerInvoicePresenter: IGetCustomerInvoicePresenter = {
})) }))
: [], : [],
//sender: {}, //await CustomerInvoiceParticipantPresenter(customerCustomerInvoice.senderId, context), //sender: {}, //await CustomerInvoiceParticipantPresenter(customerInvoice.senderId, context),
/*recipient: await CustomerInvoiceParticipantPresenter(customerCustomerInvoice.recipient, context), /*recipient: await CustomerInvoiceParticipantPresenter(customerInvoice.recipient, context),
items: customerCustomerInvoiceItemPresenter(customerCustomerInvoice.items, context), items: customerInvoiceItemPresenter(customerInvoice.items, context),
payment_term: { payment_term: {
payment_type: "", payment_type: "",
@ -43,7 +43,7 @@ export const getCustomerInvoicePresenter: IGetCustomerInvoicePresenter = {
}, },
due_amount: { due_amount: {
currency: customerCustomerInvoice.currency.toString(), currency: customerInvoice.currency.toString(),
precision: 2, precision: 2,
amount: 0, amount: 0,
}, },

View File

@ -1 +1 @@
export * from "./get-customer-invoice.presenter"; export * from "./get-invoice.presenter";

View File

@ -1,5 +1,5 @@
//export * from "./create-customer-invoice"; //export * from "./create-customer-invoice";
//export * from "./delete-customer-invoice"; //export * from "./delete-customer-invoice";
export * from "./get-customer-invoice"; export * from "./get-invoice";
export * from "./list-customer-invoices"; export * from "./list-invoices";
///export * from "./update-customer-invoice"; ///export * from "./update-customer-invoice";

View File

@ -2,24 +2,16 @@ import { SequelizeTransactionManager } from "@erp/core/api";
import { Sequelize } from "sequelize"; import { Sequelize } from "sequelize";
import { ListCustomerInvoicesUseCase } from "../../application"; import { ListCustomerInvoicesUseCase } from "../../application";
import { CustomerInvoiceService } from "../../domain"; import { CustomerInvoiceService } from "../../domain";
import { CustomerInvoiceRepository, customerCustomerInvoiceMapper } from "../../infrastructure"; import { CustomerInvoiceRepository, customerInvoiceMapper } from "../../infrastructure";
import { ListCustomerInvoicesController } from "./list-customer-invoices.controller"; import { ListCustomerInvoicesController } from "./list-invoices.controller";
import { listCustomerInvoicesPresenter } from "./presenter"; import { listCustomerInvoicesPresenter } from "./presenter";
export const buildListCustomerInvoicesController = (database: Sequelize) => { export const buildListCustomerInvoicesController = (database: Sequelize) => {
const transactionManager = new SequelizeTransactionManager(database); const transactionManager = new SequelizeTransactionManager(database);
const customerCustomerInvoiceRepository = new CustomerInvoiceRepository( const customerInvoiceRepository = new CustomerInvoiceRepository(database, customerInvoiceMapper);
database, const customerInvoiceService = new CustomerInvoiceService(customerInvoiceRepository);
customerCustomerInvoiceMapper
);
const customerCustomerInvoiceService = new CustomerInvoiceService(
customerCustomerInvoiceRepository
);
const useCase = new ListCustomerInvoicesUseCase( const useCase = new ListCustomerInvoicesUseCase(customerInvoiceService, transactionManager);
customerCustomerInvoiceService,
transactionManager
);
const presenter = listCustomerInvoicesPresenter; const presenter = listCustomerInvoicesPresenter;
return new ListCustomerInvoicesController(useCase, presenter); return new ListCustomerInvoicesController(useCase, presenter);

View File

@ -1,6 +1,6 @@
import { ExpressController } from "@erp/core/api"; import { ExpressController } from "@erp/core/api";
import { ListCustomerInvoicesUseCase } from "../../application"; import { ListCustomerInvoicesUseCase } from "../../application";
import { IListCustomerInvoicesPresenter } from "./presenter"; import { IListCustomerInvoicesPresenter } from "./presenter/list-invoices.presenter";
export class ListCustomerInvoicesController extends ExpressController { export class ListCustomerInvoicesController extends ExpressController {
public constructor( public constructor(
@ -12,13 +12,13 @@ export class ListCustomerInvoicesController extends ExpressController {
protected async executeImpl() { protected async executeImpl() {
const criteria = this.criteria; const criteria = this.criteria;
const customerCustomerInvoicesOrError = await this.listCustomerInvoices.execute(criteria); const customerInvoicesOrError = await this.listCustomerInvoices.execute(criteria);
if (customerCustomerInvoicesOrError.isFailure) { if (customerInvoicesOrError.isFailure) {
return this.handleError(customerCustomerInvoicesOrError.error); return this.handleError(customerInvoicesOrError.error);
} }
return this.ok(this.presenter.toDTO(customerCustomerInvoicesOrError.data, criteria)); return this.ok(this.presenter.toDTO(customerInvoicesOrError.data, criteria));
} }
private handleError(error: Error) { private handleError(error: Error) {

View File

@ -1 +1 @@
export * from "./list-customer-invoices.presenter"; export * from "./list-invoices.presenter";

View File

@ -1,4 +1,4 @@
import { IListResponseDTO } from "@erp/core/api"; import { IListResponseDTO } from "@erp/core";
import { Criteria } from "@repo/rdx-criteria/server"; import { Criteria } from "@repo/rdx-criteria/server";
import { Collection } from "@repo/rdx-utils"; import { Collection } from "@repo/rdx-utils";
import { IListCustomerInvoicesResponseDTO } from "../../../../common/dto"; import { IListCustomerInvoicesResponseDTO } from "../../../../common/dto";
@ -6,37 +6,35 @@ import { CustomerInvoice } from "../../../domain";
export interface IListCustomerInvoicesPresenter { export interface IListCustomerInvoicesPresenter {
toDTO: ( toDTO: (
customerCustomerInvoices: Collection<CustomerInvoice>, customerInvoices: Collection<CustomerInvoice>,
criteria: Criteria criteria: Criteria
) => IListResponseDTO<IListCustomerInvoicesResponseDTO>; ) => IListResponseDTO<IListCustomerInvoicesResponseDTO>;
} }
export const listCustomerInvoicesPresenter: IListCustomerInvoicesPresenter = { export const listCustomerInvoicesPresenter: IListCustomerInvoicesPresenter = {
toDTO: ( toDTO: (
customerCustomerInvoices: Collection<CustomerInvoice>, customerInvoices: Collection<CustomerInvoice>,
criteria: Criteria criteria: Criteria
): IListResponseDTO<IListCustomerInvoicesResponseDTO> => { ): IListResponseDTO<IListCustomerInvoicesResponseDTO> => {
const items = customerInvoices.map((customerCustomerInvoice) => { const items = customerInvoices.map((invoice) => {
return { return {
id: customerCustomerInvoice.id.toPrimitive(), id: invoice.id.toPrimitive(),
customerCustomerInvoice_status: customerCustomerInvoice.status.toString(), invoice_status: invoice.status.toString(),
customerCustomerInvoice_number: invoice_number: invoice.customerInvoiceNumber.toString(),
customerCustomerInvoice.customerCustomerInvoiceNumber.toString(), invoice_series: invoice.customerInvoiceSeries.toString(),
customerCustomerInvoice_series: issue_date: invoice.issueDate.toISOString(),
customerCustomerInvoice.customerCustomerInvoiceSeries.toString(), operation_date: invoice.operationDate.toISOString(),
issue_date: customerCustomerInvoice.issueDate.toISOString(),
operation_date: customerCustomerInvoice.operationDate.toISOString(),
language_code: "ES", language_code: "ES",
currency: customerCustomerInvoice.customerCustomerInvoiceCurrency.toString(), currency: invoice.customerInvoiceCurrency.toString(),
subtotal: customerCustomerInvoice.calculateSubtotal().toPrimitive(), subtotal: invoice.calculateSubtotal().toPrimitive(),
total: customerCustomerInvoice.calculateTotal().toPrimitive(), total: invoice.calculateTotal().toPrimitive(),
//recipient: CustomerInvoiceParticipantPresenter(customerCustomerInvoice.recipient), //recipient: CustomerInvoiceParticipantPresenter(customerInvoice.recipient),
metadata: { metadata: {
entity: "customerCustomerInvoice", entity: "customer-invoice",
}, },
} as IListCustomerInvoicesResponseDTO; } as IListCustomerInvoicesResponseDTO;
}); });

View File

@ -2,7 +2,7 @@ import { CustomerInvoiceItem } from "@/contexts/invoicing/domain/CustomerInvoice
import { IInvoicingContext } from "@/contexts/invoicing/intrastructure/InvoicingContext"; import { IInvoicingContext } from "@/contexts/invoicing/intrastructure/InvoicingContext";
import { ICollection, IMoney_Response_DTO } from "@shared/contexts"; import { ICollection, IMoney_Response_DTO } from "@shared/contexts";
export const customerCustomerInvoiceItemPresenter = ( export const customerInvoiceItemPresenter = (
items: ICollection<CustomerInvoiceItem>, items: ICollection<CustomerInvoiceItem>,
context: IInvoicingContext context: IInvoicingContext
) => ) =>

View File

@ -1,33 +1,33 @@
import { CustomerInvoice } from "@/contexts/invoicing/domain"; import { CustomerInvoice } from "@/contexts/invoicing/domain";
import { IInvoicingContext } from "@/contexts/invoicing/intrastructure/InvoicingContext"; import { IInvoicingContext } from "@/contexts/invoicing/intrastructure/InvoicingContext";
import { IUpdateCustomerInvoice_Response_DTO } from "@shared/contexts"; import { IUpdateCustomerInvoice_Response_DTO } from "@shared/contexts";
import { customerCustomerInvoiceItemPresenter } from "./CustomerInvoiceItem.presenter"; import { customerInvoiceItemPresenter } from "./CustomerInvoiceItem.presenter";
import { CustomerInvoiceParticipantPresenter } from "./CustomerInvoiceParticipant.presenter"; import { CustomerInvoiceParticipantPresenter } from "./CustomerInvoiceParticipant.presenter";
export interface IUpdateCustomerInvoicePresenter { export interface IUpdateCustomerInvoicePresenter {
map: (customerCustomerInvoice: CustomerInvoice, context: IInvoicingContext) => IUpdateCustomerInvoice_Response_DTO; map: (customerInvoice: CustomerInvoice, context: IInvoicingContext) => IUpdateCustomerInvoice_Response_DTO;
} }
export const updateCustomerInvoicePresenter: IUpdateCustomerInvoicePresenter = { export const updateCustomerInvoicePresenter: IUpdateCustomerInvoicePresenter = {
map: (customerCustomerInvoice: CustomerInvoice, context: IInvoicingContext): IUpdateCustomerInvoice_Response_DTO => { map: (customerInvoice: CustomerInvoice, context: IInvoicingContext): IUpdateCustomerInvoice_Response_DTO => {
return { return {
id: customerCustomerInvoice.id.toString(), id: customerInvoice.id.toString(),
customerCustomerInvoice_status: customerCustomerInvoice.status.toString(), customerInvoice_status: customerInvoice.status.toString(),
customerCustomerInvoice_number: customerCustomerInvoice.customerCustomerInvoiceNumber.toString(), customerInvoice_number: customerInvoice.customerInvoiceNumber.toString(),
customerCustomerInvoice_series: customerCustomerInvoice.customerCustomerInvoiceSeries.toString(), customerInvoice_series: customerInvoice.customerInvoiceSeries.toString(),
issue_date: customerCustomerInvoice.issueDate.toISO8601(), issue_date: customerInvoice.issueDate.toISO8601(),
operation_date: customerCustomerInvoice.operationDate.toISO8601(), operation_date: customerInvoice.operationDate.toISO8601(),
language_code: customerCustomerInvoice.language.toString(), language_code: customerInvoice.language.toString(),
currency: customerCustomerInvoice.currency.toString(), currency: customerInvoice.currency.toString(),
subtotal: customerCustomerInvoice.calculateSubtotal().toPrimitive(), subtotal: customerInvoice.calculateSubtotal().toPrimitive(),
total: customerCustomerInvoice.calculateTotal().toPrimitive(), total: customerInvoice.calculateTotal().toPrimitive(),
//sender: {}, //await CustomerInvoiceParticipantPresenter(customerCustomerInvoice.senderId, context), //sender: {}, //await CustomerInvoiceParticipantPresenter(customerInvoice.senderId, context),
recipient: CustomerInvoiceParticipantPresenter(customerCustomerInvoice.recipient, context), recipient: CustomerInvoiceParticipantPresenter(customerInvoice.recipient, context),
items: customerCustomerInvoiceItemPresenter(customerCustomerInvoice.items, context), items: customerInvoiceItemPresenter(customerInvoice.items, context),
}; };
}, },
}; };

View File

@ -23,16 +23,16 @@ export class UpdateCustomerInvoiceController extends ExpressController {
} }
async executeImpl(): Promise<any> { async executeImpl(): Promise<any> {
const { customerCustomerInvoiceId } = this.req.params; const { customerInvoiceId } = this.req.params;
const request: IUpdateCustomerInvoice_DTO = this.req.body; const request: IUpdateCustomerInvoice_DTO = this.req.body;
if (RuleValidator.validate(RuleValidator.RULE_NOT_NULL_OR_UNDEFINED, customerCustomerInvoiceId).isFailure) { if (RuleValidator.validate(RuleValidator.RULE_NOT_NULL_OR_UNDEFINED, customerInvoiceId).isFailure) {
return this.invalidInputError("CustomerInvoice Id param is required!"); return this.invalidInputError("CustomerInvoice Id param is required!");
} }
const idOrError = UniqueID.create(customerCustomerInvoiceId); const idOrError = UniqueID.create(customerInvoiceId);
if (idOrError.isFailure) { if (idOrError.isFailure) {
return this.invalidInputError("Invalid customerCustomerInvoice Id param!"); return this.invalidInputError("Invalid customerInvoice Id param!");
} }
try { try {
@ -62,9 +62,9 @@ export class UpdateCustomerInvoiceController extends ExpressController {
} }
} }
const customerCustomerInvoice = <CustomerInvoice>result.object; const customerInvoice = <CustomerInvoice>result.object;
return this.ok<IUpdateCustomerInvoice_Response_DTO>(this.presenter.map(customerCustomerInvoice, this.context)); return this.ok<IUpdateCustomerInvoice_Response_DTO>(this.presenter.map(customerInvoice, this.context));
} catch (e: unknown) { } catch (e: unknown) {
return this.fail(e as IServerError); return this.fail(e as IServerError);
} }

View File

@ -1,10 +1,10 @@
export type IListCustomerInvoicesRequestDTO = {} export type IListCustomerInvoicesRequestDTO = {};
export interface ICreateCustomerInvoiceRequestDTO { export interface ICreateCustomerInvoiceRequestDTO {
id: string; id: string;
customerCustomerInvoice_number: string; customerInvoice_number: string;
customerCustomerInvoice_series: string; customerInvoice_series: string;
issue_date: string; issue_date: string;
operation_date: string; operation_date: string;
language_code: string; language_code: string;

View File

@ -3,9 +3,9 @@ import { IMetadataDTO, IMoneyDTO, IQuantityDTO } from "@erp/core";
export interface IListCustomerInvoicesResponseDTO { export interface IListCustomerInvoicesResponseDTO {
id: string; id: string;
customerCustomerInvoice_status: string; invoice_status: string;
customerCustomerInvoice_number: string; invoice_number: string;
customerCustomerInvoice_series: string; invoice_series: string;
issue_date: string; issue_date: string;
operation_date: string; operation_date: string;
language_code: string; language_code: string;
@ -20,9 +20,9 @@ export interface IListCustomerInvoicesResponseDTO {
export interface IGetCustomerInvoiceResponseDTO { export interface IGetCustomerInvoiceResponseDTO {
id: string; id: string;
customerCustomerInvoice_status: string; invoice_status: string;
customerCustomerInvoice_number: string; invoice_number: string;
customerCustomerInvoice_series: string; invoice_series: string;
issue_date: string; issue_date: string;
operation_date: string; operation_date: string;
language_code: string; language_code: string;
@ -49,9 +49,9 @@ export interface IGetCustomerInvoiceResponseDTO {
export interface ICreateCustomerInvoiceResponseDTO { export interface ICreateCustomerInvoiceResponseDTO {
id: string; id: string;
customerCustomerInvoice_status: string; invoice_status: string;
customerCustomerInvoice_number: string; invoice_number: string;
customerCustomerInvoice_series: string; invoice_series: string;
issue_date: string; issue_date: string;
operation_date: string; operation_date: string;
language_code: string; language_code: string;
@ -67,9 +67,9 @@ export interface ICreateCustomerInvoiceResponseDTO {
export interface IUpdateCustomerInvoiceResponseDTO { export interface IUpdateCustomerInvoiceResponseDTO {
id: string; id: string;
customerCustomerInvoice_status: string; invoice_status: string;
customerCustomerInvoice_number: string; invoice_number: string;
customerCustomerInvoice_series: string; invoice_series: string;
issue_date: string; issue_date: string;
operation_date: string; operation_date: string;
language_code: string; language_code: string;

View File

@ -2,8 +2,8 @@ import { z } from "zod";
export const ICreateCustomerInvoiceRequestSchema = z.object({ export const ICreateCustomerInvoiceRequestSchema = z.object({
id: z.string().uuid(), id: z.string().uuid(),
customerCustomerInvoice_number: z.string().min(1), customerInvoice_number: z.string().min(1),
customerCustomerInvoice_series: z.string().min(1), customerInvoice_series: z.string().min(1),
issue_date: z.string().refine((date) => { issue_date: z.string().refine((date) => {
const dateStr = z.string().regex(/^\d{4}-\d{2}-\d{2}$/, "Invalid YYYY-MM-DD format"); const dateStr = z.string().regex(/^\d{4}-\d{2}-\d{2}$/, "Invalid YYYY-MM-DD format");
return dateStr.safeParse(date).success; return dateStr.safeParse(date).success;

View File

@ -1,4 +1,4 @@
import { CustomerInvoiceService } from "@erp/customerCustomerInvoices/api/domain/services/customer-invoice.service"; import { CustomerInvoiceService } from "@erp/customerInvoices/api/domain/services/customer-invoice.service";
import { PropsWithChildren, createContext } from "react"; import { PropsWithChildren, createContext } from "react";
/** /**

View File

@ -1,5 +1,5 @@
import { useDataSource, useQueryKey } from "@erp/core/client"; import { useDataSource, useQueryKey } from "@erp/core/client";
import { IListCustomerInvoicesResponseDTO } from "@erp/customerCustomerInvoices/common/dto"; import { IListCustomerInvoicesResponseDTO } from "@erp/customerInvoices/common/dto";
export type UseCustomerInvoicesListParams = Omit<IGetListDataProviderParams, "filters" | "resource"> & { export type UseCustomerInvoicesListParams = Omit<IGetListDataProviderParams, "filters" | "resource"> & {
status?: string; status?: string;
@ -42,10 +42,10 @@ export const useCustomerInvoices = () => {
} = params; } = params;
return useList({ return useList({
queryKey: keys().data().resource("customerCustomerInvoices").action("list").params(params).get(), queryKey: keys().data().resource("customerInvoices").action("list").params(params).get(),
queryFn: () => { queryFn: () => {
return dataSource.getList({ return dataSource.getList({
resource: "customerCustomerInvoices", resource: "customerInvoices",
quickSearchTerm, quickSearchTerm,
filters: filters:
status !== "all" status !== "all"

View File

@ -3,7 +3,7 @@
"compilerOptions": { "compilerOptions": {
"baseUrl": ".", "baseUrl": ".",
"paths": { "paths": {
"@erp/customerCustomerInvoices/*": ["./src/*"] "@erp/customer-invoices/*": ["./src/*"]
}, },
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",

View File

@ -62,6 +62,9 @@ importers:
express: express:
specifier: ^4.18.2 specifier: ^4.18.2
version: 4.21.2 version: 4.21.2
express-list-routes:
specifier: ^1.3.1
version: 1.3.1
helmet: helmet:
specifier: ^8.0.0 specifier: ^8.0.0
version: 8.1.0 version: 8.1.0
@ -3613,6 +3616,9 @@ packages:
resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
express-list-routes@1.3.1:
resolution: {integrity: sha512-HC8gpFjmeoJv1f2vJVBJHThA9XXVSOzIQd0I6WvB9G/E7Yy6f8AnFkam7GJRz/+JJQG3fX49eXWhVqjdNj32dw==}
express@4.21.2: express@4.21.2:
resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==}
engines: {node: '>= 0.10.0'} engines: {node: '>= 0.10.0'}
@ -8995,6 +9001,8 @@ snapshots:
jest-message-util: 29.7.0 jest-message-util: 29.7.0
jest-util: 29.7.0 jest-util: 29.7.0
express-list-routes@1.3.1: {}
express@4.21.2: express@4.21.2:
dependencies: dependencies:
accepts: 1.3.8 accepts: 1.3.8