diff --git a/server/src/contexts/sales/application/services/QuoteService.ts b/server/src/contexts/sales/application/services/QuoteService.ts index a584004..1ae8fda 100644 --- a/server/src/contexts/sales/application/services/QuoteService.ts +++ b/server/src/contexts/sales/application/services/QuoteService.ts @@ -5,19 +5,37 @@ const generateQuoteReferenceForDealer = async ( quoteRepository: IQuoteRepository ): Promise => { // 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 }; diff --git a/server/src/contexts/sales/domain/repository/QuoteRepository.interface.ts b/server/src/contexts/sales/domain/repository/QuoteRepository.interface.ts index d6f84f7..26736f5 100644 --- a/server/src/contexts/sales/domain/repository/QuoteRepository.interface.ts +++ b/server/src/contexts/sales/domain/repository/QuoteRepository.interface.ts @@ -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 { exists(id: UniqueID): Promise; + existsByReference(reference: QuoteReference): Promise; + create(quote: Quote): Promise; update(quote: Quote): Promise; @@ -14,4 +16,5 @@ export interface IQuoteRepository extends IRepository { removeById(id: UniqueID): Promise; findLastQuoteByDealerId(dealerId: UniqueID): Promise; + findLastReferenceByDealerId(dealerId: UniqueID): Promise; } diff --git a/server/src/contexts/sales/infrastructure/Quote.repository.ts b/server/src/contexts/sales/infrastructure/Quote.repository.ts index 5ca541c..85e4cec 100644 --- a/server/src/contexts/sales/infrastructure/Quote.repository.ts +++ b/server/src/contexts/sales/infrastructure/Quote.repository.ts @@ -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 implements IQuot return this._exists("Quote_Model", "id", id.toPrimitive()); } + public async existsByReference(reference: QuoteReference): Promise { + return this._exists("Quote_Model", "reference", reference.toPrimitive()); + } + public async create(user: Quote): Promise { const userData = this.mapper.mapToPersistence(user); await this._save("Quote_Model", user.id, userData); @@ -134,6 +138,11 @@ export class QuoteRepository extends SequelizeRepository implements IQuot return this.mapper.mapToDomain(rawQuote); } + + public async findLastReferenceByDealerId(dealerId: UniqueID): Promise { + const quote = await this.findLastQuoteByDealerId(dealerId); + return quote ? quote.reference : null; + } } export const registerQuoteRepository = (context: ISalesContext) => {