- Changed default shipment state from 'pending' to 'draft' in NewShipment component. - Updated shipment information display to include new pricing and optional sections. - Added modal dialogs for shipping, receiving, and canceling shipments in ShipmentInfo component. - Enhanced Shipment model with new actions for editing, canceling edits, finishing edits, and managing shipment states. - Introduced new properties for amount, tax rate, and tax amount in the Shipment model, along with updated sorting and filtering options.
294 lines
6.8 KiB
JavaScript
294 lines
6.8 KiB
JavaScript
import ShipmentIcon from '../../components/Icons/ShipmentIcon'
|
|
import InfoCircleIcon from '../../components/Icons/InfoCircleIcon'
|
|
import EditIcon from '../../components/Icons/EditIcon'
|
|
import BinIcon from '../../components/Icons/BinIcon'
|
|
import CheckIcon from '../../components/Icons/CheckIcon'
|
|
import XMarkIcon from '../../components/Icons/XMarkIcon'
|
|
|
|
export const Shipment = {
|
|
name: 'shipment',
|
|
label: 'Shipment',
|
|
prefix: 'SHP',
|
|
icon: ShipmentIcon,
|
|
actions: [
|
|
{
|
|
name: 'info',
|
|
label: 'Info',
|
|
default: true,
|
|
row: true,
|
|
icon: InfoCircleIcon,
|
|
url: (_id) => `/dashboard/inventory/shipments/info?shipmentId=${_id}`
|
|
},
|
|
{
|
|
name: 'edit',
|
|
label: 'Edit',
|
|
type: 'button',
|
|
icon: EditIcon,
|
|
url: (_id) =>
|
|
`/dashboard/inventory/shipments/info?shipmentId=${_id}&action=edit`,
|
|
visible: (objectData) => {
|
|
return !(objectData?._isEditing && objectData?._isEditing == true)
|
|
},
|
|
disabled: (objectData) => {
|
|
return objectData?.state?.type != 'draft'
|
|
}
|
|
},
|
|
{
|
|
name: 'cancelEdit',
|
|
label: 'Cancel Edit',
|
|
type: 'button',
|
|
icon: XMarkIcon,
|
|
url: (_id) =>
|
|
`/dashboard/inventory/shipments/info?shipmentId=${_id}&action=cancelEdit`,
|
|
visible: (objectData) => {
|
|
return objectData?._isEditing && objectData?._isEditing == true
|
|
},
|
|
disabled: (objectData) => {
|
|
return objectData?.state?.type != 'draft'
|
|
}
|
|
},
|
|
{
|
|
name: 'finishEdit',
|
|
label: 'Finish Edit',
|
|
type: 'button',
|
|
icon: CheckIcon,
|
|
url: (_id) =>
|
|
`/dashboard/inventory/shipments/info?shipmentId=${_id}&action=finishEdit`,
|
|
visible: (objectData) => {
|
|
return objectData?._isEditing && objectData?._isEditing == true
|
|
},
|
|
disabled: (objectData) => {
|
|
return objectData?.state?.type != 'draft'
|
|
}
|
|
},
|
|
{
|
|
name: 'delete',
|
|
label: 'Delete',
|
|
type: 'button',
|
|
icon: BinIcon,
|
|
danger: true,
|
|
url: (_id) =>
|
|
`/dashboard/inventory/shipments/info?shipmentId=${_id}&action=delete`,
|
|
visible: (objectData) => {
|
|
return !(objectData?._isEditing && objectData?._isEditing == true)
|
|
},
|
|
disabled: (objectData) => {
|
|
return objectData?.state?.type != 'draft'
|
|
}
|
|
},
|
|
{ type: 'divider' },
|
|
{
|
|
name: 'ship',
|
|
label: 'Ship',
|
|
type: 'button',
|
|
icon: CheckIcon,
|
|
url: (_id) =>
|
|
`/dashboard/inventory/shipments/info?shipmentId=${_id}&action=ship`,
|
|
disabled: (objectData) => {
|
|
return objectData?.state?.type != 'planned'
|
|
},
|
|
visible: (objectData) => {
|
|
return (
|
|
objectData?.state?.type == 'planned' ||
|
|
objectData?.state?.type == 'draft'
|
|
)
|
|
}
|
|
},
|
|
{
|
|
name: 'receive',
|
|
label: 'Receive',
|
|
type: 'button',
|
|
icon: CheckIcon,
|
|
url: (_id) =>
|
|
`/dashboard/inventory/shipments/info?shipmentId=${_id}&action=receive`,
|
|
disabled: (objectData) => {
|
|
return objectData?.state?.type != 'shipped'
|
|
},
|
|
visible: (objectData) => {
|
|
return (
|
|
objectData?.state?.type == 'shipped' ||
|
|
objectData?.state?.type == 'delivered'
|
|
)
|
|
}
|
|
}
|
|
],
|
|
group: [],
|
|
filters: ['orderType', 'order', 'state', 'courierService'],
|
|
sorters: [
|
|
'createdAt',
|
|
'state',
|
|
'updatedAt',
|
|
'shippedAt',
|
|
'expectedAt',
|
|
'deliveredAt'
|
|
],
|
|
columns: [
|
|
'_id',
|
|
'_reference',
|
|
'state',
|
|
'orderType',
|
|
'order',
|
|
'amount',
|
|
'amountWithTax',
|
|
'taxRate',
|
|
'taxAmount',
|
|
'trackingNumber',
|
|
'shippedAt',
|
|
'expectedAt',
|
|
'deliveredAt',
|
|
'updatedAt',
|
|
'createdAt'
|
|
],
|
|
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: '_reference',
|
|
label: 'Reference',
|
|
type: 'reference',
|
|
objectType: 'shipment',
|
|
showCopy: true,
|
|
readOnly: true
|
|
},
|
|
|
|
{
|
|
name: 'updatedAt',
|
|
label: 'Updated At',
|
|
type: 'dateTime',
|
|
readOnly: true
|
|
},
|
|
{ name: 'state', label: 'State', type: 'state', readOnly: true },
|
|
|
|
{
|
|
name: 'shippedAt',
|
|
label: 'Shipped At',
|
|
type: 'dateTime',
|
|
required: false
|
|
},
|
|
{
|
|
name: 'orderType',
|
|
label: 'Order Type',
|
|
required: true,
|
|
type: 'objectType',
|
|
masterFilter: ['purchaseOrder', 'salesOrder'],
|
|
showHyperlink: true
|
|
},
|
|
|
|
{
|
|
name: 'expectedAt',
|
|
label: 'Expected At',
|
|
type: 'dateTime',
|
|
required: false
|
|
},
|
|
{
|
|
name: 'order',
|
|
label: 'Order',
|
|
required: true,
|
|
type: 'object',
|
|
showHyperlink: true,
|
|
objectType: (objectData) => {
|
|
return objectData?.orderType
|
|
}
|
|
},
|
|
|
|
{
|
|
name: 'deliveredAt',
|
|
label: 'Delivered At',
|
|
type: 'dateTime',
|
|
required: false
|
|
},
|
|
{
|
|
name: 'courierService',
|
|
label: 'Courier Service',
|
|
required: true,
|
|
type: 'object',
|
|
objectType: 'courierService'
|
|
},
|
|
{
|
|
name: 'trackingNumber',
|
|
label: 'Tracking Number',
|
|
type: 'text',
|
|
required: false
|
|
},
|
|
{
|
|
name: 'taxRate',
|
|
label: 'Tax Rate',
|
|
type: 'object',
|
|
objectType: 'taxRate',
|
|
showHyperlink: true
|
|
},
|
|
{
|
|
name: 'taxRecord',
|
|
label: 'Tax Record',
|
|
type: 'object',
|
|
objectType: 'taxRecord',
|
|
showHyperlink: true
|
|
},
|
|
{
|
|
name: 'amount',
|
|
label: 'Amount',
|
|
type: 'number',
|
|
required: true,
|
|
prefix: '£',
|
|
min: 0,
|
|
step: 0.01,
|
|
columnWidth: 150
|
|
},
|
|
{
|
|
name: 'taxAmount',
|
|
label: 'Tax Amount',
|
|
type: 'number',
|
|
required: true,
|
|
prefix: '£',
|
|
fixedNumber: 2,
|
|
min: 0,
|
|
step: 0.01,
|
|
readOnly: true,
|
|
value: (objectData) => {
|
|
return (objectData?.amount * objectData?.taxRate?.rate) / 100 || 0
|
|
}
|
|
},
|
|
{
|
|
name: 'amountWithTax',
|
|
label: 'Amount w/ Tax',
|
|
type: 'number',
|
|
required: true,
|
|
prefix: '£',
|
|
min: 0,
|
|
step: 0.01,
|
|
readOnly: true,
|
|
columnWidth: 175,
|
|
value: (objectData) => {
|
|
if (objectData?._isEditing == true) {
|
|
return (
|
|
(objectData?.amount || 0) + (objectData?.taxAmount || 0)
|
|
).toFixed(2)
|
|
}
|
|
if (
|
|
Number.parseFloat(objectData?.amount) &&
|
|
(objectData.taxRate == undefined || objectData.taxRate == null)
|
|
) {
|
|
return Number.parseFloat(objectData?.amount).toFixed(2)
|
|
}
|
|
if (Number.parseFloat(objectData?.amountWithTax)) {
|
|
return Number.parseFloat(objectData?.amountWithTax).toFixed(2)
|
|
}
|
|
return 0
|
|
}
|
|
}
|
|
]
|
|
}
|