From 54dc76534aa4288f1e93b07db1d5d11d1c6b7a2a Mon Sep 17 00:00:00 2001 From: David Arranz Date: Tue, 9 Jul 2024 18:21:21 +0200 Subject: [PATCH] . --- .../editors/QuoteDetailsCardEditor.tsx | 24 +++--- client/src/app/quotes/edit.tsx | 16 ++-- client/src/lib/calc.ts | 46 ++++------ .../sequelize/SequelizeRepository.ts | 1 - .../application/Quote/CreateQuote.useCase.ts | 26 ++++-- .../application/Quote/UpdateQuote.useCase.ts | 84 +++++++++++++------ .../sales/infrastructure/Quote.repository.ts | 24 +++++- .../sequelize/quoteItem.model.ts | 2 +- .../express/api/routes/quote.routes.ts | 4 +- .../common/domain/entities/Percentage.ts | 5 +- .../common/domain/entities/Quantity.ts | 1 - .../common/domain/entities/UnitPrice.ts | 9 +- .../contexts/common/domain/entities/index.ts | 2 +- .../ICreateQuote_Request.dto.ts | 26 +----- .../IUpdateQuote_Request.dto.ts | 14 ++-- 15 files changed, 156 insertions(+), 128 deletions(-) diff --git a/client/src/app/quotes/components/editors/QuoteDetailsCardEditor.tsx b/client/src/app/quotes/components/editors/QuoteDetailsCardEditor.tsx index 2b17ee2..b06ed2c 100644 --- a/client/src/app/quotes/components/editors/QuoteDetailsCardEditor.tsx +++ b/client/src/app/quotes/components/editors/QuoteDetailsCardEditor.tsx @@ -54,21 +54,21 @@ export const QuoteDetailsCardEditor = () => { }, { - id: "retail_price" as const, - accessorKey: "retail_price", - header: "retail_price", + id: "unit_price" as const, + accessorKey: "unit_price", + header: "unit_price", size: 10, cell: ({ row: { index }, column: { id } }) => { - return ; + return ; }, }, { - id: "price" as const, - accessorKey: "price", - header: "price", + id: "subtotal_price" as const, + accessorKey: "subtotal_price", + header: "subtotal_price", size: 10, cell: ({ row: { index }, column: { id } }) => { - return ; + return ; }, }, { @@ -81,12 +81,12 @@ export const QuoteDetailsCardEditor = () => { }, }, { - id: "total" as const, - accessorKey: "total", - header: "total", + id: "total_price" as const, + accessorKey: "total_price", + header: "total_price", size: 10, cell: ({ row: { index }, column: { id } }) => { - return ; + return ; }, }, ], diff --git a/client/src/app/quotes/edit.tsx b/client/src/app/quotes/edit.tsx index 42550df..147165b 100644 --- a/client/src/app/quotes/edit.tsx +++ b/client/src/app/quotes/edit.tsx @@ -33,7 +33,7 @@ interface QuoteDataForm extends IUpdateQuote_Request_DTO { items: { quantity: IQuantity; description: string; - retail_price: IMoney; + unit_price: IMoney; price: IMoney; discount: IPercentage; total: IMoney; @@ -105,10 +105,10 @@ export const QuoteEdit = () => { // Recálculo líneas items.map((item, index) => { const itemTotals = calculateItemTotals(item); - quoteSubtotal = quoteSubtotal.add(itemTotals.total); + quoteSubtotal = quoteSubtotal.add(itemTotals.totalPrice); - setValue(`items.${index}.price`, itemTotals.price.toObject()); - setValue(`items.${index}.total`, itemTotals.total.toObject()); + setValue(`items.${index}.subtotal_price`, itemTotals.subtotalPrice.toObject()); + setValue(`items.${index}.total_price`, itemTotals.totalPrice.toObject()); }); console.log(quoteSubtotal.toFormat()); @@ -128,8 +128,8 @@ export const QuoteEdit = () => { const itemTotals = calculateItemTotals(items[index]); - setValue(`items.${index}.price`, itemTotals.price.toObject()); - setValue(`items.${index}.total`, itemTotals.total.toObject()); + setValue(`items.${index}.subtotal_price`, itemTotals.subtotalPrice.toObject()); + setValue(`items.${index}.total_price`, itemTotals.totalPrice.toObject()); // Recálculo completo } @@ -168,9 +168,9 @@ export const QuoteEdit = () => { diff --git a/client/src/lib/calc.ts b/client/src/lib/calc.ts index 28b7f0b..e68ebeb 100644 --- a/client/src/lib/calc.ts +++ b/client/src/lib/calc.ts @@ -3,57 +3,43 @@ import { IMoney, IPercentage, IQuantity } from "./types"; export const calculateItemTotals = (item: { quantity?: IQuantity; - retail_price?: IMoney; + unit_price?: IMoney; discount?: IPercentage; }): { quantity: Quantity; - retailPrice: MoneyValue; - price: MoneyValue; + unitPrice: MoneyValue; + subtotalPrice: MoneyValue; discount: Percentage; - total: MoneyValue; + totalPrice: MoneyValue; } => { - const { quantity: quantityValue, retail_price: retailPriceValue, discount: discountValue } = item; + const { quantity: quantity_value, unit_price: unit_price_value, discount: discount_value } = item; - console.log({ - quantityValue, - retailPriceValue, - discountValue, - }); - - const quantityOrError = Quantity.create(quantityValue); + const quantityOrError = Quantity.create(quantity_value); if (quantityOrError.isFailure) { throw quantityOrError.error; } const quantity = quantityOrError.object; - const retailPriceOrError = MoneyValue.create(retailPriceValue); - if (retailPriceOrError.isFailure) { - throw retailPriceOrError.error; + const unitPriceOrError = MoneyValue.create(unit_price_value); + if (unitPriceOrError.isFailure) { + throw unitPriceOrError.error; } - const retailPrice = retailPriceOrError.object; + const unitPrice = unitPriceOrError.object; - const discountOrError = Percentage.create(discountValue); + const discountOrError = Percentage.create(discount_value); if (discountOrError.isFailure) { throw discountOrError.error; } const discount = discountOrError.object; - const price = retailPrice.multiply(quantity.toNumber()); - const total = price.subtract(price.percentage(discount.toNumber())); + const subtotalPrice = unitPrice.multiply(quantity.toNumber()); + const totalPrice = subtotalPrice.subtract(subtotalPrice.percentage(discount.toNumber())); return { quantity, - retailPrice, - price, + unitPrice, + subtotalPrice, discount, - total, + totalPrice, }; - - /*return { - quantity: quantity.toObject(), - retail_price: retailPrice.toObject(), - price: price.toObject(), - discount: discount.toObject(), - total: total.toObject(), - };*/ }; diff --git a/server/src/contexts/common/infrastructure/sequelize/SequelizeRepository.ts b/server/src/contexts/common/infrastructure/sequelize/SequelizeRepository.ts index cdcec91..2a78b12 100644 --- a/server/src/contexts/common/infrastructure/sequelize/SequelizeRepository.ts +++ b/server/src/contexts/common/infrastructure/sequelize/SequelizeRepository.ts @@ -158,7 +158,6 @@ export abstract class SequelizeRepository implements IRepository { }, transaction: this._transaction, force, - logging: console.log, }); } diff --git a/server/src/contexts/sales/application/Quote/CreateQuote.useCase.ts b/server/src/contexts/sales/application/Quote/CreateQuote.useCase.ts index a9a8b16..b67fb0f 100644 --- a/server/src/contexts/sales/application/Quote/CreateQuote.useCase.ts +++ b/server/src/contexts/sales/application/Quote/CreateQuote.useCase.ts @@ -144,7 +144,9 @@ export class CreateQuoteUseCase return Result.fail(referenceOrError.error); } - const languageOrError = Language.createFromCode(quoteDTO.lang_code); + const languageOrError = Language.createFromCode( + quoteDTO.lang_code ?? this._dealer?.language.code + ); if (languageOrError.isFailure) { return Result.fail(languageOrError.error); } @@ -154,7 +156,9 @@ export class CreateQuoteUseCase return Result.fail(customerOrError.error); } - const currencyOrError = CurrencyData.createFromCode(quoteDTO.currency_code); + const currencyOrError = CurrencyData.createFromCode( + quoteDTO.currency_code ?? CurrencyData.DEFAULT_CURRENCY_CODE + ); if (currencyOrError.isFailure) { return Result.fail(currencyOrError.error); } @@ -174,6 +178,11 @@ export class CreateQuoteUseCase return Result.fail(validityOrError.error); } + const discountOrError = Percentage.create(quoteDTO.discount); + if (discountOrError.isFailure) { + return Result.fail(discountOrError.error); + } + const items = new Collection( quoteDTO.items?.map( (item) => @@ -182,11 +191,14 @@ export class CreateQuoteUseCase description: Description.create(item.description).object, quantity: Quantity.create(item.quantity).object, unitPrice: UnitPrice.create({ - amount: item.unit_price.amount, - currencyCode: item.unit_price.currency_code, - precision: item.unit_price.precision, + amount: item.unit_price?.amount, + currencyCode: item.unit_price?.currency_code, + precision: item.unit_price?.precision, + }).object, + discount: Percentage.create({ + amount: item.discount?.amount, + precision: item.discount?.precision, }).object, - discount: Percentage.create(item.discount.amount).object, }).object ) ); @@ -203,6 +215,8 @@ export class CreateQuoteUseCase notes: notesOrError.object, validity: validityOrError.object, + discount: discountOrError.object, + items, dealerId, diff --git a/server/src/contexts/sales/application/Quote/UpdateQuote.useCase.ts b/server/src/contexts/sales/application/Quote/UpdateQuote.useCase.ts index c06d5ea..55ffcdd 100644 --- a/server/src/contexts/sales/application/Quote/UpdateQuote.useCase.ts +++ b/server/src/contexts/sales/application/Quote/UpdateQuote.useCase.ts @@ -9,12 +9,13 @@ import { IInfrastructureError } from "@/contexts/common/infrastructure"; import { ISequelizeAdapter } from "@/contexts/common/infrastructure/sequelize"; import { Collection, - Currency, + CurrencyData, Description, DomainError, IDomainError, Language, Note, + Percentage, Quantity, Result, UTCDateValue, @@ -23,11 +24,20 @@ import { } from "@shared/contexts"; import { IUpdateQuote_Request_DTO } from "@shared/contexts"; -import { IQuoteRepository, Quote, QuoteCustomer, QuoteItem, QuoteStatus } from "../../domain"; +import { + Dealer, + IQuoteRepository, + Quote, + QuoteCustomer, + QuoteItem, + QuoteReference, + QuoteStatus, +} from "../../domain"; +import { ISalesContext } from "../../infrastructure"; export interface IUpdateQuoteUseCaseRequest extends IUseCaseRequest { id: UniqueID; - QuoteDTO: IUpdateQuote_Request_DTO; + quoteDTO: IUpdateQuote_Request_DTO; } export type UpdateQuoteResponseOrError = @@ -39,16 +49,26 @@ export class UpdateQuoteUseCase { private _adapter: ISequelizeAdapter; private _repositoryManager: IRepositoryManager; + private _dealer?: Dealer; - constructor(props: { adapter: ISequelizeAdapter; repositoryManager: IRepositoryManager }) { - this._adapter = props.adapter; - this._repositoryManager = props.repositoryManager; + constructor(context: ISalesContext) { + this._adapter = context.adapter; + this._repositoryManager = context.repositoryManager; + this._dealer = context.dealer; } async execute(request: IUpdateQuoteUseCaseRequest): Promise { - const { id, QuoteDTO } = request; + const { id, quoteDTO } = request; const QuoteRepository = this._getQuoteRepository(); + // Validaciones de datos + if (!this._dealer) { + const message = "Error. Missing Dealer"; + return Result.fail(UseCaseError.create(UseCaseError.INVALID_INPUT_DATA, message)); + } + + const dealerId = this._dealer.id; + // Comprobar que existe el Quote const idExists = await QuoteRepository().exists(id); if (!idExists) { @@ -61,10 +81,10 @@ export class UpdateQuoteUseCase } // Crear usuario - const QuoteOrError = this._tryCreateQuoteInstance(QuoteDTO, id); + const quoteOrError = this._tryCreateQuoteInstance(quoteDTO, id, dealerId); - if (QuoteOrError.isFailure) { - const { error: domainError } = QuoteOrError; + if (quoteOrError.isFailure) { + const { error: domainError } = quoteOrError; let errorCode = ""; let message = ""; @@ -84,22 +104,23 @@ export class UpdateQuoteUseCase return Result.fail(UseCaseError.create(errorCode, message, domainError)); } - return this._updateQuote(QuoteOrError.object); + return this._updateQuote(quoteOrError.object); } - private async _updateQuote(Quote: Quote) { + private async _updateQuote(quote: Quote) { // Guardar el contacto const transaction = this._adapter.startTransaction(); - const QuoteRepository = this._getQuoteRepository(); - let QuoteRepo: IQuoteRepository; + const quoteRepository = this._getQuoteRepository(); + let quoteRepo: IQuoteRepository; try { await transaction.complete(async (t) => { - QuoteRepo = QuoteRepository({ transaction: t }); - await QuoteRepo.update(Quote); + console.log(t); + quoteRepo = quoteRepository({ transaction: t }); + await quoteRepo.update(quote); }); - return Result.ok(Quote); + return Result.ok(quote); } catch (error: unknown) { const _error = error as IInfrastructureError; return Result.fail(UseCaseError.create(UseCaseError.REPOSITORY_ERROR, _error.message)); @@ -108,7 +129,8 @@ export class UpdateQuoteUseCase private _tryCreateQuoteInstance( quoteDTO: IUpdateQuote_Request_DTO, - quoteId: UniqueID + quoteId: UniqueID, + dealerId: UniqueID ): Result { const statusOrError = QuoteStatus.create(quoteDTO.status); if (statusOrError.isFailure) { @@ -120,7 +142,7 @@ export class UpdateQuoteUseCase return Result.fail(dateOrError.error); } - const referenceOrError = QuoteStatus.create(quoteDTO.reference); + const referenceOrError = QuoteReference.create(quoteDTO.reference); if (referenceOrError.isFailure) { return Result.fail(referenceOrError.error); } @@ -135,7 +157,7 @@ export class UpdateQuoteUseCase return Result.fail(customerOrError.error); } - const currencyOrError = Currency.createFromCode(quoteDTO.currency_code); + const currencyOrError = CurrencyData.createFromCode(quoteDTO.currency_code); if (currencyOrError.isFailure) { return Result.fail(currencyOrError.error); } @@ -155,16 +177,26 @@ export class UpdateQuoteUseCase return Result.fail(validityOrError.error); } + const discountOrError = Percentage.create(quoteDTO.discount); + if (discountOrError.isFailure) { + return Result.fail(discountOrError.error); + } + const items = new Collection( quoteDTO.items?.map( (item) => QuoteItem.create({ + articleId: item.article_id, description: Description.create(item.description).object, - quantity: Quantity.create({ amount: item.quantity, precision: 4 }).object, + quantity: Quantity.create(item.quantity).object, unitPrice: UnitPrice.create({ - amount: item.unit_price.amount, - currencyCode: item.unit_price.currency, - precision: item.unit_price.precision, + amount: item.unit_price?.amount, + currencyCode: item.unit_price?.currency_code, + precision: item.unit_price?.precision, + }).object, + discount: Percentage.create({ + amount: item.discount?.amount, + precision: item.discount?.precision, }).object, }).object ) @@ -182,7 +214,11 @@ export class UpdateQuoteUseCase notes: notesOrError.object, validity: validityOrError.object, + discount: discountOrError.object, + items, + + dealerId, }, quoteId ); diff --git a/server/src/contexts/sales/infrastructure/Quote.repository.ts b/server/src/contexts/sales/infrastructure/Quote.repository.ts index 9a8bf25..a37c91d 100644 --- a/server/src/contexts/sales/infrastructure/Quote.repository.ts +++ b/server/src/contexts/sales/infrastructure/Quote.repository.ts @@ -1,6 +1,6 @@ import { ISequelizeAdapter, SequelizeRepository } from "@/contexts/common/infrastructure/sequelize"; import { ICollection, IQueryCriteria, UniqueID } from "@shared/contexts"; -import { Transaction } from "sequelize"; +import { ModelDefined, Transaction } from "sequelize"; import { IQuoteRepository } from "../domain"; import { Quote } from "../domain/entities"; @@ -35,11 +35,27 @@ export class QuoteRepository extends SequelizeRepository implements IQuot } public async update(user: Quote): Promise { + console.time("update"); const userData = this.mapper.mapToPersistence(user); - // borrando y luego creando - // await this.removeById(user.id, true); - await this._save("Quote_Model", user.id, userData, {}); + const QuoteItem_Model: ModelDefined = this._adapter.getModel("QuoteItem_Model"); + + await Promise.all([ + this._save("Quote_Model", user.id, userData, {}), + QuoteItem_Model.destroy({ + where: { + quote_id: userData.id, + }, + transaction: this._transaction, + force: true, + }), + ]); + + await QuoteItem_Model.bulkCreate(userData.items, { + transaction: this._transaction, + }); + + console.timeEnd("update"); } public async getById(id: UniqueID): Promise { diff --git a/server/src/contexts/sales/infrastructure/sequelize/quoteItem.model.ts b/server/src/contexts/sales/infrastructure/sequelize/quoteItem.model.ts index 3153a34..322377a 100644 --- a/server/src/contexts/sales/infrastructure/sequelize/quoteItem.model.ts +++ b/server/src/contexts/sales/infrastructure/sequelize/quoteItem.model.ts @@ -55,7 +55,7 @@ export default (sequelize: Sequelize) => { }, id_article: { type: DataTypes.BIGINT().UNSIGNED, - allowNull: false, + allowNull: true, }, position: { type: new DataTypes.MEDIUMINT(), diff --git a/server/src/infrastructure/express/api/routes/quote.routes.ts b/server/src/infrastructure/express/api/routes/quote.routes.ts index 3a9a50b..dd7870d 100644 --- a/server/src/infrastructure/express/api/routes/quote.routes.ts +++ b/server/src/infrastructure/express/api/routes/quote.routes.ts @@ -14,12 +14,12 @@ export const QuoteRouter = (appRouter: Express.Router) => { quoteRoutes.get("/", checkUser, getDealerMiddleware, listQuotesController); quoteRoutes.get("/:quoteId", checkUser, getDealerMiddleware, getQuoteController); quoteRoutes.post("/", checkUser, getDealerMiddleware, createQuoteController); - quoteRoutes.put("/:quoteId", checkUser, updateQuoteController); + quoteRoutes.put("/:quoteId", checkUser, getDealerMiddleware, updateQuoteController); /* quoteRoutes.post("/", isAdmin, createQuoteController); - quoteRoutes.delete("/:quoteId", isAdmin, deleteQuoteController);*/ + quoteRoutes.delete("/:quoteId", isAdmin, getDealerMiddleware, deleteQuoteController);*/ appRouter.use("/quotes", quoteRoutes); }; diff --git a/shared/lib/contexts/common/domain/entities/Percentage.ts b/shared/lib/contexts/common/domain/entities/Percentage.ts index 611990c..1dd6672 100644 --- a/shared/lib/contexts/common/domain/entities/Percentage.ts +++ b/shared/lib/contexts/common/domain/entities/Percentage.ts @@ -1,6 +1,7 @@ import Joi from "joi"; import { isNull } from "lodash"; import { NullOr } from "../../../../utilities"; +import { DomainError, handleDomainError } from "../errors"; import { RuleValidator } from "../RuleValidator"; import { INullableValueObjectOptions, NullableValueObject } from "./NullableValueObject"; import { Result } from "./Result"; @@ -70,7 +71,9 @@ export class Percentage extends NullableValueObject { const validationResult = Percentage.validate(amount, _options); if (validationResult.isFailure) { - return Result.fail(validationResult.error); + return Result.fail( + handleDomainError(DomainError.INVALID_INPUT_DATA, validationResult.error.message, _options) + ); } let _amount: NullOr = Percentage.sanitize(validationResult.object); diff --git a/shared/lib/contexts/common/domain/entities/Quantity.ts b/shared/lib/contexts/common/domain/entities/Quantity.ts index babbd6e..bfe4b4b 100644 --- a/shared/lib/contexts/common/domain/entities/Quantity.ts +++ b/shared/lib/contexts/common/domain/entities/Quantity.ts @@ -74,7 +74,6 @@ export class Quantity extends NullableValueObject { } let _amount: NullOr = Quantity.sanitize(validationResult.object); - const _props = { amount: isNull(_amount) ? 0 : _amount, precision, diff --git a/shared/lib/contexts/common/domain/entities/UnitPrice.ts b/shared/lib/contexts/common/domain/entities/UnitPrice.ts index 13889ff..15b1d72 100644 --- a/shared/lib/contexts/common/domain/entities/UnitPrice.ts +++ b/shared/lib/contexts/common/domain/entities/UnitPrice.ts @@ -1,6 +1,6 @@ -import { NullOr } from '../../../../utilities'; -import { MoneyValue } from './MoneyValue'; -import { Result } from './Result'; +import { NullOr } from "../../../../utilities"; +import { MoneyValue } from "./MoneyValue"; +import { Result } from "./Result"; export interface IUnitPriceProps { amount: NullOr; @@ -10,8 +10,7 @@ export interface IUnitPriceProps { export class UnitPrice extends MoneyValue { public static create(props: IUnitPriceProps) { - const {amount, currencyCode, precision = 4} = props; - + const { amount, currencyCode, precision = 4 } = props; const _unitPriceOrError = MoneyValue.create({ amount, currencyCode, diff --git a/shared/lib/contexts/common/domain/entities/index.ts b/shared/lib/contexts/common/domain/entities/index.ts index 0738ba5..290ba52 100644 --- a/shared/lib/contexts/common/domain/entities/index.ts +++ b/shared/lib/contexts/common/domain/entities/index.ts @@ -22,7 +22,7 @@ export * from "./StringValueObject"; export * from "./TextValueObject"; export * from "./TINNumber"; export * from "./UniqueID"; -//export * from "./UnitPrice"; +export * from "./UnitPrice"; export * from "./UTCDateValue"; export * from "./ValueObject"; diff --git a/shared/lib/contexts/sales/application/dto/Quote/CreateQuote.dto/ICreateQuote_Request.dto.ts b/shared/lib/contexts/sales/application/dto/Quote/CreateQuote.dto/ICreateQuote_Request.dto.ts index ef62deb..75a9e77 100644 --- a/shared/lib/contexts/sales/application/dto/Quote/CreateQuote.dto/ICreateQuote_Request.dto.ts +++ b/shared/lib/contexts/sales/application/dto/Quote/CreateQuote.dto/ICreateQuote_Request.dto.ts @@ -41,34 +41,10 @@ export interface ICreateQuoteItem_Request_DTO { export function ensureCreateQuote_Request_DTOIsValid(quoteDTO: ICreateQuote_Request_DTO) { const schema = Joi.object({ id: Joi.string(), + status: Joi.string(), date: Joi.string(), reference: Joi.string(), - lang_code: Joi.string(), customer_information: Joi.string(), - currency_code: Joi.string(), - payment_method: Joi.string(), - notes: Joi.string(), - validity: Joi.string(), - - items: Joi.array().items( - Joi.object({ - article_id: Joi.string(), - description: Joi.string(), - quantity: { - amount: Joi.number(), - precision: Joi.number(), - }, - unit_price: Joi.object({ - amount: Joi.number(), - precision: Joi.number(), - currency: Joi.string(), - }), - discount: Joi.object({ - amount: Joi.number(), - precision: Joi.number(), - }), - }).unknown(true) - ), }).unknown(true); const result = RuleValidator.validate(schema, quoteDTO); diff --git a/shared/lib/contexts/sales/application/dto/Quote/UpdateQuote.dto/IUpdateQuote_Request.dto.ts b/shared/lib/contexts/sales/application/dto/Quote/UpdateQuote.dto/IUpdateQuote_Request.dto.ts index ea348c4..38108df 100644 --- a/shared/lib/contexts/sales/application/dto/Quote/UpdateQuote.dto/IUpdateQuote_Request.dto.ts +++ b/shared/lib/contexts/sales/application/dto/Quote/UpdateQuote.dto/IUpdateQuote_Request.dto.ts @@ -43,14 +43,14 @@ export function ensureUpdateQuote_Request_DTOIsValid(quoteDTO: IUpdateQuote_Requ customer_information: Joi.string(), lang_code: Joi.string(), currency_code: Joi.string(), - payment_method: Joi.string(), - notes: Joi.string(), - validity: Joi.string(), + payment_method: Joi.string().optional().allow(null).allow("").default(""), + notes: Joi.string().optional().allow(null).allow("").default(""), + validity: Joi.string().optional().allow(null).allow("").default(""), subtotal: Joi.object({ amount: Joi.number(), precision: Joi.number(), - currency: Joi.string(), + currency_code: Joi.string(), }), discount: Joi.object({ @@ -69,12 +69,12 @@ export function ensureUpdateQuote_Request_DTOIsValid(quoteDTO: IUpdateQuote_Requ unit_price: Joi.object({ amount: Joi.number(), precision: Joi.number(), - currency: Joi.string(), + currency_code: Joi.string(), }), subtotal_price: Joi.object({ amount: Joi.number(), precision: Joi.number(), - currency: Joi.string(), + currency_code: Joi.string(), }), discount: Joi.object({ amount: Joi.number(), @@ -83,7 +83,7 @@ export function ensureUpdateQuote_Request_DTOIsValid(quoteDTO: IUpdateQuote_Requ total_price: Joi.object({ amount: Joi.number(), precision: Joi.number(), - currency: Joi.string(), + currency_code: Joi.string(), }), }).unknown(true) ),