From 13bbcbe50e42391306763d33485b697ec0378e59 Mon Sep 17 00:00:00 2001 From: Tom Butcher Date: Wed, 3 Dec 2025 23:35:30 +0000 Subject: [PATCH] Added tax rates, tax records and minor style improvements. --- assets/icons/taxrateicon.svg | 13 ++ assets/icons/taxrecordicon.svg | 14 ++ assets/icons/taxruleicon.svg | 13 ++ assets/stylesheets/App.css | 22 +- .../Management/ManagementSidebar.jsx | 17 ++ .../Dashboard/Management/Parts/NewPart.jsx | 18 +- .../Dashboard/Management/TaxRates.jsx | 97 +++++++++ .../Management/TaxRates/NewTaxRate.jsx | 80 +++++++ .../Management/TaxRates/TaxRateInfo.jsx | 193 +++++++++++++++++ .../Dashboard/Management/TaxRecords.jsx | 98 +++++++++ .../Management/TaxRecords/NewTaxRecord.jsx | 80 +++++++ .../Management/TaxRecords/TaxRecordInfo.jsx | 196 ++++++++++++++++++ .../Production/GCodeFiles/GCodeFileInfo.jsx | 1 + .../Production/Printers/ControlPrinter.jsx | 35 +++- .../Production/SubJobs/SubJobInfo.jsx | 1 + src/components/Dashboard/common/FileList.jsx | 11 +- .../Dashboard/common/NotesPanel.jsx | 6 +- .../Dashboard/common/ObjectChildTable.jsx | 127 +++++++++++- .../Dashboard/common/ObjectDisplay.jsx | 29 ++- .../Dashboard/common/ObjectForm.jsx | 14 +- .../Dashboard/common/ObjectInfo.jsx | 22 +- .../Dashboard/common/ObjectProperty.jsx | 3 +- .../Dashboard/common/ObjectSelect.jsx | 25 ++- .../Dashboard/common/ObjectTable.jsx | 9 +- .../Dashboard/common/PrinterPositionPanel.jsx | 22 +- .../Dashboard/common/StateDisplay.jsx | 2 +- .../Dashboard/context/AuthContext.jsx | 6 +- src/components/Icons/TaxRateIcon.jsx | 6 + src/components/Icons/TaxRecordIcon.jsx | 6 + src/database/ObjectModels.js | 10 +- src/database/models/Job.js | 3 +- src/database/models/Part.js | 132 ++++++++++-- src/database/models/PurchaseOrder.js | 129 +++++++++--- src/database/models/SubJob.js | 51 +++-- src/database/models/TaxRate.js | 181 ++++++++++++++++ src/database/models/TaxRecord.js | 174 ++++++++++++++++ src/routes/ManagementRoutes.jsx | 22 +- 37 files changed, 1728 insertions(+), 140 deletions(-) create mode 100644 assets/icons/taxrateicon.svg create mode 100644 assets/icons/taxrecordicon.svg create mode 100644 assets/icons/taxruleicon.svg create mode 100644 src/components/Dashboard/Management/TaxRates.jsx create mode 100644 src/components/Dashboard/Management/TaxRates/NewTaxRate.jsx create mode 100644 src/components/Dashboard/Management/TaxRates/TaxRateInfo.jsx create mode 100644 src/components/Dashboard/Management/TaxRecords.jsx create mode 100644 src/components/Dashboard/Management/TaxRecords/NewTaxRecord.jsx create mode 100644 src/components/Dashboard/Management/TaxRecords/TaxRecordInfo.jsx create mode 100644 src/components/Icons/TaxRateIcon.jsx create mode 100644 src/components/Icons/TaxRecordIcon.jsx create mode 100644 src/database/models/TaxRate.js create mode 100644 src/database/models/TaxRecord.js diff --git a/assets/icons/taxrateicon.svg b/assets/icons/taxrateicon.svg new file mode 100644 index 0000000..82d57cc --- /dev/null +++ b/assets/icons/taxrateicon.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/assets/icons/taxrecordicon.svg b/assets/icons/taxrecordicon.svg new file mode 100644 index 0000000..cf187c9 --- /dev/null +++ b/assets/icons/taxrecordicon.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/assets/icons/taxruleicon.svg b/assets/icons/taxruleicon.svg new file mode 100644 index 0000000..4ff9aa2 --- /dev/null +++ b/assets/icons/taxruleicon.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/assets/stylesheets/App.css b/assets/stylesheets/App.css index 0dae3b8..6a3861b 100644 --- a/assets/stylesheets/App.css +++ b/assets/stylesheets/App.css @@ -347,6 +347,26 @@ body { } .ant-select-selection-item .ant-tag, -.ant-select-tree-title .ant-tag { +.ant-select-tree-title .object-display-tag { background: transparent !important; + padding: 0; + margin-right: 1px !important; + padding-top: 3px; +} + +.ant-select-outlined.ant-select-multiple + .ant-select-selection-item + .object-display-tag { + padding-top: 0px; +} + +.ant-select-outlined.ant-select-multiple + .ant-select-selection-item + .object-display-tag + .ant-flex { + margin-top: -0.75px; +} + +.object-info-descriptions table { + table-layout: fixed !important; } diff --git a/src/components/Dashboard/Management/ManagementSidebar.jsx b/src/components/Dashboard/Management/ManagementSidebar.jsx index f0248c8..4345eae 100644 --- a/src/components/Dashboard/Management/ManagementSidebar.jsx +++ b/src/components/Dashboard/Management/ManagementSidebar.jsx @@ -19,6 +19,8 @@ import DocumentJobIcon from '../../Icons/DocumentJobIcon' import FileIcon from '../../Icons/FileIcon' import CourierIcon from '../../Icons/CourierIcon' import CourierServiceIcon from '../../Icons/CourierServiceIcon' +import TaxRateIcon from '../../Icons/TaxRateIcon' +import TaxRecordIcon from '../../Icons/TaxRecordIcon' const items = [ { @@ -65,6 +67,19 @@ const items = [ path: '/dashboard/management/courierservices' }, { type: 'divider' }, + { + key: 'taxRates', + icon: , + label: 'Tax Rates', + path: '/dashboard/management/taxrates' + }, + { + key: 'taxRecords', + icon: , + label: 'Tax Records', + path: '/dashboard/management/taxrecords' + }, + { type: 'divider' }, { key: 'noteTypes', icon: , @@ -156,6 +171,8 @@ const routeKeyMap = { '/dashboard/management/vendors': 'vendors', '/dashboard/management/couriers': 'couriers', '/dashboard/management/courierservices': 'courierServices', + '/dashboard/management/taxrates': 'taxRates', + '/dashboard/management/taxrecords': 'taxRecords', '/dashboard/management/materials': 'materials', '/dashboard/management/notetypes': 'noteTypes', '/dashboard/management/settings': 'settings', diff --git a/src/components/Dashboard/Management/Parts/NewPart.jsx b/src/components/Dashboard/Management/Parts/NewPart.jsx index 0fae248..9a71a7c 100644 --- a/src/components/Dashboard/Management/Parts/NewPart.jsx +++ b/src/components/Dashboard/Management/Parts/NewPart.jsx @@ -25,8 +25,12 @@ const NewPart = ({ onOk }) => { visibleProperties={{ file: false, priceMode: false, - globalPricing: false, - amount: false, + cost: false, + costTaxRate: false, + costWithTax: false, + price: false, + priceTaxRate: false, + priceWithTax: false, margin: false }} /> @@ -45,9 +49,13 @@ const NewPart = ({ onOk }) => { objectData={objectData} visibleProperties={{ priceMode: true, - globalPricing: true, - amount: true, - margin: true + margin: true, + cost: true, + costTaxRate: true, + costWithTax: true, + price: true, + priceTaxRate: true, + priceWithTax: true }} /> ) diff --git a/src/components/Dashboard/Management/TaxRates.jsx b/src/components/Dashboard/Management/TaxRates.jsx new file mode 100644 index 0000000..ac47674 --- /dev/null +++ b/src/components/Dashboard/Management/TaxRates.jsx @@ -0,0 +1,97 @@ +import { useState, useRef } from 'react' +import { Button, Flex, Space, Modal, Dropdown, message } from 'antd' +import NewTaxRate from './TaxRates/NewTaxRate' +import ObjectTable from '../common/ObjectTable' +import PlusIcon from '../../Icons/PlusIcon' +import ReloadIcon from '../../Icons/ReloadIcon' +import useColumnVisibility from '../hooks/useColumnVisibility' +import GridIcon from '../../Icons/GridIcon' +import ListIcon from '../../Icons/ListIcon' +import useViewMode from '../hooks/useViewMode' +import ColumnViewButton from '../common/ColumnViewButton' + +const TaxRates = () => { + const [messageApi, contextHolder] = message.useMessage() + const [newTaxRateOpen, setNewTaxRateOpen] = useState(false) + const tableRef = useRef() + + const [viewMode, setViewMode] = useViewMode('taxRate') + + const [columnVisibility, setColumnVisibility] = useColumnVisibility('taxRate') + + const actionItems = { + items: [ + { + label: 'New Tax Rate', + key: 'newTaxRate', + icon: + }, + { type: 'divider' }, + { + label: 'Reload List', + key: 'reloadList', + icon: + } + ], + onClick: ({ key }) => { + if (key === 'reloadList') { + tableRef.current?.reload() + } else if (key === 'newTaxRate') { + setNewTaxRateOpen(true) + } + } + } + + return ( + <> + + {contextHolder} + + + + + + + + + + + + + +