diff --git a/client/src/app/quotes/components/editors/QuoteDetailsCardEditor.tsx b/client/src/app/quotes/components/editors/QuoteDetailsCardEditor.tsx index b06ed2c..6a61611 100644 --- a/client/src/app/quotes/components/editors/QuoteDetailsCardEditor.tsx +++ b/client/src/app/quotes/components/editors/QuoteDetailsCardEditor.tsx @@ -127,14 +127,13 @@ export const QuoteDetailsCardEditor = () => { const handleInsertArticle = useCallback( (newArticle) => { - console.log(newArticle); - fieldActions.append({ ...newArticle, quantity: { amount: 1, precision: Quantity.DEFAULT_PRECISION, }, + unit_price: newArticle.retail_price, }); }, [fieldActions] diff --git a/client/src/app/quotes/edit.tsx b/client/src/app/quotes/edit.tsx index 147165b..97f4d1b 100644 --- a/client/src/app/quotes/edit.tsx +++ b/client/src/app/quotes/edit.tsx @@ -1,6 +1,5 @@ -import { FormMoneyField, LoadingOverlay, SubmitButton } from "@/components"; +import { ErrorOverlay, FormMoneyField, LoadingOverlay, SubmitButton } from "@/components"; import { calculateItemTotals } from "@/lib/calc"; -import { useGetIdentity } from "@/lib/hooks"; import { useUrlId } from "@/lib/hooks/useUrlId"; import { Badge, Button, Form, Tabs, TabsContent, TabsList, TabsTrigger } from "@/ui"; import { IUpdateQuote_Request_DTO, MoneyValue } from "@shared/contexts"; @@ -45,12 +44,12 @@ export const QuoteEdit = () => { const [loading, setLoading] = useState(false); const quoteId = useUrlId(); - const { data: userIdentity } = useGetIdentity(); + //const { data: userIdentity } = useGetIdentity(); const { useOne, useUpdate } = useQuotes(); const { data, status } = useOne(quoteId); - const { mutate } = useUpdate(quoteId); + const { mutate } = useUpdate(String(quoteId)); const form = useForm({ mode: "onBlur", @@ -64,11 +63,14 @@ export const QuoteEdit = () => { payment_method: "", notes: "", validity: "", - subtotal: "", + subtotal_price: "", items: [], }, }); + const { watch, getValues, setValue, formState } = form; + const { isSubmitting } = formState; + const onSubmit: SubmitHandler = async (data) => { console.debug(JSON.stringify(data)); @@ -89,8 +91,6 @@ export const QuoteEdit = () => { } }; - const { watch, getValues, setValue } = form; - useEffect(() => { const { unsubscribe } = watch((_, { name, type }) => { const value = getValues(); @@ -138,6 +138,14 @@ export const QuoteEdit = () => { return () => unsubscribe(); }, [watch, getValues, setValue]); + if (isSubmitting) { + return ; + } + + if (status === "error") { + return ; + } + if (status !== "success") { return ; } diff --git a/server/src/contexts/common/infrastructure/sequelize/SequelizeRepository.ts b/server/src/contexts/common/infrastructure/sequelize/SequelizeRepository.ts index 2a78b12..55668e5 100644 --- a/server/src/contexts/common/infrastructure/sequelize/SequelizeRepository.ts +++ b/server/src/contexts/common/infrastructure/sequelize/SequelizeRepository.ts @@ -62,7 +62,10 @@ export abstract class SequelizeRepository implements IRepository { protected async _getById(modelName: string, id: UniqueID | string, params: any = {}): Promise { const _model = this._adapter.getModel(modelName); - return _model.findByPk(id.toString(), params); + return _model.findByPk(id.toString(), { + transaction: this._transaction, + ...params, + }); } protected async _findAll( diff --git a/server/src/contexts/sales/application/Quote/GetQuote.useCase.ts b/server/src/contexts/sales/application/Quote/GetQuote.useCase.ts index d0f1e0c..aa27e5c 100644 --- a/server/src/contexts/sales/application/Quote/GetQuote.useCase.ts +++ b/server/src/contexts/sales/application/Quote/GetQuote.useCase.ts @@ -47,19 +47,19 @@ export class GetQuoteUseCase const transaction = this._adapter.startTransaction(); const QuoteRepoBuilder = this._getQuoteRepository(); - let Quote: Quote | null = null; + let quote: Quote | null = null; try { await transaction.complete(async (t) => { - const QuoteRepo = QuoteRepoBuilder({ transaction: t }); - Quote = await QuoteRepo.getById(id); + const quoteRepo = QuoteRepoBuilder({ transaction: t }); + quote = await quoteRepo.getById(id); }); - if (!Quote) { + if (!quote) { return Result.fail(UseCaseError.create(UseCaseError.NOT_FOUND_ERROR, "Quote not found")); } - return Result.ok(Quote!); + return Result.ok(quote!); } catch (error: unknown) { const _error = error as IInfrastructureError; return Result.fail(UseCaseError.create(UseCaseError.REPOSITORY_ERROR, "Query error", _error)); diff --git a/server/src/contexts/sales/application/Quote/UpdateQuote.useCase.ts b/server/src/contexts/sales/application/Quote/UpdateQuote.useCase.ts index 55ffcdd..bfd6439 100644 --- a/server/src/contexts/sales/application/Quote/UpdateQuote.useCase.ts +++ b/server/src/contexts/sales/application/Quote/UpdateQuote.useCase.ts @@ -80,7 +80,7 @@ export class UpdateQuoteUseCase ); } - // Crear usuario + // Crear quote const quoteOrError = this._tryCreateQuoteInstance(quoteDTO, id, dealerId); if (quoteOrError.isFailure) { diff --git a/server/src/contexts/sales/infrastructure/Quote.repository.ts b/server/src/contexts/sales/infrastructure/Quote.repository.ts index a37c91d..b446750 100644 --- a/server/src/contexts/sales/infrastructure/Quote.repository.ts +++ b/server/src/contexts/sales/infrastructure/Quote.repository.ts @@ -59,7 +59,11 @@ export class QuoteRepository extends SequelizeRepository implements IQuot } public async getById(id: UniqueID): Promise { - const rawQuote: any = await this._getById("Quote_Model", id); + const QuoteItem_Model: ModelDefined = this._adapter.getModel("QuoteItem_Model"); + + const rawQuote: any = await this._getById("Quote_Model", id, { + include: "items", + }); if (!rawQuote === true) { return null; diff --git a/server/src/contexts/sales/infrastructure/mappers/quoteItem.mapper.ts b/server/src/contexts/sales/infrastructure/mappers/quoteItem.mapper.ts index c732807..5058ceb 100644 --- a/server/src/contexts/sales/infrastructure/mappers/quoteItem.mapper.ts +++ b/server/src/contexts/sales/infrastructure/mappers/quoteItem.mapper.ts @@ -25,7 +25,12 @@ class QuoteItemMapper const props: IQuoteItemProps = { articleId: source.id_article, description: this.mapsValue(source, "description", Description.create), - quantity: this.mapsValue(source, "quantity", Quantity.create), + quantity: this.mapsValue(source, "quantity", (quantity) => + Quantity.create({ + amount: quantity, + precision: Quantity.DEFAULT_PRECISION, + }) + ), unitPrice: this.mapsValue(source, "unit_price", (unit_price) => MoneyValue.create({ amount: unit_price, diff --git a/shared/lib/contexts/common/application/Common.service.ts b/shared/lib/contexts/common/application/Common.service.ts index 7207d32..ebf5e72 100644 --- a/shared/lib/contexts/common/application/Common.service.ts +++ b/shared/lib/contexts/common/application/Common.service.ts @@ -6,7 +6,6 @@ import { Measure, Name, Phone, - Quantity, Result, UTCDateValue, UniqueID, @@ -63,11 +62,11 @@ export const ensureDescriptionIsValid = (value: string): Result return descriptionOrError.isSuccess ? Result.ok(true) : Result.fail(descriptionOrError.error); }; -export const ensureQuantityIsValid = (value: string): Result => { +/*export const ensureQuantityIsValid = (value: string): Result => { const descriptionOrError = Quantity.create(value); return descriptionOrError.isSuccess ? Result.ok(true) : Result.fail(descriptionOrError.error); -}; +};*/ export const ensureUnitPriceIsValid = (value: any): Result => { const { amount, currency, precision } = value;