From 3896aa7bc4bf56fa1757d5ab6a7de2f34756c720 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Tue, 14 Jul 2026 03:00:25 +0000 Subject: [PATCH] Add frontend support --- .../src/components/tables/ColumnRenderers.tsx | 16 ++++++++++++++++ src/frontend/src/forms/CommonForms.tsx | 1 + src/frontend/src/forms/PurchaseOrderForms.tsx | 1 + src/frontend/src/forms/ReturnOrderForms.tsx | 1 + src/frontend/src/forms/SalesOrderForms.tsx | 1 + .../src/tables/general/ExtraLineItemTable.tsx | 11 ++++++++--- .../purchasing/PurchaseOrderLineItemTable.tsx | 11 ++++++++--- .../tables/sales/ReturnOrderLineItemTable.tsx | 6 ++++++ .../src/tables/sales/SalesOrderLineItemTable.tsx | 8 +++++++- 9 files changed, 49 insertions(+), 7 deletions(-) diff --git a/src/frontend/src/components/tables/ColumnRenderers.tsx b/src/frontend/src/components/tables/ColumnRenderers.tsx index 59db7402e4..9748c2a7ff 100644 --- a/src/frontend/src/components/tables/ColumnRenderers.tsx +++ b/src/frontend/src/components/tables/ColumnRenderers.tsx @@ -461,6 +461,22 @@ export function DecimalColumn(props: TableColumn): TableColumn { }; } +export function PercentageColumn(props: TableColumn): TableColumn { + return { + sortable: true, + render: (record: any) => { + const value = resolveItem(record, props.accessor ?? ''); + + if (value == null || value === 0) { + return '-'; + } + + return `${formatDecimal(value)}%`; + }, + ...props + }; +} + export function DescriptionColumn(props: TableColumnProps): TableColumn { return { accessor: 'description', diff --git a/src/frontend/src/forms/CommonForms.tsx b/src/frontend/src/forms/CommonForms.tsx index 3bd64bc0d0..9a6935ebdb 100644 --- a/src/frontend/src/forms/CommonForms.tsx +++ b/src/frontend/src/forms/CommonForms.tsx @@ -91,6 +91,7 @@ export function extraLineItemFields(): ApiFormFieldSet { quantity: {}, price: {}, price_currency: {}, + discount: {}, project_code: ProjectCodeField(), notes: {}, link: {} diff --git a/src/frontend/src/forms/PurchaseOrderForms.tsx b/src/frontend/src/forms/PurchaseOrderForms.tsx index 4776e668eb..cdf37160df 100644 --- a/src/frontend/src/forms/PurchaseOrderForms.tsx +++ b/src/frontend/src/forms/PurchaseOrderForms.tsx @@ -186,6 +186,7 @@ export function usePurchaseOrderLineItemFields({ value: purchasePriceCurrency, onValueChange: setPurchasePriceCurrency }, + discount: {}, auto_pricing: { default: create !== false, value: autoPricing, diff --git a/src/frontend/src/forms/ReturnOrderForms.tsx b/src/frontend/src/forms/ReturnOrderForms.tsx index 17bbaac6fd..f268b28d7a 100644 --- a/src/frontend/src/forms/ReturnOrderForms.tsx +++ b/src/frontend/src/forms/ReturnOrderForms.tsx @@ -133,6 +133,7 @@ export function useReturnOrderLineItemFields({ }, price: {}, price_currency: {}, + discount: {}, project_code: ProjectCodeField(), target_date: {}, notes: {}, diff --git a/src/frontend/src/forms/SalesOrderForms.tsx b/src/frontend/src/forms/SalesOrderForms.tsx index 40bb783133..6e9c955c56 100644 --- a/src/frontend/src/forms/SalesOrderForms.tsx +++ b/src/frontend/src/forms/SalesOrderForms.tsx @@ -197,6 +197,7 @@ export function useSalesOrderLineItemFields({ value: partCurrency, onValueChange: setPartCurrency }, + discount: {}, project_code: ProjectCodeField(), target_date: {}, notes: {}, diff --git a/src/frontend/src/tables/general/ExtraLineItemTable.tsx b/src/frontend/src/tables/general/ExtraLineItemTable.tsx index f675b00aa2..91f821478c 100644 --- a/src/frontend/src/tables/general/ExtraLineItemTable.tsx +++ b/src/frontend/src/tables/general/ExtraLineItemTable.tsx @@ -19,6 +19,7 @@ import { LineItemColumn, LinkColumn, NoteColumn, + PercentageColumn, ProjectCodeColumn } from '../../components/tables/ColumnRenderers'; import { InvenTreeTable } from '../../components/tables/InvenTreeTable'; @@ -69,13 +70,17 @@ export default function ExtraLineItemTable({ currency: record.price_currency }) }, + PercentageColumn({ + accessor: 'discount', + title: t`Discount`, + defaultVisible: false + }), { accessor: 'total_price', title: t`Total Price`, render: (record: any) => - formatCurrency(record.price, { - currency: record.price_currency, - multiplier: record.quantity + formatCurrency(record.total_price, { + currency: record.price_currency }) }, ProjectCodeColumn({}), diff --git a/src/frontend/src/tables/purchasing/PurchaseOrderLineItemTable.tsx b/src/frontend/src/tables/purchasing/PurchaseOrderLineItemTable.tsx index 773ca49af2..d609581f57 100644 --- a/src/frontend/src/tables/purchasing/PurchaseOrderLineItemTable.tsx +++ b/src/frontend/src/tables/purchasing/PurchaseOrderLineItemTable.tsx @@ -30,6 +30,7 @@ import { LocationColumn, NoteColumn, PartColumn, + PercentageColumn, ProjectCodeColumn, ReferenceColumn, TargetDateColumn @@ -254,13 +255,17 @@ export function PurchaseOrderLineItemTable({ accessor: 'purchase_price', title: t`Unit Price` }), + PercentageColumn({ + accessor: 'discount', + title: t`Discount`, + defaultVisible: false + }), { accessor: 'total_price', title: t`Total Price`, render: (record: any) => - formatCurrency(record.purchase_price, { - currency: record.purchase_price_currency, - multiplier: record.quantity + formatCurrency(record.total_price, { + currency: record.purchase_price_currency }) }, TargetDateColumn({}), diff --git a/src/frontend/src/tables/sales/ReturnOrderLineItemTable.tsx b/src/frontend/src/tables/sales/ReturnOrderLineItemTable.tsx index 18cbdeb7af..d6eacbe1a0 100644 --- a/src/frontend/src/tables/sales/ReturnOrderLineItemTable.tsx +++ b/src/frontend/src/tables/sales/ReturnOrderLineItemTable.tsx @@ -23,6 +23,7 @@ import { LinkColumn, NoteColumn, PartColumn, + PercentageColumn, ProjectCodeColumn, ReferenceColumn, StatusColumn, @@ -148,6 +149,11 @@ export default function ReturnOrderLineItemTable({ render: (record: any) => formatCurrency(record.price, { currency: record.price_currency }) }, + PercentageColumn({ + accessor: 'discount', + title: t`Discount`, + defaultVisible: false + }), DateColumn({ accessor: 'target_date', title: t`Target Date` diff --git a/src/frontend/src/tables/sales/SalesOrderLineItemTable.tsx b/src/frontend/src/tables/sales/SalesOrderLineItemTable.tsx index b165244112..ca6d26dadc 100644 --- a/src/frontend/src/tables/sales/SalesOrderLineItemTable.tsx +++ b/src/frontend/src/tables/sales/SalesOrderLineItemTable.tsx @@ -36,6 +36,7 @@ import { IPNColumn, LineItemColumn, LinkColumn, + PercentageColumn, ProjectCodeColumn, ReferenceColumn, RenderPartColumn @@ -119,13 +120,18 @@ export default function SalesOrderLineItemTable({ currency: record.sale_price_currency }) }, + PercentageColumn({ + accessor: 'discount', + title: t`Discount`, + defaultVisible: false + }), { accessor: 'total_price', title: t`Total Price`, render: (record: any) => formatCurrency(record.sale_price, { currency: record.sale_price_currency, - multiplier: record.quantity + multiplier: record.quantity * (1 - (record.discount ?? 0) / 100) }) }, DateColumn({