Facturas de cliente

This commit is contained in:
David Arranz 2025-11-17 11:26:54 +01:00
parent ecdc0379bd
commit ec80d62d8c
11 changed files with 70 additions and 58 deletions

View File

@ -2,46 +2,51 @@ import type { ModuleClientParams } from "@erp/core/client";
import { lazy } from "react";
import { Outlet, type RouteObject } from "react-router-dom";
import { IssuedInvoiceListPage } from "./issued-invoices/pages/list/issued-invoice-list-page";
// Lazy load components
const InvoicesLayout = lazy(() =>
import("./shared/ui").then((m) => ({ default: m.CustomerInvoicesLayout }))
const ProformaLayout = lazy(() =>
import("./proformas/ui").then((m) => ({ default: m.ProformaLayout }))
);
const ProformaListPage = lazy(() =>
import("./pages").then((m) => ({ default: m.ProformaListPage }))
const IssuedInvoicesLayout = lazy(() =>
import("./issued-invoices/ui").then((m) => ({ default: m.IssuedInvoicesLayout }))
);
const CustomerInvoiceAdd = lazy(() =>
const ProformasListPage = lazy(() =>
import("./proformas/pages").then((m) => ({ default: m.ProformaListPage }))
);
const IssuedInvoiceListPage = lazy(() =>
import("./issued-invoices/pages").then((m) => ({ default: m.IssuedInvoiceListPage }))
);
/*const CustomerInvoiceAdd = lazy(() =>
import("./pages").then((m) => ({ default: m.CustomerInvoiceCreate }))
);
const InvoiceUpdatePage = lazy(() =>
import("./pages").then((m) => ({ default: m.InvoiceUpdatePage }))
);
);*/
export const CustomerInvoiceRoutes = (params: ModuleClientParams): RouteObject[] => {
return [
{
path: "proformas",
element: (
<InvoicesLayout>
<ProformaLayout>
<Outlet context={params} />
</InvoicesLayout>
</ProformaLayout>
),
children: [
{ path: "", index: true, element: <ProformaListPage /> }, // index
{ path: "list", element: <ProformaListPage /> },
{ path: "create", element: <CustomerInvoiceAdd /> },
{ path: ":id/edit", element: <InvoiceUpdatePage /> },
{ path: "", index: true, element: <ProformasListPage /> }, // index
{ path: "list", element: <ProformasListPage /> },
//{ path: "create", element: <CustomerInvoiceAdd /> },
//{ path: ":id/edit", element: <InvoiceUpdatePage /> },
],
},
{
path: "customer-invoices",
element: (
<InvoicesLayout>
<IssuedInvoicesLayout>
<Outlet context={params} />
</InvoicesLayout>
</IssuedInvoicesLayout>
),
children: [
{ path: "", index: true, element: <IssuedInvoiceListPage /> }, // index

View File

@ -33,16 +33,19 @@ export function useIssuedInvoicesGridColumns(
() => [
// Nº
{
accessorKey: "invoice_number",
id: "series_invoice_number",
header: ({ column }) => (
<DataTableColumnHeader
className="text-right tabular-nums justify-end"
column={column}
title={t("pages.issued_invoices.list.grid_columns.invoice_number")}
title={t("pages.issued_invoices.list.grid_columns.series_invoice_number")}
/>
),
cell: ({ row }) => (
<div className="text-right tabular-nums">{row.original.invoice_number}</div>
<div className="text-right tabular-nums">
{row.original.series}
{row.original.invoice_number}
</div>
),
enableHiding: false,
enableSorting: false,
@ -50,7 +53,7 @@ export function useIssuedInvoicesGridColumns(
size: 48,
minSize: 48,
meta: {
title: t("pages.issued_invoices.list.grid_columns.invoice_number"),
title: t("pages.issued_invoices.list.grid_columns.series_invoice_number"),
},
},
@ -86,24 +89,6 @@ export function useIssuedInvoicesGridColumns(
title: t("pages.issued_invoices.list.grid_columns.recipient"),
},
},
// Serie
{
accessorKey: "series",
header: ({ column }) => (
<DataTableColumnHeader
className="text-left"
column={column}
title={t("pages.issued_invoices.list.grid_columns.series")}
/>
),
cell: ({ row }) => <div className="font-normal text-left">{row.original.series}</div>,
enableSorting: false,
size: 120,
minSize: 100,
meta: {
title: t("pages.issued_invoices.list.grid_columns.series"),
},
},
// Referencia
{
accessorKey: "reference",

View File

@ -56,11 +56,6 @@ export const IssuedInvoicesGrid = ({
<DataTable
columns={columns}
columnVisibility={{
subtotal_amount_fmt: false,
discount_amount_fmt: false,
taxes_amount_fmt: false,
}}
data={items}
enablePagination
manualPagination

View File

@ -0,0 +1 @@
export * from "./issued-invoices-layout";

View File

@ -0,0 +1,5 @@
import type { PropsWithChildren } from "react";
export const IssuedInvoicesLayout = ({ children }: PropsWithChildren) => {
return <div>{children}</div>;
};

View File

@ -0,0 +1 @@
export * from "./blocks";

View File

@ -5,13 +5,10 @@ import type { ColumnDef } from "@tanstack/react-table";
import * as React from "react";
import { Controller, useFormContext } from "react-hook-form";
import { ProformaTaxesMultiSelect } from "../../shared";
import { AmountInputField } from "../../shared/ui/components/editor/items/amount-input-field";
import { HoverCardTotalsSummary } from "../../shared/ui/components/editor/items/hover-card-total-summary";
import { ItemDataTableRowActions } from "../../shared/ui/components/editor/items/items-data-table-row-actions";
import { PercentageInputField } from "../../shared/ui/components/editor/items/percentage-input-field";
import { QuantityInputField } from "../../shared/ui/components/editor/items/quantity-input-field";
import { useProformaContext } from "../pages/update/context";
import { AmountInputField } from "../ui/components/amount-input-field";
import { PercentageInputField } from "../ui/components/percentage-input-field";
import { QuantityInputField } from "../ui/components/quantity-input-field";
export interface ProformaItemFormData {
id: string; // ← mapea RHF field.id aquí

View File

@ -14,6 +14,7 @@ import {
} from "@repo/shadcn-ui/components";
import type { ColumnDef } from "@tanstack/react-table";
import {
ArrowBigRightDashIcon,
CopyIcon,
DownloadIcon,
EditIcon,
@ -305,7 +306,7 @@ export function useProformasGridColumns(
return (
<ButtonGroup>
{/* Editar (acción primaria) */}
{/* Emitir factura: approved -> issued */}
<Tooltip>
<TooltipTrigger asChild>
<Button
@ -318,6 +319,27 @@ export function useProformasGridColumns(
size="sm"
type="button"
variant="ghost"
>
<ArrowBigRightDashIcon aria-hidden="true" className="size-4 " />
<span className="sr-only">Emitir</span>
</Button>
</TooltipTrigger>
<TooltipContent>{t("common.edit_row")}</TooltipContent>
</Tooltip>
{/* Editar (acción primaria) */}
<Tooltip>
<TooltipTrigger asChild>
<Button
aria-label={t("common.edit_row")}
className="cursor-pointer text-muted-foreground hover:text-primary hidden"
onClick={(e) => {
e.stopPropagation();
onEdit?.(proforma);
}}
size="sm"
type="button"
variant="ghost"
>
<EditIcon aria-hidden="true" className="size-4 " />
</Button>
@ -330,7 +352,7 @@ export function useProformasGridColumns(
<TooltipTrigger asChild>
<Button
aria-label={t("common.duplicate_row")}
className="cursor-pointer text-muted-foreground hover:text-primary"
className="cursor-pointer text-muted-foreground hover:text-primary hidden"
onClick={(e) => {
e.stopPropagation();
onDuplicate?.(proforma);
@ -350,7 +372,7 @@ export function useProformasGridColumns(
<TooltipTrigger asChild>
<Button
aria-label={t("common.download_pdf")}
className="cursor-pointer text-muted-foreground hover:text-primary"
className="cursor-pointer text-muted-foreground hover:text-primary hidden"
onClick={(e) => {
e.stopPropagation();
onDownloadPdf?.(proforma);

View File

@ -85,11 +85,6 @@ export const ProformasGrid = ({
<DataTable
columns={columns}
columnVisibility={{
subtotal_amount_fmt: false,
discount_amount_fmt: false,
taxes_amount_fmt: false,
}}
data={items}
enablePagination
manualPagination

View File

@ -1 +1,2 @@
export * from "./proforma-layout";
export * from "./proforma-tax-summary";

View File

@ -0,0 +1,5 @@
import type { PropsWithChildren } from "react";
export const ProformaLayout = ({ children }: PropsWithChildren) => {
return <div>{children}</div>;
};