Add OrderItem and Shipment models to database schema

- Introduced OrderItem and Shipment models with associated properties and actions.
- Updated ObjectModels to include new models for better integration.
- Refactored existing models to remove unnecessary ID references and improve hyperlink support for related objects.
- Enhanced various models by removing deprecated fields and ensuring consistency in object references.
This commit is contained in:
Tom Butcher 2025-12-07 02:41:17 +00:00
parent 2f323181f5
commit f24bc27e2c
21 changed files with 605 additions and 582 deletions

View File

@ -18,6 +18,8 @@ import { StockAudit } from './models/StockAudit'
import { PartStock } from './models/PartStock' import { PartStock } from './models/PartStock'
import { ProductStock } from './models/ProductStock' import { ProductStock } from './models/ProductStock'
import { PurchaseOrder } from './models/PurchaseOrder' import { PurchaseOrder } from './models/PurchaseOrder'
import { OrderItem } from './models/OrderItem'
import { Shipment } from './models/Shipment'
import { AuditLog } from './models/AuditLog' import { AuditLog } from './models/AuditLog'
import { User } from './models/User' import { User } from './models/User'
import { NoteType } from './models/NoteType' import { NoteType } from './models/NoteType'
@ -51,6 +53,8 @@ export const objectModels = [
PartStock, PartStock,
ProductStock, ProductStock,
PurchaseOrder, PurchaseOrder,
OrderItem,
Shipment,
AuditLog, AuditLog,
User, User,
NoteType, NoteType,
@ -85,6 +89,8 @@ export {
PartStock, PartStock,
ProductStock, ProductStock,
PurchaseOrder, PurchaseOrder,
OrderItem,
Shipment,
AuditLog, AuditLog,
User, User,
NoteType, NoteType,

View File

@ -9,13 +9,12 @@ export const AuditLog = {
columns: [ columns: [
'_id', '_id',
'owner', 'owner',
'owner._id', 'parent',
'parent._id',
'operation', 'operation',
'changes', 'changes',
'createdAt' 'createdAt'
], ],
filters: ['_id', 'owner._id', 'parent._id', 'operation'], filters: ['_id', 'owner', 'parent', 'operation'],
sorters: ['createdAt'], sorters: ['createdAt'],
properties: [ properties: [
{ {
@ -50,18 +49,8 @@ export const AuditLog = {
}, },
columnFixed: 'left', columnFixed: 'left',
value: null, value: null,
showCopy: true showCopy: true,
}, showHyperlink: true
{
name: 'owner._id',
label: 'Owner ID',
type: 'id',
objectType: (objectData) => {
return objectData.ownerType
},
columnFixed: 'left',
showHyperlink: true,
showCopy: true
}, },
{ {
name: 'parent', name: 'parent',
@ -71,17 +60,8 @@ export const AuditLog = {
return objectData.parentType return objectData.parentType
}, },
value: null, value: null,
showCopy: true showCopy: true,
}, showHyperlink: true
{
name: 'parent._id',
label: 'Parent ID',
type: 'id',
objectType: (objectData) => {
return objectData.parentType
},
showHyperlink: true,
showCopy: true
}, },
{ {
name: 'operation', name: 'operation',

View File

@ -74,15 +74,14 @@ export const CourierService = {
'name', 'name',
'_id', '_id',
'courier', 'courier',
'courier._id',
'tracked', 'tracked',
'deliveryTime', 'deliveryTime',
'active' 'active'
], ],
filters: ['name', '_id', 'courier._id', 'active', 'deliveryTime', 'tracked'], filters: ['name', '_id', 'courier', 'active', 'deliveryTime', 'tracked'],
sorters: [ sorters: [
'name', 'name',
'courier._id', 'courier',
'active', 'active',
'tracked', 'tracked',
'estimatedDeliveryTime', 'estimatedDeliveryTime',
@ -126,13 +125,6 @@ export const CourierService = {
showHyperlink: true, showHyperlink: true,
required: true required: true
}, },
{
name: 'courier._id',
label: 'Courier ID',
type: 'id',
objectType: 'courier',
showHyperlink: true
},
{ {
name: 'deliveryTime', name: 'deliveryTime',
label: 'Delivery Time', label: 'Delivery Time',

View File

@ -121,16 +121,8 @@ export const DocumentJob = {
type: 'object', type: 'object',
objectType: (objectData) => { objectType: (objectData) => {
return objectData?.objectType return objectData?.objectType
} },
}, showHyperlink: true
{
name: 'object._id',
label: 'Object ID',
type: 'id',
showHyperlink: true,
objectType: (objectData) => {
return objectData?.objectType
}
}, },
{ {
name: 'documentTemplate', name: 'documentTemplate',
@ -139,6 +131,7 @@ export const DocumentJob = {
columnWidth: 150, columnWidth: 150,
type: 'object', type: 'object',
objectType: 'documentTemplate', objectType: 'documentTemplate',
showHyperlink: true,
masterFilter: (objectData) => { masterFilter: (objectData) => {
return { return {
active: true, active: true,
@ -147,13 +140,6 @@ export const DocumentJob = {
} }
} }
}, },
{
name: 'documentTemplate._id',
label: 'Template ID',
type: 'id',
showHyperlink: true,
objectType: 'documentTemplate'
},
{ {
name: 'documentPrinter', name: 'documentPrinter',
label: 'Printer', label: 'Printer',
@ -161,19 +147,13 @@ export const DocumentJob = {
columnWidth: 150, columnWidth: 150,
type: 'object', type: 'object',
objectType: 'documentPrinter', objectType: 'documentPrinter',
showHyperlink: true,
masterFilter: () => { masterFilter: () => {
return { return {
active: true, active: true,
online: true online: true
} }
} }
},
{
name: 'documentPrinter._id',
label: 'Printer ID',
type: 'id',
showHyperlink: true,
objectType: 'documentPrinter'
} }
] ]
} }

View File

@ -66,7 +66,6 @@ export const DocumentPrinter = {
'_id', '_id',
'state', 'state',
'host', 'host',
'host._id',
'tags', 'tags',
'connectedAt', 'connectedAt',
'updatedAt' 'updatedAt'
@ -132,15 +131,8 @@ export const DocumentPrinter = {
label: 'Vendor', label: 'Vendor',
type: 'object', type: 'object',
objectType: 'vendor', objectType: 'vendor',
required: false required: false,
}, showHyperlink: true
{
name: 'vendor._id',
label: 'Vendor ID',
type: 'id',
objectType: 'vendor',
showHyperlink: true,
readOnly: true
}, },
{ {
name: 'host', name: 'host',
@ -150,14 +142,6 @@ export const DocumentPrinter = {
objectType: 'host', objectType: 'host',
showHyperlink: true showHyperlink: true
}, },
{
name: 'host._id',
label: 'Host ID',
type: 'id',
objectType: 'host',
showCopy: true,
showHyperlink: true
},
{ {
name: 'connection.interface', name: 'connection.interface',
label: 'Interface', label: 'Interface',
@ -211,14 +195,7 @@ export const DocumentPrinter = {
label: 'Current Document Size', label: 'Current Document Size',
required: false, required: false,
type: 'object', type: 'object',
objectType: 'documentSize'
},
{
name: 'currentDocumentSize._id',
label: 'Current Document Size ID',
type: 'id',
objectType: 'documentSize', objectType: 'documentSize',
showCopy: true,
showHyperlink: true showHyperlink: true
}, },
{ {

View File

@ -78,9 +78,7 @@ export const DocumentTemplate = {
'objectType', 'objectType',
'tags', 'tags',
'parent', 'parent',
'parent._id',
'documentSize', 'documentSize',
'documentSize._id',
'createdAt', 'createdAt',
'updatedAt' 'updatedAt'
], ],
@ -158,14 +156,7 @@ export const DocumentTemplate = {
label: 'Document Size', label: 'Document Size',
required: true, required: true,
type: 'object', type: 'object',
objectType: 'documentSize'
},
{
name: 'documentSize._id',
label: 'Document Size ID',
type: 'id',
objectType: 'documentSize', objectType: 'documentSize',
showCopy: true,
showHyperlink: true showHyperlink: true
}, },
{ {
@ -175,17 +166,7 @@ export const DocumentTemplate = {
type: 'object', type: 'object',
masterFilter: { global: true, active: true }, masterFilter: { global: true, active: true },
objectType: 'documentTemplate', objectType: 'documentTemplate',
empty: (documentTemplate) => {
return documentTemplate.global
}
},
{
name: 'parent._id',
label: 'Parent ID',
required: false,
type: 'id',
showHyperlink: true, showHyperlink: true,
objectType: 'documentTemplate',
empty: (documentTemplate) => { empty: (documentTemplate) => {
return documentTemplate.global return documentTemplate.global
} }

View File

@ -65,14 +65,13 @@ export const Filament = {
'type', 'type',
'color', 'color',
'vendor', 'vendor',
'vendor._id',
'cost', 'cost',
'density', 'density',
'diameter', 'diameter',
'createdAt', 'createdAt',
'updatedAt' 'updatedAt'
], ],
filters: ['_id', 'name', 'type', 'color', 'cost', 'vendor', 'vendor._id'], filters: ['_id', 'name', 'type', 'color', 'cost', 'vendor'],
sorters: [ sorters: [
'name', 'name',
'createdAt', 'createdAt',
@ -116,14 +115,7 @@ export const Filament = {
label: 'Vendor', label: 'Vendor',
required: true, required: true,
type: 'object', type: 'object',
objectType: 'vendor'
},
{
name: 'vendor._id',
label: 'Vendor ID',
type: 'id',
objectType: 'vendor', objectType: 'vendor',
showCopy: true,
showHyperlink: true showHyperlink: true
}, },
{ {

View File

@ -23,7 +23,6 @@ export const FilamentStock = {
'currentWeight', 'currentWeight',
'startingWeight', 'startingWeight',
'filament', 'filament',
'filament._id',
'createdAt', 'createdAt',
'updatedAt' 'updatedAt'
], ],
@ -65,15 +64,8 @@ export const FilamentStock = {
objectType: 'filament', objectType: 'filament',
readOnly: true, readOnly: true,
initial: true, initial: true,
required: true required: true,
}, showHyperlink: true
{
name: 'filament._id',
label: 'Filament ID',
type: 'id',
objectType: 'filament',
showHyperlink: true,
readOnly: true
}, },
{ {
name: 'currentWeight', name: 'currentWeight',

View File

@ -122,31 +122,16 @@ export const GCodeFile = {
value: null, value: null,
required: true, required: true,
showPreview: false, showPreview: false,
showHyperlink: false, showHyperlink: true,
filter: ['.gcode', '.g'] filter: ['.gcode', '.g']
}, },
{
name: 'file._id',
label: 'File ID',
type: 'id',
value: null,
objectType: 'file',
showHyperlink: true
},
{ {
name: 'filament', name: 'filament',
label: 'Filament', label: 'Filament',
type: 'object', type: 'object',
value: null, value: null,
objectType: 'filament', objectType: 'filament',
required: true required: true,
},
{
name: 'filament._id',
label: 'Filament ID',
type: 'id',
value: null,
objectType: 'filament',
showHyperlink: true showHyperlink: true
}, },
{ {
@ -236,17 +221,8 @@ export const GCodeFile = {
label: 'Part', label: 'Part',
type: 'object', type: 'object',
objectType: 'part', objectType: 'part',
required: true required: true,
}, showHyperlink: true
{
name: 'part._id',
label: 'Part ID',
type: 'id',
objectType: 'part',
showHyperlink: true,
value: (objectData) => {
return objectData?.part?._id
}
}, },
{ {
name: 'quantity', name: 'quantity',

View File

@ -40,13 +40,12 @@ export const Job = {
columns: [ columns: [
'_id', '_id',
'gcodeFile', 'gcodeFile',
'gcodeFile._id',
'quantity', 'quantity',
'state', 'state',
'createdAt' 'createdAt'
], ],
filters: ['state', '_id', 'gcodeFile._id', 'quantity'], filters: ['state', '_id', 'gcodeFile', 'quantity'],
sorters: ['createdAt', 'state', 'quantity', 'gcodeFile'], sorters: ['createdAt', 'state', 'quantity', 'gcodeFile'],
properties: [ properties: [
{ {
@ -113,13 +112,7 @@ export const Job = {
type: 'object', type: 'object',
columnFixed: 'left', columnFixed: 'left',
objectType: 'gcodeFile', objectType: 'gcodeFile',
required: true required: true,
},
{
name: 'gcodeFile._id',
label: 'GCode File ID',
type: 'id',
objectType: 'gcodeFile',
showHyperlink: true showHyperlink: true
} }
] ]

View File

@ -31,9 +31,30 @@ export const Note = {
readOnly: true readOnly: true
}, },
{ {
name: 'parent._id', name: '_reference',
label: 'Parent ID', label: 'Reference',
type: 'id', type: 'reference',
objectType: 'note',
showCopy: true,
readOnly: true
},
{
name: 'updatedAt',
label: 'Updated At',
type: 'dateTime',
readOnly: true
},
{
name: 'user',
label: 'User',
type: 'object',
objectType: 'user',
showHyperlink: true
},
{
name: 'parent',
label: 'Parent',
type: 'object',
objectType: (objectData) => { objectType: (objectData) => {
return objectData.parentType return objectData.parentType
}, },
@ -54,24 +75,6 @@ export const Note = {
objectType: 'noteType', objectType: 'noteType',
showHyperlink: true, showHyperlink: true,
required: true required: true
},
{
name: 'noteType._id',
label: 'Note Type ID',
type: 'id',
objectType: 'noteType'
},
{
name: 'user._id',
label: 'User ID',
type: 'id',
objectType: 'user'
},
{
name: 'updatedAt',
label: 'Updated At',
type: 'dateTime',
readOnly: true
} }
] ]
} }

View File

@ -0,0 +1,214 @@
import OrderItemIcon from '../../components/Icons/OrderItemIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
export const OrderItem = {
name: 'orderItem',
label: 'Order Item',
prefix: 'ODI',
icon: OrderItemIcon,
actions: [
{
name: 'info',
label: 'Info',
default: true,
row: true,
icon: InfoCircleIcon,
url: (_id) => `/dashboard/inventory/orderitems/info?orderItemId=${_id}`
}
],
group: [],
filters: ['itemType', 'item', 'order'],
sorters: ['createdAt', 'updatedAt', 'itemAmount', 'quantity'],
columns: [
'_id',
'itemType',
'item',
'itemAmount',
'quantity',
'totalAmount',
'taxRate',
'totalAmountWithTax',
'order',
'createdAt',
'updatedAt'
],
properties: [
{
name: '_id',
label: 'ID',
type: 'id',
columnFixed: 'left',
objectType: 'orderItem',
columnWidth: 140,
showCopy: true
},
{
name: 'createdAt',
label: 'Created At',
type: 'dateTime',
readOnly: true
},
{
name: 'orderType',
label: 'Order Type',
type: 'objectType',
masterFilter: ['purchaseOrder', 'salesOrder'],
required: true
},
{
name: 'updatedAt',
label: 'Updated At',
type: 'dateTime',
readOnly: true
},
{
name: 'order',
label: 'Order',
type: 'object',
showHyperlink: true,
objectType: (objectData) => {
return objectData?.orderType
},
required: true
},
{
name: 'itemType',
label: 'Item Type',
type: 'objectType',
masterFilter: ['part', 'packaging'],
required: true,
columnWidth: 125
},
{
name: 'item',
label: 'Item',
type: 'object',
objectType: (objectData) => {
return objectData?.itemType
},
required: true,
showHyperlink: true,
columnWidth: 300
},
{
name: 'syncAmount',
label: 'Sync Amount',
type: 'select',
options: [
{ label: 'Item Cost', value: 'itemCost' },
{ label: 'Item Price', value: 'itemPrice' },
{ label: 'None', value: null }
],
required: false
},
{
name: 'itemAmount',
label: 'Item Amount',
type: 'number',
required: true,
prefix: '£',
min: 0,
step: 0.01,
readOnly: (objectData) => {
return objectData?.syncAmount != null
},
columnWidth: 150,
value: (objectData) => {
if (objectData?.item?.cost && objectData?.syncAmount == 'itemCost') {
return objectData?.item?.cost || undefined
}
if (objectData?.item?.price && objectData?.syncAmount == 'itemPrice') {
return objectData?.item?.price || undefined
}
return objectData?.itemAmount || undefined
}
},
{
name: 'quantity',
label: 'Quantity',
type: 'number',
required: true,
columnWidth: 150
},
{
name: 'totalAmount',
label: 'Total Amount',
type: 'number',
required: true,
prefix: '£',
min: 0,
step: 0.01,
columnWidth: 150,
readOnly: true,
value: (objectData) => {
if (objectData?.itemAmount && objectData?.quantity) {
return (
(objectData?.itemAmount || 0) * (objectData?.quantity || 0)
).toFixed(2)
} else {
return 0
}
}
},
{
name: 'taxRate',
label: 'Tax Rate',
type: 'object',
objectType: 'taxRate',
showHyperlink: true,
value: (objectData) => {
if (
objectData?.item?.costTaxRate?._id &&
objectData?.syncAmount == 'itemCost'
) {
return objectData?.item?.costTaxRate || undefined
} else if (
objectData?.item?.priceTaxRate?._id &&
objectData?.syncAmount == 'itemPrice'
) {
return objectData?.item?.priceTaxRate || undefined
} else {
return objectData?.taxRate || undefined
}
},
readOnly: (objectData) => {
return objectData?.syncAmount != null
}
},
{
name: 'totalAmountWithTax',
label: 'Total Amount w/ Tax',
type: 'number',
required: true,
readOnly: true,
prefix: '£',
min: 0,
step: 0.01,
columnWidth: 175,
value: (objectData) => {
const totalAmount = objectData?.itemAmount * objectData?.quantity || 0
if (objectData?.taxRate?.rateType == 'percentage') {
if (objectData?.quantity == undefined || objectData?.quantity == 0) {
return undefined
}
return (
(
(totalAmount || 0) *
(1 + objectData?.taxRate?.rate / 100)
).toFixed(2) || undefined
)
} else if (objectData?.taxRate?.rateType == 'amount') {
return (
((totalAmount || 0) + objectData?.taxRate?.rate).toFixed(2) ||
undefined
)
} else {
return totalAmount || 0
}
}
}
]
}

View File

@ -58,15 +58,8 @@ export const Part = {
} }
} }
], ],
columns: [ columns: ['name', '_id', 'product', 'globalPricing', 'createdAt'],
'name', filters: ['name', '_id', 'product', 'globalPricing'],
'_id',
'product',
'product._id',
'globalPricing',
'createdAt'
],
filters: ['name', '_id', 'product', 'product._id', 'globalPricing'],
sorters: ['name', 'email', 'role', 'createdAt', '_id'], sorters: ['name', 'email', 'role', 'createdAt', '_id'],
properties: [ properties: [
{ {
@ -103,6 +96,7 @@ export const Part = {
required: true, required: true,
type: 'object', type: 'object',
objectType: 'vendor', objectType: 'vendor',
showHyperlink: true,
value: (objectData) => { value: (objectData) => {
console.log(objectData?.vendor, objectData?.product?.vendor) console.log(objectData?.vendor, objectData?.product?.vendor)
if (!objectData?.vendor && objectData?.product?.vendor) { if (!objectData?.vendor && objectData?.product?.vendor) {
@ -112,14 +106,6 @@ export const Part = {
} }
} }
}, },
{
name: 'vendor._id',
label: 'Vendor ID',
readOnly: true,
type: 'id',
showHyperlink: true,
objectType: 'vendor'
},
{ {
name: 'cost', name: 'cost',
label: 'Cost', label: 'Cost',
@ -132,7 +118,7 @@ export const Part = {
}, },
{ {
name: 'costWithTax', name: 'costWithTax',
label: 'Cost with Tax', label: 'Cost w/ Tax',
columnWidth: 150, columnWidth: 150,
required: true, required: true,
readOnly: true, readOnly: true,
@ -163,15 +149,8 @@ export const Part = {
label: 'Cost Tax Rate', label: 'Cost Tax Rate',
required: true, required: true,
type: 'object', type: 'object',
objectType: 'taxRate' objectType: 'taxRate',
}, showHyperlink: true
{
name: 'costTaxRate._id',
label: 'Cost Tax Rate ID',
readOnly: true,
type: 'id',
showHyperlink: true,
objectType: 'taxRate'
}, },
{ {
name: 'price', name: 'price',
@ -201,7 +180,7 @@ export const Part = {
}, },
{ {
name: 'priceWithTax', name: 'priceWithTax',
label: 'Price with Tax', label: 'Price w/ Tax',
columnWidth: 150, columnWidth: 150,
required: true, required: true,
readOnly: true, readOnly: true,
@ -251,15 +230,8 @@ export const Part = {
label: 'Price Tax Rate', label: 'Price Tax Rate',
required: true, required: true,
type: 'object', type: 'object',
objectType: 'taxRate' objectType: 'taxRate',
}, showHyperlink: true
{
name: 'priceTaxRate._id',
label: 'Price Tax Rate ID',
readOnly: true,
type: 'id',
showHyperlink: true,
objectType: 'taxRate'
}, },
{ {
@ -267,14 +239,7 @@ export const Part = {
label: 'File', label: 'File',
type: 'file', type: 'file',
value: null, value: null,
required: false required: false,
},
{
name: 'file._id',
label: 'File ID',
type: 'id',
value: null,
objectType: 'file',
showHyperlink: true showHyperlink: true
} }
] ]

View File

@ -25,7 +25,6 @@ export const PartStock = {
'startingQuantity', 'startingQuantity',
'currentQuantity', 'currentQuantity',
'part', 'part',
'part._id',
'createdAt', 'createdAt',
'updatedAt' 'updatedAt'
], ],
@ -66,26 +65,12 @@ export const PartStock = {
required: true, required: true,
masterFilter: ['subJob'] masterFilter: ['subJob']
}, },
{
name: 'consumedAt',
label: 'Consumed At',
type: 'dateTime',
readOnly: true
},
{ {
name: 'part', name: 'part',
label: 'Part', label: 'Part',
type: 'object', type: 'object',
objectType: 'part', objectType: 'part',
required: true required: true,
},
{
name: 'part._id',
label: 'Part ID',
type: 'id',
objectType: 'part',
readOnly: true,
showHyperlink: true showHyperlink: true
}, },
@ -98,17 +83,8 @@ export const PartStock = {
columnWidth: 200, columnWidth: 200,
objectType: (objectData) => { objectType: (objectData) => {
return objectData?.sourceType return objectData?.sourceType
} },
}, showHyperlink: true
{
name: 'source._id',
label: 'Source ID',
type: 'id',
readOnly: true,
columnWidth: 200,
objectType: (objectData) => {
return objectData?.sourceType
}
}, },
{ {
name: 'currentQuantity', name: 'currentQuantity',
@ -124,13 +100,6 @@ export const PartStock = {
return objectData.currentQuantity return objectData.currentQuantity
} }
} }
},
{
name: 'startingQuantity',
label: 'Starting Quantity',
type: 'number',
columnWidth: 200,
required: true
} }
] ]
} }

View File

@ -213,16 +213,7 @@ export const Printer = {
] ]
} }
], ],
columns: [ columns: ['name', '_id', 'state', 'host', 'tags', 'connectedAt', 'updatedAt'],
'name',
'_id',
'state',
'host',
'host._id',
'tags',
'connectedAt',
'updatedAt'
],
filters: ['name', '_id', 'state', 'tags'], filters: ['name', '_id', 'state', 'tags'],
sorters: ['name', 'state', 'connectedAt'], sorters: ['name', 'state', 'connectedAt'],
group: ['tags'], group: ['tags'],
@ -286,30 +277,16 @@ export const Printer = {
label: 'Vendor', label: 'Vendor',
type: 'object', type: 'object',
objectType: 'vendor', objectType: 'vendor',
required: false required: false,
}, showHyperlink: true
{
name: 'vendor._id',
label: 'Vendor ID',
type: 'id',
objectType: 'vendor',
showHyperlink: true,
readOnly: true
}, },
{ {
name: 'host', name: 'host',
label: 'Host', label: 'Host',
type: 'object', type: 'object',
objectType: 'host', objectType: 'host',
required: true required: true,
}, showHyperlink: true
{
name: 'host._id',
label: 'Host ID',
type: 'id',
objectType: 'host',
showHyperlink: true,
readOnly: true
}, },
{ {
name: 'moonraker.host', name: 'moonraker.host',
@ -354,45 +331,24 @@ export const Printer = {
label: 'Filament Stock', label: 'Filament Stock',
type: 'object', type: 'object',
objectType: 'filamentStock', objectType: 'filamentStock',
required: false required: false,
}, showHyperlink: true
{
name: 'currentFilamentStock._id',
label: 'Filament Stock ID',
type: 'id',
objectType: 'filamentStock',
showHyperlink: true,
readOnly: true
}, },
{ {
name: 'currentJob', name: 'currentJob',
label: 'Current Job', label: 'Current Job',
type: 'object', type: 'object',
objectType: 'job', objectType: 'job',
required: false required: false,
}, showHyperlink: true
{
name: 'currentJob._id',
label: 'Current Job ID',
type: 'id',
objectType: 'job',
showHyperlink: true,
readOnly: true
}, },
{ {
name: 'currentSubJob', name: 'currentSubJob',
label: 'Current Sub Job', label: 'Current Sub Job',
type: 'object', type: 'object',
objectType: 'subJob', objectType: 'subJob',
required: false required: false,
}, showHyperlink: true
{
name: 'currentSubJob._id',
label: 'Current Sub Job ID',
type: 'id',
objectType: 'subJob',
showHyperlink: true,
readOnly: true
}, },
{ {
name: 'alerts', name: 'alerts',

View File

@ -64,12 +64,11 @@ export const Product = {
'name', 'name',
'tags', 'tags',
'vendor', 'vendor',
'vendor._id',
'price', 'price',
'createdAt', 'createdAt',
'updatedAt' 'updatedAt'
], ],
filters: ['_id', 'name', 'type', 'color', 'cost', 'vendor', 'vendor._id'], filters: ['_id', 'name', 'type', 'color', 'cost', 'vendor'],
sorters: ['name', 'createdAt', 'type', 'vendor', 'cost', 'updatedAt'], sorters: ['name', 'createdAt', 'type', 'vendor', 'cost', 'updatedAt'],
properties: [ properties: [
{ {
@ -103,15 +102,8 @@ export const Product = {
label: 'Vendor', label: 'Vendor',
required: true, required: true,
type: 'object', type: 'object',
objectType: 'vendor' objectType: 'vendor',
}, showHyperlink: true
{
name: 'vendor._id',
label: 'Vendor ID',
readOnly: true,
type: 'id',
showHyperlink: true,
objectType: 'vendor'
}, },
{ {
name: 'version', name: 'version',
@ -167,17 +159,8 @@ export const Product = {
label: 'Part', label: 'Part',
type: 'object', type: 'object',
objectType: 'part', objectType: 'part',
required: true required: true,
}, showHyperlink: true
{
name: 'part._id',
label: 'Part ID',
type: 'id',
objectType: 'part',
showHyperlink: true,
value: (objectData) => {
return objectData?.part?._id
}
}, },
{ {
name: 'quantity', name: 'quantity',

View File

@ -1,5 +1,6 @@
import PurchaseOrderIcon from '../../components/Icons/PurchaseOrderIcon' import PurchaseOrderIcon from '../../components/Icons/PurchaseOrderIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
import PlusIcon from '../../components/Icons/PlusIcon'
export const PurchaseOrder = { export const PurchaseOrder = {
name: 'purchaseOrder', name: 'purchaseOrder',
@ -15,12 +16,20 @@ export const PurchaseOrder = {
icon: InfoCircleIcon, icon: InfoCircleIcon,
url: (_id) => url: (_id) =>
`/dashboard/inventory/purchaseorders/info?purchaseOrderId=${_id}` `/dashboard/inventory/purchaseorders/info?purchaseOrderId=${_id}`
},
{
name: 'New Order Item',
label: 'New Order Item',
type: 'button',
icon: PlusIcon,
url: (_id) =>
`/dashboard/inventory/purchaseorders/info?purchaseOrderId=${_id}&action=newOrderItem`
} }
], ],
group: ['vendor'], group: ['vendor'],
filters: ['vendor', 'vendor._id'], filters: ['vendor'],
sorters: ['createdAt', 'state', 'updatedAt'], sorters: ['createdAt', 'state', 'updatedAt'],
columns: ['_id', 'createdAt', 'state', 'updatedAt', 'vendor', 'vendor._id'], columns: ['_id', 'createdAt', 'state', 'updatedAt', 'vendor'],
properties: [ properties: [
{ {
name: '_id', name: '_id',
@ -49,183 +58,8 @@ export const PurchaseOrder = {
label: 'Vendor', label: 'Vendor',
required: true, required: true,
type: 'object', type: 'object',
objectType: 'vendor' objectType: 'vendor',
}, showHyperlink: true
{
name: 'vendor._id',
label: 'Vendor ID',
readOnly: true,
type: 'id',
showHyperlink: true,
objectType: 'vendor'
},
{
name: 'items',
label: 'Order Items',
type: 'objectChildren',
required: true,
properties: [
{
name: 'itemType',
label: 'Item Type',
type: 'objectType',
masterFilter: ['part', 'packaging'],
required: true
},
{
name: 'item',
label: 'Item',
type: 'object',
objectType: (objectData) => {
return objectData?.itemType
},
required: true
},
{
name: 'item._id',
label: 'Item ID',
type: 'id',
objectType: (objectData) => {
return objectData?.itemType
},
showHyperlink: true,
value: (objectData) => {
return objectData?.item?._id
}
},
{
name: 'itemCost',
label: 'Item Cost',
type: 'number',
required: true,
prefix: '£',
min: 0,
step: 0.01,
columnWidth: 150,
value: (objectData) => {
if (objectData?.item) {
return objectData?.item?.cost || undefined
} else {
return undefined
}
}
},
{
name: 'quantity',
label: 'Quantity',
type: 'number',
required: true,
columnWidth: 150
},
{
name: 'totalCost',
label: 'Total Cost',
type: 'number',
required: true,
prefix: '£',
min: 0,
step: 0.01,
columnWidth: 150,
value: (objectData) => {
return (
(objectData?.itemCost || 0) * (objectData?.quantity || 0) ||
undefined
)
}
},
{
name: 'taxRate',
label: 'Tax Rate',
type: 'object',
objectType: 'taxRate',
value: (objectData) => {
if (objectData?.item) {
console.log(objectData?.item)
return objectData?.item?.costTaxRate || undefined
} else {
return undefined
}
}
},
{
name: 'taxRate._id',
label: 'Tax Rate ID',
type: 'id',
showHyperlink: true,
objectType: 'taxRate',
value: (objectData) => {
return objectData?.taxRate?._id || undefined
}
},
{
name: 'totalCostWithTax',
label: 'Total Cost With Tax',
type: 'number',
required: true,
readOnly: true,
prefix: '£',
min: 0,
step: 0.01,
columnWidth: 175,
value: (objectData) => {
if (objectData?.taxRate?.rateType == 'percentage') {
return (
(
(objectData?.totalCost || 0) *
(1 + objectData?.taxRate?.rate / 100)
).toFixed(2) || undefined
)
} else if (objectData?.taxRate?.rateType == 'amount') {
return (
(
(objectData?.totalCost || 0) + objectData?.taxRate?.rate
).toFixed(2) || undefined
)
} else {
return objectData?.totalCost || undefined
}
}
}
],
rollups: [
{
name: 'totalQuantity',
label: 'Total',
type: 'number',
property: 'quantity',
value: (objectData) => {
return objectData?.items?.reduce(
(acc, item) => acc + item.quantity,
0
)
}
},
{
name: 'totalCost',
label: 'Total',
type: 'number',
prefix: '£',
property: 'totalCost',
value: (objectData) => {
return objectData?.items
?.reduce((acc, item) => acc + (item.totalCost || 0), 0)
.toFixed(2)
}
},
{
name: 'totalCostWithTax',
label: 'Total',
type: 'number',
prefix: '£',
property: 'totalCostWithTax',
value: (objectData) => {
return objectData?.items
?.reduce((acc, item) => acc + (item.totalCostWithTax || 0), 0)
.toFixed(2)
}
}
]
}, },
{ {
name: 'cost', name: 'cost',

View File

@ -0,0 +1,280 @@
import ShipmentIcon from '../../components/Icons/ShipmentIcon'
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
export const Shipment = {
name: 'shipment',
label: 'Shipment',
prefix: 'SHM',
icon: ShipmentIcon,
actions: [
{
name: 'info',
label: 'Info',
default: true,
row: true,
icon: InfoCircleIcon,
url: (_id) => `/dashboard/inventory/shipments/info?shipmentId=${_id}`
}
],
group: ['vendor', 'purchaseOrder'],
filters: ['vendor', 'purchaseOrder', 'state', 'courierService'],
sorters: [
'createdAt',
'state',
'updatedAt',
'shippedDate',
'expectedDeliveryDate'
],
columns: [
'_id',
'createdAt',
'state',
'updatedAt',
'vendor',
'purchaseOrder',
'trackingNumber'
],
properties: [
{
name: '_id',
label: 'ID',
type: 'id',
columnFixed: 'left',
objectType: 'shipment',
columnWidth: 140,
showCopy: true
},
{
name: 'createdAt',
label: 'Created At',
type: 'dateTime',
readOnly: true
},
{ name: 'state', label: 'State', type: 'state', readOnly: true },
{
name: 'updatedAt',
label: 'Updated At',
type: 'dateTime',
readOnly: true
},
{
name: 'purchaseOrder',
label: 'Purchase Order',
required: true,
type: 'object',
objectType: 'purchaseOrder',
showHyperlink: true
},
{
name: 'vendor',
label: 'Vendor',
required: true,
type: 'object',
objectType: 'vendor',
showHyperlink: true
},
{
name: 'courierService',
label: 'Courier Service',
required: false,
type: 'object',
objectType: 'courierService'
},
{
name: 'trackingNumber',
label: 'Tracking Number',
type: 'string',
required: false
},
{
name: 'items',
label: 'Shipment Items',
type: 'objectChildren',
required: true,
properties: [
{
name: 'itemType',
label: 'Item Type',
type: 'objectType',
masterFilter: ['part', 'packaging'],
required: true
},
{
name: 'item',
label: 'Item',
type: 'object',
objectType: (objectData) => {
return objectData?.itemType
},
required: true,
showHyperlink: true
},
{
name: 'itemCost',
label: 'Item Cost',
type: 'number',
required: true,
prefix: '£',
min: 0,
step: 0.01,
columnWidth: 150,
value: (objectData) => {
if (objectData?.item) {
return objectData?.item?.cost || undefined
} else {
return undefined
}
}
},
{
name: 'quantity',
label: 'Quantity',
type: 'number',
required: true,
columnWidth: 150
},
{
name: 'totalCost',
label: 'Total Cost',
type: 'number',
required: true,
prefix: '£',
min: 0,
step: 0.01,
columnWidth: 150,
value: (objectData) => {
return (
(objectData?.itemCost || 0) * (objectData?.quantity || 0) ||
undefined
)
}
},
{
name: 'taxRate',
label: 'Tax Rate',
type: 'object',
objectType: 'taxRate',
showHyperlink: true,
value: (objectData) => {
if (objectData?.item) {
return objectData?.item?.costTaxRate || undefined
} else {
return undefined
}
}
},
{
name: 'totalCostWithTax',
label: 'Total Cost w/ Tax',
type: 'number',
required: true,
readOnly: true,
prefix: '£',
min: 0,
step: 0.01,
columnWidth: 175,
value: (objectData) => {
if (objectData?.taxRate?.rateType == 'percentage') {
return (
(
(objectData?.totalCost || 0) *
(1 + objectData?.taxRate?.rate / 100)
).toFixed(2) || undefined
)
} else if (objectData?.taxRate?.rateType == 'amount') {
return (
(
(objectData?.totalCost || 0) + objectData?.taxRate?.rate
).toFixed(2) || undefined
)
} else {
return objectData?.totalCost || undefined
}
}
}
],
rollups: [
{
name: 'totalQuantity',
label: 'Total',
type: 'number',
property: 'quantity',
value: (objectData) => {
return objectData?.items?.reduce(
(acc, item) => acc + item.quantity,
0
)
}
},
{
name: 'totalCost',
label: 'Total',
type: 'number',
prefix: '£',
property: 'totalCost',
value: (objectData) => {
return objectData?.items
?.reduce((acc, item) => acc + (item.totalCost || 0), 0)
.toFixed(2)
}
},
{
name: 'totalCostWithTax',
label: 'Total',
type: 'number',
prefix: '£',
property: 'totalCostWithTax',
value: (objectData) => {
return objectData?.items
?.reduce((acc, item) => acc + (item.totalCostWithTax || 0), 0)
.toFixed(2)
}
}
]
},
{
name: 'cost',
label: 'Cost',
type: 'netGross',
required: true,
prefix: '£',
min: 0,
step: 0.01,
value: (objectData) => {
const net = objectData?.items?.reduce(
(acc, item) => acc + (item.totalCost || 0),
0
)
const gross = objectData?.items?.reduce(
(acc, item) => acc + (item.totalCostWithTax || 0),
0
)
return { net: net, gross: gross }
}
},
{
name: 'shippedDate',
label: 'Shipped Date',
type: 'dateTime',
required: false
},
{
name: 'expectedDeliveryDate',
label: 'Expected Delivery Date',
type: 'dateTime',
required: false
},
{
name: 'actualDeliveryDate',
label: 'Actual Delivery Date',
type: 'dateTime',
required: false
},
{
name: 'notes',
label: 'Notes',
type: 'textarea',
required: false
}
]
}

View File

@ -6,8 +6,8 @@ export const StockEvent = {
prefix: 'SEV', prefix: 'SEV',
icon: StockEventIcon, icon: StockEventIcon,
actions: [], actions: [],
columns: ['_id', 'owner', 'owner._id', 'parent._id', 'value', 'createdAt'], columns: ['_id', 'owner', 'parent', 'value', 'createdAt'],
filters: ['_id', 'owner._id', 'parent._id'], filters: ['_id', 'owner', 'parent'],
sorters: ['createdAt'], sorters: ['createdAt'],
properties: [ properties: [
{ {
@ -42,18 +42,8 @@ export const StockEvent = {
}, },
columnFixed: 'left', columnFixed: 'left',
value: null, value: null,
showCopy: true showCopy: true,
}, showHyperlink: true
{
name: 'owner._id',
label: 'Owner ID',
type: 'id',
objectType: (objectData) => {
return objectData.ownerType
},
columnFixed: 'left',
showHyperlink: true,
showCopy: true
}, },
{ {
name: 'parent', name: 'parent',
@ -63,17 +53,8 @@ export const StockEvent = {
return objectData?.parentType return objectData?.parentType
}, },
value: null, value: null,
showCopy: true showCopy: true,
}, showHyperlink: true
{
name: 'parent._id',
label: 'Parent ID',
type: 'id',
objectType: (objectData) => {
return objectData.parentType
},
showHyperlink: true,
showCopy: true
}, },
{ {
name: 'value', name: 'value',

View File

@ -28,8 +28,8 @@ export const SubJob = {
} }
} }
], ],
columns: ['_id', 'printer', 'printer._id', 'job._id', 'state', 'createdAt'], columns: ['_id', 'printer', 'job', 'state', 'createdAt'],
filters: ['state', '_id', 'job._id', 'printer._id'], filters: ['state', '_id', 'job', 'printer'],
sorters: ['createdAt', 'state'], sorters: ['createdAt', 'state'],
group: ['job'], group: ['job'],
properties: [ properties: [
@ -102,15 +102,8 @@ export const SubJob = {
name: 'job', name: 'job',
label: 'Job', label: 'Job',
type: 'object', type: 'object',
objectType: 'job' objectType: 'job',
}, showHyperlink: true
{
name: 'job._id',
label: 'Job ID',
type: 'id',
columnWidth: 140,
showHyperlink: true,
objectType: 'job'
}, },
{ {
@ -118,16 +111,8 @@ export const SubJob = {
label: 'Printer', label: 'Printer',
type: 'object', type: 'object',
columnFixed: 'left', columnFixed: 'left',
objectType: 'printer' objectType: 'printer',
}, showHyperlink: true
{
name: 'printer._id',
label: 'Printer ID',
type: 'id',
columnWidth: 140,
columnFixed: 'left',
showHyperlink: true,
objectType: 'printer'
} }
] ]
} }

View File

@ -101,15 +101,8 @@ export const TaxRecord = {
label: 'Tax Rate', label: 'Tax Rate',
required: true, required: true,
type: 'object', type: 'object',
objectType: 'taxRate' objectType: 'taxRate',
}, showHyperlink: true
{
name: 'taxRate._id',
label: 'Tax Rate ID',
readOnly: true,
type: 'id',
showHyperlink: true,
objectType: 'taxRate'
}, },
{ {
name: 'transactionType', name: 'transactionType',
@ -129,17 +122,8 @@ export const TaxRecord = {
type: 'object', type: 'object',
objectType: (objectData) => { objectType: (objectData) => {
return objectData?.transactionType || 'purchaseOrder' return objectData?.transactionType || 'purchaseOrder'
} },
}, showHyperlink: true
{
name: 'transaction._id',
label: 'Transaction ID',
readOnly: true,
type: 'id',
showHyperlink: true,
objectType: (objectData) => {
return objectData?.transactionType || 'purchaseOrder'
}
}, },
{ {
name: 'amount', name: 'amount',