Facturas de cliente
This commit is contained in:
parent
ecdc0379bd
commit
ec80d62d8c
@ -2,46 +2,51 @@ import type { ModuleClientParams } from "@erp/core/client";
|
|||||||
import { lazy } from "react";
|
import { lazy } from "react";
|
||||||
import { Outlet, type RouteObject } from "react-router-dom";
|
import { Outlet, type RouteObject } from "react-router-dom";
|
||||||
|
|
||||||
import { IssuedInvoiceListPage } from "./issued-invoices/pages/list/issued-invoice-list-page";
|
const ProformaLayout = lazy(() =>
|
||||||
|
import("./proformas/ui").then((m) => ({ default: m.ProformaLayout }))
|
||||||
// Lazy load components
|
|
||||||
const InvoicesLayout = lazy(() =>
|
|
||||||
import("./shared/ui").then((m) => ({ default: m.CustomerInvoicesLayout }))
|
|
||||||
);
|
);
|
||||||
|
|
||||||
const ProformaListPage = lazy(() =>
|
const IssuedInvoicesLayout = lazy(() =>
|
||||||
import("./pages").then((m) => ({ default: m.ProformaListPage }))
|
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 }))
|
import("./pages").then((m) => ({ default: m.CustomerInvoiceCreate }))
|
||||||
);
|
);
|
||||||
const InvoiceUpdatePage = lazy(() =>
|
const InvoiceUpdatePage = lazy(() =>
|
||||||
import("./pages").then((m) => ({ default: m.InvoiceUpdatePage }))
|
import("./pages").then((m) => ({ default: m.InvoiceUpdatePage }))
|
||||||
);
|
);*/
|
||||||
|
|
||||||
export const CustomerInvoiceRoutes = (params: ModuleClientParams): RouteObject[] => {
|
export const CustomerInvoiceRoutes = (params: ModuleClientParams): RouteObject[] => {
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
path: "proformas",
|
path: "proformas",
|
||||||
element: (
|
element: (
|
||||||
<InvoicesLayout>
|
<ProformaLayout>
|
||||||
<Outlet context={params} />
|
<Outlet context={params} />
|
||||||
</InvoicesLayout>
|
</ProformaLayout>
|
||||||
),
|
),
|
||||||
children: [
|
children: [
|
||||||
{ path: "", index: true, element: <ProformaListPage /> }, // index
|
{ path: "", index: true, element: <ProformasListPage /> }, // index
|
||||||
{ path: "list", element: <ProformaListPage /> },
|
{ path: "list", element: <ProformasListPage /> },
|
||||||
{ path: "create", element: <CustomerInvoiceAdd /> },
|
//{ path: "create", element: <CustomerInvoiceAdd /> },
|
||||||
{ path: ":id/edit", element: <InvoiceUpdatePage /> },
|
//{ path: ":id/edit", element: <InvoiceUpdatePage /> },
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "customer-invoices",
|
path: "customer-invoices",
|
||||||
element: (
|
element: (
|
||||||
<InvoicesLayout>
|
<IssuedInvoicesLayout>
|
||||||
<Outlet context={params} />
|
<Outlet context={params} />
|
||||||
</InvoicesLayout>
|
</IssuedInvoicesLayout>
|
||||||
),
|
),
|
||||||
children: [
|
children: [
|
||||||
{ path: "", index: true, element: <IssuedInvoiceListPage /> }, // index
|
{ path: "", index: true, element: <IssuedInvoiceListPage /> }, // index
|
||||||
|
|||||||
@ -33,16 +33,19 @@ export function useIssuedInvoicesGridColumns(
|
|||||||
() => [
|
() => [
|
||||||
// Nº
|
// Nº
|
||||||
{
|
{
|
||||||
accessorKey: "invoice_number",
|
id: "series_invoice_number",
|
||||||
header: ({ column }) => (
|
header: ({ column }) => (
|
||||||
<DataTableColumnHeader
|
<DataTableColumnHeader
|
||||||
className="text-right tabular-nums justify-end"
|
className="text-right tabular-nums justify-end"
|
||||||
column={column}
|
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 }) => (
|
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,
|
enableHiding: false,
|
||||||
enableSorting: false,
|
enableSorting: false,
|
||||||
@ -50,7 +53,7 @@ export function useIssuedInvoicesGridColumns(
|
|||||||
size: 48,
|
size: 48,
|
||||||
minSize: 48,
|
minSize: 48,
|
||||||
meta: {
|
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"),
|
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
|
// Referencia
|
||||||
{
|
{
|
||||||
accessorKey: "reference",
|
accessorKey: "reference",
|
||||||
|
|||||||
@ -56,11 +56,6 @@ export const IssuedInvoicesGrid = ({
|
|||||||
|
|
||||||
<DataTable
|
<DataTable
|
||||||
columns={columns}
|
columns={columns}
|
||||||
columnVisibility={{
|
|
||||||
subtotal_amount_fmt: false,
|
|
||||||
discount_amount_fmt: false,
|
|
||||||
taxes_amount_fmt: false,
|
|
||||||
}}
|
|
||||||
data={items}
|
data={items}
|
||||||
enablePagination
|
enablePagination
|
||||||
manualPagination
|
manualPagination
|
||||||
|
|||||||
@ -0,0 +1 @@
|
|||||||
|
export * from "./issued-invoices-layout";
|
||||||
@ -0,0 +1,5 @@
|
|||||||
|
import type { PropsWithChildren } from "react";
|
||||||
|
|
||||||
|
export const IssuedInvoicesLayout = ({ children }: PropsWithChildren) => {
|
||||||
|
return <div>{children}</div>;
|
||||||
|
};
|
||||||
@ -0,0 +1 @@
|
|||||||
|
export * from "./blocks";
|
||||||
@ -5,13 +5,10 @@ import type { ColumnDef } from "@tanstack/react-table";
|
|||||||
import * as React from "react";
|
import * as React from "react";
|
||||||
import { Controller, useFormContext } from "react-hook-form";
|
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 { 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 {
|
export interface ProformaItemFormData {
|
||||||
id: string; // ← mapea RHF field.id aquí
|
id: string; // ← mapea RHF field.id aquí
|
||||||
|
|||||||
@ -14,6 +14,7 @@ import {
|
|||||||
} from "@repo/shadcn-ui/components";
|
} from "@repo/shadcn-ui/components";
|
||||||
import type { ColumnDef } from "@tanstack/react-table";
|
import type { ColumnDef } from "@tanstack/react-table";
|
||||||
import {
|
import {
|
||||||
|
ArrowBigRightDashIcon,
|
||||||
CopyIcon,
|
CopyIcon,
|
||||||
DownloadIcon,
|
DownloadIcon,
|
||||||
EditIcon,
|
EditIcon,
|
||||||
@ -305,7 +306,7 @@ export function useProformasGridColumns(
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<ButtonGroup>
|
<ButtonGroup>
|
||||||
{/* Editar (acción primaria) */}
|
{/* Emitir factura: approved -> issued */}
|
||||||
<Tooltip>
|
<Tooltip>
|
||||||
<TooltipTrigger asChild>
|
<TooltipTrigger asChild>
|
||||||
<Button
|
<Button
|
||||||
@ -318,6 +319,27 @@ export function useProformasGridColumns(
|
|||||||
size="sm"
|
size="sm"
|
||||||
type="button"
|
type="button"
|
||||||
variant="ghost"
|
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 " />
|
<EditIcon aria-hidden="true" className="size-4 " />
|
||||||
</Button>
|
</Button>
|
||||||
@ -330,7 +352,7 @@ export function useProformasGridColumns(
|
|||||||
<TooltipTrigger asChild>
|
<TooltipTrigger asChild>
|
||||||
<Button
|
<Button
|
||||||
aria-label={t("common.duplicate_row")}
|
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) => {
|
onClick={(e) => {
|
||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
onDuplicate?.(proforma);
|
onDuplicate?.(proforma);
|
||||||
@ -350,7 +372,7 @@ export function useProformasGridColumns(
|
|||||||
<TooltipTrigger asChild>
|
<TooltipTrigger asChild>
|
||||||
<Button
|
<Button
|
||||||
aria-label={t("common.download_pdf")}
|
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) => {
|
onClick={(e) => {
|
||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
onDownloadPdf?.(proforma);
|
onDownloadPdf?.(proforma);
|
||||||
|
|||||||
@ -85,11 +85,6 @@ export const ProformasGrid = ({
|
|||||||
|
|
||||||
<DataTable
|
<DataTable
|
||||||
columns={columns}
|
columns={columns}
|
||||||
columnVisibility={{
|
|
||||||
subtotal_amount_fmt: false,
|
|
||||||
discount_amount_fmt: false,
|
|
||||||
taxes_amount_fmt: false,
|
|
||||||
}}
|
|
||||||
data={items}
|
data={items}
|
||||||
enablePagination
|
enablePagination
|
||||||
manualPagination
|
manualPagination
|
||||||
|
|||||||
@ -1 +1,2 @@
|
|||||||
|
export * from "./proforma-layout";
|
||||||
export * from "./proforma-tax-summary";
|
export * from "./proforma-tax-summary";
|
||||||
|
|||||||
@ -0,0 +1,5 @@
|
|||||||
|
import type { PropsWithChildren } from "react";
|
||||||
|
|
||||||
|
export const ProformaLayout = ({ children }: PropsWithChildren) => {
|
||||||
|
return <div>{children}</div>;
|
||||||
|
};
|
||||||
Loading…
Reference in New Issue
Block a user