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

View File

@ -134,8 +134,6 @@ process.on("uncaughtException", (error: Error) => {
await initModules({ app, database, baseRoutePath: API_BASE_PATH, logger });
console.log(listRoutes(app._router, API_BASE_PATH));
server.listen(currentState.port, () => {
server.emit("listening");
@ -166,6 +164,7 @@ process.on("uncaughtException", (error: Error) => {
logger.info(`Server path: ${currentState.appPath}`);
logger.info(`Server environment: ${currentState.environment}`);
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) {
serverError(error as NodeJS.ErrnoException);

View File

@ -1,30 +1,5 @@
// Función para listar rutas
export function listRoutes(appOrRouter, basePath = "") {
const routes = [];
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;
export function listRoutes(app, basePath = "") {
const expressListRoutes = require("express-list-routes");
return expressListRoutes(app, { logger: false, prefix: basePath });
}

View File

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

View File

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

View File

@ -17,7 +17,7 @@ export const createAxiosDataSource = (client: AxiosInstance): IDataSource => {
getBaseUrl: getBaseUrlOrFail,
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;
},

View File

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

View File

@ -6,14 +6,17 @@ import { ICustomerInvoiceService } from "../domain";
export class DeleteCustomerInvoiceUseCase {
constructor(
private readonly customerCustomerInvoiceService: ICustomerInvoiceService,
private readonly customerInvoiceService: ICustomerInvoiceService,
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) => {
try {
return await this.customerCustomerInvoiceService.deleteCustomerInvoiceById(customerCustomerInvoiceID, transaction);
return await this.customerInvoiceService.deleteCustomerInvoiceById(
customerInvoiceID,
transaction
);
} catch (error: unknown) {
logger.error(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 { logger } from "@/lib/logger";
import { Result } from "@repo/rdx-utils";
import { ICustomerInvoiceService, CustomerInvoice } from "../domain";
import { CustomerInvoice, ICustomerInvoiceService } from "../domain";
export class GetCustomerInvoiceUseCase {
constructor(
private readonly customerCustomerInvoiceService: ICustomerInvoiceService,
private readonly customerInvoiceService: ICustomerInvoiceService,
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) => {
try {
return await this.customerCustomerInvoiceService.findCustomerInvoiceById(customerCustomerInvoiceID, transaction);
return await this.customerInvoiceService.findCustomerInvoiceById(
customerInvoiceID,
transaction
);
} catch (error: unknown) {
logger.error(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 { Collection, Result } from "@repo/rdx-utils";
import { Transaction } from "sequelize";
import { ICustomerInvoiceService, CustomerInvoice } from "../domain";
import { CustomerInvoice, ICustomerInvoiceService } from "../domain";
export class ListCustomerInvoicesUseCase {
constructor(
private readonly customerCustomerInvoiceService: ICustomerInvoiceService,
private readonly customerInvoiceService: ICustomerInvoiceService,
private readonly transactionManager: ITransactionManager
) {}
public execute(criteria: Criteria): Promise<Result<Collection<CustomerInvoice>, Error>> {
return this.transactionManager.complete(async (transaction: Transaction) => {
try {
return await this.customerCustomerInvoiceService.findCustomerInvoices(criteria, transaction);
return await this.customerInvoiceService.findCustomerInvoices(criteria, transaction);
} catch (error: unknown) {
return Result.fail(error as Error);
}

View File

@ -1,7 +1,7 @@
/* import { IAdapter, RepositoryBuilder } from "@/contexts/common/domain";
import { UniqueID } from "@shared/contexts";
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 (
participantId: UniqueID,

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -4,10 +4,13 @@ import { Collection, Result } from "@repo/rdx-utils";
import { CustomerInvoice } from "../aggregates";
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>>;
deleteById(id: UniqueID, transaction?: any): Promise<Result<boolean, Error>>;
create(customerCustomerInvoice: CustomerInvoice, transaction?: any): Promise<void>;
update(customerCustomerInvoice: CustomerInvoice, transaction?: any): Promise<void>;
create(customerInvoice: 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 { UniqueID } from "@repo/rdx-ddd";
import { Collection, Result } from "@repo/rdx-utils";
import { ICustomerInvoiceProps, CustomerInvoice } from "../aggregates";
import { CustomerInvoice, ICustomerInvoiceProps } from "../aggregates";
export interface ICustomerInvoiceService {
findCustomerInvoices(criteria: Criteria, transaction?: any): Promise<Result<Collection<CustomerInvoice>, Error>>;
findCustomerInvoiceById(customerCustomerInvoiceId: UniqueID, transaction?: any): Promise<Result<CustomerInvoice>>;
findCustomerInvoices(
criteria: Criteria,
transaction?: any
): Promise<Result<Collection<CustomerInvoice>, Error>>;
findCustomerInvoiceById(
customerInvoiceId: UniqueID,
transaction?: any
): Promise<Result<CustomerInvoice>>;
updateCustomerInvoiceById(
customerCustomerInvoiceId: UniqueID,
customerInvoiceId: UniqueID,
data: Partial<ICustomerInvoiceProps>,
transaction?: any
): Promise<Result<CustomerInvoice, Error>>;
createCustomerInvoice(
customerCustomerInvoiceId: UniqueID,
customerInvoiceId: UniqueID,
data: ICustomerInvoiceProps,
transaction?: any
): 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 { Collection, Result } from "@repo/rdx-utils";
import { Transaction } from "sequelize";
import { ICustomerInvoiceProps, CustomerInvoice } from "../aggregates";
import { CustomerInvoice, ICustomerInvoiceProps } from "../aggregates";
import { ICustomerInvoiceRepository } from "../repositories";
import { ICustomerInvoiceService } from "./customerCustomerInvoice-service.interface";
import { ICustomerInvoiceService } from "./customer-invoice-service.interface";
export class CustomerInvoiceService implements ICustomerInvoiceService {
constructor(private readonly repo: ICustomerInvoiceRepository) {}
@ -13,39 +13,42 @@ export class CustomerInvoiceService implements ICustomerInvoiceService {
criteria: Criteria,
transaction?: Transaction
): Promise<Result<Collection<CustomerInvoice>, Error>> {
const customerCustomerInvoicesOrError = await this.repo.findAll(criteria, transaction);
if (customerCustomerInvoicesOrError.isFailure) {
return Result.fail(customerCustomerInvoicesOrError.error);
const customerInvoicesOrError = await this.repo.findAll(criteria, transaction);
if (customerInvoicesOrError.isFailure) {
return Result.fail(customerInvoicesOrError.error);
}
// 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 customerCustomerInvoicesOrError;
return customerInvoicesOrError;
}
async findCustomerInvoiceById(customerCustomerInvoiceId: UniqueID, transaction?: Transaction): Promise<Result<CustomerInvoice>> {
return await this.repo.getById(customerCustomerInvoiceId, transaction);
async findCustomerInvoiceById(
customerInvoiceId: UniqueID,
transaction?: Transaction
): Promise<Result<CustomerInvoice>> {
return await this.repo.getById(customerInvoiceId, transaction);
}
async updateCustomerInvoiceById(
customerCustomerInvoiceId: UniqueID,
customerInvoiceId: UniqueID,
data: Partial<ICustomerInvoiceProps>,
transaction?: Transaction
): Promise<Result<CustomerInvoice, Error>> {
// Verificar si la factura existe
const customerCustomerInvoiceOrError = await this.repo.getById(customerCustomerInvoiceId, transaction);
if (customerCustomerInvoiceOrError.isFailure) {
const customerInvoiceOrError = await this.repo.getById(customerInvoiceId, transaction);
if (customerInvoiceOrError.isFailure) {
return Result.fail(new Error("CustomerInvoice not found"));
}
return Result.fail(new Error("No implementado"));
/*const updatedCustomerInvoiceOrError = CustomerInvoice.update(customerCustomerInvoiceOrError.data, data);
/*const updatedCustomerInvoiceOrError = CustomerInvoice.update(customerInvoiceOrError.data, data);
if (updatedCustomerInvoiceOrError.isFailure) {
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(
customerCustomerInvoiceId: UniqueID,
customerInvoiceId: UniqueID,
data: ICustomerInvoiceProps,
transaction?: Transaction
): Promise<Result<CustomerInvoice, Error>> {
// Verificar si la factura existe
const customerCustomerInvoiceOrError = await this.repo.getById(customerCustomerInvoiceId, transaction);
if (customerCustomerInvoiceOrError.isSuccess) {
const customerInvoiceOrError = await this.repo.getById(customerInvoiceId, transaction);
if (customerInvoiceOrError.isSuccess) {
return Result.fail(new Error("CustomerInvoice exists"));
}
const newCustomerInvoiceOrError = CustomerInvoice.create(data, customerCustomerInvoiceId);
const newCustomerInvoiceOrError = CustomerInvoice.create(data, customerInvoiceId);
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;
@ -78,9 +83,9 @@ export class CustomerInvoiceService implements ICustomerInvoiceService {
}
async deleteCustomerInvoiceById(
customerCustomerInvoiceId: UniqueID,
customerInvoiceId: UniqueID,
transaction?: Transaction
): 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 "./customerCustomerInvoice.service";
export * from "./customer-invoice-service.interface";
export * from "./customer-invoice.service";

View File

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

View File

@ -1,20 +1,22 @@
import { IModuleServer, ModuleParams } from "@erp/core/api";
import { customerCustomerInvoicesRouter, models } from "./infrastructure";
import { customerInvoicesRouter, models } from "./infrastructure";
export const customerCustomerInvoicesAPIModule: IModuleServer = {
name: "customerCustomerInvoices",
export const customerInvoicesAPIModule: IModuleServer = {
name: "customer-invoices",
version: "1.0.0",
dependencies: [],
init(params: ModuleParams) {
// const contacts = getService<ContactsService>("contacts");
const { logger } = params;
customerCustomerInvoicesRouter(params);
logger.info("🚀 CustomerInvoices module initialized", { label: "customerCustomerInvoices" });
customerInvoicesRouter(params);
logger.info("🚀 CustomerInvoices module initialized", { label: "customer-invoices" });
},
registerDependencies(params) {
const { database, logger } = params;
logger.info("🚀 CustomerInvoices module dependencies registered", { label: "customerCustomerInvoices" });
logger.info("🚀 CustomerInvoices module dependencies registered", {
label: "customer-invoices",
});
return {
models,
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 { Sequelize } from "sequelize";
import { buildListCustomerInvoicesController } from "../../presentation";
export const customerCustomerInvoicesRouter = (params: ModuleParams) => {
const { app, database, baseRoutePath } = params as {
export const customerInvoicesRouter = (params: ModuleParams) => {
const { app, database, baseRoutePath, logger } = params as {
app: Application;
database: Sequelize;
baseRoutePath: string;
logger: ILogger;
};
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(
"/:customerCustomerInvoiceId",
"/:customerInvoiceId",
//checkTabContext,
//checkUser,
(req: Request, res: Response, next: NextFunction) => {
@ -43,7 +44,7 @@ export const customerCustomerInvoicesRouter = (params: ModuleParams) => {
);
routes.put(
"/:customerCustomerInvoiceId",
"/:customerInvoiceId",
validateAndParseBody(IUpdateCustomerInvoiceRequestSchema),
checkTabContext,
//checkUser,
@ -53,7 +54,7 @@ export const customerCustomerInvoicesRouter = (params: ModuleParams) => {
);
routes.delete(
"/:customerCustomerInvoiceId",
"/:customerInvoiceId",
validateAndParseBody(IDeleteCustomerInvoiceRequestSchema),
checkTabContext,
//checkUser,

View File

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

View File

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

View File

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

View File

@ -12,7 +12,7 @@ import { CustomerInvoiceParticipant_Model, TCreationCustomerInvoiceParticipant_M
import {
ICustomerInvoiceParticipantAddressMapper,
createCustomerInvoiceParticipantAddressMapper,
} from "./customerCustomerInvoiceParticipantAddress.mapper";
} from "./customer-invoiceParticipantAddress.mapper";
export interface ICustomerInvoiceParticipantMapper
extends ISequelizeMapper<
@ -99,7 +99,7 @@ class CustomerInvoiceParticipantMapper
const { sourceParent } = params;
return {
customerCustomerInvoice_id: sourceParent.id.toPrimitive(),
customerInvoice_id: sourceParent.id.toPrimitive(),
participant_id: source.id.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,
Sequelize,
} from "sequelize";
import { CustomerInvoiceModel } from "./customerCustomerInvoice.model";
import { CustomerInvoiceModel } from "./customer-invoice.model";
export type CustomerInvoiceItemCreationAttributes = InferCreationAttributes<
CustomerInvoiceItemModel,
{ omit: "customerCustomerInvoice" }
{ omit: "invoice" }
>;
export class CustomerInvoiceItemModel extends Model<
InferAttributes<CustomerInvoiceItemModel>,
InferCreationAttributes<CustomerInvoiceItemModel, { omit: "customerCustomerInvoice" }>
InferCreationAttributes<CustomerInvoiceItemModel, { omit: "invoice" }>
> {
declare item_id: string;
declare customerCustomerInvoice_id: string;
declare invoice_id: string;
declare parent_id: CreationOptional<string>;
declare position: number;
@ -42,14 +42,14 @@ export class CustomerInvoiceItemModel extends Model<
declare total_amount: CreationOptional<number>;
declare total_scale: CreationOptional<number>;
declare customerCustomerInvoice: NonAttribute<CustomerInvoiceModel>;
declare invoice: NonAttribute<CustomerInvoiceModel>;
static associate(database: Sequelize) {
/*const { CustomerInvoice_Model, CustomerInvoiceItem_Model } = connection.models;
/*const { Invoice_Model, CustomerInvoiceItem_Model } = connection.models;
CustomerInvoiceItem_Model.belongsTo(CustomerInvoice_Model, {
as: "customerCustomerInvoice",
foreignKey: "customerCustomerInvoice_id",
CustomerInvoiceItem_Model.belongsTo(Invoice_Model, {
as: "customerInvoice",
foreignKey: "invoice_id",
onDelete: "CASCADE",
});*/
}
@ -62,7 +62,7 @@ export default (database: Sequelize) => {
type: new DataTypes.UUID(),
primaryKey: true,
},
customerCustomerInvoice_id: {
invoice_id: {
type: new DataTypes.UUID(),
primaryKey: true,
},
@ -159,7 +159,7 @@ export default (database: Sequelize) => {
},
{
sequelize: database,
tableName: "customerCustomerInvoice_items",
tableName: "customer_invoice_items",
defaultScope: {},

View File

@ -7,9 +7,15 @@ import {
NonAttribute,
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[];
};
@ -19,13 +25,13 @@ export class CustomerInvoiceModel extends Model<
> {
declare id: string;
declare customerCustomerInvoice_status: string;
declare customerCustomerInvoice_series: CreationOptional<string>;
declare customerCustomerInvoice_number: CreationOptional<string>;
declare invoice_status: string;
declare invoice_series: CreationOptional<string>;
declare invoice_number: CreationOptional<string>;
declare issue_date: CreationOptional<string>;
declare operation_date: CreationOptional<string>;
declare customerCustomerInvoice_language: string;
declare customerCustomerInvoice_currency: string;
declare invoice_language: string;
declare invoice_currency: string;
// Subtotal
declare subtotal_amount: CreationOptional<number>;
@ -44,7 +50,7 @@ export class CustomerInvoiceModel extends Model<
CustomerInvoiceModel.hasMany(CustomerInvoiceItemModel, {
as: "items",
foreignKey: "customerCustomerInvoice_id",
foreignKey: "invoice_id",
onDelete: "CASCADE",
});
}
@ -58,18 +64,18 @@ export default (database: Sequelize) => {
primaryKey: true,
},
customerCustomerInvoice_status: {
invoice_status: {
type: new DataTypes.STRING(),
allowNull: false,
},
customerCustomerInvoice_series: {
invoice_series: {
type: new DataTypes.STRING(),
allowNull: true,
defaultValue: null,
},
customerCustomerInvoice_number: {
invoice_number: {
type: new DataTypes.STRING(),
allowNull: true,
defaultValue: null,
@ -87,12 +93,12 @@ export default (database: Sequelize) => {
defaultValue: null,
},
customerCustomerInvoice_language: {
invoice_language: {
type: new DataTypes.STRING(),
allowNull: false,
},
customerCustomerInvoice_currency: {
invoice_currency: {
type: new DataTypes.STRING(3), // ISO 4217
allowNull: false,
},
@ -121,7 +127,7 @@ export default (database: Sequelize) => {
},
{
sequelize: database,
tableName: "customerCustomerInvoices",
tableName: "customer_invoices",
paranoid: true, // softs deletes
timestamps: true,
@ -130,7 +136,7 @@ export default (database: Sequelize) => {
updatedAt: "updated_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

View File

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

View File

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

View File

@ -7,7 +7,7 @@ import {
NonAttribute,
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<
CustomerInvoiceParticipantAddress_Model,
@ -86,7 +86,7 @@ export default (sequelize: Sequelize) => {
},
{
sequelize,
tableName: "customerCustomerInvoice_participant_addresses",
tableName: "customerInvoice_participant_addresses",
}
);

View File

@ -1,9 +1,9 @@
import customerCustomerInvoiceItemModelInit from "./customerCustomerInvoice-item.model";
import customerCustomerInvoiceModelInit from "./customerCustomerInvoice.model";
import customerInvoiceItemModelInit from "./customer-invoice-item.model";
import customerInvoiceModelInit from "./customer-invoice.model";
export * from "./customerCustomerInvoice-item.model"; // exporta las clases, tipos
export * from "./customerCustomerInvoice.model";
export * from "./customerCustomerInvoice.repository";
export * from "./customer-invoice-item.model"; // exporta las clases, tipos
export * from "./customer-invoice.model";
export * from "./customer-invoice.repository";
// 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";
export class DeleteCustomerInvoiceController extends ExpressController {

View File

@ -1,14 +1,14 @@
import { DeleteCustomerInvoiceUseCase } from "@/contexts/customerCustomerInvoices/application";
import { CustomerInvoiceService } from "@/contexts/customerCustomerInvoices/domain";
import { customerCustomerInvoiceRepository } from "@/contexts/customerCustomerInvoices/intrastructure";
import { DeleteCustomerInvoiceUseCase } from "@/contexts/customer-invoices/application";
import { CustomerInvoiceService } from "@/contexts/customer-invoices/domain";
import { customerInvoiceRepository } from "@/contexts/customer-invoices/intrastructure";
import { SequelizeTransactionManager } from "@/core/common/infrastructure";
import { DeleteCustomerInvoiceController } from "./delete-customer-invoice.controller";
export const buildDeleteCustomerInvoiceController = () => {
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);
};

View File

@ -12,19 +12,22 @@ export class GetCustomerInvoiceController extends ExpressController {
}
protected async executeImpl() {
const { customerCustomerInvoiceId } = this.req.params;
const { customerInvoiceId } = this.req.params;
// Validar ID
const customerCustomerInvoiceIdOrError = UniqueID.create(customerCustomerInvoiceId);
if (customerCustomerInvoiceIdOrError.isFailure) return this.invalidInputError("CustomerInvoice ID not valid");
const customerInvoiceIdOrError = UniqueID.create(customerInvoiceId);
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) {
return this.handleError(customerCustomerInvoiceOrError.error);
if (customerInvoiceOrError.isFailure) {
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) {

View File

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

View File

@ -2,7 +2,7 @@ import { CustomerInvoiceItem } from "#/server/domain";
import { IInvoicingContext } from "#/server/intrastructure";
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.items.map((item: CustomerInvoiceItem) => ({
description: item.description.toString(),

View File

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

View File

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

View File

@ -1,6 +1,6 @@
import { ExpressController } from "@erp/core/api";
import { ListCustomerInvoicesUseCase } from "../../application";
import { IListCustomerInvoicesPresenter } from "./presenter";
import { IListCustomerInvoicesPresenter } from "./presenter/list-invoices.presenter";
export class ListCustomerInvoicesController extends ExpressController {
public constructor(
@ -12,13 +12,13 @@ export class ListCustomerInvoicesController extends ExpressController {
protected async executeImpl() {
const criteria = this.criteria;
const customerCustomerInvoicesOrError = await this.listCustomerInvoices.execute(criteria);
const customerInvoicesOrError = await this.listCustomerInvoices.execute(criteria);
if (customerCustomerInvoicesOrError.isFailure) {
return this.handleError(customerCustomerInvoicesOrError.error);
if (customerInvoicesOrError.isFailure) {
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) {

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

View File

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

View File

@ -1,33 +1,33 @@
import { CustomerInvoice } from "@/contexts/invoicing/domain";
import { IInvoicingContext } from "@/contexts/invoicing/intrastructure/InvoicingContext";
import { IUpdateCustomerInvoice_Response_DTO } from "@shared/contexts";
import { customerCustomerInvoiceItemPresenter } from "./CustomerInvoiceItem.presenter";
import { customerInvoiceItemPresenter } from "./CustomerInvoiceItem.presenter";
import { CustomerInvoiceParticipantPresenter } from "./CustomerInvoiceParticipant.presenter";
export interface IUpdateCustomerInvoicePresenter {
map: (customerCustomerInvoice: CustomerInvoice, context: IInvoicingContext) => IUpdateCustomerInvoice_Response_DTO;
map: (customerInvoice: CustomerInvoice, context: IInvoicingContext) => IUpdateCustomerInvoice_Response_DTO;
}
export const updateCustomerInvoicePresenter: IUpdateCustomerInvoicePresenter = {
map: (customerCustomerInvoice: CustomerInvoice, context: IInvoicingContext): IUpdateCustomerInvoice_Response_DTO => {
map: (customerInvoice: CustomerInvoice, context: IInvoicingContext): IUpdateCustomerInvoice_Response_DTO => {
return {
id: customerCustomerInvoice.id.toString(),
id: customerInvoice.id.toString(),
customerCustomerInvoice_status: customerCustomerInvoice.status.toString(),
customerCustomerInvoice_number: customerCustomerInvoice.customerCustomerInvoiceNumber.toString(),
customerCustomerInvoice_series: customerCustomerInvoice.customerCustomerInvoiceSeries.toString(),
issue_date: customerCustomerInvoice.issueDate.toISO8601(),
operation_date: customerCustomerInvoice.operationDate.toISO8601(),
language_code: customerCustomerInvoice.language.toString(),
currency: customerCustomerInvoice.currency.toString(),
subtotal: customerCustomerInvoice.calculateSubtotal().toPrimitive(),
total: customerCustomerInvoice.calculateTotal().toPrimitive(),
customerInvoice_status: customerInvoice.status.toString(),
customerInvoice_number: customerInvoice.customerInvoiceNumber.toString(),
customerInvoice_series: customerInvoice.customerInvoiceSeries.toString(),
issue_date: customerInvoice.issueDate.toISO8601(),
operation_date: customerInvoice.operationDate.toISO8601(),
language_code: customerInvoice.language.toString(),
currency: customerInvoice.currency.toString(),
subtotal: customerInvoice.calculateSubtotal().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> {
const { customerCustomerInvoiceId } = this.req.params;
const { customerInvoiceId } = this.req.params;
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!");
}
const idOrError = UniqueID.create(customerCustomerInvoiceId);
const idOrError = UniqueID.create(customerInvoiceId);
if (idOrError.isFailure) {
return this.invalidInputError("Invalid customerCustomerInvoice Id param!");
return this.invalidInputError("Invalid customerInvoice Id param!");
}
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) {
return this.fail(e as IServerError);
}

View File

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

View File

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

View File

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

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";
/**

View File

@ -1,5 +1,5 @@
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"> & {
status?: string;
@ -42,10 +42,10 @@ export const useCustomerInvoices = () => {
} = params;
return useList({
queryKey: keys().data().resource("customerCustomerInvoices").action("list").params(params).get(),
queryKey: keys().data().resource("customerInvoices").action("list").params(params).get(),
queryFn: () => {
return dataSource.getList({
resource: "customerCustomerInvoices",
resource: "customerInvoices",
quickSearchTerm,
filters:
status !== "all"

View File

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

View File

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