Facturas de cliente
This commit is contained in:
parent
7bf24c8f91
commit
3a881c554f
@ -40,8 +40,8 @@
|
|||||||
"typescript": "^5.8.3"
|
"typescript": "^5.8.3"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@erp/core": "workspace:*",
|
|
||||||
"@erp/auth": "workspace:*",
|
"@erp/auth": "workspace:*",
|
||||||
|
"@erp/core": "workspace:*",
|
||||||
"@erp/customer-invoices": "workspace:*",
|
"@erp/customer-invoices": "workspace:*",
|
||||||
"bcrypt": "^5.1.1",
|
"bcrypt": "^5.1.1",
|
||||||
"cls-rtracer": "^2.6.3",
|
"cls-rtracer": "^2.6.3",
|
||||||
@ -49,6 +49,7 @@
|
|||||||
"dinero.js": "^1.9.1",
|
"dinero.js": "^1.9.1",
|
||||||
"dotenv": "^16.5.0",
|
"dotenv": "^16.5.0",
|
||||||
"express": "^4.18.2",
|
"express": "^4.18.2",
|
||||||
|
"express-list-routes": "^1.3.1",
|
||||||
"helmet": "^8.0.0",
|
"helmet": "^8.0.0",
|
||||||
"http": "0.0.1-security",
|
"http": "0.0.1-security",
|
||||||
"jsonwebtoken": "^9.0.2",
|
"jsonwebtoken": "^9.0.2",
|
||||||
@ -73,9 +74,14 @@
|
|||||||
"node": ">=22"
|
"node": ">=22"
|
||||||
},
|
},
|
||||||
"tsup": {
|
"tsup": {
|
||||||
"entry": ["src/index.ts"],
|
"entry": [
|
||||||
|
"src/index.ts"
|
||||||
|
],
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"format": ["esm", "cjs"],
|
"format": [
|
||||||
|
"esm",
|
||||||
|
"cjs"
|
||||||
|
],
|
||||||
"target": "es2020",
|
"target": "es2020",
|
||||||
"sourcemap": true,
|
"sourcemap": true,
|
||||||
"clean": true,
|
"clean": true,
|
||||||
|
|||||||
@ -134,8 +134,6 @@ process.on("uncaughtException", (error: Error) => {
|
|||||||
|
|
||||||
await initModules({ app, database, baseRoutePath: API_BASE_PATH, logger });
|
await initModules({ app, database, baseRoutePath: API_BASE_PATH, logger });
|
||||||
|
|
||||||
console.log(listRoutes(app._router, API_BASE_PATH));
|
|
||||||
|
|
||||||
server.listen(currentState.port, () => {
|
server.listen(currentState.port, () => {
|
||||||
server.emit("listening");
|
server.emit("listening");
|
||||||
|
|
||||||
@ -166,6 +164,7 @@ process.on("uncaughtException", (error: Error) => {
|
|||||||
logger.info(`Server path: ${currentState.appPath}`);
|
logger.info(`Server path: ${currentState.appPath}`);
|
||||||
logger.info(`Server environment: ${currentState.environment}`);
|
logger.info(`Server environment: ${currentState.environment}`);
|
||||||
logger.info("To shut down your server, press <CTRL> + C at any time");
|
logger.info("To shut down your server, press <CTRL> + C at any time");
|
||||||
|
logger.info(JSON.stringify(listRoutes(app._router, API_BASE_PATH), null, 3));
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
serverError(error as NodeJS.ErrnoException);
|
serverError(error as NodeJS.ErrnoException);
|
||||||
|
|||||||
@ -1,30 +1,5 @@
|
|||||||
// Función para listar rutas
|
// Función para listar rutas
|
||||||
export function listRoutes(appOrRouter, basePath = "") {
|
export function listRoutes(app, basePath = "") {
|
||||||
const routes = [];
|
const expressListRoutes = require("express-list-routes");
|
||||||
|
return expressListRoutes(app, { logger: false, prefix: basePath });
|
||||||
appOrRouter.stack.forEach((middleware) => {
|
|
||||||
if (middleware.route) {
|
|
||||||
// Es una ruta directa
|
|
||||||
const methods = Object.keys(middleware.route.methods).map((m) => m.toUpperCase());
|
|
||||||
routes.push({
|
|
||||||
path: basePath + middleware.route.path,
|
|
||||||
methods,
|
|
||||||
});
|
|
||||||
} else if (middleware.name === "router" && middleware.handle.stack) {
|
|
||||||
// Es un router anidado
|
|
||||||
const newBasePath =
|
|
||||||
basePath +
|
|
||||||
(middleware.regexp?.source !== "^\\/?$"
|
|
||||||
? middleware.regexp
|
|
||||||
?.toString()
|
|
||||||
.replace(/^\/\^\\/, "")
|
|
||||||
.replace(/\\\/\?\(\?=\\\/\|\$\)\/i$/, "")
|
|
||||||
.replace(/\\\//g, "/")
|
|
||||||
: "");
|
|
||||||
const childRoutes = listRoutes(middleware.handle, basePath + (middleware?.path || ""));
|
|
||||||
routes.push(...childRoutes);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return routes;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { ILogger } from "@erp/core";
|
import { ILogger } from "@erp/core/api";
|
||||||
|
|
||||||
export class ConsoleLogger implements ILogger {
|
export class ConsoleLogger implements ILogger {
|
||||||
info(message: string, meta?: any) {
|
info(message: string, meta?: any) {
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { ILogger } from "@erp/core";
|
import { ILogger } from "@erp/core/api";
|
||||||
|
|
||||||
export class SentryLogger implements ILogger {
|
export class SentryLogger implements ILogger {
|
||||||
// biome-ignore lint/complexity/noUselessConstructor: <explanation>
|
// biome-ignore lint/complexity/noUselessConstructor: <explanation>
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { ILogger } from "@erp/core";
|
import { ILogger } from "@erp/core/api";
|
||||||
import rTracer from "cls-rtracer";
|
import rTracer from "cls-rtracer";
|
||||||
import { createLogger, format, transports } from "winston";
|
import { createLogger, format, transports } from "winston";
|
||||||
|
|
||||||
@ -17,7 +17,7 @@ const winston = createLogger({
|
|||||||
let message = info.message;
|
let message = info.message;
|
||||||
|
|
||||||
if (typeof message === "object") {
|
if (typeof message === "object") {
|
||||||
message = JSON.stringify(message, null, 3);
|
message = JSON.stringify(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
let out = `${timestamp}`;
|
let out = `${timestamp}`;
|
||||||
@ -46,6 +46,9 @@ const winston = createLogger({
|
|||||||
});
|
});
|
||||||
|
|
||||||
export class WinstonLogger implements ILogger {
|
export class WinstonLogger implements ILogger {
|
||||||
|
debug(message: string, meta?: any): void {
|
||||||
|
winston.debug(message, meta ?? {});
|
||||||
|
}
|
||||||
info(message: string, meta?: any) {
|
info(message: string, meta?: any) {
|
||||||
winston.info(message, meta ?? {});
|
winston.info(message, meta ?? {});
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
import { authAPIModule } from "@erp/auth/api";
|
import { authAPIModule } from "@erp/auth/api";
|
||||||
import { invoicesAPIModule } from "@erp/customer-invoices/api";
|
import { customerInvoicesAPIModule } from "@erp/customer-invoices/api";
|
||||||
import { registerModule } from "./lib";
|
import { registerModule } from "./lib";
|
||||||
|
|
||||||
export const registerModules = () => {
|
export const registerModules = () => {
|
||||||
registerModule(authAPIModule);
|
registerModule(authAPIModule);
|
||||||
registerModule(invoicesAPIModule);
|
registerModule(customerInvoicesAPIModule);
|
||||||
};
|
};
|
||||||
|
|||||||
@ -21,3 +21,5 @@ export const authAPIModule: IModuleServer = {
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default authAPIModule;
|
||||||
|
|||||||
@ -1 +1,2 @@
|
|||||||
|
export * from "./dto";
|
||||||
export * from "./types";
|
export * from "./types";
|
||||||
|
|||||||
@ -17,7 +17,7 @@ export const createAxiosDataSource = (client: AxiosInstance): IDataSource => {
|
|||||||
getBaseUrl: getBaseUrlOrFail,
|
getBaseUrl: getBaseUrlOrFail,
|
||||||
|
|
||||||
getList: async <T>(resource: string, params?: Record<string, any>) => {
|
getList: async <T>(resource: string, params?: Record<string, any>) => {
|
||||||
const res = await client.get<T[]>(resource, { params });
|
const res = await client.get<T[]>(resource, params);
|
||||||
return res.data;
|
return res.data;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@ -1,13 +1,13 @@
|
|||||||
import { UniqueID, UtcDate } from "@/core/common/domain";
|
import { UniqueID, UtcDate } from "@/core/common/domain";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
type ICustomerInvoiceProps,
|
|
||||||
type ICustomerInvoiceService,
|
|
||||||
type CustomerInvoice,
|
type CustomerInvoice,
|
||||||
CustomerInvoiceNumber,
|
CustomerInvoiceNumber,
|
||||||
CustomerInvoiceSerie,
|
CustomerInvoiceSerie,
|
||||||
CustomerInvoiceStatus,
|
CustomerInvoiceStatus,
|
||||||
} from "@/contexts/customerCustomerInvoices/domain";
|
type ICustomerInvoiceProps,
|
||||||
|
type ICustomerInvoiceService,
|
||||||
|
} from "@/contexts/customer-invoices/domain";
|
||||||
import { ITransactionManager } from "@/core/common/infrastructure/database";
|
import { ITransactionManager } from "@/core/common/infrastructure/database";
|
||||||
import { logger } from "@/core/logger";
|
import { logger } from "@/core/logger";
|
||||||
import { Result } from "@repo/rdx-utils";
|
import { Result } from "@repo/rdx-utils";
|
||||||
@ -15,12 +15,12 @@ import { ICreateCustomerInvoiceRequestDTO } from "../../common/dto";
|
|||||||
|
|
||||||
export class CreateCustomerInvoiceUseCase {
|
export class CreateCustomerInvoiceUseCase {
|
||||||
constructor(
|
constructor(
|
||||||
private readonly customerCustomerInvoiceService: ICustomerInvoiceService,
|
private readonly customerInvoiceService: ICustomerInvoiceService,
|
||||||
private readonly transactionManager: ITransactionManager
|
private readonly transactionManager: ITransactionManager
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
public execute(
|
public execute(
|
||||||
customerCustomerInvoiceID: UniqueID,
|
customerInvoiceID: UniqueID,
|
||||||
dto: ICreateCustomerInvoiceRequestDTO
|
dto: ICreateCustomerInvoiceRequestDTO
|
||||||
): Promise<Result<CustomerInvoice, Error>> {
|
): Promise<Result<CustomerInvoice, Error>> {
|
||||||
return this.transactionManager.complete(async (transaction) => {
|
return this.transactionManager.complete(async (transaction) => {
|
||||||
@ -32,8 +32,12 @@ export class CreateCustomerInvoiceUseCase {
|
|||||||
|
|
||||||
const data = validOrErrors.data;
|
const data = validOrErrors.data;
|
||||||
|
|
||||||
// Update customerCustomerInvoice with dto
|
// Update customerInvoice with dto
|
||||||
return await this.customerCustomerInvoiceService.createCustomerInvoice(customerCustomerInvoiceID, data, transaction);
|
return await this.customerInvoiceService.createCustomerInvoice(
|
||||||
|
customerInvoiceID,
|
||||||
|
data,
|
||||||
|
transaction
|
||||||
|
);
|
||||||
} catch (error: unknown) {
|
} catch (error: unknown) {
|
||||||
logger.error(error as Error);
|
logger.error(error as Error);
|
||||||
return Result.fail(error as Error);
|
return Result.fail(error as Error);
|
||||||
@ -41,17 +45,19 @@ export class CreateCustomerInvoiceUseCase {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private validateCustomerInvoiceData(dto: ICreateCustomerInvoiceRequestDTO): Result<ICustomerInvoiceProps, Error> {
|
private validateCustomerInvoiceData(
|
||||||
|
dto: ICreateCustomerInvoiceRequestDTO
|
||||||
|
): Result<ICustomerInvoiceProps, Error> {
|
||||||
const errors: Error[] = [];
|
const errors: Error[] = [];
|
||||||
|
|
||||||
const customerCustomerInvoiceNumerOrError = CustomerInvoiceNumber.create(dto.customerCustomerInvoice_number);
|
const customerInvoiceNumerOrError = CustomerInvoiceNumber.create(dto.customerInvoice_number);
|
||||||
const customerCustomerInvoiceSeriesOrError = CustomerInvoiceSerie.create(dto.customerCustomerInvoice_series);
|
const customerInvoiceSeriesOrError = CustomerInvoiceSerie.create(dto.customerInvoice_series);
|
||||||
const issueDateOrError = UtcDate.create(dto.issue_date);
|
const issueDateOrError = UtcDate.create(dto.issue_date);
|
||||||
const operationDateOrError = UtcDate.create(dto.operation_date);
|
const operationDateOrError = UtcDate.create(dto.operation_date);
|
||||||
|
|
||||||
const result = Result.combine([
|
const result = Result.combine([
|
||||||
customerCustomerInvoiceNumerOrError,
|
customerInvoiceNumerOrError,
|
||||||
customerCustomerInvoiceSeriesOrError,
|
customerInvoiceSeriesOrError,
|
||||||
issueDateOrError,
|
issueDateOrError,
|
||||||
operationDateOrError,
|
operationDateOrError,
|
||||||
]);
|
]);
|
||||||
@ -62,11 +68,11 @@ export class CreateCustomerInvoiceUseCase {
|
|||||||
|
|
||||||
const validatedData: ICustomerInvoiceProps = {
|
const validatedData: ICustomerInvoiceProps = {
|
||||||
status: CustomerInvoiceStatus.createDraft(),
|
status: CustomerInvoiceStatus.createDraft(),
|
||||||
customerCustomerInvoiceNumber: customerCustomerInvoiceNumerOrError.data,
|
customerInvoiceNumber: customerInvoiceNumerOrError.data,
|
||||||
customerCustomerInvoiceSeries: customerCustomerInvoiceSeriesOrError.data,
|
customerInvoiceSeries: customerInvoiceSeriesOrError.data,
|
||||||
issueDate: issueDateOrError.data,
|
issueDate: issueDateOrError.data,
|
||||||
operationDate: operationDateOrError.data,
|
operationDate: operationDateOrError.data,
|
||||||
customerCustomerInvoiceCurrency: dto.currency,
|
customerInvoiceCurrency: dto.currency,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*if (errors.length > 0) {
|
/*if (errors.length > 0) {
|
||||||
@ -75,14 +81,14 @@ export class CreateCustomerInvoiceUseCase {
|
|||||||
}*/
|
}*/
|
||||||
return Result.ok(validatedData);
|
return Result.ok(validatedData);
|
||||||
|
|
||||||
/*let customerCustomerInvoice_status = CustomerInvoiceStatus.create(dto.status).object;
|
/*let customerInvoice_status = CustomerInvoiceStatus.create(dto.status).object;
|
||||||
if (customerCustomerInvoice_status.isEmpty()) {
|
if (customerInvoice_status.isEmpty()) {
|
||||||
customerCustomerInvoice_status = CustomerInvoiceStatus.createDraft();
|
customerInvoice_status = CustomerInvoiceStatus.createDraft();
|
||||||
}
|
}
|
||||||
|
|
||||||
let customerCustomerInvoice_series = CustomerInvoiceSeries.create(dto.customerCustomerInvoice_series).object;
|
let customerInvoice_series = CustomerInvoiceSeries.create(dto.customerInvoice_series).object;
|
||||||
if (customerCustomerInvoice_series.isEmpty()) {
|
if (customerInvoice_series.isEmpty()) {
|
||||||
customerCustomerInvoice_series = CustomerInvoiceSeries.create(dto.customerCustomerInvoice_series).object;
|
customerInvoice_series = CustomerInvoiceSeries.create(dto.customerInvoice_series).object;
|
||||||
}
|
}
|
||||||
|
|
||||||
let issue_date = CustomerInvoiceDate.create(dto.issue_date).object;
|
let issue_date = CustomerInvoiceDate.create(dto.issue_date).object;
|
||||||
@ -95,16 +101,16 @@ export class CreateCustomerInvoiceUseCase {
|
|||||||
operation_date = CustomerInvoiceDate.createCurrentDate().object;
|
operation_date = CustomerInvoiceDate.createCurrentDate().object;
|
||||||
}
|
}
|
||||||
|
|
||||||
let customerCustomerInvoiceCurrency = Currency.createFromCode(dto.currency).object;
|
let customerInvoiceCurrency = Currency.createFromCode(dto.currency).object;
|
||||||
|
|
||||||
if (customerCustomerInvoiceCurrency.isEmpty()) {
|
if (customerInvoiceCurrency.isEmpty()) {
|
||||||
customerCustomerInvoiceCurrency = Currency.createDefaultCode().object;
|
customerInvoiceCurrency = Currency.createDefaultCode().object;
|
||||||
}
|
}
|
||||||
|
|
||||||
let customerCustomerInvoiceLanguage = Language.createFromCode(dto.language_code).object;
|
let customerInvoiceLanguage = Language.createFromCode(dto.language_code).object;
|
||||||
|
|
||||||
if (customerCustomerInvoiceLanguage.isEmpty()) {
|
if (customerInvoiceLanguage.isEmpty()) {
|
||||||
customerCustomerInvoiceLanguage = Language.createDefaultCode().object;
|
customerInvoiceLanguage = Language.createDefaultCode().object;
|
||||||
}
|
}
|
||||||
|
|
||||||
const items = new Collection<CustomerInvoiceItem>(
|
const items = new Collection<CustomerInvoiceItem>(
|
||||||
@ -122,26 +128,26 @@ export class CreateCustomerInvoiceUseCase {
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!customerCustomerInvoice_status.isDraft()) {
|
if (!customerInvoice_status.isDraft()) {
|
||||||
throw Error("Error al crear una factura que no es borrador");
|
throw Error("Error al crear una factura que no es borrador");
|
||||||
}
|
}
|
||||||
|
|
||||||
return DraftCustomerInvoice.create(
|
return DraftCustomerInvoice.create(
|
||||||
{
|
{
|
||||||
customerCustomerInvoiceSeries: customerCustomerInvoice_series,
|
customerInvoiceSeries: customerInvoice_series,
|
||||||
issueDate: issue_date,
|
issueDate: issue_date,
|
||||||
operationDate: operation_date,
|
operationDate: operation_date,
|
||||||
customerCustomerInvoiceCurrency,
|
customerInvoiceCurrency,
|
||||||
language: customerCustomerInvoiceLanguage,
|
language: customerInvoiceLanguage,
|
||||||
customerCustomerInvoiceNumber: CustomerInvoiceNumber.create(undefined).object,
|
customerInvoiceNumber: CustomerInvoiceNumber.create(undefined).object,
|
||||||
//notes: Note.create(customerCustomerInvoiceDTO.notes).object,
|
//notes: Note.create(customerInvoiceDTO.notes).object,
|
||||||
|
|
||||||
//senderId: UniqueID.create(null).object,
|
//senderId: UniqueID.create(null).object,
|
||||||
recipient,
|
recipient,
|
||||||
|
|
||||||
items,
|
items,
|
||||||
},
|
},
|
||||||
customerCustomerInvoiceId
|
customerInvoiceId
|
||||||
);*/
|
);*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,14 +6,17 @@ import { ICustomerInvoiceService } from "../domain";
|
|||||||
|
|
||||||
export class DeleteCustomerInvoiceUseCase {
|
export class DeleteCustomerInvoiceUseCase {
|
||||||
constructor(
|
constructor(
|
||||||
private readonly customerCustomerInvoiceService: ICustomerInvoiceService,
|
private readonly customerInvoiceService: ICustomerInvoiceService,
|
||||||
private readonly transactionManager: ITransactionManager
|
private readonly transactionManager: ITransactionManager
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
public execute(customerCustomerInvoiceID: UniqueID): Promise<Result<boolean, Error>> {
|
public execute(customerInvoiceID: UniqueID): Promise<Result<boolean, Error>> {
|
||||||
return this.transactionManager.complete(async (transaction) => {
|
return this.transactionManager.complete(async (transaction) => {
|
||||||
try {
|
try {
|
||||||
return await this.customerCustomerInvoiceService.deleteCustomerInvoiceById(customerCustomerInvoiceID, transaction);
|
return await this.customerInvoiceService.deleteCustomerInvoiceById(
|
||||||
|
customerInvoiceID,
|
||||||
|
transaction
|
||||||
|
);
|
||||||
} catch (error: unknown) {
|
} catch (error: unknown) {
|
||||||
logger.error(error as Error);
|
logger.error(error as Error);
|
||||||
return Result.fail(error as Error);
|
return Result.fail(error as Error);
|
||||||
|
|||||||
@ -2,18 +2,21 @@ import { UniqueID } from "@/core/common/domain";
|
|||||||
import { ITransactionManager } from "@/core/common/infrastructure/database";
|
import { ITransactionManager } from "@/core/common/infrastructure/database";
|
||||||
import { logger } from "@/lib/logger";
|
import { logger } from "@/lib/logger";
|
||||||
import { Result } from "@repo/rdx-utils";
|
import { Result } from "@repo/rdx-utils";
|
||||||
import { ICustomerInvoiceService, CustomerInvoice } from "../domain";
|
import { CustomerInvoice, ICustomerInvoiceService } from "../domain";
|
||||||
|
|
||||||
export class GetCustomerInvoiceUseCase {
|
export class GetCustomerInvoiceUseCase {
|
||||||
constructor(
|
constructor(
|
||||||
private readonly customerCustomerInvoiceService: ICustomerInvoiceService,
|
private readonly customerInvoiceService: ICustomerInvoiceService,
|
||||||
private readonly transactionManager: ITransactionManager
|
private readonly transactionManager: ITransactionManager
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
public execute(customerCustomerInvoiceID: UniqueID): Promise<Result<CustomerInvoice, Error>> {
|
public execute(customerInvoiceID: UniqueID): Promise<Result<CustomerInvoice, Error>> {
|
||||||
return this.transactionManager.complete(async (transaction) => {
|
return this.transactionManager.complete(async (transaction) => {
|
||||||
try {
|
try {
|
||||||
return await this.customerCustomerInvoiceService.findCustomerInvoiceById(customerCustomerInvoiceID, transaction);
|
return await this.customerInvoiceService.findCustomerInvoiceById(
|
||||||
|
customerInvoiceID,
|
||||||
|
transaction
|
||||||
|
);
|
||||||
} catch (error: unknown) {
|
} catch (error: unknown) {
|
||||||
logger.error(error as Error);
|
logger.error(error as Error);
|
||||||
return Result.fail(error as Error);
|
return Result.fail(error as Error);
|
||||||
|
|||||||
@ -2,18 +2,18 @@ import { ITransactionManager } from "@erp/core/api";
|
|||||||
import { Criteria } from "@repo/rdx-criteria/server";
|
import { Criteria } from "@repo/rdx-criteria/server";
|
||||||
import { Collection, Result } from "@repo/rdx-utils";
|
import { Collection, Result } from "@repo/rdx-utils";
|
||||||
import { Transaction } from "sequelize";
|
import { Transaction } from "sequelize";
|
||||||
import { ICustomerInvoiceService, CustomerInvoice } from "../domain";
|
import { CustomerInvoice, ICustomerInvoiceService } from "../domain";
|
||||||
|
|
||||||
export class ListCustomerInvoicesUseCase {
|
export class ListCustomerInvoicesUseCase {
|
||||||
constructor(
|
constructor(
|
||||||
private readonly customerCustomerInvoiceService: ICustomerInvoiceService,
|
private readonly customerInvoiceService: ICustomerInvoiceService,
|
||||||
private readonly transactionManager: ITransactionManager
|
private readonly transactionManager: ITransactionManager
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
public execute(criteria: Criteria): Promise<Result<Collection<CustomerInvoice>, Error>> {
|
public execute(criteria: Criteria): Promise<Result<Collection<CustomerInvoice>, Error>> {
|
||||||
return this.transactionManager.complete(async (transaction: Transaction) => {
|
return this.transactionManager.complete(async (transaction: Transaction) => {
|
||||||
try {
|
try {
|
||||||
return await this.customerCustomerInvoiceService.findCustomerInvoices(criteria, transaction);
|
return await this.customerInvoiceService.findCustomerInvoices(criteria, transaction);
|
||||||
} catch (error: unknown) {
|
} catch (error: unknown) {
|
||||||
return Result.fail(error as Error);
|
return Result.fail(error as Error);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
/* import { IAdapter, RepositoryBuilder } from "@/contexts/common/domain";
|
/* import { IAdapter, RepositoryBuilder } from "@/contexts/common/domain";
|
||||||
import { UniqueID } from "@shared/contexts";
|
import { UniqueID } from "@shared/contexts";
|
||||||
import { ICustomerInvoiceParticipantRepository } from "../../domain";
|
import { ICustomerInvoiceParticipantRepository } from "../../domain";
|
||||||
import { CustomerInvoiceCustomer } from "../../domain/entities/customerCustomerInvoice-customer/customerCustomerInvoice-customer";
|
import { CustomerInvoiceCustomer } from "../../domain/entities/customer-invoice-customer/customer-invoice-customer";
|
||||||
|
|
||||||
export const participantFinder = async (
|
export const participantFinder = async (
|
||||||
participantId: UniqueID,
|
participantId: UniqueID,
|
||||||
|
|||||||
@ -2,16 +2,16 @@ import { UniqueID } from "@/core/common/domain";
|
|||||||
import { ITransactionManager } from "@/core/common/infrastructure/database";
|
import { ITransactionManager } from "@/core/common/infrastructure/database";
|
||||||
import { Result } from "@repo/rdx-utils";
|
import { Result } from "@repo/rdx-utils";
|
||||||
import { IUpdateCustomerInvoiceRequestDTO } from "../../common/dto";
|
import { IUpdateCustomerInvoiceRequestDTO } from "../../common/dto";
|
||||||
import { ICustomerInvoiceService, CustomerInvoice } from "../domain";
|
import { CustomerInvoice, ICustomerInvoiceService } from "../domain";
|
||||||
|
|
||||||
export class CreateCustomerInvoiceUseCase {
|
export class CreateCustomerInvoiceUseCase {
|
||||||
constructor(
|
constructor(
|
||||||
private readonly customerCustomerInvoiceService: ICustomerInvoiceService,
|
private readonly customerInvoiceService: ICustomerInvoiceService,
|
||||||
private readonly transactionManager: ITransactionManager
|
private readonly transactionManager: ITransactionManager
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
public execute(
|
public execute(
|
||||||
customerCustomerInvoiceID: UniqueID,
|
customerInvoiceID: UniqueID,
|
||||||
dto: Partial<IUpdateCustomerInvoiceRequestDTO>
|
dto: Partial<IUpdateCustomerInvoiceRequestDTO>
|
||||||
): Promise<Result<CustomerInvoice, Error>> {
|
): Promise<Result<CustomerInvoice, Error>> {
|
||||||
return this.transactionManager.complete(async (transaction) => {
|
return this.transactionManager.complete(async (transaction) => {
|
||||||
@ -25,8 +25,8 @@ export class CreateCustomerInvoiceUseCase {
|
|||||||
|
|
||||||
const data = validOrErrors.data;
|
const data = validOrErrors.data;
|
||||||
|
|
||||||
// Update customerCustomerInvoice with dto
|
// Update customerInvoice with dto
|
||||||
return await this.customerCustomerInvoiceService.updateCustomerInvoiceById(customerCustomerInvoiceID, data, transaction);
|
return await this.customerInvoiceService.updateCustomerInvoiceById(customerInvoiceID, data, transaction);
|
||||||
} catch (error: unknown) {
|
} catch (error: unknown) {
|
||||||
logger.error(error as Error);
|
logger.error(error as Error);
|
||||||
return Result.fail(error as Error);
|
return Result.fail(error as Error);
|
||||||
@ -41,41 +41,41 @@ export class CreateCustomerInvoiceUseCase {
|
|||||||
const errors: Error[] = [];
|
const errors: Error[] = [];
|
||||||
const validatedData: Partial<ICustomerInvoiceProps> = {};
|
const validatedData: Partial<ICustomerInvoiceProps> = {};
|
||||||
|
|
||||||
// Create customerCustomerInvoice
|
// Create customerInvoice
|
||||||
let customerCustomerInvoice_status = CustomerInvoiceStatus.create(customerCustomerInvoiceDTO.status).object;
|
let customerInvoice_status = CustomerInvoiceStatus.create(customerInvoiceDTO.status).object;
|
||||||
if (customerCustomerInvoice_status.isEmpty()) {
|
if (customerInvoice_status.isEmpty()) {
|
||||||
customerCustomerInvoice_status = CustomerInvoiceStatus.createDraft();
|
customerInvoice_status = CustomerInvoiceStatus.createDraft();
|
||||||
}
|
}
|
||||||
|
|
||||||
let customerCustomerInvoice_series = CustomerInvoiceSeries.create(customerCustomerInvoiceDTO.customerCustomerInvoice_series).object;
|
let customerInvoice_series = CustomerInvoiceSeries.create(customerInvoiceDTO.customerInvoice_series).object;
|
||||||
if (customerCustomerInvoice_series.isEmpty()) {
|
if (customerInvoice_series.isEmpty()) {
|
||||||
customerCustomerInvoice_series = CustomerInvoiceSeries.create(customerCustomerInvoiceDTO.customerCustomerInvoice_series).object;
|
customerInvoice_series = CustomerInvoiceSeries.create(customerInvoiceDTO.customerInvoice_series).object;
|
||||||
}
|
}
|
||||||
|
|
||||||
let issue_date = CustomerInvoiceDate.create(customerCustomerInvoiceDTO.issue_date).object;
|
let issue_date = CustomerInvoiceDate.create(customerInvoiceDTO.issue_date).object;
|
||||||
if (issue_date.isEmpty()) {
|
if (issue_date.isEmpty()) {
|
||||||
issue_date = CustomerInvoiceDate.createCurrentDate().object;
|
issue_date = CustomerInvoiceDate.createCurrentDate().object;
|
||||||
}
|
}
|
||||||
|
|
||||||
let operation_date = CustomerInvoiceDate.create(customerCustomerInvoiceDTO.operation_date).object;
|
let operation_date = CustomerInvoiceDate.create(customerInvoiceDTO.operation_date).object;
|
||||||
if (operation_date.isEmpty()) {
|
if (operation_date.isEmpty()) {
|
||||||
operation_date = CustomerInvoiceDate.createCurrentDate().object;
|
operation_date = CustomerInvoiceDate.createCurrentDate().object;
|
||||||
}
|
}
|
||||||
|
|
||||||
let customerCustomerInvoiceCurrency = Currency.createFromCode(customerCustomerInvoiceDTO.currency).object;
|
let customerInvoiceCurrency = Currency.createFromCode(customerInvoiceDTO.currency).object;
|
||||||
|
|
||||||
if (customerCustomerInvoiceCurrency.isEmpty()) {
|
if (customerInvoiceCurrency.isEmpty()) {
|
||||||
customerCustomerInvoiceCurrency = Currency.createDefaultCode().object;
|
customerInvoiceCurrency = Currency.createDefaultCode().object;
|
||||||
}
|
}
|
||||||
|
|
||||||
let customerCustomerInvoiceLanguage = Language.createFromCode(customerCustomerInvoiceDTO.language_code).object;
|
let customerInvoiceLanguage = Language.createFromCode(customerInvoiceDTO.language_code).object;
|
||||||
|
|
||||||
if (customerCustomerInvoiceLanguage.isEmpty()) {
|
if (customerInvoiceLanguage.isEmpty()) {
|
||||||
customerCustomerInvoiceLanguage = Language.createDefaultCode().object;
|
customerInvoiceLanguage = Language.createDefaultCode().object;
|
||||||
}
|
}
|
||||||
|
|
||||||
const items = new Collection<CustomerInvoiceItem>(
|
const items = new Collection<CustomerInvoiceItem>(
|
||||||
customerCustomerInvoiceDTO.items?.map(
|
customerInvoiceDTO.items?.map(
|
||||||
(item) =>
|
(item) =>
|
||||||
CustomerInvoiceSimpleItem.create({
|
CustomerInvoiceSimpleItem.create({
|
||||||
description: Description.create(item.description).object,
|
description: Description.create(item.description).object,
|
||||||
@ -89,26 +89,26 @@ export class CreateCustomerInvoiceUseCase {
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!customerCustomerInvoice_status.isDraft()) {
|
if (!customerInvoice_status.isDraft()) {
|
||||||
throw Error("Error al crear una factura que no es borrador");
|
throw Error("Error al crear una factura que no es borrador");
|
||||||
}
|
}
|
||||||
|
|
||||||
return DraftCustomerInvoice.create(
|
return DraftCustomerInvoice.create(
|
||||||
{
|
{
|
||||||
customerCustomerInvoiceSeries: customerCustomerInvoice_series,
|
customerInvoiceSeries: customerInvoice_series,
|
||||||
issueDate: issue_date,
|
issueDate: issue_date,
|
||||||
operationDate: operation_date,
|
operationDate: operation_date,
|
||||||
customerCustomerInvoiceCurrency,
|
customerInvoiceCurrency,
|
||||||
language: customerCustomerInvoiceLanguage,
|
language: customerInvoiceLanguage,
|
||||||
customerCustomerInvoiceNumber: CustomerInvoiceNumber.create(undefined).object,
|
customerInvoiceNumber: CustomerInvoiceNumber.create(undefined).object,
|
||||||
//notes: Note.create(customerCustomerInvoiceDTO.notes).object,
|
//notes: Note.create(customerInvoiceDTO.notes).object,
|
||||||
|
|
||||||
//senderId: UniqueID.create(null).object,
|
//senderId: UniqueID.create(null).object,
|
||||||
recipient,
|
recipient,
|
||||||
|
|
||||||
items,
|
items,
|
||||||
},
|
},
|
||||||
customerCustomerInvoiceId
|
customerInvoiceId
|
||||||
);
|
);
|
||||||
} */
|
} */
|
||||||
}
|
}
|
||||||
@ -152,39 +152,39 @@ export class UpdateCustomerInvoiceUseCase2
|
|||||||
id: UniqueID;
|
id: UniqueID;
|
||||||
data: IUpdateCustomerInvoice_DTO;
|
data: IUpdateCustomerInvoice_DTO;
|
||||||
}): Promise<UpdateCustomerInvoiceResponseOrError> {
|
}): Promise<UpdateCustomerInvoiceResponseOrError> {
|
||||||
const { id, data: customerCustomerInvoiceDTO } = request;
|
const { id, data: customerInvoiceDTO } = request;
|
||||||
|
|
||||||
// Validaciones
|
// Validaciones
|
||||||
const customerCustomerInvoiceDTOOrError = ensureUpdateCustomerInvoice_DTOIsValid(customerCustomerInvoiceDTO);
|
const customerInvoiceDTOOrError = ensureUpdateCustomerInvoice_DTOIsValid(customerInvoiceDTO);
|
||||||
if (customerCustomerInvoiceDTOOrError.isFailure) {
|
if (customerInvoiceDTOOrError.isFailure) {
|
||||||
return this.handleValidationFailure(customerCustomerInvoiceDTOOrError.error);
|
return this.handleValidationFailure(customerInvoiceDTOOrError.error);
|
||||||
}
|
}
|
||||||
|
|
||||||
const transaction = this._adapter.startTransaction();
|
const transaction = this._adapter.startTransaction();
|
||||||
|
|
||||||
const customerCustomerInvoiceRepoBuilder = this.getRepository<ICustomerInvoiceRepository>("CustomerInvoice");
|
const customerInvoiceRepoBuilder = this.getRepository<ICustomerInvoiceRepository>("CustomerInvoice");
|
||||||
|
|
||||||
let customerCustomerInvoice: CustomerInvoice | null = null;
|
let customerInvoice: CustomerInvoice | null = null;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await transaction.complete(async (t) => {
|
await transaction.complete(async (t) => {
|
||||||
customerCustomerInvoice = await customerCustomerInvoiceRepoBuilder({ transaction: t }).getById(id);
|
customerInvoice = await customerInvoiceRepoBuilder({ transaction: t }).getById(id);
|
||||||
});
|
});
|
||||||
|
|
||||||
if (customerCustomerInvoice === null) {
|
if (customerInvoice === null) {
|
||||||
return Result.fail<IUseCaseError>(
|
return Result.fail<IUseCaseError>(
|
||||||
UseCaseError.create(UseCaseError.NOT_FOUND_ERROR, `CustomerInvoice not found`, {
|
UseCaseError.create(UseCaseError.NOT_FOUND_ERROR, `CustomerInvoice not found`, {
|
||||||
id: request.id.toString(),
|
id: request.id.toString(),
|
||||||
entity: "customerCustomerInvoice",
|
entity: "customerInvoice",
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Result.ok<CustomerInvoice>(customerCustomerInvoice);
|
return Result.ok<CustomerInvoice>(customerInvoice);
|
||||||
} catch (error: unknown) {
|
} catch (error: unknown) {
|
||||||
const _error = error as Error;
|
const _error = error as Error;
|
||||||
if (customerCustomerInvoiceRepoBuilder().isRepositoryError(_error)) {
|
if (customerInvoiceRepoBuilder().isRepositoryError(_error)) {
|
||||||
return this.handleRepositoryError(error as BaseError, customerCustomerInvoiceRepoBuilder());
|
return this.handleRepositoryError(error as BaseError, customerInvoiceRepoBuilder());
|
||||||
} else {
|
} else {
|
||||||
return this.handleUnexceptedError(error);
|
return this.handleUnexceptedError(error);
|
||||||
}
|
}
|
||||||
@ -192,7 +192,7 @@ export class UpdateCustomerInvoiceUseCase2
|
|||||||
|
|
||||||
// Recipient validations
|
// Recipient validations
|
||||||
const recipientIdOrError = ensureParticipantIdIsValid(
|
const recipientIdOrError = ensureParticipantIdIsValid(
|
||||||
customerCustomerInvoiceDTO?.recipient?.id,
|
customerInvoiceDTO?.recipient?.id,
|
||||||
);
|
);
|
||||||
if (recipientIdOrError.isFailure) {
|
if (recipientIdOrError.isFailure) {
|
||||||
return this.handleValidationFailure(
|
return this.handleValidationFailure(
|
||||||
@ -203,7 +203,7 @@ export class UpdateCustomerInvoiceUseCase2
|
|||||||
const recipientId = recipientIdOrError.object;
|
const recipientId = recipientIdOrError.object;
|
||||||
|
|
||||||
const recipientBillingIdOrError = ensureParticipantAddressIdIsValid(
|
const recipientBillingIdOrError = ensureParticipantAddressIdIsValid(
|
||||||
customerCustomerInvoiceDTO?.recipient?.billing_address_id,
|
customerInvoiceDTO?.recipient?.billing_address_id,
|
||||||
);
|
);
|
||||||
if (recipientBillingIdOrError.isFailure) {
|
if (recipientBillingIdOrError.isFailure) {
|
||||||
return this.handleValidationFailure(
|
return this.handleValidationFailure(
|
||||||
@ -214,7 +214,7 @@ export class UpdateCustomerInvoiceUseCase2
|
|||||||
const recipientBillingId = recipientBillingIdOrError.object;
|
const recipientBillingId = recipientBillingIdOrError.object;
|
||||||
|
|
||||||
const recipientShippingIdOrError = ensureParticipantAddressIdIsValid(
|
const recipientShippingIdOrError = ensureParticipantAddressIdIsValid(
|
||||||
customerCustomerInvoiceDTO?.recipient?.shipping_address_id,
|
customerInvoiceDTO?.recipient?.shipping_address_id,
|
||||||
);
|
);
|
||||||
if (recipientShippingIdOrError.isFailure) {
|
if (recipientShippingIdOrError.isFailure) {
|
||||||
return this.handleValidationFailure(
|
return this.handleValidationFailure(
|
||||||
@ -236,18 +236,18 @@ export class UpdateCustomerInvoiceUseCase2
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Crear customerCustomerInvoice
|
// Crear customerInvoice
|
||||||
const customerCustomerInvoiceOrError = await this.tryUpdateCustomerInvoiceInstance(
|
const customerInvoiceOrError = await this.tryUpdateCustomerInvoiceInstance(
|
||||||
customerCustomerInvoiceDTO,
|
customerInvoiceDTO,
|
||||||
customerCustomerInvoiceIdOrError.object,
|
customerInvoiceIdOrError.object,
|
||||||
//senderId,
|
//senderId,
|
||||||
//senderBillingId,
|
//senderBillingId,
|
||||||
//senderShippingId,
|
//senderShippingId,
|
||||||
recipientContact,
|
recipientContact,
|
||||||
);
|
);
|
||||||
|
|
||||||
if (customerCustomerInvoiceOrError.isFailure) {
|
if (customerInvoiceOrError.isFailure) {
|
||||||
const { error: domainError } = customerCustomerInvoiceOrError;
|
const { error: domainError } = customerInvoiceOrError;
|
||||||
let errorCode = "";
|
let errorCode = "";
|
||||||
let message = "";
|
let message = "";
|
||||||
|
|
||||||
@ -269,46 +269,46 @@ export class UpdateCustomerInvoiceUseCase2
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.saveCustomerInvoice(customerCustomerInvoiceOrError.object);
|
return this.saveCustomerInvoice(customerInvoiceOrError.object);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async tryUpdateCustomerInvoiceInstance(customerCustomerInvoiceDTO, customerCustomerInvoiceId, recipient) {
|
private async tryUpdateCustomerInvoiceInstance(customerInvoiceDTO, customerInvoiceId, recipient) {
|
||||||
// Create customerCustomerInvoice
|
// Create customerInvoice
|
||||||
let customerCustomerInvoice_status = CustomerInvoiceStatus.create(customerCustomerInvoiceDTO.status).object;
|
let customerInvoice_status = CustomerInvoiceStatus.create(customerInvoiceDTO.status).object;
|
||||||
if (customerCustomerInvoice_status.isEmpty()) {
|
if (customerInvoice_status.isEmpty()) {
|
||||||
customerCustomerInvoice_status = CustomerInvoiceStatus.createDraft();
|
customerInvoice_status = CustomerInvoiceStatus.createDraft();
|
||||||
}
|
}
|
||||||
|
|
||||||
let customerCustomerInvoice_series = CustomerInvoiceSeries.create(customerCustomerInvoiceDTO.customerCustomerInvoice_series).object;
|
let customerInvoice_series = CustomerInvoiceSeries.create(customerInvoiceDTO.customerInvoice_series).object;
|
||||||
if (customerCustomerInvoice_series.isEmpty()) {
|
if (customerInvoice_series.isEmpty()) {
|
||||||
customerCustomerInvoice_series = CustomerInvoiceSeries.create(customerCustomerInvoiceDTO.customerCustomerInvoice_series).object;
|
customerInvoice_series = CustomerInvoiceSeries.create(customerInvoiceDTO.customerInvoice_series).object;
|
||||||
}
|
}
|
||||||
|
|
||||||
let issue_date = CustomerInvoiceDate.create(customerCustomerInvoiceDTO.issue_date).object;
|
let issue_date = CustomerInvoiceDate.create(customerInvoiceDTO.issue_date).object;
|
||||||
if (issue_date.isEmpty()) {
|
if (issue_date.isEmpty()) {
|
||||||
issue_date = CustomerInvoiceDate.createCurrentDate().object;
|
issue_date = CustomerInvoiceDate.createCurrentDate().object;
|
||||||
}
|
}
|
||||||
|
|
||||||
let operation_date = CustomerInvoiceDate.create(customerCustomerInvoiceDTO.operation_date).object;
|
let operation_date = CustomerInvoiceDate.create(customerInvoiceDTO.operation_date).object;
|
||||||
if (operation_date.isEmpty()) {
|
if (operation_date.isEmpty()) {
|
||||||
operation_date = CustomerInvoiceDate.createCurrentDate().object;
|
operation_date = CustomerInvoiceDate.createCurrentDate().object;
|
||||||
}
|
}
|
||||||
|
|
||||||
let customerCustomerInvoiceCurrency = Currency.createFromCode(customerCustomerInvoiceDTO.currency).object;
|
let customerInvoiceCurrency = Currency.createFromCode(customerInvoiceDTO.currency).object;
|
||||||
|
|
||||||
if (customerCustomerInvoiceCurrency.isEmpty()) {
|
if (customerInvoiceCurrency.isEmpty()) {
|
||||||
customerCustomerInvoiceCurrency = Currency.createDefaultCode().object;
|
customerInvoiceCurrency = Currency.createDefaultCode().object;
|
||||||
}
|
}
|
||||||
|
|
||||||
let customerCustomerInvoiceLanguage = Language.createFromCode(customerCustomerInvoiceDTO.language_code).object;
|
let customerInvoiceLanguage = Language.createFromCode(customerInvoiceDTO.language_code).object;
|
||||||
|
|
||||||
if (customerCustomerInvoiceLanguage.isEmpty()) {
|
if (customerInvoiceLanguage.isEmpty()) {
|
||||||
customerCustomerInvoiceLanguage = Language.createDefaultCode().object;
|
customerInvoiceLanguage = Language.createDefaultCode().object;
|
||||||
}
|
}
|
||||||
|
|
||||||
const items = new Collection<CustomerInvoiceItem>(
|
const items = new Collection<CustomerInvoiceItem>(
|
||||||
customerCustomerInvoiceDTO.items?.map(
|
customerInvoiceDTO.items?.map(
|
||||||
(item) =>
|
(item) =>
|
||||||
CustomerInvoiceSimpleItem.create({
|
CustomerInvoiceSimpleItem.create({
|
||||||
description: Description.create(item.description).object,
|
description: Description.create(item.description).object,
|
||||||
@ -322,26 +322,26 @@ export class UpdateCustomerInvoiceUseCase2
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!customerCustomerInvoice_status.isDraft()) {
|
if (!customerInvoice_status.isDraft()) {
|
||||||
throw Error("Error al crear una factura que no es borrador");
|
throw Error("Error al crear una factura que no es borrador");
|
||||||
}
|
}
|
||||||
|
|
||||||
return DraftCustomerInvoice.create(
|
return DraftCustomerInvoice.create(
|
||||||
{
|
{
|
||||||
customerCustomerInvoiceSeries: customerCustomerInvoice_series,
|
customerInvoiceSeries: customerInvoice_series,
|
||||||
issueDate: issue_date,
|
issueDate: issue_date,
|
||||||
operationDate: operation_date,
|
operationDate: operation_date,
|
||||||
customerCustomerInvoiceCurrency,
|
customerInvoiceCurrency,
|
||||||
language: customerCustomerInvoiceLanguage,
|
language: customerInvoiceLanguage,
|
||||||
customerCustomerInvoiceNumber: CustomerInvoiceNumber.create(undefined).object,
|
customerInvoiceNumber: CustomerInvoiceNumber.create(undefined).object,
|
||||||
//notes: Note.create(customerCustomerInvoiceDTO.notes).object,
|
//notes: Note.create(customerInvoiceDTO.notes).object,
|
||||||
|
|
||||||
//senderId: UniqueID.create(null).object,
|
//senderId: UniqueID.create(null).object,
|
||||||
recipient,
|
recipient,
|
||||||
|
|
||||||
items,
|
items,
|
||||||
},
|
},
|
||||||
customerCustomerInvoiceId
|
customerInvoiceId
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -361,21 +361,21 @@ export class UpdateCustomerInvoiceUseCase2
|
|||||||
return contact;
|
return contact;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async saveCustomerInvoice(customerCustomerInvoice: DraftCustomerInvoice) {
|
private async saveCustomerInvoice(customerInvoice: DraftCustomerInvoice) {
|
||||||
const transaction = this._adapter.startTransaction();
|
const transaction = this._adapter.startTransaction();
|
||||||
const customerCustomerInvoiceRepoBuilder = this.getRepository<ICustomerInvoiceRepository>("CustomerInvoice");
|
const customerInvoiceRepoBuilder = this.getRepository<ICustomerInvoiceRepository>("CustomerInvoice");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await transaction.complete(async (t) => {
|
await transaction.complete(async (t) => {
|
||||||
const customerCustomerInvoiceRepo = customerCustomerInvoiceRepoBuilder({ transaction: t });
|
const customerInvoiceRepo = customerInvoiceRepoBuilder({ transaction: t });
|
||||||
await customerCustomerInvoiceRepo.save(customerCustomerInvoice);
|
await customerInvoiceRepo.save(customerInvoice);
|
||||||
});
|
});
|
||||||
|
|
||||||
return Result.ok<DraftCustomerInvoice>(customerCustomerInvoice);
|
return Result.ok<DraftCustomerInvoice>(customerInvoice);
|
||||||
} catch (error: unknown) {
|
} catch (error: unknown) {
|
||||||
const _error = error as Error;
|
const _error = error as Error;
|
||||||
if (customerCustomerInvoiceRepoBuilder().isRepositoryError(_error)) {
|
if (customerInvoiceRepoBuilder().isRepositoryError(_error)) {
|
||||||
return this.handleRepositoryError(error as BaseError, customerCustomerInvoiceRepoBuilder());
|
return this.handleRepositoryError(error as BaseError, customerInvoiceRepoBuilder());
|
||||||
} else {
|
} else {
|
||||||
return this.handleUnexceptedError(error);
|
return this.handleUnexceptedError(error);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,11 +1,15 @@
|
|||||||
import { AggregateRoot, MoneyValue, UniqueID, UtcDate } from "@repo/rdx-ddd";
|
import { AggregateRoot, MoneyValue, UniqueID, UtcDate } from "@repo/rdx-ddd";
|
||||||
import { Collection, Result } from "@repo/rdx-utils";
|
import { Collection, Result } from "@repo/rdx-utils";
|
||||||
import { CustomerInvoiceCustomer, CustomerInvoiceItem, CustomerInvoiceItems } from "../entities";
|
import { CustomerInvoiceCustomer, CustomerInvoiceItem, CustomerInvoiceItems } from "../entities";
|
||||||
import { CustomerInvoiceNumber, CustomerInvoiceSerie, CustomerInvoiceStatus } from "../value-objects";
|
import {
|
||||||
|
CustomerInvoiceNumber,
|
||||||
|
CustomerInvoiceSerie,
|
||||||
|
CustomerInvoiceStatus,
|
||||||
|
} from "../value-objects";
|
||||||
|
|
||||||
export interface ICustomerInvoiceProps {
|
export interface ICustomerInvoiceProps {
|
||||||
customerCustomerInvoiceNumber: CustomerInvoiceNumber;
|
customerInvoiceNumber: CustomerInvoiceNumber;
|
||||||
customerCustomerInvoiceSeries: CustomerInvoiceSerie;
|
customerInvoiceSeries: CustomerInvoiceSerie;
|
||||||
|
|
||||||
status: CustomerInvoiceStatus;
|
status: CustomerInvoiceStatus;
|
||||||
|
|
||||||
@ -15,7 +19,7 @@ export interface ICustomerInvoiceProps {
|
|||||||
//dueDate: UtcDate; // ? --> depende de la forma de pago
|
//dueDate: UtcDate; // ? --> depende de la forma de pago
|
||||||
|
|
||||||
//tax: Tax; // ? --> detalles?
|
//tax: Tax; // ? --> detalles?
|
||||||
customerCustomerInvoiceCurrency: string;
|
customerInvoiceCurrency: string;
|
||||||
|
|
||||||
//language: Language;
|
//language: Language;
|
||||||
|
|
||||||
@ -33,8 +37,8 @@ export interface ICustomerInvoiceProps {
|
|||||||
|
|
||||||
export interface ICustomerInvoice {
|
export interface ICustomerInvoice {
|
||||||
id: UniqueID;
|
id: UniqueID;
|
||||||
customerCustomerInvoiceNumber: CustomerInvoiceNumber;
|
customerInvoiceNumber: CustomerInvoiceNumber;
|
||||||
customerCustomerInvoiceSeries: CustomerInvoiceSerie;
|
customerInvoiceSeries: CustomerInvoiceSerie;
|
||||||
|
|
||||||
status: CustomerInvoiceStatus;
|
status: CustomerInvoiceStatus;
|
||||||
|
|
||||||
@ -49,7 +53,7 @@ export interface ICustomerInvoice {
|
|||||||
|
|
||||||
//tax: Tax;
|
//tax: Tax;
|
||||||
//language: Language;
|
//language: Language;
|
||||||
customerCustomerInvoiceCurrency: string;
|
customerInvoiceCurrency: string;
|
||||||
|
|
||||||
//purchareOrderNumber: string;
|
//purchareOrderNumber: string;
|
||||||
//notes: Note;
|
//notes: Note;
|
||||||
@ -64,7 +68,10 @@ export interface ICustomerInvoice {
|
|||||||
calculateTotal: () => MoneyValue;
|
calculateTotal: () => MoneyValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class CustomerInvoice extends AggregateRoot<ICustomerInvoiceProps> implements ICustomerInvoice {
|
export class CustomerInvoice
|
||||||
|
extends AggregateRoot<ICustomerInvoiceProps>
|
||||||
|
implements ICustomerInvoice
|
||||||
|
{
|
||||||
private _items!: Collection<CustomerInvoiceItem>;
|
private _items!: Collection<CustomerInvoiceItem>;
|
||||||
//protected _status: CustomerInvoiceStatus;
|
//protected _status: CustomerInvoiceStatus;
|
||||||
|
|
||||||
@ -75,25 +82,25 @@ export class CustomerInvoice extends AggregateRoot<ICustomerInvoiceProps> implem
|
|||||||
}
|
}
|
||||||
|
|
||||||
static create(props: ICustomerInvoiceProps, id?: UniqueID): Result<CustomerInvoice, Error> {
|
static create(props: ICustomerInvoiceProps, id?: UniqueID): Result<CustomerInvoice, Error> {
|
||||||
const customerCustomerInvoice = new CustomerInvoice(props, id);
|
const customerInvoice = new CustomerInvoice(props, id);
|
||||||
|
|
||||||
// Reglas de negocio / validaciones
|
// Reglas de negocio / validaciones
|
||||||
// ...
|
// ...
|
||||||
// ...
|
// ...
|
||||||
|
|
||||||
// 🔹 Disparar evento de dominio "CustomerInvoiceAuthenticatedEvent"
|
// 🔹 Disparar evento de dominio "CustomerInvoiceAuthenticatedEvent"
|
||||||
//const { customerCustomerInvoice } = props;
|
//const { customerInvoice } = props;
|
||||||
//user.addDomainEvent(new CustomerInvoiceAuthenticatedEvent(id, customerCustomerInvoice.toString()));
|
//user.addDomainEvent(new CustomerInvoiceAuthenticatedEvent(id, customerInvoice.toString()));
|
||||||
|
|
||||||
return Result.ok(customerCustomerInvoice);
|
return Result.ok(customerInvoice);
|
||||||
}
|
}
|
||||||
|
|
||||||
get customerCustomerInvoiceNumber() {
|
get customerInvoiceNumber() {
|
||||||
return this.props.customerCustomerInvoiceNumber;
|
return this.props.customerInvoiceNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
get customerCustomerInvoiceSeries() {
|
get customerInvoiceSeries() {
|
||||||
return this.props.customerCustomerInvoiceSeries;
|
return this.props.customerInvoiceSeries;
|
||||||
}
|
}
|
||||||
|
|
||||||
get issueDate() {
|
get issueDate() {
|
||||||
@ -152,8 +159,8 @@ export class CustomerInvoice extends AggregateRoot<ICustomerInvoiceProps> implem
|
|||||||
return this.props.shipTo;
|
return this.props.shipTo;
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
get customerCustomerInvoiceCurrency() {
|
get customerInvoiceCurrency() {
|
||||||
return this.props.customerCustomerInvoiceCurrency;
|
return this.props.customerInvoiceCurrency;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*get notes() {
|
/*get notes() {
|
||||||
@ -174,29 +181,29 @@ export class CustomerInvoice extends AggregateRoot<ICustomerInvoiceProps> implem
|
|||||||
}*/
|
}*/
|
||||||
|
|
||||||
calculateSubtotal(): MoneyValue {
|
calculateSubtotal(): MoneyValue {
|
||||||
const customerCustomerInvoiceSubtotal = MoneyValue.create({
|
const customerInvoiceSubtotal = MoneyValue.create({
|
||||||
amount: 0,
|
amount: 0,
|
||||||
currency_code: this.props.customerCustomerInvoiceCurrency,
|
currency_code: this.props.customerInvoiceCurrency,
|
||||||
scale: 2,
|
scale: 2,
|
||||||
}).data;
|
}).data;
|
||||||
|
|
||||||
return this._items.getAll().reduce((subtotal, item) => {
|
return this._items.getAll().reduce((subtotal, item) => {
|
||||||
return subtotal.add(item.calculateTotal());
|
return subtotal.add(item.calculateTotal());
|
||||||
}, customerCustomerInvoiceSubtotal);
|
}, customerInvoiceSubtotal);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Method to calculate the total tax in the customerCustomerInvoice
|
// Method to calculate the total tax in the customerInvoice
|
||||||
calculateTaxTotal(): MoneyValue {
|
calculateTaxTotal(): MoneyValue {
|
||||||
const taxTotal = MoneyValue.create({
|
const taxTotal = MoneyValue.create({
|
||||||
amount: 0,
|
amount: 0,
|
||||||
currency_code: this.props.customerCustomerInvoiceCurrency,
|
currency_code: this.props.customerInvoiceCurrency,
|
||||||
scale: 2,
|
scale: 2,
|
||||||
}).data;
|
}).data;
|
||||||
|
|
||||||
return taxTotal;
|
return taxTotal;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Method to calculate the total customerCustomerInvoice amount, including taxes
|
// Method to calculate the total customerInvoice amount, including taxes
|
||||||
calculateTotal(): MoneyValue {
|
calculateTotal(): MoneyValue {
|
||||||
return this.calculateSubtotal().add(this.calculateTaxTotal());
|
return this.calculateSubtotal().add(this.calculateTaxTotal());
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
export * from "./customerCustomerInvoice";
|
export * from "./customer-invoice";
|
||||||
|
|||||||
@ -1,2 +1,2 @@
|
|||||||
export * from "./customerCustomerInvoice-customer";
|
export * from "./invoice-customer";
|
||||||
export * from "./customerCustomerInvoice-items";
|
export * from "./invoice-items";
|
||||||
|
|||||||
@ -1,2 +1 @@
|
|||||||
export * from "./customerCustomerInvoice-address";
|
export * from "./invoice-customer";
|
||||||
export * from "./customerCustomerInvoice-customer";
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { DomainEntity, Name, TINNumber, UniqueID } from "@repo/rdx-ddd";
|
import { DomainEntity, Name, TINNumber, UniqueID } from "@repo/rdx-ddd";
|
||||||
import { Result } from "@repo/rdx-utils";
|
import { Result } from "@repo/rdx-utils";
|
||||||
import { CustomerInvoiceAddress } from "./customerCustomerInvoice-address";
|
import { CustomerInvoiceAddress } from "./customer-invoice-address";
|
||||||
|
|
||||||
export interface ICustomerInvoiceCustomerProps {
|
export interface ICustomerInvoiceCustomerProps {
|
||||||
tin: TINNumber;
|
tin: TINNumber;
|
||||||
|
|||||||
@ -1,2 +1,2 @@
|
|||||||
export * from "./customerCustomerInvoice-item";
|
export * from "./invoice-item";
|
||||||
export * from "./customerCustomerInvoice-items";
|
export * from "./invoice-items";
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { MoneyValue, Percentage, Quantity } from "@/core/common/domain";
|
import { MoneyValue, Percentage, Quantity } from "@/core/common/domain";
|
||||||
import { CustomerInvoiceItemDescription } from "../../value-objects";
|
import { CustomerInvoiceItemDescription } from "../../value-objects";
|
||||||
import { CustomerInvoiceItem } from "./customerCustomerInvoice-item";
|
import { CustomerInvoiceItem } from "./customer-invoice-item";
|
||||||
|
|
||||||
describe("CustomerInvoiceItem", () => {
|
describe("CustomerInvoiceItem", () => {
|
||||||
it("debería calcular correctamente el subtotal (unitPrice * quantity)", () => {
|
it("debería calcular correctamente el subtotal (unitPrice * quantity)", () => {
|
||||||
@ -14,8 +14,8 @@ describe("CustomerInvoiceItem", () => {
|
|||||||
const result = CustomerInvoiceItem.create(props);
|
const result = CustomerInvoiceItem.create(props);
|
||||||
|
|
||||||
expect(result.isOk()).toBe(true);
|
expect(result.isOk()).toBe(true);
|
||||||
const customerCustomerInvoiceItem = result.unwrap();
|
const customerInvoiceItem = result.unwrap();
|
||||||
expect(customerCustomerInvoiceItem.subtotalPrice.value).toBe(100); // 50 * 2
|
expect(customerInvoiceItem.subtotalPrice.value).toBe(100); // 50 * 2
|
||||||
});
|
});
|
||||||
|
|
||||||
it("debería calcular correctamente el total con descuento", () => {
|
it("debería calcular correctamente el total con descuento", () => {
|
||||||
@ -29,8 +29,8 @@ describe("CustomerInvoiceItem", () => {
|
|||||||
const result = CustomerInvoiceItem.create(props);
|
const result = CustomerInvoiceItem.create(props);
|
||||||
|
|
||||||
expect(result.isOk()).toBe(true);
|
expect(result.isOk()).toBe(true);
|
||||||
const customerCustomerInvoiceItem = result.unwrap();
|
const customerInvoiceItem = result.unwrap();
|
||||||
expect(customerCustomerInvoiceItem.totalPrice.value).toBe(81); // (30 * 3) - 10% de (30 * 3)
|
expect(customerInvoiceItem.totalPrice.value).toBe(81); // (30 * 3) - 10% de (30 * 3)
|
||||||
});
|
});
|
||||||
|
|
||||||
it("debería devolver los valores correctos de las propiedades", () => {
|
it("debería devolver los valores correctos de las propiedades", () => {
|
||||||
@ -44,11 +44,11 @@ describe("CustomerInvoiceItem", () => {
|
|||||||
const result = CustomerInvoiceItem.create(props);
|
const result = CustomerInvoiceItem.create(props);
|
||||||
|
|
||||||
expect(result.isOk()).toBe(true);
|
expect(result.isOk()).toBe(true);
|
||||||
const customerCustomerInvoiceItem = result.unwrap();
|
const customerInvoiceItem = result.unwrap();
|
||||||
expect(customerCustomerInvoiceItem.description.value).toBe("Producto C");
|
expect(customerInvoiceItem.description.value).toBe("Producto C");
|
||||||
expect(customerCustomerInvoiceItem.quantity.value).toBe(1);
|
expect(customerInvoiceItem.quantity.value).toBe(1);
|
||||||
expect(customerCustomerInvoiceItem.unitPrice.value).toBe(100);
|
expect(customerInvoiceItem.unitPrice.value).toBe(100);
|
||||||
expect(customerCustomerInvoiceItem.discount.value).toBe(5);
|
expect(customerInvoiceItem.discount.value).toBe(5);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("debería manejar correctamente un descuento del 0%", () => {
|
it("debería manejar correctamente un descuento del 0%", () => {
|
||||||
@ -62,8 +62,8 @@ describe("CustomerInvoiceItem", () => {
|
|||||||
const result = CustomerInvoiceItem.create(props);
|
const result = CustomerInvoiceItem.create(props);
|
||||||
|
|
||||||
expect(result.isOk()).toBe(true);
|
expect(result.isOk()).toBe(true);
|
||||||
const customerCustomerInvoiceItem = result.unwrap();
|
const customerInvoiceItem = result.unwrap();
|
||||||
expect(customerCustomerInvoiceItem.totalPrice.value).toBe(100); // 25 * 4
|
expect(customerInvoiceItem.totalPrice.value).toBe(100); // 25 * 4
|
||||||
});
|
});
|
||||||
|
|
||||||
it("debería manejar correctamente un descuento del 100%", () => {
|
it("debería manejar correctamente un descuento del 100%", () => {
|
||||||
@ -77,7 +77,7 @@ describe("CustomerInvoiceItem", () => {
|
|||||||
const result = CustomerInvoiceItem.create(props);
|
const result = CustomerInvoiceItem.create(props);
|
||||||
|
|
||||||
expect(result.isOk()).toBe(true);
|
expect(result.isOk()).toBe(true);
|
||||||
const customerCustomerInvoiceItem = result.unwrap();
|
const customerInvoiceItem = result.unwrap();
|
||||||
expect(customerCustomerInvoiceItem.totalPrice.value).toBe(0); // (50 * 2) - 100% de (50 * 2)
|
expect(customerInvoiceItem.totalPrice.value).toBe(0); // (50 * 2) - 100% de (50 * 2)
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@ -28,11 +28,17 @@ export interface ICustomerInvoiceItem {
|
|||||||
totalPrice: CustomerInvoiceItemTotalPrice;
|
totalPrice: CustomerInvoiceItemTotalPrice;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class CustomerInvoiceItem extends DomainEntity<ICustomerInvoiceItemProps> implements ICustomerInvoiceItem {
|
export class CustomerInvoiceItem
|
||||||
|
extends DomainEntity<ICustomerInvoiceItemProps>
|
||||||
|
implements ICustomerInvoiceItem
|
||||||
|
{
|
||||||
private _subtotalPrice!: CustomerInvoiceItemSubtotalPrice;
|
private _subtotalPrice!: CustomerInvoiceItemSubtotalPrice;
|
||||||
private _totalPrice!: CustomerInvoiceItemTotalPrice;
|
private _totalPrice!: CustomerInvoiceItemTotalPrice;
|
||||||
|
|
||||||
public static create(props: ICustomerInvoiceItemProps, id?: UniqueID): Result<CustomerInvoiceItem, Error> {
|
public static create(
|
||||||
|
props: ICustomerInvoiceItemProps,
|
||||||
|
id?: UniqueID
|
||||||
|
): Result<CustomerInvoiceItem, Error> {
|
||||||
const item = new CustomerInvoiceItem(props, id);
|
const item = new CustomerInvoiceItem(props, id);
|
||||||
|
|
||||||
// Reglas de negocio / validaciones
|
// Reglas de negocio / validaciones
|
||||||
@ -40,8 +46,8 @@ export class CustomerInvoiceItem extends DomainEntity<ICustomerInvoiceItemProps>
|
|||||||
// ...
|
// ...
|
||||||
|
|
||||||
// 🔹 Disparar evento de dominio "CustomerInvoiceItemCreatedEvent"
|
// 🔹 Disparar evento de dominio "CustomerInvoiceItemCreatedEvent"
|
||||||
//const { customerCustomerInvoice } = props;
|
//const { customerInvoice } = props;
|
||||||
//user.addDomainEvent(new CustomerInvoiceAuthenticatedEvent(id, customerCustomerInvoice.toString()));
|
//user.addDomainEvent(new CustomerInvoiceAuthenticatedEvent(id, customerInvoice.toString()));
|
||||||
|
|
||||||
return Result.ok(item);
|
return Result.ok(item);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { Collection } from "@repo/rdx-utils";
|
import { Collection } from "@repo/rdx-utils";
|
||||||
import { CustomerInvoiceItem } from "./customerCustomerInvoice-item";
|
import { CustomerInvoiceItem } from "./customer-invoice-item";
|
||||||
|
|
||||||
export class CustomerInvoiceItems extends Collection<CustomerInvoiceItem> {
|
export class CustomerInvoiceItems extends Collection<CustomerInvoiceItem> {
|
||||||
public static create(items?: CustomerInvoiceItem[]): CustomerInvoiceItems {
|
public static create(items?: CustomerInvoiceItem[]): CustomerInvoiceItems {
|
||||||
|
|||||||
@ -4,10 +4,13 @@ import { Collection, Result } from "@repo/rdx-utils";
|
|||||||
import { CustomerInvoice } from "../aggregates";
|
import { CustomerInvoice } from "../aggregates";
|
||||||
|
|
||||||
export interface ICustomerInvoiceRepository {
|
export interface ICustomerInvoiceRepository {
|
||||||
findAll(criteria: Criteria, transaction?: any): Promise<Result<Collection<CustomerInvoice>, Error>>;
|
findAll(
|
||||||
|
criteria: Criteria,
|
||||||
|
transaction?: any
|
||||||
|
): Promise<Result<Collection<CustomerInvoice>, Error>>;
|
||||||
getById(id: UniqueID, transaction?: any): Promise<Result<CustomerInvoice, Error>>;
|
getById(id: UniqueID, transaction?: any): Promise<Result<CustomerInvoice, Error>>;
|
||||||
deleteById(id: UniqueID, transaction?: any): Promise<Result<boolean, Error>>;
|
deleteById(id: UniqueID, transaction?: any): Promise<Result<boolean, Error>>;
|
||||||
|
|
||||||
create(customerCustomerInvoice: CustomerInvoice, transaction?: any): Promise<void>;
|
create(customerInvoice: CustomerInvoice, transaction?: any): Promise<void>;
|
||||||
update(customerCustomerInvoice: CustomerInvoice, transaction?: any): Promise<void>;
|
update(customerInvoice: CustomerInvoice, transaction?: any): Promise<void>;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
export * from "./customerCustomerInvoice-repository.interface";
|
export * from "./customer-invoice-repository.interface";
|
||||||
|
|||||||
@ -1,23 +1,32 @@
|
|||||||
import { Criteria } from "@repo/rdx-criteria/server";
|
import { Criteria } from "@repo/rdx-criteria/server";
|
||||||
import { UniqueID } from "@repo/rdx-ddd";
|
import { UniqueID } from "@repo/rdx-ddd";
|
||||||
import { Collection, Result } from "@repo/rdx-utils";
|
import { Collection, Result } from "@repo/rdx-utils";
|
||||||
import { ICustomerInvoiceProps, CustomerInvoice } from "../aggregates";
|
import { CustomerInvoice, ICustomerInvoiceProps } from "../aggregates";
|
||||||
|
|
||||||
export interface ICustomerInvoiceService {
|
export interface ICustomerInvoiceService {
|
||||||
findCustomerInvoices(criteria: Criteria, transaction?: any): Promise<Result<Collection<CustomerInvoice>, Error>>;
|
findCustomerInvoices(
|
||||||
findCustomerInvoiceById(customerCustomerInvoiceId: UniqueID, transaction?: any): Promise<Result<CustomerInvoice>>;
|
criteria: Criteria,
|
||||||
|
transaction?: any
|
||||||
|
): Promise<Result<Collection<CustomerInvoice>, Error>>;
|
||||||
|
findCustomerInvoiceById(
|
||||||
|
customerInvoiceId: UniqueID,
|
||||||
|
transaction?: any
|
||||||
|
): Promise<Result<CustomerInvoice>>;
|
||||||
|
|
||||||
updateCustomerInvoiceById(
|
updateCustomerInvoiceById(
|
||||||
customerCustomerInvoiceId: UniqueID,
|
customerInvoiceId: UniqueID,
|
||||||
data: Partial<ICustomerInvoiceProps>,
|
data: Partial<ICustomerInvoiceProps>,
|
||||||
transaction?: any
|
transaction?: any
|
||||||
): Promise<Result<CustomerInvoice, Error>>;
|
): Promise<Result<CustomerInvoice, Error>>;
|
||||||
|
|
||||||
createCustomerInvoice(
|
createCustomerInvoice(
|
||||||
customerCustomerInvoiceId: UniqueID,
|
customerInvoiceId: UniqueID,
|
||||||
data: ICustomerInvoiceProps,
|
data: ICustomerInvoiceProps,
|
||||||
transaction?: any
|
transaction?: any
|
||||||
): Promise<Result<CustomerInvoice, Error>>;
|
): Promise<Result<CustomerInvoice, Error>>;
|
||||||
|
|
||||||
deleteCustomerInvoiceById(customerCustomerInvoiceId: UniqueID, transaction?: any): Promise<Result<boolean, Error>>;
|
deleteCustomerInvoiceById(
|
||||||
|
customerInvoiceId: UniqueID,
|
||||||
|
transaction?: any
|
||||||
|
): Promise<Result<boolean, Error>>;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,9 +2,9 @@ import { Criteria } from "@repo/rdx-criteria/server";
|
|||||||
import { UniqueID } from "@repo/rdx-ddd";
|
import { UniqueID } from "@repo/rdx-ddd";
|
||||||
import { Collection, Result } from "@repo/rdx-utils";
|
import { Collection, Result } from "@repo/rdx-utils";
|
||||||
import { Transaction } from "sequelize";
|
import { Transaction } from "sequelize";
|
||||||
import { ICustomerInvoiceProps, CustomerInvoice } from "../aggregates";
|
import { CustomerInvoice, ICustomerInvoiceProps } from "../aggregates";
|
||||||
import { ICustomerInvoiceRepository } from "../repositories";
|
import { ICustomerInvoiceRepository } from "../repositories";
|
||||||
import { ICustomerInvoiceService } from "./customerCustomerInvoice-service.interface";
|
import { ICustomerInvoiceService } from "./customer-invoice-service.interface";
|
||||||
|
|
||||||
export class CustomerInvoiceService implements ICustomerInvoiceService {
|
export class CustomerInvoiceService implements ICustomerInvoiceService {
|
||||||
constructor(private readonly repo: ICustomerInvoiceRepository) {}
|
constructor(private readonly repo: ICustomerInvoiceRepository) {}
|
||||||
@ -13,39 +13,42 @@ export class CustomerInvoiceService implements ICustomerInvoiceService {
|
|||||||
criteria: Criteria,
|
criteria: Criteria,
|
||||||
transaction?: Transaction
|
transaction?: Transaction
|
||||||
): Promise<Result<Collection<CustomerInvoice>, Error>> {
|
): Promise<Result<Collection<CustomerInvoice>, Error>> {
|
||||||
const customerCustomerInvoicesOrError = await this.repo.findAll(criteria, transaction);
|
const customerInvoicesOrError = await this.repo.findAll(criteria, transaction);
|
||||||
if (customerCustomerInvoicesOrError.isFailure) {
|
if (customerInvoicesOrError.isFailure) {
|
||||||
return Result.fail(customerCustomerInvoicesOrError.error);
|
return Result.fail(customerInvoicesOrError.error);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Solo devolver usuarios activos
|
// Solo devolver usuarios activos
|
||||||
//const allCustomerInvoices = customerCustomerInvoicesOrError.data.filter((customerCustomerInvoice) => customerCustomerInvoice.isActive);
|
//const allCustomerInvoices = customerInvoicesOrError.data.filter((customerInvoice) => customerInvoice.isActive);
|
||||||
//return Result.ok(new Collection(allCustomerInvoices));
|
//return Result.ok(new Collection(allCustomerInvoices));
|
||||||
|
|
||||||
return customerCustomerInvoicesOrError;
|
return customerInvoicesOrError;
|
||||||
}
|
}
|
||||||
|
|
||||||
async findCustomerInvoiceById(customerCustomerInvoiceId: UniqueID, transaction?: Transaction): Promise<Result<CustomerInvoice>> {
|
async findCustomerInvoiceById(
|
||||||
return await this.repo.getById(customerCustomerInvoiceId, transaction);
|
customerInvoiceId: UniqueID,
|
||||||
|
transaction?: Transaction
|
||||||
|
): Promise<Result<CustomerInvoice>> {
|
||||||
|
return await this.repo.getById(customerInvoiceId, transaction);
|
||||||
}
|
}
|
||||||
|
|
||||||
async updateCustomerInvoiceById(
|
async updateCustomerInvoiceById(
|
||||||
customerCustomerInvoiceId: UniqueID,
|
customerInvoiceId: UniqueID,
|
||||||
data: Partial<ICustomerInvoiceProps>,
|
data: Partial<ICustomerInvoiceProps>,
|
||||||
transaction?: Transaction
|
transaction?: Transaction
|
||||||
): Promise<Result<CustomerInvoice, Error>> {
|
): Promise<Result<CustomerInvoice, Error>> {
|
||||||
// Verificar si la factura existe
|
// Verificar si la factura existe
|
||||||
const customerCustomerInvoiceOrError = await this.repo.getById(customerCustomerInvoiceId, transaction);
|
const customerInvoiceOrError = await this.repo.getById(customerInvoiceId, transaction);
|
||||||
if (customerCustomerInvoiceOrError.isFailure) {
|
if (customerInvoiceOrError.isFailure) {
|
||||||
return Result.fail(new Error("CustomerInvoice not found"));
|
return Result.fail(new Error("CustomerInvoice not found"));
|
||||||
}
|
}
|
||||||
|
|
||||||
return Result.fail(new Error("No implementado"));
|
return Result.fail(new Error("No implementado"));
|
||||||
|
|
||||||
/*const updatedCustomerInvoiceOrError = CustomerInvoice.update(customerCustomerInvoiceOrError.data, data);
|
/*const updatedCustomerInvoiceOrError = CustomerInvoice.update(customerInvoiceOrError.data, data);
|
||||||
if (updatedCustomerInvoiceOrError.isFailure) {
|
if (updatedCustomerInvoiceOrError.isFailure) {
|
||||||
return Result.fail(
|
return Result.fail(
|
||||||
new Error(`Error updating customerCustomerInvoice: ${updatedCustomerInvoiceOrError.error.message}`)
|
new Error(`Error updating customerInvoice: ${updatedCustomerInvoiceOrError.error.message}`)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -56,19 +59,21 @@ export class CustomerInvoiceService implements ICustomerInvoiceService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async createCustomerInvoice(
|
async createCustomerInvoice(
|
||||||
customerCustomerInvoiceId: UniqueID,
|
customerInvoiceId: UniqueID,
|
||||||
data: ICustomerInvoiceProps,
|
data: ICustomerInvoiceProps,
|
||||||
transaction?: Transaction
|
transaction?: Transaction
|
||||||
): Promise<Result<CustomerInvoice, Error>> {
|
): Promise<Result<CustomerInvoice, Error>> {
|
||||||
// Verificar si la factura existe
|
// Verificar si la factura existe
|
||||||
const customerCustomerInvoiceOrError = await this.repo.getById(customerCustomerInvoiceId, transaction);
|
const customerInvoiceOrError = await this.repo.getById(customerInvoiceId, transaction);
|
||||||
if (customerCustomerInvoiceOrError.isSuccess) {
|
if (customerInvoiceOrError.isSuccess) {
|
||||||
return Result.fail(new Error("CustomerInvoice exists"));
|
return Result.fail(new Error("CustomerInvoice exists"));
|
||||||
}
|
}
|
||||||
|
|
||||||
const newCustomerInvoiceOrError = CustomerInvoice.create(data, customerCustomerInvoiceId);
|
const newCustomerInvoiceOrError = CustomerInvoice.create(data, customerInvoiceId);
|
||||||
if (newCustomerInvoiceOrError.isFailure) {
|
if (newCustomerInvoiceOrError.isFailure) {
|
||||||
return Result.fail(new Error(`Error creating customerCustomerInvoice: ${newCustomerInvoiceOrError.error.message}`));
|
return Result.fail(
|
||||||
|
new Error(`Error creating customerInvoice: ${newCustomerInvoiceOrError.error.message}`)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const newCustomerInvoice = newCustomerInvoiceOrError.data;
|
const newCustomerInvoice = newCustomerInvoiceOrError.data;
|
||||||
@ -78,9 +83,9 @@ export class CustomerInvoiceService implements ICustomerInvoiceService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async deleteCustomerInvoiceById(
|
async deleteCustomerInvoiceById(
|
||||||
customerCustomerInvoiceId: UniqueID,
|
customerInvoiceId: UniqueID,
|
||||||
transaction?: Transaction
|
transaction?: Transaction
|
||||||
): Promise<Result<boolean, Error>> {
|
): Promise<Result<boolean, Error>> {
|
||||||
return this.repo.deleteById(customerCustomerInvoiceId, transaction);
|
return this.repo.deleteById(customerInvoiceId, transaction);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,2 +1,2 @@
|
|||||||
export * from "./customerCustomerInvoice-service.interface";
|
export * from "./customer-invoice-service.interface";
|
||||||
export * from "./customerCustomerInvoice.service";
|
export * from "./customer-invoice.service";
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
export * from "./customerCustomerInvoice-address-type";
|
export * from "./customer-invoice-address-type";
|
||||||
export * from "./customerCustomerInvoice-item-description";
|
export * from "./customer-invoice-item-description";
|
||||||
export * from "./customerCustomerInvoice-item-discount";
|
export * from "./customer-invoice-item-discount";
|
||||||
export * from "./customerCustomerInvoice-item-quantity";
|
export * from "./customer-invoice-item-quantity";
|
||||||
export * from "./customerCustomerInvoice-item-subtotal-price";
|
export * from "./customer-invoice-item-subtotal-price";
|
||||||
export * from "./customerCustomerInvoice-item-total-price";
|
export * from "./customer-invoice-item-total-price";
|
||||||
export * from "./customerCustomerInvoice-item-unit-price";
|
export * from "./customer-invoice-item-unit-price";
|
||||||
export * from "./customerCustomerInvoice-number";
|
export * from "./customer-invoice-number";
|
||||||
export * from "./customerCustomerInvoice-serie";
|
export * from "./customer-invoice-serie";
|
||||||
export * from "./customerCustomerInvoice-status";
|
export * from "./customer-invoice-status";
|
||||||
|
|||||||
@ -1,20 +1,22 @@
|
|||||||
import { IModuleServer, ModuleParams } from "@erp/core/api";
|
import { IModuleServer, ModuleParams } from "@erp/core/api";
|
||||||
import { customerCustomerInvoicesRouter, models } from "./infrastructure";
|
import { customerInvoicesRouter, models } from "./infrastructure";
|
||||||
|
|
||||||
export const customerCustomerInvoicesAPIModule: IModuleServer = {
|
export const customerInvoicesAPIModule: IModuleServer = {
|
||||||
name: "customerCustomerInvoices",
|
name: "customer-invoices",
|
||||||
version: "1.0.0",
|
version: "1.0.0",
|
||||||
dependencies: [],
|
dependencies: [],
|
||||||
|
|
||||||
init(params: ModuleParams) {
|
init(params: ModuleParams) {
|
||||||
// const contacts = getService<ContactsService>("contacts");
|
// const contacts = getService<ContactsService>("contacts");
|
||||||
const { logger } = params;
|
const { logger } = params;
|
||||||
customerCustomerInvoicesRouter(params);
|
customerInvoicesRouter(params);
|
||||||
logger.info("🚀 CustomerInvoices module initialized", { label: "customerCustomerInvoices" });
|
logger.info("🚀 CustomerInvoices module initialized", { label: "customer-invoices" });
|
||||||
},
|
},
|
||||||
registerDependencies(params) {
|
registerDependencies(params) {
|
||||||
const { database, logger } = params;
|
const { database, logger } = params;
|
||||||
logger.info("🚀 CustomerInvoices module dependencies registered", { label: "customerCustomerInvoices" });
|
logger.info("🚀 CustomerInvoices module dependencies registered", {
|
||||||
|
label: "customer-invoices",
|
||||||
|
});
|
||||||
return {
|
return {
|
||||||
models,
|
models,
|
||||||
services: {
|
services: {
|
||||||
@ -24,3 +26,5 @@ export const customerCustomerInvoicesAPIModule: IModuleServer = {
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export default customerInvoicesAPIModule;
|
||||||
|
|||||||
@ -1,13 +1,14 @@
|
|||||||
import { ModuleParams } from "@erp/core/api";
|
import { ILogger, ModuleParams } from "@erp/core/api";
|
||||||
import { Application, NextFunction, Request, Response, Router } from "express";
|
import { Application, NextFunction, Request, Response, Router } from "express";
|
||||||
import { Sequelize } from "sequelize";
|
import { Sequelize } from "sequelize";
|
||||||
import { buildListCustomerInvoicesController } from "../../presentation";
|
import { buildListCustomerInvoicesController } from "../../presentation";
|
||||||
|
|
||||||
export const customerCustomerInvoicesRouter = (params: ModuleParams) => {
|
export const customerInvoicesRouter = (params: ModuleParams) => {
|
||||||
const { app, database, baseRoutePath } = params as {
|
const { app, database, baseRoutePath, logger } = params as {
|
||||||
app: Application;
|
app: Application;
|
||||||
database: Sequelize;
|
database: Sequelize;
|
||||||
baseRoutePath: string;
|
baseRoutePath: string;
|
||||||
|
logger: ILogger;
|
||||||
};
|
};
|
||||||
|
|
||||||
const routes: Router = Router({ mergeParams: true });
|
const routes: Router = Router({ mergeParams: true });
|
||||||
@ -21,10 +22,10 @@ export const customerCustomerInvoicesRouter = (params: ModuleParams) => {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
app.use(`${baseRoutePath}/customerCustomerInvoices`, routes);
|
app.use(`${baseRoutePath}/customer-invoices`, routes);
|
||||||
|
|
||||||
/*routes.get(
|
/*routes.get(
|
||||||
"/:customerCustomerInvoiceId",
|
"/:customerInvoiceId",
|
||||||
//checkTabContext,
|
//checkTabContext,
|
||||||
//checkUser,
|
//checkUser,
|
||||||
(req: Request, res: Response, next: NextFunction) => {
|
(req: Request, res: Response, next: NextFunction) => {
|
||||||
@ -43,7 +44,7 @@ export const customerCustomerInvoicesRouter = (params: ModuleParams) => {
|
|||||||
);
|
);
|
||||||
|
|
||||||
routes.put(
|
routes.put(
|
||||||
"/:customerCustomerInvoiceId",
|
"/:customerInvoiceId",
|
||||||
validateAndParseBody(IUpdateCustomerInvoiceRequestSchema),
|
validateAndParseBody(IUpdateCustomerInvoiceRequestSchema),
|
||||||
checkTabContext,
|
checkTabContext,
|
||||||
//checkUser,
|
//checkUser,
|
||||||
@ -53,7 +54,7 @@ export const customerCustomerInvoicesRouter = (params: ModuleParams) => {
|
|||||||
);
|
);
|
||||||
|
|
||||||
routes.delete(
|
routes.delete(
|
||||||
"/:customerCustomerInvoiceId",
|
"/:customerInvoiceId",
|
||||||
validateAndParseBody(IDeleteCustomerInvoiceRequestSchema),
|
validateAndParseBody(IDeleteCustomerInvoiceRequestSchema),
|
||||||
checkTabContext,
|
checkTabContext,
|
||||||
//checkUser,
|
//checkUser,
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
export * from "./customerInvoices.routes";
|
export * from "./customer-invoices.routes";
|
||||||
|
|||||||
@ -10,13 +10,25 @@ import {
|
|||||||
CustomerInvoiceItemQuantity,
|
CustomerInvoiceItemQuantity,
|
||||||
CustomerInvoiceItemUnitPrice,
|
CustomerInvoiceItemUnitPrice,
|
||||||
} from "../../domain";
|
} from "../../domain";
|
||||||
import { CustomerInvoiceItemCreationAttributes, CustomerInvoiceItemModel, CustomerInvoiceModel } from "../sequelize";
|
import {
|
||||||
|
CustomerInvoiceItemCreationAttributes,
|
||||||
|
CustomerInvoiceItemModel,
|
||||||
|
CustomerInvoiceModel,
|
||||||
|
} from "../sequelize";
|
||||||
|
|
||||||
export interface ICustomerInvoiceItemMapper
|
export interface ICustomerInvoiceItemMapper
|
||||||
extends ISequelizeMapper<CustomerInvoiceItemModel, CustomerInvoiceItemCreationAttributes, CustomerInvoiceItem> {}
|
extends ISequelizeMapper<
|
||||||
|
CustomerInvoiceItemModel,
|
||||||
|
CustomerInvoiceItemCreationAttributes,
|
||||||
|
CustomerInvoiceItem
|
||||||
|
> {}
|
||||||
|
|
||||||
export class CustomerInvoiceItemMapper
|
export class CustomerInvoiceItemMapper
|
||||||
extends SequelizeMapper<CustomerInvoiceItemModel, CustomerInvoiceItemCreationAttributes, CustomerInvoiceItem>
|
extends SequelizeMapper<
|
||||||
|
CustomerInvoiceItemModel,
|
||||||
|
CustomerInvoiceItemCreationAttributes,
|
||||||
|
CustomerInvoiceItem
|
||||||
|
>
|
||||||
implements ICustomerInvoiceItemMapper
|
implements ICustomerInvoiceItemMapper
|
||||||
{
|
{
|
||||||
public mapToDomain(
|
public mapToDomain(
|
||||||
@ -50,7 +62,7 @@ export class CustomerInvoiceItemMapper
|
|||||||
const unitPriceOrError = CustomerInvoiceItemUnitPrice.create({
|
const unitPriceOrError = CustomerInvoiceItemUnitPrice.create({
|
||||||
amount: source.unit_price_amount,
|
amount: source.unit_price_amount,
|
||||||
scale: source.unit_price_scale,
|
scale: source.unit_price_scale,
|
||||||
currency_code: sourceParent.customerCustomerInvoice_currency,
|
currency_code: sourceParent.invoice_currency,
|
||||||
});
|
});
|
||||||
if (unitPriceOrError.isFailure) {
|
if (unitPriceOrError.isFailure) {
|
||||||
return Result.fail(unitPriceOrError.error);
|
return Result.fail(unitPriceOrError.error);
|
||||||
@ -101,7 +113,7 @@ export class CustomerInvoiceItemMapper
|
|||||||
|
|
||||||
const lineData = {
|
const lineData = {
|
||||||
parent_id: undefined,
|
parent_id: undefined,
|
||||||
customerCustomerInvoice_id: sourceParent.id.toPrimitive(),
|
invoice_id: sourceParent.id.toPrimitive(),
|
||||||
item_type: "simple",
|
item_type: "simple",
|
||||||
position: index,
|
position: index,
|
||||||
|
|
||||||
|
|||||||
@ -1,37 +1,49 @@
|
|||||||
import { ISequelizeMapper, MapperParamsType, SequelizeMapper } from "@erp/core/api";
|
import { ISequelizeMapper, MapperParamsType, SequelizeMapper } from "@erp/core/api";
|
||||||
import { UniqueID, UtcDate } from "@repo/rdx-ddd";
|
import { UniqueID, UtcDate } from "@repo/rdx-ddd";
|
||||||
import { Result } from "@repo/rdx-utils";
|
import { Result } from "@repo/rdx-utils";
|
||||||
import { CustomerInvoice, CustomerInvoiceNumber, CustomerInvoiceSerie, CustomerInvoiceStatus } from "../../domain";
|
import {
|
||||||
|
CustomerInvoice,
|
||||||
|
CustomerInvoiceNumber,
|
||||||
|
CustomerInvoiceSerie,
|
||||||
|
CustomerInvoiceStatus,
|
||||||
|
} from "../../domain";
|
||||||
import { CustomerInvoiceCreationAttributes, CustomerInvoiceModel } from "../sequelize";
|
import { CustomerInvoiceCreationAttributes, CustomerInvoiceModel } from "../sequelize";
|
||||||
import { CustomerInvoiceItemMapper } from "./customerCustomerInvoice-item.mapper";
|
import { CustomerInvoiceItemMapper } from "./customer-invoice-item.mapper";
|
||||||
|
|
||||||
export interface ICustomerInvoiceMapper
|
export interface ICustomerInvoiceMapper
|
||||||
extends ISequelizeMapper<CustomerInvoiceModel, CustomerInvoiceCreationAttributes, CustomerInvoice> {}
|
extends ISequelizeMapper<
|
||||||
|
CustomerInvoiceModel,
|
||||||
|
CustomerInvoiceCreationAttributes,
|
||||||
|
CustomerInvoice
|
||||||
|
> {}
|
||||||
|
|
||||||
export class CustomerInvoiceMapper
|
export class CustomerInvoiceMapper
|
||||||
extends SequelizeMapper<CustomerInvoiceModel, CustomerInvoiceCreationAttributes, CustomerInvoice>
|
extends SequelizeMapper<CustomerInvoiceModel, CustomerInvoiceCreationAttributes, CustomerInvoice>
|
||||||
implements ICustomerInvoiceMapper
|
implements ICustomerInvoiceMapper
|
||||||
{
|
{
|
||||||
private customerCustomerInvoiceItemMapper: CustomerInvoiceItemMapper;
|
private customerInvoiceItemMapper: CustomerInvoiceItemMapper;
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
super();
|
super();
|
||||||
this.customerCustomerInvoiceItemMapper = new CustomerInvoiceItemMapper(); // Instanciar el mapper de items
|
this.customerInvoiceItemMapper = new CustomerInvoiceItemMapper(); // Instanciar el mapper de items
|
||||||
}
|
}
|
||||||
|
|
||||||
public mapToDomain(source: CustomerInvoiceModel, params?: MapperParamsType): Result<CustomerInvoice, Error> {
|
public mapToDomain(
|
||||||
|
source: CustomerInvoiceModel,
|
||||||
|
params?: MapperParamsType
|
||||||
|
): Result<CustomerInvoice, Error> {
|
||||||
const idOrError = UniqueID.create(source.id);
|
const idOrError = UniqueID.create(source.id);
|
||||||
const statusOrError = CustomerInvoiceStatus.create(source.customerCustomerInvoice_status);
|
const statusOrError = CustomerInvoiceStatus.create(source.invoice_status);
|
||||||
const customerCustomerInvoiceSeriesOrError = CustomerInvoiceSerie.create(source.customerCustomerInvoice_series);
|
const customerInvoiceSeriesOrError = CustomerInvoiceSerie.create(source.invoice_series);
|
||||||
const customerCustomerInvoiceNumberOrError = CustomerInvoiceNumber.create(source.customerCustomerInvoice_number);
|
const customerInvoiceNumberOrError = CustomerInvoiceNumber.create(source.invoice_number);
|
||||||
const issueDateOrError = UtcDate.create(source.issue_date);
|
const issueDateOrError = UtcDate.create(source.issue_date);
|
||||||
const operationDateOrError = UtcDate.create(source.operation_date);
|
const operationDateOrError = UtcDate.create(source.operation_date);
|
||||||
|
|
||||||
const result = Result.combine([
|
const result = Result.combine([
|
||||||
idOrError,
|
idOrError,
|
||||||
statusOrError,
|
statusOrError,
|
||||||
customerCustomerInvoiceSeriesOrError,
|
customerInvoiceSeriesOrError,
|
||||||
customerCustomerInvoiceNumberOrError,
|
customerInvoiceNumberOrError,
|
||||||
issueDateOrError,
|
issueDateOrError,
|
||||||
operationDateOrError,
|
operationDateOrError,
|
||||||
]);
|
]);
|
||||||
@ -41,7 +53,7 @@ export class CustomerInvoiceMapper
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Mapear los items de la factura
|
// Mapear los items de la factura
|
||||||
const itemsOrErrors = this.customerCustomerInvoiceItemMapper.mapArrayToDomain(source.items, {
|
const itemsOrErrors = this.customerInvoiceItemMapper.mapArrayToDomain(source.items, {
|
||||||
sourceParent: source,
|
sourceParent: source,
|
||||||
...params,
|
...params,
|
||||||
});
|
});
|
||||||
@ -50,37 +62,40 @@ export class CustomerInvoiceMapper
|
|||||||
return Result.fail(itemsOrErrors.error);
|
return Result.fail(itemsOrErrors.error);
|
||||||
}
|
}
|
||||||
|
|
||||||
const customerCustomerInvoiceCurrency = source.customerCustomerInvoice_currency || "EUR";
|
const customerInvoiceCurrency = source.invoice_currency || "EUR";
|
||||||
|
|
||||||
return CustomerInvoice.create(
|
return CustomerInvoice.create(
|
||||||
{
|
{
|
||||||
status: statusOrError.data,
|
status: statusOrError.data,
|
||||||
customerCustomerInvoiceSeries: customerCustomerInvoiceSeriesOrError.data,
|
customerInvoiceSeries: customerInvoiceSeriesOrError.data,
|
||||||
customerCustomerInvoiceNumber: customerCustomerInvoiceNumberOrError.data,
|
customerInvoiceNumber: customerInvoiceNumberOrError.data,
|
||||||
issueDate: issueDateOrError.data,
|
issueDate: issueDateOrError.data,
|
||||||
operationDate: operationDateOrError.data,
|
operationDate: operationDateOrError.data,
|
||||||
customerCustomerInvoiceCurrency,
|
customerInvoiceCurrency,
|
||||||
items: itemsOrErrors.data,
|
items: itemsOrErrors.data,
|
||||||
},
|
},
|
||||||
idOrError.data
|
idOrError.data
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public mapToPersistence(source: CustomerInvoice, params?: MapperParamsType): CustomerInvoiceCreationAttributes {
|
public mapToPersistence(
|
||||||
|
source: CustomerInvoice,
|
||||||
|
params?: MapperParamsType
|
||||||
|
): CustomerInvoiceCreationAttributes {
|
||||||
const subtotal = source.calculateSubtotal();
|
const subtotal = source.calculateSubtotal();
|
||||||
const total = source.calculateTotal();
|
const total = source.calculateTotal();
|
||||||
|
|
||||||
const items = this.customerCustomerInvoiceItemMapper.mapCollectionToPersistence(source.items, params);
|
const items = this.customerInvoiceItemMapper.mapCollectionToPersistence(source.items, params);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
id: source.id.toString(),
|
id: source.id.toString(),
|
||||||
customerCustomerInvoice_status: source.status.toPrimitive(),
|
invoice_status: source.status.toPrimitive(),
|
||||||
customerCustomerInvoice_series: source.customerCustomerInvoiceSeries.toPrimitive(),
|
invoice_series: source.customerInvoiceSeries.toPrimitive(),
|
||||||
customerCustomerInvoice_number: source.customerCustomerInvoiceNumber.toPrimitive(),
|
invoice_number: source.customerInvoiceNumber.toPrimitive(),
|
||||||
issue_date: source.issueDate.toPrimitive(),
|
issue_date: source.issueDate.toPrimitive(),
|
||||||
operation_date: source.operationDate.toPrimitive(),
|
operation_date: source.operationDate.toPrimitive(),
|
||||||
customerCustomerInvoice_language: "es",
|
invoice_language: "es",
|
||||||
customerCustomerInvoice_currency: source.customerCustomerInvoiceCurrency || "EUR",
|
invoice_currency: source.customerInvoiceCurrency || "EUR",
|
||||||
|
|
||||||
subtotal_amount: subtotal.amount,
|
subtotal_amount: subtotal.amount,
|
||||||
subtotal_scale: subtotal.scale,
|
subtotal_scale: subtotal.scale,
|
||||||
@ -93,5 +108,5 @@ export class CustomerInvoiceMapper
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const customerCustomerInvoiceMapper: CustomerInvoiceMapper = new CustomerInvoiceMapper();
|
const customerInvoiceMapper: CustomerInvoiceMapper = new CustomerInvoiceMapper();
|
||||||
export { customerCustomerInvoiceMapper };
|
export { customerInvoiceMapper };
|
||||||
|
|||||||
@ -12,7 +12,7 @@ import { CustomerInvoiceParticipant_Model, TCreationCustomerInvoiceParticipant_M
|
|||||||
import {
|
import {
|
||||||
ICustomerInvoiceParticipantAddressMapper,
|
ICustomerInvoiceParticipantAddressMapper,
|
||||||
createCustomerInvoiceParticipantAddressMapper,
|
createCustomerInvoiceParticipantAddressMapper,
|
||||||
} from "./customerCustomerInvoiceParticipantAddress.mapper";
|
} from "./customer-invoiceParticipantAddress.mapper";
|
||||||
|
|
||||||
export interface ICustomerInvoiceParticipantMapper
|
export interface ICustomerInvoiceParticipantMapper
|
||||||
extends ISequelizeMapper<
|
extends ISequelizeMapper<
|
||||||
@ -99,7 +99,7 @@ class CustomerInvoiceParticipantMapper
|
|||||||
const { sourceParent } = params;
|
const { sourceParent } = params;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
customerCustomerInvoice_id: sourceParent.id.toPrimitive(),
|
customerInvoice_id: sourceParent.id.toPrimitive(),
|
||||||
|
|
||||||
participant_id: source.id.toPrimitive(),
|
participant_id: source.id.toPrimitive(),
|
||||||
tin: source.tin.toPrimitive(),
|
tin: source.tin.toPrimitive(),
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
export * from "./customerCustomerInvoice.mapper";
|
export * from "./customer-invoice.mapper";
|
||||||
|
|||||||
@ -7,19 +7,19 @@ import {
|
|||||||
NonAttribute,
|
NonAttribute,
|
||||||
Sequelize,
|
Sequelize,
|
||||||
} from "sequelize";
|
} from "sequelize";
|
||||||
import { CustomerInvoiceModel } from "./customerCustomerInvoice.model";
|
import { CustomerInvoiceModel } from "./customer-invoice.model";
|
||||||
|
|
||||||
export type CustomerInvoiceItemCreationAttributes = InferCreationAttributes<
|
export type CustomerInvoiceItemCreationAttributes = InferCreationAttributes<
|
||||||
CustomerInvoiceItemModel,
|
CustomerInvoiceItemModel,
|
||||||
{ omit: "customerCustomerInvoice" }
|
{ omit: "invoice" }
|
||||||
>;
|
>;
|
||||||
|
|
||||||
export class CustomerInvoiceItemModel extends Model<
|
export class CustomerInvoiceItemModel extends Model<
|
||||||
InferAttributes<CustomerInvoiceItemModel>,
|
InferAttributes<CustomerInvoiceItemModel>,
|
||||||
InferCreationAttributes<CustomerInvoiceItemModel, { omit: "customerCustomerInvoice" }>
|
InferCreationAttributes<CustomerInvoiceItemModel, { omit: "invoice" }>
|
||||||
> {
|
> {
|
||||||
declare item_id: string;
|
declare item_id: string;
|
||||||
declare customerCustomerInvoice_id: string;
|
declare invoice_id: string;
|
||||||
|
|
||||||
declare parent_id: CreationOptional<string>;
|
declare parent_id: CreationOptional<string>;
|
||||||
declare position: number;
|
declare position: number;
|
||||||
@ -42,14 +42,14 @@ export class CustomerInvoiceItemModel extends Model<
|
|||||||
declare total_amount: CreationOptional<number>;
|
declare total_amount: CreationOptional<number>;
|
||||||
declare total_scale: CreationOptional<number>;
|
declare total_scale: CreationOptional<number>;
|
||||||
|
|
||||||
declare customerCustomerInvoice: NonAttribute<CustomerInvoiceModel>;
|
declare invoice: NonAttribute<CustomerInvoiceModel>;
|
||||||
|
|
||||||
static associate(database: Sequelize) {
|
static associate(database: Sequelize) {
|
||||||
/*const { CustomerInvoice_Model, CustomerInvoiceItem_Model } = connection.models;
|
/*const { Invoice_Model, CustomerInvoiceItem_Model } = connection.models;
|
||||||
|
|
||||||
CustomerInvoiceItem_Model.belongsTo(CustomerInvoice_Model, {
|
CustomerInvoiceItem_Model.belongsTo(Invoice_Model, {
|
||||||
as: "customerCustomerInvoice",
|
as: "customerInvoice",
|
||||||
foreignKey: "customerCustomerInvoice_id",
|
foreignKey: "invoice_id",
|
||||||
onDelete: "CASCADE",
|
onDelete: "CASCADE",
|
||||||
});*/
|
});*/
|
||||||
}
|
}
|
||||||
@ -62,7 +62,7 @@ export default (database: Sequelize) => {
|
|||||||
type: new DataTypes.UUID(),
|
type: new DataTypes.UUID(),
|
||||||
primaryKey: true,
|
primaryKey: true,
|
||||||
},
|
},
|
||||||
customerCustomerInvoice_id: {
|
invoice_id: {
|
||||||
type: new DataTypes.UUID(),
|
type: new DataTypes.UUID(),
|
||||||
primaryKey: true,
|
primaryKey: true,
|
||||||
},
|
},
|
||||||
@ -159,7 +159,7 @@ export default (database: Sequelize) => {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
sequelize: database,
|
sequelize: database,
|
||||||
tableName: "customerCustomerInvoice_items",
|
tableName: "customer_invoice_items",
|
||||||
|
|
||||||
defaultScope: {},
|
defaultScope: {},
|
||||||
|
|
||||||
|
|||||||
@ -7,9 +7,15 @@ import {
|
|||||||
NonAttribute,
|
NonAttribute,
|
||||||
Sequelize,
|
Sequelize,
|
||||||
} from "sequelize";
|
} from "sequelize";
|
||||||
import { CustomerInvoiceItemCreationAttributes, CustomerInvoiceItemModel } from "./customerCustomerInvoice-item.model";
|
import {
|
||||||
|
CustomerInvoiceItemCreationAttributes,
|
||||||
|
CustomerInvoiceItemModel,
|
||||||
|
} from "./customer-invoice-item.model";
|
||||||
|
|
||||||
export type CustomerInvoiceCreationAttributes = InferCreationAttributes<CustomerInvoiceModel, { omit: "items" }> & {
|
export type CustomerInvoiceCreationAttributes = InferCreationAttributes<
|
||||||
|
CustomerInvoiceModel,
|
||||||
|
{ omit: "items" }
|
||||||
|
> & {
|
||||||
items?: CustomerInvoiceItemCreationAttributes[];
|
items?: CustomerInvoiceItemCreationAttributes[];
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -19,13 +25,13 @@ export class CustomerInvoiceModel extends Model<
|
|||||||
> {
|
> {
|
||||||
declare id: string;
|
declare id: string;
|
||||||
|
|
||||||
declare customerCustomerInvoice_status: string;
|
declare invoice_status: string;
|
||||||
declare customerCustomerInvoice_series: CreationOptional<string>;
|
declare invoice_series: CreationOptional<string>;
|
||||||
declare customerCustomerInvoice_number: CreationOptional<string>;
|
declare invoice_number: CreationOptional<string>;
|
||||||
declare issue_date: CreationOptional<string>;
|
declare issue_date: CreationOptional<string>;
|
||||||
declare operation_date: CreationOptional<string>;
|
declare operation_date: CreationOptional<string>;
|
||||||
declare customerCustomerInvoice_language: string;
|
declare invoice_language: string;
|
||||||
declare customerCustomerInvoice_currency: string;
|
declare invoice_currency: string;
|
||||||
|
|
||||||
// Subtotal
|
// Subtotal
|
||||||
declare subtotal_amount: CreationOptional<number>;
|
declare subtotal_amount: CreationOptional<number>;
|
||||||
@ -44,7 +50,7 @@ export class CustomerInvoiceModel extends Model<
|
|||||||
|
|
||||||
CustomerInvoiceModel.hasMany(CustomerInvoiceItemModel, {
|
CustomerInvoiceModel.hasMany(CustomerInvoiceItemModel, {
|
||||||
as: "items",
|
as: "items",
|
||||||
foreignKey: "customerCustomerInvoice_id",
|
foreignKey: "invoice_id",
|
||||||
onDelete: "CASCADE",
|
onDelete: "CASCADE",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -58,18 +64,18 @@ export default (database: Sequelize) => {
|
|||||||
primaryKey: true,
|
primaryKey: true,
|
||||||
},
|
},
|
||||||
|
|
||||||
customerCustomerInvoice_status: {
|
invoice_status: {
|
||||||
type: new DataTypes.STRING(),
|
type: new DataTypes.STRING(),
|
||||||
allowNull: false,
|
allowNull: false,
|
||||||
},
|
},
|
||||||
|
|
||||||
customerCustomerInvoice_series: {
|
invoice_series: {
|
||||||
type: new DataTypes.STRING(),
|
type: new DataTypes.STRING(),
|
||||||
allowNull: true,
|
allowNull: true,
|
||||||
defaultValue: null,
|
defaultValue: null,
|
||||||
},
|
},
|
||||||
|
|
||||||
customerCustomerInvoice_number: {
|
invoice_number: {
|
||||||
type: new DataTypes.STRING(),
|
type: new DataTypes.STRING(),
|
||||||
allowNull: true,
|
allowNull: true,
|
||||||
defaultValue: null,
|
defaultValue: null,
|
||||||
@ -87,12 +93,12 @@ export default (database: Sequelize) => {
|
|||||||
defaultValue: null,
|
defaultValue: null,
|
||||||
},
|
},
|
||||||
|
|
||||||
customerCustomerInvoice_language: {
|
invoice_language: {
|
||||||
type: new DataTypes.STRING(),
|
type: new DataTypes.STRING(),
|
||||||
allowNull: false,
|
allowNull: false,
|
||||||
},
|
},
|
||||||
|
|
||||||
customerCustomerInvoice_currency: {
|
invoice_currency: {
|
||||||
type: new DataTypes.STRING(3), // ISO 4217
|
type: new DataTypes.STRING(3), // ISO 4217
|
||||||
allowNull: false,
|
allowNull: false,
|
||||||
},
|
},
|
||||||
@ -121,7 +127,7 @@ export default (database: Sequelize) => {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
sequelize: database,
|
sequelize: database,
|
||||||
tableName: "customerCustomerInvoices",
|
tableName: "customer_invoices",
|
||||||
|
|
||||||
paranoid: true, // softs deletes
|
paranoid: true, // softs deletes
|
||||||
timestamps: true,
|
timestamps: true,
|
||||||
@ -130,7 +136,7 @@ export default (database: Sequelize) => {
|
|||||||
updatedAt: "updated_at",
|
updatedAt: "updated_at",
|
||||||
deletedAt: "deleted_at",
|
deletedAt: "deleted_at",
|
||||||
|
|
||||||
indexes: [{ unique: true, fields: ["customerCustomerInvoice_number"] }],
|
indexes: [{ unique: true, fields: ["invoice_number"] }],
|
||||||
|
|
||||||
whereMergeStrategy: "and", // <- cómo tratar el merge de un scope
|
whereMergeStrategy: "and", // <- cómo tratar el merge de un scope
|
||||||
|
|
||||||
|
|||||||
@ -3,12 +3,15 @@ import { Criteria } from "@repo/rdx-criteria/server";
|
|||||||
import { UniqueID } from "@repo/rdx-ddd";
|
import { UniqueID } from "@repo/rdx-ddd";
|
||||||
import { Collection, Result } from "@repo/rdx-utils";
|
import { Collection, Result } from "@repo/rdx-utils";
|
||||||
import { Sequelize, Transaction } from "sequelize";
|
import { Sequelize, Transaction } from "sequelize";
|
||||||
import { ICustomerInvoiceRepository, CustomerInvoice } from "../../domain";
|
import { CustomerInvoice, ICustomerInvoiceRepository } from "../../domain";
|
||||||
import { ICustomerInvoiceMapper } from "../mappers/customerCustomerInvoice.mapper";
|
import { ICustomerInvoiceMapper } from "../mappers/customer-invoice.mapper";
|
||||||
import { CustomerInvoiceItemModel } from "./customerCustomerInvoice-item.model";
|
import { CustomerInvoiceItemModel } from "./customer-invoice-item.model";
|
||||||
import { CustomerInvoiceModel } from "./customerCustomerInvoice.model";
|
import { CustomerInvoiceModel } from "./customer-invoice.model";
|
||||||
|
|
||||||
export class CustomerInvoiceRepository extends SequelizeRepository<CustomerInvoice> implements ICustomerInvoiceRepository {
|
export class CustomerInvoiceRepository
|
||||||
|
extends SequelizeRepository<CustomerInvoice>
|
||||||
|
implements ICustomerInvoiceRepository
|
||||||
|
{
|
||||||
private readonly _mapper!: ICustomerInvoiceMapper;
|
private readonly _mapper!: ICustomerInvoiceMapper;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -27,11 +30,14 @@ export class CustomerInvoiceRepository extends SequelizeRepository<CustomerInvoi
|
|||||||
this._mapper = mapper;
|
this._mapper = mapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
async customerCustomerInvoiceExists(id: UniqueID, transaction?: Transaction): Promise<Result<boolean, Error>> {
|
async customerInvoiceExists(
|
||||||
|
id: UniqueID,
|
||||||
|
transaction?: Transaction
|
||||||
|
): Promise<Result<boolean, Error>> {
|
||||||
try {
|
try {
|
||||||
const _customerCustomerInvoice = await this._getById(CustomerInvoiceModel, id, {}, transaction);
|
const _customerInvoice = await this._getById(CustomerInvoiceModel, id, {}, transaction);
|
||||||
|
|
||||||
return Result.ok(Boolean(id.equals(_customerCustomerInvoice.id)));
|
return Result.ok(Boolean(id.equals(_customerInvoice.id)));
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
return this._handleDatabaseError(error, this._customErrorMapper);
|
return this._handleDatabaseError(error, this._customErrorMapper);
|
||||||
}
|
}
|
||||||
@ -53,8 +59,6 @@ export class CustomerInvoiceRepository extends SequelizeRepository<CustomerInvoi
|
|||||||
...this.convertCriteria(criteria),
|
...this.convertCriteria(criteria),
|
||||||
});
|
});
|
||||||
|
|
||||||
console.error("aqui");
|
|
||||||
|
|
||||||
return this._mapper.mapArrayToDomain(rawCustomerInvoices);
|
return this._mapper.mapArrayToDomain(rawCustomerInvoices);
|
||||||
} catch (error: unknown) {
|
} catch (error: unknown) {
|
||||||
console.error("Error in findAll", error);
|
console.error("Error in findAll", error);
|
||||||
@ -95,13 +99,25 @@ export class CustomerInvoiceRepository extends SequelizeRepository<CustomerInvoi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async create(customerCustomerInvoice: CustomerInvoice, transaction?: Transaction): Promise<void> {
|
async create(customerInvoice: CustomerInvoice, transaction?: Transaction): Promise<void> {
|
||||||
const customerCustomerInvoiceData = this._mapper.mapToPersistence(customerCustomerInvoice);
|
const customerInvoiceData = this._mapper.mapToPersistence(customerInvoice);
|
||||||
await this._save(CustomerInvoiceModel, customerCustomerInvoice.id, customerCustomerInvoiceData, {}, transaction);
|
await this._save(
|
||||||
|
CustomerInvoiceModel,
|
||||||
|
customerInvoice.id,
|
||||||
|
customerInvoiceData,
|
||||||
|
{},
|
||||||
|
transaction
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
async update(customerCustomerInvoice: CustomerInvoice, transaction?: Transaction): Promise<void> {
|
async update(customerInvoice: CustomerInvoice, transaction?: Transaction): Promise<void> {
|
||||||
const customerCustomerInvoiceData = this._mapper.mapToPersistence(customerCustomerInvoice);
|
const customerInvoiceData = this._mapper.mapToPersistence(customerInvoice);
|
||||||
await this._save(CustomerInvoiceModel, customerCustomerInvoice.id, customerCustomerInvoiceData, {}, transaction);
|
await this._save(
|
||||||
|
CustomerInvoiceModel,
|
||||||
|
customerInvoice.id,
|
||||||
|
customerInvoiceData,
|
||||||
|
{},
|
||||||
|
transaction
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,15 +7,15 @@ import {
|
|||||||
NonAttribute,
|
NonAttribute,
|
||||||
Sequelize,
|
Sequelize,
|
||||||
} from "sequelize";
|
} from "sequelize";
|
||||||
import { CustomerInvoiceModel } from "./customerCustomerInvoice.model";
|
import { CustomerInvoiceModel } from "./customer-invoice.model";
|
||||||
import {
|
import {
|
||||||
CustomerInvoiceParticipantAddress_Model,
|
CustomerInvoiceParticipantAddress_Model,
|
||||||
TCreationCustomerInvoiceParticipantAddress_Model,
|
TCreationCustomerInvoiceParticipantAddress_Model,
|
||||||
} from "./customerCustomerInvoiceParticipantAddress.mo.del.ts.bak";
|
} from "./customer-invoiceParticipantAddress.mo.del.ts.bak";
|
||||||
|
|
||||||
export type TCreationCustomerInvoiceParticipant_Model = InferCreationAttributes<
|
export type TCreationCustomerInvoiceParticipant_Model = InferCreationAttributes<
|
||||||
CustomerInvoiceParticipant_Model,
|
CustomerInvoiceParticipant_Model,
|
||||||
{ omit: "shippingAddress" | "billingAddress" | "customerCustomerInvoice" }
|
{ omit: "shippingAddress" | "billingAddress" | "customerInvoice" }
|
||||||
> & {
|
> & {
|
||||||
billingAddress: TCreationCustomerInvoiceParticipantAddress_Model;
|
billingAddress: TCreationCustomerInvoiceParticipantAddress_Model;
|
||||||
shippingAddress: TCreationCustomerInvoiceParticipantAddress_Model;
|
shippingAddress: TCreationCustomerInvoiceParticipantAddress_Model;
|
||||||
@ -24,11 +24,11 @@ export type TCreationCustomerInvoiceParticipant_Model = InferCreationAttributes<
|
|||||||
export class CustomerInvoiceParticipant_Model extends Model<
|
export class CustomerInvoiceParticipant_Model extends Model<
|
||||||
InferAttributes<
|
InferAttributes<
|
||||||
CustomerInvoiceParticipant_Model,
|
CustomerInvoiceParticipant_Model,
|
||||||
{ omit: "shippingAddress" | "billingAddress" | "customerCustomerInvoice" }
|
{ omit: "shippingAddress" | "billingAddress" | "customerInvoice" }
|
||||||
>,
|
>,
|
||||||
InferCreationAttributes<
|
InferCreationAttributes<
|
||||||
CustomerInvoiceParticipant_Model,
|
CustomerInvoiceParticipant_Model,
|
||||||
{ omit: "shippingAddress" | "billingAddress" | "customerCustomerInvoice" }
|
{ omit: "shippingAddress" | "billingAddress" | "customerInvoice" }
|
||||||
>
|
>
|
||||||
> {
|
> {
|
||||||
static associate(connection: Sequelize) {
|
static associate(connection: Sequelize) {
|
||||||
@ -36,8 +36,8 @@ export class CustomerInvoiceParticipant_Model extends Model<
|
|||||||
connection.models;
|
connection.models;
|
||||||
|
|
||||||
CustomerInvoiceParticipant_Model.belongsTo(CustomerInvoice_Model, {
|
CustomerInvoiceParticipant_Model.belongsTo(CustomerInvoice_Model, {
|
||||||
as: "customerCustomerInvoice",
|
as: "customerInvoice",
|
||||||
foreignKey: "customerCustomerInvoice_id",
|
foreignKey: "customerInvoice_id",
|
||||||
onDelete: "CASCADE",
|
onDelete: "CASCADE",
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -55,7 +55,7 @@ export class CustomerInvoiceParticipant_Model extends Model<
|
|||||||
}
|
}
|
||||||
|
|
||||||
declare participant_id: string;
|
declare participant_id: string;
|
||||||
declare customerCustomerInvoice_id: string;
|
declare customerInvoice_id: string;
|
||||||
declare tin: CreationOptional<string>;
|
declare tin: CreationOptional<string>;
|
||||||
declare company_name: CreationOptional<string>;
|
declare company_name: CreationOptional<string>;
|
||||||
declare first_name: CreationOptional<string>;
|
declare first_name: CreationOptional<string>;
|
||||||
@ -64,7 +64,7 @@ export class CustomerInvoiceParticipant_Model extends Model<
|
|||||||
declare shippingAddress?: NonAttribute<CustomerInvoiceParticipantAddress_Model>;
|
declare shippingAddress?: NonAttribute<CustomerInvoiceParticipantAddress_Model>;
|
||||||
declare billingAddress?: NonAttribute<CustomerInvoiceParticipantAddress_Model>;
|
declare billingAddress?: NonAttribute<CustomerInvoiceParticipantAddress_Model>;
|
||||||
|
|
||||||
declare customerCustomerInvoice?: NonAttribute<CustomerInvoiceModel>;
|
declare customerInvoice?: NonAttribute<CustomerInvoiceModel>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default (sequelize: Sequelize) => {
|
export default (sequelize: Sequelize) => {
|
||||||
@ -74,7 +74,7 @@ export default (sequelize: Sequelize) => {
|
|||||||
type: new DataTypes.UUID(),
|
type: new DataTypes.UUID(),
|
||||||
primaryKey: true,
|
primaryKey: true,
|
||||||
},
|
},
|
||||||
customerCustomerInvoice_id: {
|
customerInvoice_id: {
|
||||||
type: new DataTypes.UUID(),
|
type: new DataTypes.UUID(),
|
||||||
primaryKey: true,
|
primaryKey: true,
|
||||||
},
|
},
|
||||||
@ -97,7 +97,7 @@ export default (sequelize: Sequelize) => {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
sequelize,
|
sequelize,
|
||||||
tableName: "customerCustomerInvoice_participants",
|
tableName: "customerInvoice_participants",
|
||||||
timestamps: false,
|
timestamps: false,
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|||||||
@ -7,7 +7,7 @@ import {
|
|||||||
NonAttribute,
|
NonAttribute,
|
||||||
Sequelize,
|
Sequelize,
|
||||||
} from "sequelize";
|
} from "sequelize";
|
||||||
import { CustomerInvoiceParticipant_Model } from "./customerCustomerInvoiceParticipant.mo.del.ts.bak";
|
import { CustomerInvoiceParticipant_Model } from "./customer-invoiceParticipant.mo.del.ts.bak";
|
||||||
|
|
||||||
export type TCreationCustomerInvoiceParticipantAddress_Model = InferCreationAttributes<
|
export type TCreationCustomerInvoiceParticipantAddress_Model = InferCreationAttributes<
|
||||||
CustomerInvoiceParticipantAddress_Model,
|
CustomerInvoiceParticipantAddress_Model,
|
||||||
@ -86,7 +86,7 @@ export default (sequelize: Sequelize) => {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
sequelize,
|
sequelize,
|
||||||
tableName: "customerCustomerInvoice_participant_addresses",
|
tableName: "customerInvoice_participant_addresses",
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
import customerCustomerInvoiceItemModelInit from "./customerCustomerInvoice-item.model";
|
import customerInvoiceItemModelInit from "./customer-invoice-item.model";
|
||||||
import customerCustomerInvoiceModelInit from "./customerCustomerInvoice.model";
|
import customerInvoiceModelInit from "./customer-invoice.model";
|
||||||
|
|
||||||
export * from "./customerCustomerInvoice-item.model"; // exporta las clases, tipos
|
export * from "./customer-invoice-item.model"; // exporta las clases, tipos
|
||||||
export * from "./customerCustomerInvoice.model";
|
export * from "./customer-invoice.model";
|
||||||
export * from "./customerCustomerInvoice.repository";
|
export * from "./customer-invoice.repository";
|
||||||
|
|
||||||
// Array de inicializadores para que registerModels() lo use
|
// Array de inicializadores para que registerModels() lo use
|
||||||
export const models = [customerCustomerInvoiceItemModelInit, customerCustomerInvoiceModelInit];
|
export const models = [customerInvoiceItemModelInit, customerInvoiceModelInit];
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { DeleteCustomerInvoiceUseCase } from "@/contexts/customerCustomerInvoices/application";
|
import { DeleteCustomerInvoiceUseCase } from "@/contexts/customer-invoices/application";
|
||||||
import { ExpressController } from "@/core/common/presentation";
|
import { ExpressController } from "@/core/common/presentation";
|
||||||
|
|
||||||
export class DeleteCustomerInvoiceController extends ExpressController {
|
export class DeleteCustomerInvoiceController extends ExpressController {
|
||||||
|
|||||||
@ -1,14 +1,14 @@
|
|||||||
import { DeleteCustomerInvoiceUseCase } from "@/contexts/customerCustomerInvoices/application";
|
import { DeleteCustomerInvoiceUseCase } from "@/contexts/customer-invoices/application";
|
||||||
import { CustomerInvoiceService } from "@/contexts/customerCustomerInvoices/domain";
|
import { CustomerInvoiceService } from "@/contexts/customer-invoices/domain";
|
||||||
import { customerCustomerInvoiceRepository } from "@/contexts/customerCustomerInvoices/intrastructure";
|
import { customerInvoiceRepository } from "@/contexts/customer-invoices/intrastructure";
|
||||||
import { SequelizeTransactionManager } from "@/core/common/infrastructure";
|
import { SequelizeTransactionManager } from "@/core/common/infrastructure";
|
||||||
import { DeleteCustomerInvoiceController } from "./delete-customer-invoice.controller";
|
import { DeleteCustomerInvoiceController } from "./delete-customer-invoice.controller";
|
||||||
|
|
||||||
export const buildDeleteCustomerInvoiceController = () => {
|
export const buildDeleteCustomerInvoiceController = () => {
|
||||||
const transactionManager = new SequelizeTransactionManager();
|
const transactionManager = new SequelizeTransactionManager();
|
||||||
const customerCustomerInvoiceService = new CustomerInvoiceService(customerCustomerInvoiceRepository);
|
const customerInvoiceService = new CustomerInvoiceService(customerInvoiceRepository);
|
||||||
|
|
||||||
const useCase = new DeleteCustomerInvoiceUseCase(customerCustomerInvoiceService, transactionManager);
|
const useCase = new DeleteCustomerInvoiceUseCase(customerInvoiceService, transactionManager);
|
||||||
|
|
||||||
return new DeleteCustomerInvoiceController(useCase);
|
return new DeleteCustomerInvoiceController(useCase);
|
||||||
};
|
};
|
||||||
|
|||||||
@ -12,19 +12,22 @@ export class GetCustomerInvoiceController extends ExpressController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected async executeImpl() {
|
protected async executeImpl() {
|
||||||
const { customerCustomerInvoiceId } = this.req.params;
|
const { customerInvoiceId } = this.req.params;
|
||||||
|
|
||||||
// Validar ID
|
// Validar ID
|
||||||
const customerCustomerInvoiceIdOrError = UniqueID.create(customerCustomerInvoiceId);
|
const customerInvoiceIdOrError = UniqueID.create(customerInvoiceId);
|
||||||
if (customerCustomerInvoiceIdOrError.isFailure) return this.invalidInputError("CustomerInvoice ID not valid");
|
if (customerInvoiceIdOrError.isFailure)
|
||||||
|
return this.invalidInputError("CustomerInvoice ID not valid");
|
||||||
|
|
||||||
const customerCustomerInvoiceOrError = await this.getCustomerInvoice.execute(customerCustomerInvoiceIdOrError.data);
|
const customerInvoiceOrError = await this.getCustomerInvoice.execute(
|
||||||
|
customerInvoiceIdOrError.data
|
||||||
|
);
|
||||||
|
|
||||||
if (customerCustomerInvoiceOrError.isFailure) {
|
if (customerInvoiceOrError.isFailure) {
|
||||||
return this.handleError(customerCustomerInvoiceOrError.error);
|
return this.handleError(customerInvoiceOrError.error);
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.ok(this.presenter.toDTO(customerCustomerInvoiceOrError.data));
|
return this.ok(this.presenter.toDTO(customerInvoiceOrError.data));
|
||||||
}
|
}
|
||||||
|
|
||||||
private handleError(error: Error) {
|
private handleError(error: Error) {
|
||||||
|
|||||||
@ -1,23 +1,18 @@
|
|||||||
import { SequelizeTransactionManager } from "@erp/core/api";
|
import { SequelizeTransactionManager } from "@erp/core/api";
|
||||||
import { Sequelize } from "sequelize";
|
import { Sequelize } from "sequelize";
|
||||||
import { CustomerInvoiceService } from "../../domain";
|
import { CustomerInvoiceService } from "../../domain";
|
||||||
import { CustomerInvoiceRepository, customerCustomerInvoiceMapper } from "../../infrastructure";
|
import { CustomerInvoiceRepository, customerInvoiceMapper } from "../../infrastructure";
|
||||||
|
|
||||||
import { GetCustomerInvoiceUseCase } from "../../application";
|
import { GetCustomerInvoiceUseCase } from "../../application";
|
||||||
import { GetCustomerInvoiceController } from "./get-customer-invoice.controller";
|
import { GetCustomerInvoiceController } from "./get-invoice.controller";
|
||||||
import { getCustomerInvoicePresenter } from "./presenter";
|
import { getCustomerInvoicePresenter } from "./presenter";
|
||||||
|
|
||||||
export const buildGetCustomerInvoiceController = (database: Sequelize) => {
|
export const buildGetCustomerInvoiceController = (database: Sequelize) => {
|
||||||
const transactionManager = new SequelizeTransactionManager(database);
|
const transactionManager = new SequelizeTransactionManager(database);
|
||||||
const customerCustomerInvoiceRepository = new CustomerInvoiceRepository(
|
const customerInvoiceRepository = new CustomerInvoiceRepository(database, customerInvoiceMapper);
|
||||||
database,
|
const customerInvoiceService = new CustomerInvoiceService(customerInvoiceRepository);
|
||||||
customerCustomerInvoiceMapper
|
|
||||||
);
|
|
||||||
const customerCustomerInvoiceService = new CustomerInvoiceService(
|
|
||||||
customerCustomerInvoiceRepository
|
|
||||||
);
|
|
||||||
|
|
||||||
const useCase = new GetCustomerInvoiceUseCase(customerCustomerInvoiceService, transactionManager);
|
const useCase = new GetCustomerInvoiceUseCase(customerInvoiceService, transactionManager);
|
||||||
const presenter = getCustomerInvoicePresenter;
|
const presenter = getCustomerInvoicePresenter;
|
||||||
|
|
||||||
return new GetCustomerInvoiceController(useCase, presenter);
|
return new GetCustomerInvoiceController(useCase, presenter);
|
||||||
|
|||||||
@ -2,7 +2,7 @@ import { CustomerInvoiceItem } from "#/server/domain";
|
|||||||
import { IInvoicingContext } from "#/server/intrastructure";
|
import { IInvoicingContext } from "#/server/intrastructure";
|
||||||
import { Collection } from "@rdx/core";
|
import { Collection } from "@rdx/core";
|
||||||
|
|
||||||
export const customerCustomerInvoiceItemPresenter = (items: Collection<CustomerInvoiceItem>, context: IInvoicingContext) =>
|
export const customerInvoiceItemPresenter = (items: Collection<CustomerInvoiceItem>, context: IInvoicingContext) =>
|
||||||
items.totalCount > 0
|
items.totalCount > 0
|
||||||
? items.items.map((item: CustomerInvoiceItem) => ({
|
? items.items.map((item: CustomerInvoiceItem) => ({
|
||||||
description: item.description.toString(),
|
description: item.description.toString(),
|
||||||
|
|||||||
@ -1,27 +1,27 @@
|
|||||||
import { IGetCustomerInvoiceResponseDTO } from "../../../../../common/dto";
|
import { IGetCustomerInvoiceResponseDTO } from "../../../../common/dto";
|
||||||
import { CustomerInvoice, CustomerInvoiceItem } from "../../../../domain";
|
import { CustomerInvoice, CustomerInvoiceItem } from "../../../domain";
|
||||||
|
|
||||||
export interface IGetCustomerInvoicePresenter {
|
export interface IGetCustomerInvoicePresenter {
|
||||||
toDTO: (customerCustomerInvoice: CustomerInvoice) => IGetCustomerInvoiceResponseDTO;
|
toDTO: (customerInvoice: CustomerInvoice) => IGetCustomerInvoiceResponseDTO;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getCustomerInvoicePresenter: IGetCustomerInvoicePresenter = {
|
export const getCustomerInvoicePresenter: IGetCustomerInvoicePresenter = {
|
||||||
toDTO: (customerCustomerInvoice: CustomerInvoice): IGetCustomerInvoiceResponseDTO => ({
|
toDTO: (customerInvoice: CustomerInvoice): IGetCustomerInvoiceResponseDTO => ({
|
||||||
id: customerCustomerInvoice.id.toPrimitive(),
|
id: customerInvoice.id.toPrimitive(),
|
||||||
|
|
||||||
customerCustomerInvoice_status: customerCustomerInvoice.status.toString(),
|
customerInvoice_status: customerInvoice.status.toString(),
|
||||||
customerCustomerInvoice_number: customerCustomerInvoice.customerCustomerInvoiceNumber.toString(),
|
customerInvoice_number: customerInvoice.customerInvoiceNumber.toString(),
|
||||||
customerCustomerInvoice_series: customerCustomerInvoice.customerCustomerInvoiceSeries.toString(),
|
customerInvoice_series: customerInvoice.customerInvoiceSeries.toString(),
|
||||||
issue_date: customerCustomerInvoice.issueDate.toDateString(),
|
issue_date: customerInvoice.issueDate.toDateString(),
|
||||||
operation_date: customerCustomerInvoice.operationDate.toDateString(),
|
operation_date: customerInvoice.operationDate.toDateString(),
|
||||||
language_code: "ES",
|
language_code: "ES",
|
||||||
currency: customerCustomerInvoice.customerCustomerInvoiceCurrency.toString(),
|
currency: customerInvoice.customerInvoiceCurrency.toString(),
|
||||||
subtotal: customerCustomerInvoice.calculateSubtotal().toPrimitive(),
|
subtotal: customerInvoice.calculateSubtotal().toPrimitive(),
|
||||||
total: customerCustomerInvoice.calculateTotal().toPrimitive(),
|
total: customerInvoice.calculateTotal().toPrimitive(),
|
||||||
|
|
||||||
items:
|
items:
|
||||||
customerCustomerInvoice.items.size() > 0
|
customerInvoice.items.size() > 0
|
||||||
? customerCustomerInvoice.items.map((item: CustomerInvoiceItem) => ({
|
? customerInvoice.items.map((item: CustomerInvoiceItem) => ({
|
||||||
description: item.description.toString(),
|
description: item.description.toString(),
|
||||||
quantity: item.quantity.toPrimitive(),
|
quantity: item.quantity.toPrimitive(),
|
||||||
unit_measure: "",
|
unit_measure: "",
|
||||||
@ -32,10 +32,10 @@ export const getCustomerInvoicePresenter: IGetCustomerInvoicePresenter = {
|
|||||||
}))
|
}))
|
||||||
: [],
|
: [],
|
||||||
|
|
||||||
//sender: {}, //await CustomerInvoiceParticipantPresenter(customerCustomerInvoice.senderId, context),
|
//sender: {}, //await CustomerInvoiceParticipantPresenter(customerInvoice.senderId, context),
|
||||||
|
|
||||||
/*recipient: await CustomerInvoiceParticipantPresenter(customerCustomerInvoice.recipient, context),
|
/*recipient: await CustomerInvoiceParticipantPresenter(customerInvoice.recipient, context),
|
||||||
items: customerCustomerInvoiceItemPresenter(customerCustomerInvoice.items, context),
|
items: customerInvoiceItemPresenter(customerInvoice.items, context),
|
||||||
|
|
||||||
payment_term: {
|
payment_term: {
|
||||||
payment_type: "",
|
payment_type: "",
|
||||||
@ -43,7 +43,7 @@ export const getCustomerInvoicePresenter: IGetCustomerInvoicePresenter = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
due_amount: {
|
due_amount: {
|
||||||
currency: customerCustomerInvoice.currency.toString(),
|
currency: customerInvoice.currency.toString(),
|
||||||
precision: 2,
|
precision: 2,
|
||||||
amount: 0,
|
amount: 0,
|
||||||
},
|
},
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
export * from "./get-customer-invoice.presenter";
|
export * from "./get-invoice.presenter";
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
//export * from "./create-customer-invoice";
|
//export * from "./create-customer-invoice";
|
||||||
//export * from "./delete-customer-invoice";
|
//export * from "./delete-customer-invoice";
|
||||||
export * from "./get-customer-invoice";
|
export * from "./get-invoice";
|
||||||
export * from "./list-customer-invoices";
|
export * from "./list-invoices";
|
||||||
///export * from "./update-customer-invoice";
|
///export * from "./update-customer-invoice";
|
||||||
|
|||||||
@ -2,24 +2,16 @@ import { SequelizeTransactionManager } from "@erp/core/api";
|
|||||||
import { Sequelize } from "sequelize";
|
import { Sequelize } from "sequelize";
|
||||||
import { ListCustomerInvoicesUseCase } from "../../application";
|
import { ListCustomerInvoicesUseCase } from "../../application";
|
||||||
import { CustomerInvoiceService } from "../../domain";
|
import { CustomerInvoiceService } from "../../domain";
|
||||||
import { CustomerInvoiceRepository, customerCustomerInvoiceMapper } from "../../infrastructure";
|
import { CustomerInvoiceRepository, customerInvoiceMapper } from "../../infrastructure";
|
||||||
import { ListCustomerInvoicesController } from "./list-customer-invoices.controller";
|
import { ListCustomerInvoicesController } from "./list-invoices.controller";
|
||||||
import { listCustomerInvoicesPresenter } from "./presenter";
|
import { listCustomerInvoicesPresenter } from "./presenter";
|
||||||
|
|
||||||
export const buildListCustomerInvoicesController = (database: Sequelize) => {
|
export const buildListCustomerInvoicesController = (database: Sequelize) => {
|
||||||
const transactionManager = new SequelizeTransactionManager(database);
|
const transactionManager = new SequelizeTransactionManager(database);
|
||||||
const customerCustomerInvoiceRepository = new CustomerInvoiceRepository(
|
const customerInvoiceRepository = new CustomerInvoiceRepository(database, customerInvoiceMapper);
|
||||||
database,
|
const customerInvoiceService = new CustomerInvoiceService(customerInvoiceRepository);
|
||||||
customerCustomerInvoiceMapper
|
|
||||||
);
|
|
||||||
const customerCustomerInvoiceService = new CustomerInvoiceService(
|
|
||||||
customerCustomerInvoiceRepository
|
|
||||||
);
|
|
||||||
|
|
||||||
const useCase = new ListCustomerInvoicesUseCase(
|
const useCase = new ListCustomerInvoicesUseCase(customerInvoiceService, transactionManager);
|
||||||
customerCustomerInvoiceService,
|
|
||||||
transactionManager
|
|
||||||
);
|
|
||||||
const presenter = listCustomerInvoicesPresenter;
|
const presenter = listCustomerInvoicesPresenter;
|
||||||
|
|
||||||
return new ListCustomerInvoicesController(useCase, presenter);
|
return new ListCustomerInvoicesController(useCase, presenter);
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { ExpressController } from "@erp/core/api";
|
import { ExpressController } from "@erp/core/api";
|
||||||
import { ListCustomerInvoicesUseCase } from "../../application";
|
import { ListCustomerInvoicesUseCase } from "../../application";
|
||||||
import { IListCustomerInvoicesPresenter } from "./presenter";
|
import { IListCustomerInvoicesPresenter } from "./presenter/list-invoices.presenter";
|
||||||
|
|
||||||
export class ListCustomerInvoicesController extends ExpressController {
|
export class ListCustomerInvoicesController extends ExpressController {
|
||||||
public constructor(
|
public constructor(
|
||||||
@ -12,13 +12,13 @@ export class ListCustomerInvoicesController extends ExpressController {
|
|||||||
|
|
||||||
protected async executeImpl() {
|
protected async executeImpl() {
|
||||||
const criteria = this.criteria;
|
const criteria = this.criteria;
|
||||||
const customerCustomerInvoicesOrError = await this.listCustomerInvoices.execute(criteria);
|
const customerInvoicesOrError = await this.listCustomerInvoices.execute(criteria);
|
||||||
|
|
||||||
if (customerCustomerInvoicesOrError.isFailure) {
|
if (customerInvoicesOrError.isFailure) {
|
||||||
return this.handleError(customerCustomerInvoicesOrError.error);
|
return this.handleError(customerInvoicesOrError.error);
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.ok(this.presenter.toDTO(customerCustomerInvoicesOrError.data, criteria));
|
return this.ok(this.presenter.toDTO(customerInvoicesOrError.data, criteria));
|
||||||
}
|
}
|
||||||
|
|
||||||
private handleError(error: Error) {
|
private handleError(error: Error) {
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
export * from "./list-customer-invoices.presenter";
|
export * from "./list-invoices.presenter";
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { IListResponseDTO } from "@erp/core/api";
|
import { IListResponseDTO } from "@erp/core";
|
||||||
import { Criteria } from "@repo/rdx-criteria/server";
|
import { Criteria } from "@repo/rdx-criteria/server";
|
||||||
import { Collection } from "@repo/rdx-utils";
|
import { Collection } from "@repo/rdx-utils";
|
||||||
import { IListCustomerInvoicesResponseDTO } from "../../../../common/dto";
|
import { IListCustomerInvoicesResponseDTO } from "../../../../common/dto";
|
||||||
@ -6,37 +6,35 @@ import { CustomerInvoice } from "../../../domain";
|
|||||||
|
|
||||||
export interface IListCustomerInvoicesPresenter {
|
export interface IListCustomerInvoicesPresenter {
|
||||||
toDTO: (
|
toDTO: (
|
||||||
customerCustomerInvoices: Collection<CustomerInvoice>,
|
customerInvoices: Collection<CustomerInvoice>,
|
||||||
criteria: Criteria
|
criteria: Criteria
|
||||||
) => IListResponseDTO<IListCustomerInvoicesResponseDTO>;
|
) => IListResponseDTO<IListCustomerInvoicesResponseDTO>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const listCustomerInvoicesPresenter: IListCustomerInvoicesPresenter = {
|
export const listCustomerInvoicesPresenter: IListCustomerInvoicesPresenter = {
|
||||||
toDTO: (
|
toDTO: (
|
||||||
customerCustomerInvoices: Collection<CustomerInvoice>,
|
customerInvoices: Collection<CustomerInvoice>,
|
||||||
criteria: Criteria
|
criteria: Criteria
|
||||||
): IListResponseDTO<IListCustomerInvoicesResponseDTO> => {
|
): IListResponseDTO<IListCustomerInvoicesResponseDTO> => {
|
||||||
const items = customerInvoices.map((customerCustomerInvoice) => {
|
const items = customerInvoices.map((invoice) => {
|
||||||
return {
|
return {
|
||||||
id: customerCustomerInvoice.id.toPrimitive(),
|
id: invoice.id.toPrimitive(),
|
||||||
|
|
||||||
customerCustomerInvoice_status: customerCustomerInvoice.status.toString(),
|
invoice_status: invoice.status.toString(),
|
||||||
customerCustomerInvoice_number:
|
invoice_number: invoice.customerInvoiceNumber.toString(),
|
||||||
customerCustomerInvoice.customerCustomerInvoiceNumber.toString(),
|
invoice_series: invoice.customerInvoiceSeries.toString(),
|
||||||
customerCustomerInvoice_series:
|
issue_date: invoice.issueDate.toISOString(),
|
||||||
customerCustomerInvoice.customerCustomerInvoiceSeries.toString(),
|
operation_date: invoice.operationDate.toISOString(),
|
||||||
issue_date: customerCustomerInvoice.issueDate.toISOString(),
|
|
||||||
operation_date: customerCustomerInvoice.operationDate.toISOString(),
|
|
||||||
language_code: "ES",
|
language_code: "ES",
|
||||||
|
|
||||||
currency: customerCustomerInvoice.customerCustomerInvoiceCurrency.toString(),
|
currency: invoice.customerInvoiceCurrency.toString(),
|
||||||
subtotal: customerCustomerInvoice.calculateSubtotal().toPrimitive(),
|
subtotal: invoice.calculateSubtotal().toPrimitive(),
|
||||||
total: customerCustomerInvoice.calculateTotal().toPrimitive(),
|
total: invoice.calculateTotal().toPrimitive(),
|
||||||
|
|
||||||
//recipient: CustomerInvoiceParticipantPresenter(customerCustomerInvoice.recipient),
|
//recipient: CustomerInvoiceParticipantPresenter(customerInvoice.recipient),
|
||||||
|
|
||||||
metadata: {
|
metadata: {
|
||||||
entity: "customerCustomerInvoice",
|
entity: "customer-invoice",
|
||||||
},
|
},
|
||||||
} as IListCustomerInvoicesResponseDTO;
|
} as IListCustomerInvoicesResponseDTO;
|
||||||
});
|
});
|
||||||
|
|||||||
@ -2,7 +2,7 @@ import { CustomerInvoiceItem } from "@/contexts/invoicing/domain/CustomerInvoice
|
|||||||
import { IInvoicingContext } from "@/contexts/invoicing/intrastructure/InvoicingContext";
|
import { IInvoicingContext } from "@/contexts/invoicing/intrastructure/InvoicingContext";
|
||||||
import { ICollection, IMoney_Response_DTO } from "@shared/contexts";
|
import { ICollection, IMoney_Response_DTO } from "@shared/contexts";
|
||||||
|
|
||||||
export const customerCustomerInvoiceItemPresenter = (
|
export const customerInvoiceItemPresenter = (
|
||||||
items: ICollection<CustomerInvoiceItem>,
|
items: ICollection<CustomerInvoiceItem>,
|
||||||
context: IInvoicingContext
|
context: IInvoicingContext
|
||||||
) =>
|
) =>
|
||||||
|
|||||||
@ -1,33 +1,33 @@
|
|||||||
import { CustomerInvoice } from "@/contexts/invoicing/domain";
|
import { CustomerInvoice } from "@/contexts/invoicing/domain";
|
||||||
import { IInvoicingContext } from "@/contexts/invoicing/intrastructure/InvoicingContext";
|
import { IInvoicingContext } from "@/contexts/invoicing/intrastructure/InvoicingContext";
|
||||||
import { IUpdateCustomerInvoice_Response_DTO } from "@shared/contexts";
|
import { IUpdateCustomerInvoice_Response_DTO } from "@shared/contexts";
|
||||||
import { customerCustomerInvoiceItemPresenter } from "./CustomerInvoiceItem.presenter";
|
import { customerInvoiceItemPresenter } from "./CustomerInvoiceItem.presenter";
|
||||||
import { CustomerInvoiceParticipantPresenter } from "./CustomerInvoiceParticipant.presenter";
|
import { CustomerInvoiceParticipantPresenter } from "./CustomerInvoiceParticipant.presenter";
|
||||||
|
|
||||||
export interface IUpdateCustomerInvoicePresenter {
|
export interface IUpdateCustomerInvoicePresenter {
|
||||||
map: (customerCustomerInvoice: CustomerInvoice, context: IInvoicingContext) => IUpdateCustomerInvoice_Response_DTO;
|
map: (customerInvoice: CustomerInvoice, context: IInvoicingContext) => IUpdateCustomerInvoice_Response_DTO;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const updateCustomerInvoicePresenter: IUpdateCustomerInvoicePresenter = {
|
export const updateCustomerInvoicePresenter: IUpdateCustomerInvoicePresenter = {
|
||||||
map: (customerCustomerInvoice: CustomerInvoice, context: IInvoicingContext): IUpdateCustomerInvoice_Response_DTO => {
|
map: (customerInvoice: CustomerInvoice, context: IInvoicingContext): IUpdateCustomerInvoice_Response_DTO => {
|
||||||
return {
|
return {
|
||||||
id: customerCustomerInvoice.id.toString(),
|
id: customerInvoice.id.toString(),
|
||||||
|
|
||||||
customerCustomerInvoice_status: customerCustomerInvoice.status.toString(),
|
customerInvoice_status: customerInvoice.status.toString(),
|
||||||
customerCustomerInvoice_number: customerCustomerInvoice.customerCustomerInvoiceNumber.toString(),
|
customerInvoice_number: customerInvoice.customerInvoiceNumber.toString(),
|
||||||
customerCustomerInvoice_series: customerCustomerInvoice.customerCustomerInvoiceSeries.toString(),
|
customerInvoice_series: customerInvoice.customerInvoiceSeries.toString(),
|
||||||
issue_date: customerCustomerInvoice.issueDate.toISO8601(),
|
issue_date: customerInvoice.issueDate.toISO8601(),
|
||||||
operation_date: customerCustomerInvoice.operationDate.toISO8601(),
|
operation_date: customerInvoice.operationDate.toISO8601(),
|
||||||
language_code: customerCustomerInvoice.language.toString(),
|
language_code: customerInvoice.language.toString(),
|
||||||
currency: customerCustomerInvoice.currency.toString(),
|
currency: customerInvoice.currency.toString(),
|
||||||
subtotal: customerCustomerInvoice.calculateSubtotal().toPrimitive(),
|
subtotal: customerInvoice.calculateSubtotal().toPrimitive(),
|
||||||
total: customerCustomerInvoice.calculateTotal().toPrimitive(),
|
total: customerInvoice.calculateTotal().toPrimitive(),
|
||||||
|
|
||||||
//sender: {}, //await CustomerInvoiceParticipantPresenter(customerCustomerInvoice.senderId, context),
|
//sender: {}, //await CustomerInvoiceParticipantPresenter(customerInvoice.senderId, context),
|
||||||
|
|
||||||
recipient: CustomerInvoiceParticipantPresenter(customerCustomerInvoice.recipient, context),
|
recipient: CustomerInvoiceParticipantPresenter(customerInvoice.recipient, context),
|
||||||
|
|
||||||
items: customerCustomerInvoiceItemPresenter(customerCustomerInvoice.items, context),
|
items: customerInvoiceItemPresenter(customerInvoice.items, context),
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@ -23,16 +23,16 @@ export class UpdateCustomerInvoiceController extends ExpressController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async executeImpl(): Promise<any> {
|
async executeImpl(): Promise<any> {
|
||||||
const { customerCustomerInvoiceId } = this.req.params;
|
const { customerInvoiceId } = this.req.params;
|
||||||
const request: IUpdateCustomerInvoice_DTO = this.req.body;
|
const request: IUpdateCustomerInvoice_DTO = this.req.body;
|
||||||
|
|
||||||
if (RuleValidator.validate(RuleValidator.RULE_NOT_NULL_OR_UNDEFINED, customerCustomerInvoiceId).isFailure) {
|
if (RuleValidator.validate(RuleValidator.RULE_NOT_NULL_OR_UNDEFINED, customerInvoiceId).isFailure) {
|
||||||
return this.invalidInputError("CustomerInvoice Id param is required!");
|
return this.invalidInputError("CustomerInvoice Id param is required!");
|
||||||
}
|
}
|
||||||
|
|
||||||
const idOrError = UniqueID.create(customerCustomerInvoiceId);
|
const idOrError = UniqueID.create(customerInvoiceId);
|
||||||
if (idOrError.isFailure) {
|
if (idOrError.isFailure) {
|
||||||
return this.invalidInputError("Invalid customerCustomerInvoice Id param!");
|
return this.invalidInputError("Invalid customerInvoice Id param!");
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -62,9 +62,9 @@ export class UpdateCustomerInvoiceController extends ExpressController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const customerCustomerInvoice = <CustomerInvoice>result.object;
|
const customerInvoice = <CustomerInvoice>result.object;
|
||||||
|
|
||||||
return this.ok<IUpdateCustomerInvoice_Response_DTO>(this.presenter.map(customerCustomerInvoice, this.context));
|
return this.ok<IUpdateCustomerInvoice_Response_DTO>(this.presenter.map(customerInvoice, this.context));
|
||||||
} catch (e: unknown) {
|
} catch (e: unknown) {
|
||||||
return this.fail(e as IServerError);
|
return this.fail(e as IServerError);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
export type IListCustomerInvoicesRequestDTO = {}
|
export type IListCustomerInvoicesRequestDTO = {};
|
||||||
|
|
||||||
export interface ICreateCustomerInvoiceRequestDTO {
|
export interface ICreateCustomerInvoiceRequestDTO {
|
||||||
id: string;
|
id: string;
|
||||||
|
|
||||||
customerCustomerInvoice_number: string;
|
customerInvoice_number: string;
|
||||||
customerCustomerInvoice_series: string;
|
customerInvoice_series: string;
|
||||||
issue_date: string;
|
issue_date: string;
|
||||||
operation_date: string;
|
operation_date: string;
|
||||||
language_code: string;
|
language_code: string;
|
||||||
|
|||||||
@ -3,9 +3,9 @@ import { IMetadataDTO, IMoneyDTO, IQuantityDTO } from "@erp/core";
|
|||||||
export interface IListCustomerInvoicesResponseDTO {
|
export interface IListCustomerInvoicesResponseDTO {
|
||||||
id: string;
|
id: string;
|
||||||
|
|
||||||
customerCustomerInvoice_status: string;
|
invoice_status: string;
|
||||||
customerCustomerInvoice_number: string;
|
invoice_number: string;
|
||||||
customerCustomerInvoice_series: string;
|
invoice_series: string;
|
||||||
issue_date: string;
|
issue_date: string;
|
||||||
operation_date: string;
|
operation_date: string;
|
||||||
language_code: string;
|
language_code: string;
|
||||||
@ -20,9 +20,9 @@ export interface IListCustomerInvoicesResponseDTO {
|
|||||||
export interface IGetCustomerInvoiceResponseDTO {
|
export interface IGetCustomerInvoiceResponseDTO {
|
||||||
id: string;
|
id: string;
|
||||||
|
|
||||||
customerCustomerInvoice_status: string;
|
invoice_status: string;
|
||||||
customerCustomerInvoice_number: string;
|
invoice_number: string;
|
||||||
customerCustomerInvoice_series: string;
|
invoice_series: string;
|
||||||
issue_date: string;
|
issue_date: string;
|
||||||
operation_date: string;
|
operation_date: string;
|
||||||
language_code: string;
|
language_code: string;
|
||||||
@ -49,9 +49,9 @@ export interface IGetCustomerInvoiceResponseDTO {
|
|||||||
export interface ICreateCustomerInvoiceResponseDTO {
|
export interface ICreateCustomerInvoiceResponseDTO {
|
||||||
id: string;
|
id: string;
|
||||||
|
|
||||||
customerCustomerInvoice_status: string;
|
invoice_status: string;
|
||||||
customerCustomerInvoice_number: string;
|
invoice_number: string;
|
||||||
customerCustomerInvoice_series: string;
|
invoice_series: string;
|
||||||
issue_date: string;
|
issue_date: string;
|
||||||
operation_date: string;
|
operation_date: string;
|
||||||
language_code: string;
|
language_code: string;
|
||||||
@ -67,9 +67,9 @@ export interface ICreateCustomerInvoiceResponseDTO {
|
|||||||
export interface IUpdateCustomerInvoiceResponseDTO {
|
export interface IUpdateCustomerInvoiceResponseDTO {
|
||||||
id: string;
|
id: string;
|
||||||
|
|
||||||
customerCustomerInvoice_status: string;
|
invoice_status: string;
|
||||||
customerCustomerInvoice_number: string;
|
invoice_number: string;
|
||||||
customerCustomerInvoice_series: string;
|
invoice_series: string;
|
||||||
issue_date: string;
|
issue_date: string;
|
||||||
operation_date: string;
|
operation_date: string;
|
||||||
language_code: string;
|
language_code: string;
|
||||||
|
|||||||
@ -2,8 +2,8 @@ import { z } from "zod";
|
|||||||
|
|
||||||
export const ICreateCustomerInvoiceRequestSchema = z.object({
|
export const ICreateCustomerInvoiceRequestSchema = z.object({
|
||||||
id: z.string().uuid(),
|
id: z.string().uuid(),
|
||||||
customerCustomerInvoice_number: z.string().min(1),
|
customerInvoice_number: z.string().min(1),
|
||||||
customerCustomerInvoice_series: z.string().min(1),
|
customerInvoice_series: z.string().min(1),
|
||||||
issue_date: z.string().refine((date) => {
|
issue_date: z.string().refine((date) => {
|
||||||
const dateStr = z.string().regex(/^\d{4}-\d{2}-\d{2}$/, "Invalid YYYY-MM-DD format");
|
const dateStr = z.string().regex(/^\d{4}-\d{2}-\d{2}$/, "Invalid YYYY-MM-DD format");
|
||||||
return dateStr.safeParse(date).success;
|
return dateStr.safeParse(date).success;
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { CustomerInvoiceService } from "@erp/customerCustomerInvoices/api/domain/services/customer-invoice.service";
|
import { CustomerInvoiceService } from "@erp/customerInvoices/api/domain/services/customer-invoice.service";
|
||||||
import { PropsWithChildren, createContext } from "react";
|
import { PropsWithChildren, createContext } from "react";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { useDataSource, useQueryKey } from "@erp/core/client";
|
import { useDataSource, useQueryKey } from "@erp/core/client";
|
||||||
import { IListCustomerInvoicesResponseDTO } from "@erp/customerCustomerInvoices/common/dto";
|
import { IListCustomerInvoicesResponseDTO } from "@erp/customerInvoices/common/dto";
|
||||||
|
|
||||||
export type UseCustomerInvoicesListParams = Omit<IGetListDataProviderParams, "filters" | "resource"> & {
|
export type UseCustomerInvoicesListParams = Omit<IGetListDataProviderParams, "filters" | "resource"> & {
|
||||||
status?: string;
|
status?: string;
|
||||||
@ -42,10 +42,10 @@ export const useCustomerInvoices = () => {
|
|||||||
} = params;
|
} = params;
|
||||||
|
|
||||||
return useList({
|
return useList({
|
||||||
queryKey: keys().data().resource("customerCustomerInvoices").action("list").params(params).get(),
|
queryKey: keys().data().resource("customerInvoices").action("list").params(params).get(),
|
||||||
queryFn: () => {
|
queryFn: () => {
|
||||||
return dataSource.getList({
|
return dataSource.getList({
|
||||||
resource: "customerCustomerInvoices",
|
resource: "customerInvoices",
|
||||||
quickSearchTerm,
|
quickSearchTerm,
|
||||||
filters:
|
filters:
|
||||||
status !== "all"
|
status !== "all"
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"baseUrl": ".",
|
"baseUrl": ".",
|
||||||
"paths": {
|
"paths": {
|
||||||
"@erp/customerCustomerInvoices/*": ["./src/*"]
|
"@erp/customer-invoices/*": ["./src/*"]
|
||||||
},
|
},
|
||||||
|
|
||||||
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
||||||
|
|||||||
@ -62,6 +62,9 @@ importers:
|
|||||||
express:
|
express:
|
||||||
specifier: ^4.18.2
|
specifier: ^4.18.2
|
||||||
version: 4.21.2
|
version: 4.21.2
|
||||||
|
express-list-routes:
|
||||||
|
specifier: ^1.3.1
|
||||||
|
version: 1.3.1
|
||||||
helmet:
|
helmet:
|
||||||
specifier: ^8.0.0
|
specifier: ^8.0.0
|
||||||
version: 8.1.0
|
version: 8.1.0
|
||||||
@ -3613,6 +3616,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==}
|
resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==}
|
||||||
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
|
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
|
||||||
|
|
||||||
|
express-list-routes@1.3.1:
|
||||||
|
resolution: {integrity: sha512-HC8gpFjmeoJv1f2vJVBJHThA9XXVSOzIQd0I6WvB9G/E7Yy6f8AnFkam7GJRz/+JJQG3fX49eXWhVqjdNj32dw==}
|
||||||
|
|
||||||
express@4.21.2:
|
express@4.21.2:
|
||||||
resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==}
|
resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==}
|
||||||
engines: {node: '>= 0.10.0'}
|
engines: {node: '>= 0.10.0'}
|
||||||
@ -8995,6 +9001,8 @@ snapshots:
|
|||||||
jest-message-util: 29.7.0
|
jest-message-util: 29.7.0
|
||||||
jest-util: 29.7.0
|
jest-util: 29.7.0
|
||||||
|
|
||||||
|
express-list-routes@1.3.1: {}
|
||||||
|
|
||||||
express@4.21.2:
|
express@4.21.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
accepts: 1.3.8
|
accepts: 1.3.8
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user