Facturas de cliente

This commit is contained in:
David Arranz 2025-10-20 09:44:56 +02:00
parent fdbdb0ee26
commit 29bbd51b0d
10 changed files with 44 additions and 43 deletions

View File

@ -94,7 +94,7 @@ export const UpdateCommitButtonGroup = ({
className className
)} )}
> >
{preview && <SubmitFormButton {...submit} />}
{submit && <SubmitFormButton {...submit} />} {submit && <SubmitFormButton {...submit} />}
{showCancel && <CancelFormButton {...cancel} />} {showCancel && <CancelFormButton {...cancel} />}

View File

@ -1 +1,4 @@
export * from "./invoice-edit-form"; export * from "./invoice-basic-info-fields";
export * from "./invoice-items-editor";
export * from "./invoice-totals";
export * from "./recipient";

View File

@ -9,8 +9,7 @@ export const InvoiceRecipient = (props: ComponentProps<"fieldset">) => {
const { t } = useTranslation(); const { t } = useTranslation();
const { control, getValues } = useFormContext(); const { control, getValues } = useFormContext();
const recipient = getValues("recipient");
const recipient = getValues('recipient');
return ( return (
<FieldSet {...props}> <FieldSet {...props}>

View File

@ -1,4 +1,3 @@
export * from "../pages/list/invoices-list-grid";
export * from "./customer-invoice-editor-skeleton"; export * from "./customer-invoice-editor-skeleton";
export * from "./customer-invoice-prices-card"; export * from "./customer-invoice-prices-card";
export * from "./customer-invoice-status-badge"; export * from "./customer-invoice-status-badge";

View File

@ -4,10 +4,10 @@ import { Button } from "@repo/shadcn-ui/components";
import { PlusIcon } from "lucide-react"; import { PlusIcon } from "lucide-react";
import { useMemo, useState } from 'react'; import { useMemo, useState } from 'react';
import { useNavigate } from "react-router-dom"; import { useNavigate } from "react-router-dom";
import { InvoicesListGrid, PageHeader } from '../../components';
import { useInvoicesQuery } from '../../hooks'; import { useInvoicesQuery } from '../../hooks';
import { useTranslation } from "../../i18n"; import { useTranslation } from "../../i18n";
import { invoiceResumeDtoToFormAdapter } from '../../schemas/invoice-resume-dto.adapter'; import { invoiceResumeDtoToFormAdapter } from '../../schemas/invoice-resume-dto.adapter';
import { InvoicesListGrid } from './invoices-list-grid';
export const InvoiceListPage = () => { export const InvoiceListPage = () => {
const { t } = useTranslation(); const { t } = useTranslation();

View File

@ -9,7 +9,6 @@ import { useMemo } from 'react';
import { FieldErrors, FormProvider } from "react-hook-form"; import { FieldErrors, FormProvider } from "react-hook-form";
import { useNavigate } from "react-router-dom"; import { useNavigate } from "react-router-dom";
import { import {
InvoiceEditForm,
PageHeader PageHeader
} from "../../components"; } from "../../components";
import { useInvoiceContext } from '../../context'; import { useInvoiceContext } from '../../context';
@ -22,6 +21,7 @@ import {
defaultCustomerInvoiceFormData, defaultCustomerInvoiceFormData,
invoiceDtoToFormAdapter invoiceDtoToFormAdapter
} from "../../schemas"; } from "../../schemas";
import { InvoiceUpdateForm } from './invoice-update-form';
export type InvoiceUpdateCompProps = { export type InvoiceUpdateCompProps = {
@ -104,7 +104,7 @@ export const InvoiceUpdateComp = ({
<AppContent> <AppContent>
<FormProvider {...form}> <FormProvider {...form}>
<InvoiceEditForm <InvoiceUpdateForm
formId="invoice-update-form" formId="invoice-update-form"
onSubmit={handleSubmit} onSubmit={handleSubmit}
onError={handleError} onError={handleError}

View File

@ -2,25 +2,22 @@ import { FieldErrors, useFormContext } from "react-hook-form";
import { FormDebug } from '@erp/core/components'; import { FormDebug } from '@erp/core/components';
import { cn } from '@repo/shadcn-ui/lib/utils'; import { cn } from '@repo/shadcn-ui/lib/utils';
import { InvoiceBasicInfoFields, InvoiceItems, InvoiceRecipient, InvoiceTotals } from '../../components';
import { InvoiceFormData } from "../../schemas"; import { InvoiceFormData } from "../../schemas";
import { InvoiceBasicInfoFields } from "./invoice-basic-info-fields";
import { InvoiceItems } from './invoice-items-editor';
import { InvoiceTotals } from './invoice-totals';
import { InvoiceRecipient } from "./recipient";
interface CustomerInvoiceFormProps { interface InvoiceUpdateFormProps {
formId: string; formId: string;
onSubmit: (data: InvoiceFormData) => void; onSubmit: (data: InvoiceFormData) => void;
onError: (errors: FieldErrors<InvoiceFormData>) => void; onError: (errors: FieldErrors<InvoiceFormData>) => void;
className: string; className: string;
} }
export const InvoiceEditForm = ({ export const InvoiceUpdateForm = ({
formId, formId,
onSubmit, onSubmit,
onError, onError,
className, className,
}: CustomerInvoiceFormProps) => { }: InvoiceUpdateFormProps) => {
const form = useFormContext<InvoiceFormData>(); const form = useFormContext<InvoiceFormData>();
return ( return (

View File

@ -20,6 +20,7 @@ export const invoiceDtoToFormAdapter = {
operation_date: dto.operation_date, operation_date: dto.operation_date,
customer_id: dto.customer_id, customer_id: dto.customer_id,
recipient: dto.recipient,
reference: dto.reference ?? "", reference: dto.reference ?? "",
description: dto.description ?? "", description: dto.description ?? "",

View File

@ -74,33 +74,33 @@ export const CustomerCard = ({
)} )}
</ItemDescription> </ItemDescription>
</ItemContent> </ItemContent>
<ItemFooter> <ItemFooter className='flex-wrap'>
<div className='flex flex-wrap gap-2'>
<Button <Button
type="button" type="button"
variant='outline' variant='outline'
size='sm' size='sm'
onClick={onChangeCustomer} onClick={onChangeCustomer}
className='flex-1 min-w-36 gap-2 cursor-pointer' className='flex-1 min-w-36 gap-2 cursor-pointer'
> >
<RefreshCwIcon className='size-4' /> <RefreshCwIcon className='size-4' />
<span className='text-sm text-muted-foreground'> <span className='text-sm text-muted-foreground'>
Cambiar de cliente Cambiar de cliente
</span> </span>
</Button> </Button>
<Button <Button
type="button" type="button"
variant='outline' variant='outline'
size='sm' size='sm'
onClick={onAddNewCustomer} onClick={onAddNewCustomer}
className='flex-1 min-w-36 gap-2 cursor-pointer' className='flex-1 min-w-36 gap-2 cursor-pointer'
> >
<UserPlusIcon className='size-4' /> <UserPlusIcon className='size-4' />
<span className='text-sm text-muted-foreground'> <span className='text-sm text-muted-foreground'>
Nuevo cliente Nuevo cliente
</span> </span>
</Button> </Button>
</div>
</ItemFooter> </ItemFooter>
</Item> </Item>
); );

View File

@ -33,7 +33,7 @@ export const CustomerModalSelector = ({
readOnly = false, readOnly = false,
className, className,
}: CustomerModalSelectorProps) => { }: CustomerModalSelectorProps) => {
// UI state
const [showSearch, setShowSearch] = useState(false); const [showSearch, setShowSearch] = useState(false);
const [showForm, setShowForm] = useState(false); const [showForm, setShowForm] = useState(false);
const [searchQuery, setSearchQuery] = useState(""); const [searchQuery, setSearchQuery] = useState("");
@ -82,6 +82,8 @@ export const CustomerModalSelector = ({
setShowSearch(false); setShowSearch(false);
}; };
console.log(selected);
return ( return (
<> <>
<div> <div>