This commit is contained in:
David Arranz 2024-08-23 19:10:30 +02:00
parent 26bc608131
commit 321c27fce9
3 changed files with 41 additions and 11 deletions

View File

@ -5,19 +5,37 @@ const generateQuoteReferenceForDealer = async (
quoteRepository: IQuoteRepository
): Promise<QuoteReference> => {
// Obtener la última referencia del dealer
const lastQuote = await quoteRepository.findLastQuoteByDealerId(dealer.id);
let lastQuoteReference = await quoteRepository.findLastReferenceByDealerId(dealer.id);
let isUnique = false;
// Generar la nueva referencia usando el Value Object
const quoteReferenceResult = QuoteReference.fromPrevious(
lastQuote ? lastQuote.reference : null,
dealer
);
// Referencia temporal
let newQuoteReference: QuoteReference = QuoteReference.create(undefined).object;
if (quoteReferenceResult.isFailure) {
throw new Error("Error al crear la referencia de presupuesto");
while (!isUnique) {
// Generar la nueva referencia usando el Value Object
const quoteReferenceOrError = QuoteReference.fromPrevious(
lastQuoteReference ? lastQuoteReference : null,
dealer
);
if (quoteReferenceOrError.isFailure) {
throw new Error("Error al crear la referencia de presupuesto");
}
newQuoteReference = quoteReferenceOrError.object;
// Verificar si la referencia ya existe
const existingQuote = await quoteRepository.existsByReference(newQuoteReference);
if (!existingQuote) {
isUnique = true;
} else {
// Utilizamos la última referencia encontrada para continuar la generación
lastQuoteReference = newQuoteReference;
}
}
return quoteReferenceResult.object;
return newQuoteReference;
};
export { generateQuoteReferenceForDealer };

View File

@ -1,10 +1,12 @@
/* eslint-disable no-unused-vars */
import { IRepository } from "@/contexts/common/domain/repositories";
import { ICollection, IQueryCriteria, UniqueID } from "@shared/contexts";
import { Quote } from "../entities";
import { Quote, QuoteReference } from "../entities";
export interface IQuoteRepository extends IRepository<Quote> {
exists(id: UniqueID): Promise<boolean>;
existsByReference(reference: QuoteReference): Promise<boolean>;
create(quote: Quote): Promise<void>;
update(quote: Quote): Promise<void>;
@ -14,4 +16,5 @@ export interface IQuoteRepository extends IRepository<Quote> {
removeById(id: UniqueID): Promise<void>;
findLastQuoteByDealerId(dealerId: UniqueID): Promise<Quote | null>;
findLastReferenceByDealerId(dealerId: UniqueID): Promise<QuoteReference | null>;
}

View File

@ -3,7 +3,7 @@ import { ICollection, IQueryCriteria, UniqueID } from "@shared/contexts";
import { ModelDefined, Transaction } from "sequelize";
import { IQuoteRepository } from "../domain";
import { Quote } from "../domain/entities";
import { Quote, QuoteReference } from "../domain/entities";
import { ISalesContext } from "./Sales.context";
import { IQuoteMapper, createQuoteMapper } from "./mappers/quote.mapper";
@ -29,6 +29,10 @@ export class QuoteRepository extends SequelizeRepository<Quote> implements IQuot
return this._exists("Quote_Model", "id", id.toPrimitive());
}
public async existsByReference(reference: QuoteReference): Promise<boolean> {
return this._exists("Quote_Model", "reference", reference.toPrimitive());
}
public async create(user: Quote): Promise<void> {
const userData = this.mapper.mapToPersistence(user);
await this._save("Quote_Model", user.id, userData);
@ -134,6 +138,11 @@ export class QuoteRepository extends SequelizeRepository<Quote> implements IQuot
return this.mapper.mapToDomain(rawQuote);
}
public async findLastReferenceByDealerId(dealerId: UniqueID): Promise<QuoteReference | null> {
const quote = await this.findLastQuoteByDealerId(dealerId);
return quote ? quote.reference : null;
}
}
export const registerQuoteRepository = (context: ISalesContext) => {