This commit is contained in:
David Arranz 2024-07-09 20:29:02 +02:00
parent 54dc76534a
commit 54dc0a8442
8 changed files with 39 additions and 21 deletions

View File

@ -127,14 +127,13 @@ export const QuoteDetailsCardEditor = () => {
const handleInsertArticle = useCallback( const handleInsertArticle = useCallback(
(newArticle) => { (newArticle) => {
console.log(newArticle);
fieldActions.append({ fieldActions.append({
...newArticle, ...newArticle,
quantity: { quantity: {
amount: 1, amount: 1,
precision: Quantity.DEFAULT_PRECISION, precision: Quantity.DEFAULT_PRECISION,
}, },
unit_price: newArticle.retail_price,
}); });
}, },
[fieldActions] [fieldActions]

View File

@ -1,6 +1,5 @@
import { FormMoneyField, LoadingOverlay, SubmitButton } from "@/components"; import { ErrorOverlay, FormMoneyField, LoadingOverlay, SubmitButton } from "@/components";
import { calculateItemTotals } from "@/lib/calc"; import { calculateItemTotals } from "@/lib/calc";
import { useGetIdentity } from "@/lib/hooks";
import { useUrlId } from "@/lib/hooks/useUrlId"; import { useUrlId } from "@/lib/hooks/useUrlId";
import { Badge, Button, Form, Tabs, TabsContent, TabsList, TabsTrigger } from "@/ui"; import { Badge, Button, Form, Tabs, TabsContent, TabsList, TabsTrigger } from "@/ui";
import { IUpdateQuote_Request_DTO, MoneyValue } from "@shared/contexts"; import { IUpdateQuote_Request_DTO, MoneyValue } from "@shared/contexts";
@ -45,12 +44,12 @@ export const QuoteEdit = () => {
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
const quoteId = useUrlId(); const quoteId = useUrlId();
const { data: userIdentity } = useGetIdentity(); //const { data: userIdentity } = useGetIdentity();
const { useOne, useUpdate } = useQuotes(); const { useOne, useUpdate } = useQuotes();
const { data, status } = useOne(quoteId); const { data, status } = useOne(quoteId);
const { mutate } = useUpdate(quoteId); const { mutate } = useUpdate(String(quoteId));
const form = useForm<QuoteDataForm>({ const form = useForm<QuoteDataForm>({
mode: "onBlur", mode: "onBlur",
@ -64,11 +63,14 @@ export const QuoteEdit = () => {
payment_method: "", payment_method: "",
notes: "", notes: "",
validity: "", validity: "",
subtotal: "", subtotal_price: "",
items: [], items: [],
}, },
}); });
const { watch, getValues, setValue, formState } = form;
const { isSubmitting } = formState;
const onSubmit: SubmitHandler<QuoteDataForm> = async (data) => { const onSubmit: SubmitHandler<QuoteDataForm> = async (data) => {
console.debug(JSON.stringify(data)); console.debug(JSON.stringify(data));
@ -89,8 +91,6 @@ export const QuoteEdit = () => {
} }
}; };
const { watch, getValues, setValue } = form;
useEffect(() => { useEffect(() => {
const { unsubscribe } = watch((_, { name, type }) => { const { unsubscribe } = watch((_, { name, type }) => {
const value = getValues(); const value = getValues();
@ -138,6 +138,14 @@ export const QuoteEdit = () => {
return () => unsubscribe(); return () => unsubscribe();
}, [watch, getValues, setValue]); }, [watch, getValues, setValue]);
if (isSubmitting) {
return <LoadingOverlay />;
}
if (status === "error") {
return <ErrorOverlay errorMessage={queryError.message} />;
}
if (status !== "success") { if (status !== "success") {
return <LoadingOverlay />; return <LoadingOverlay />;
} }

View File

@ -62,7 +62,10 @@ export abstract class SequelizeRepository<T> implements IRepository<T> {
protected async _getById(modelName: string, id: UniqueID | string, params: any = {}): Promise<T> { protected async _getById(modelName: string, id: UniqueID | string, params: any = {}): Promise<T> {
const _model = this._adapter.getModel(modelName); const _model = this._adapter.getModel(modelName);
return _model.findByPk(id.toString(), params); return _model.findByPk(id.toString(), {
transaction: this._transaction,
...params,
});
} }
protected async _findAll( protected async _findAll(

View File

@ -47,19 +47,19 @@ export class GetQuoteUseCase
const transaction = this._adapter.startTransaction(); const transaction = this._adapter.startTransaction();
const QuoteRepoBuilder = this._getQuoteRepository(); const QuoteRepoBuilder = this._getQuoteRepository();
let Quote: Quote | null = null; let quote: Quote | null = null;
try { try {
await transaction.complete(async (t) => { await transaction.complete(async (t) => {
const QuoteRepo = QuoteRepoBuilder({ transaction: t }); const quoteRepo = QuoteRepoBuilder({ transaction: t });
Quote = await QuoteRepo.getById(id); quote = await quoteRepo.getById(id);
}); });
if (!Quote) { if (!quote) {
return Result.fail(UseCaseError.create(UseCaseError.NOT_FOUND_ERROR, "Quote not found")); return Result.fail(UseCaseError.create(UseCaseError.NOT_FOUND_ERROR, "Quote not found"));
} }
return Result.ok<Quote>(Quote!); return Result.ok<Quote>(quote!);
} catch (error: unknown) { } catch (error: unknown) {
const _error = error as IInfrastructureError; const _error = error as IInfrastructureError;
return Result.fail(UseCaseError.create(UseCaseError.REPOSITORY_ERROR, "Query error", _error)); return Result.fail(UseCaseError.create(UseCaseError.REPOSITORY_ERROR, "Query error", _error));

View File

@ -80,7 +80,7 @@ export class UpdateQuoteUseCase
); );
} }
// Crear usuario // Crear quote
const quoteOrError = this._tryCreateQuoteInstance(quoteDTO, id, dealerId); const quoteOrError = this._tryCreateQuoteInstance(quoteDTO, id, dealerId);
if (quoteOrError.isFailure) { if (quoteOrError.isFailure) {

View File

@ -59,7 +59,11 @@ export class QuoteRepository extends SequelizeRepository<Quote> implements IQuot
} }
public async getById(id: UniqueID): Promise<Quote | null> { public async getById(id: UniqueID): Promise<Quote | null> {
const rawQuote: any = await this._getById("Quote_Model", id); const QuoteItem_Model: ModelDefined<any, any> = this._adapter.getModel("QuoteItem_Model");
const rawQuote: any = await this._getById("Quote_Model", id, {
include: "items",
});
if (!rawQuote === true) { if (!rawQuote === true) {
return null; return null;

View File

@ -25,7 +25,12 @@ class QuoteItemMapper
const props: IQuoteItemProps = { const props: IQuoteItemProps = {
articleId: source.id_article, articleId: source.id_article,
description: this.mapsValue(source, "description", Description.create), 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) => unitPrice: this.mapsValue(source, "unit_price", (unit_price) =>
MoneyValue.create({ MoneyValue.create({
amount: unit_price, amount: unit_price,

View File

@ -6,7 +6,6 @@ import {
Measure, Measure,
Name, Name,
Phone, Phone,
Quantity,
Result, Result,
UTCDateValue, UTCDateValue,
UniqueID, UniqueID,
@ -63,11 +62,11 @@ export const ensureDescriptionIsValid = (value: string): Result<boolean, Error>
return descriptionOrError.isSuccess ? Result.ok(true) : Result.fail(descriptionOrError.error); return descriptionOrError.isSuccess ? Result.ok(true) : Result.fail(descriptionOrError.error);
}; };
export const ensureQuantityIsValid = (value: string): Result<boolean, Error> => { /*export const ensureQuantityIsValid = (value: string): Result<boolean, Error> => {
const descriptionOrError = Quantity.create(value); const descriptionOrError = Quantity.create(value);
return descriptionOrError.isSuccess ? Result.ok(true) : Result.fail(descriptionOrError.error); return descriptionOrError.isSuccess ? Result.ok(true) : Result.fail(descriptionOrError.error);
}; };*/
export const ensureUnitPriceIsValid = (value: any): Result<boolean, Error> => { export const ensureUnitPriceIsValid = (value: any): Result<boolean, Error> => {
const { amount, currency, precision } = value; const { amount, currency, precision } = value;