.
This commit is contained in:
parent
86d00b55e3
commit
7ba2ad5784
@ -3,7 +3,7 @@
|
|||||||
import { ErrorMessage } from "@/lib/hooks/useDownloader/types";
|
import { ErrorMessage } from "@/lib/hooks/useDownloader/types";
|
||||||
import { cn } from "@/lib/utils";
|
import { cn } from "@/lib/utils";
|
||||||
import { Button, Card, CardContent, CardHeader, CardTitle, Progress } from "@/ui";
|
import { Button, Card, CardContent, CardHeader, CardTitle, Progress } from "@/ui";
|
||||||
import { FileText, Loader2, XCircleIcon } from "lucide-react";
|
import { FileTextIcon, Loader2Icon, XCircleIcon } from "lucide-react";
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
|
|
||||||
interface PDFGenerationLoadingProps {
|
interface PDFGenerationLoadingProps {
|
||||||
@ -39,7 +39,7 @@ export const PDFGenerationLoading = ({
|
|||||||
<CardHeader>
|
<CardHeader>
|
||||||
<CardTitle className='flex items-center justify-between'>
|
<CardTitle className='flex items-center justify-between'>
|
||||||
{error?.errorMessage ? "Error en la generación del PDF" : "Generando PDF"}
|
{error?.errorMessage ? "Error en la generación del PDF" : "Generando PDF"}
|
||||||
{isInProgress && <Loader2 className='w-4 h-4 animate-spin' />}
|
{isInProgress && <Loader2Icon className='w-4 h-4 animate-spin' />}
|
||||||
{error?.errorMessage && <XCircleIcon className='w-4 h-4 text-destructive' />}
|
{error?.errorMessage && <XCircleIcon className='w-4 h-4 text-destructive' />}
|
||||||
</CardTitle>
|
</CardTitle>
|
||||||
</CardHeader>
|
</CardHeader>
|
||||||
@ -53,8 +53,8 @@ export const PDFGenerationLoading = ({
|
|||||||
className='absolute bottom-0 left-0 right-0 transition-all duration-1000 ease-out bg-primary'
|
className='absolute bottom-0 left-0 right-0 transition-all duration-1000 ease-out bg-primary'
|
||||||
style={{ height: `${percentage}%` }}
|
style={{ height: `${percentage}%` }}
|
||||||
/>
|
/>
|
||||||
<FileText
|
<FileTextIcon
|
||||||
className='absolute transform -translate-x-1/2 -translate-y-1/2 top-1/2 left-1/2 text-primary-foreground'
|
className='absolute transform -translate-x-1/2 -translate-y-1/2 animate-pulse top-1/2 left-1/2 text-muted-foreground'
|
||||||
size={48}
|
size={48}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -6,7 +6,6 @@ import {
|
|||||||
Button,
|
Button,
|
||||||
Dialog,
|
Dialog,
|
||||||
DialogContent,
|
DialogContent,
|
||||||
DialogDescription,
|
|
||||||
DialogHeader,
|
DialogHeader,
|
||||||
DialogTitle,
|
DialogTitle,
|
||||||
DialogTrigger,
|
DialogTrigger,
|
||||||
@ -45,23 +44,49 @@ export const QuotesList = () => {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<Tabs defaultValue='all'>
|
<Tabs defaultValue='all'>
|
||||||
<div className='flex items-center'>
|
<div className='flex items-baseline'>
|
||||||
<div className='flex items-center justify-center mr-4 font-medium'>
|
<TabsList>
|
||||||
<Trans i18nKey='quotes.list.columns.status' />
|
<TabsTrigger value='all'>
|
||||||
|
<Trans i18nKey='quotes.list.tabs.all' />
|
||||||
|
</TabsTrigger>
|
||||||
|
<TabsTrigger value='draft'>
|
||||||
|
<Trans i18nKey='quotes.list.tabs.draft' />
|
||||||
|
</TabsTrigger>
|
||||||
|
<TabsTrigger value='ready'>
|
||||||
|
<Trans i18nKey='quotes.list.tabs.ready' />
|
||||||
|
</TabsTrigger>
|
||||||
|
<TabsTrigger value='delivered'>
|
||||||
|
<Trans i18nKey='quotes.list.tabs.delivered' />
|
||||||
|
</TabsTrigger>
|
||||||
|
<TabsTrigger value='accepted'>
|
||||||
|
<Trans i18nKey='quotes.list.tabs.accepted' />
|
||||||
|
</TabsTrigger>
|
||||||
|
<TabsTrigger value='rejected'>
|
||||||
|
<Trans i18nKey='quotes.list.tabs.rejected' />
|
||||||
|
</TabsTrigger>
|
||||||
|
<TabsTrigger value='archived' className='hidden sm:flex'>
|
||||||
|
<Trans i18nKey='quotes.list.tabs.archived' />
|
||||||
|
</TabsTrigger>
|
||||||
|
</TabsList>
|
||||||
|
<div className='flex items-baseline justify-center mr-4 font-medium'>
|
||||||
<Dialog>
|
<Dialog>
|
||||||
<DialogTrigger asChild>
|
<DialogTrigger asChild>
|
||||||
<Button variant='ghost' size='icon' className='w-4 h-4 p-0 ml-1'>
|
<Button variant='link' className='inline-flex items-center font-medium group'>
|
||||||
|
<Trans
|
||||||
|
i18nKey='quotes.list.tabs_title'
|
||||||
|
className='underline-offset-4 group-hover:underline'
|
||||||
|
/>
|
||||||
<HelpCircleIcon className='w-4 h-4 ml-1 text-muted-foreground' />
|
<HelpCircleIcon className='w-4 h-4 ml-1 text-muted-foreground' />
|
||||||
</Button>
|
</Button>
|
||||||
</DialogTrigger>
|
</DialogTrigger>
|
||||||
<DialogContent className='sm:max-w-[425px]'>
|
<DialogContent className='sm:max-w-[425px]'>
|
||||||
<DialogHeader>
|
<DialogHeader>
|
||||||
<DialogTitle>Ayuda sobre el Estado de Cotizaciones</DialogTitle>
|
<DialogTitle>Ayuda sobre el Estado de Cotizaciones</DialogTitle>
|
||||||
<DialogDescription>
|
|
||||||
El estado de una cotización indica su posición actual en el proceso de negocio.
|
|
||||||
</DialogDescription>
|
|
||||||
</DialogHeader>
|
</DialogHeader>
|
||||||
<div className='grid gap-4 py-4'>
|
<div className='grid gap-4 py-4'>
|
||||||
|
<p>
|
||||||
|
El estado de una cotización indica su posición actual en el proceso de negocio.
|
||||||
|
</p>
|
||||||
<p>Los estados posibles son:</p>
|
<p>Los estados posibles son:</p>
|
||||||
<ul className='pl-6 space-y-2 list-disc'>
|
<ul className='pl-6 space-y-2 list-disc'>
|
||||||
<li>
|
<li>
|
||||||
@ -96,29 +121,6 @@ export const QuotesList = () => {
|
|||||||
</DialogContent>
|
</DialogContent>
|
||||||
</Dialog>
|
</Dialog>
|
||||||
</div>
|
</div>
|
||||||
<TabsList>
|
|
||||||
<TabsTrigger value='all'>
|
|
||||||
<Trans i18nKey='quotes.list.tabs.all' />
|
|
||||||
</TabsTrigger>
|
|
||||||
<TabsTrigger value='draft'>
|
|
||||||
<Trans i18nKey='quotes.list.tabs.draft' />
|
|
||||||
</TabsTrigger>
|
|
||||||
<TabsTrigger value='ready'>
|
|
||||||
<Trans i18nKey='quotes.list.tabs.ready' />
|
|
||||||
</TabsTrigger>
|
|
||||||
<TabsTrigger value='delivered'>
|
|
||||||
<Trans i18nKey='quotes.list.tabs.delivered' />
|
|
||||||
</TabsTrigger>
|
|
||||||
<TabsTrigger value='accepted'>
|
|
||||||
<Trans i18nKey='quotes.list.tabs.accepted' />
|
|
||||||
</TabsTrigger>
|
|
||||||
<TabsTrigger value='rejected'>
|
|
||||||
<Trans i18nKey='quotes.list.tabs.rejected' />
|
|
||||||
</TabsTrigger>
|
|
||||||
<TabsTrigger value='archived' className='hidden sm:flex'>
|
|
||||||
<Trans i18nKey='quotes.list.tabs.archived' />
|
|
||||||
</TabsTrigger>
|
|
||||||
</TabsList>
|
|
||||||
<div className='flex items-center gap-2 ml-auto'>
|
<div className='flex items-center gap-2 ml-auto'>
|
||||||
<Toggle
|
<Toggle
|
||||||
aria-label='Show quote preview'
|
aria-label='Show quote preview'
|
||||||
|
|||||||
@ -126,6 +126,7 @@
|
|||||||
"list": {
|
"list": {
|
||||||
"title": "Quotes",
|
"title": "Quotes",
|
||||||
"subtitle": "",
|
"subtitle": "",
|
||||||
|
"tabs_title": "Status",
|
||||||
"tabs": {
|
"tabs": {
|
||||||
"all": "All",
|
"all": "All",
|
||||||
"draft": "Draft",
|
"draft": "Draft",
|
||||||
|
|||||||
@ -126,6 +126,7 @@
|
|||||||
"list": {
|
"list": {
|
||||||
"title": "Cotizaciones",
|
"title": "Cotizaciones",
|
||||||
"subtitle": "",
|
"subtitle": "",
|
||||||
|
"tabs_title": "Estados",
|
||||||
"tabs": {
|
"tabs": {
|
||||||
"all": "Todas",
|
"all": "Todas",
|
||||||
"draft": "Borradores",
|
"draft": "Borradores",
|
||||||
|
|||||||
@ -105,7 +105,7 @@ export class CreateQuoteUseCase
|
|||||||
switch (domainError.code) {
|
switch (domainError.code) {
|
||||||
case DomainError.INVALID_INPUT_DATA:
|
case DomainError.INVALID_INPUT_DATA:
|
||||||
errorCode = UseCaseError.INVALID_INPUT_DATA;
|
errorCode = UseCaseError.INVALID_INPUT_DATA;
|
||||||
message = "El presupuesto tiene algún dato erróneo.";
|
message = "La cotización tiene algún dato erróneo.";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -195,7 +195,12 @@ export class CreateQuoteUseCase
|
|||||||
return Result.fail(discountOrError.error);
|
return Result.fail(discountOrError.error);
|
||||||
}
|
}
|
||||||
|
|
||||||
const taxOrError = Percentage.create(quoteDTO.tax);
|
const taxOrError = Percentage.create(
|
||||||
|
quoteDTO.tax ?? {
|
||||||
|
amount: this._dealer?.additionalInfo.get("default_tax")?.toString(),
|
||||||
|
scale: 2,
|
||||||
|
}
|
||||||
|
);
|
||||||
if (taxOrError.isFailure) {
|
if (taxOrError.isFailure) {
|
||||||
return Result.fail(taxOrError.error);
|
return Result.fail(taxOrError.error);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user