import ProductSkuIcon from '../../components/Icons/ProductSkuIcon' import InfoCircleIcon from '../../components/Icons/InfoCircleIcon' import EditIcon from '../../components/Icons/EditIcon' import CheckIcon from '../../components/Icons/CheckIcon' import XMarkIcon from '../../components/Icons/XMarkIcon' import BinIcon from '../../components/Icons/BinIcon' export const ProductSku = { name: 'productSku', label: 'Product SKU', prefix: 'SKU', icon: ProductSkuIcon, actions: [ { name: 'info', label: 'Info', default: true, row: true, icon: InfoCircleIcon, url: (_id) => `/dashboard/management/productskus/info?productSkuId=${_id}` }, { name: 'edit', label: 'Edit', row: true, icon: EditIcon, url: (_id) => `/dashboard/management/productskus/info?productSkuId=${_id}&action=edit`, visible: (objectData) => { return !(objectData?._isEditing && objectData?._isEditing == true) } }, { name: 'finishEdit', label: 'Save Edits', icon: CheckIcon, url: (_id) => `/dashboard/management/productskus/info?productSkuId=${_id}&action=finishEdit`, visible: (objectData) => { return objectData?._isEditing && objectData?._isEditing == true } }, { name: 'cancelEdit', label: 'Cancel Edits', icon: XMarkIcon, url: (_id) => `/dashboard/management/productskus/info?productSkuId=${_id}&action=cancelEdit`, visible: (objectData) => { return objectData?._isEditing && objectData?._isEditing == true } }, { type: 'divider' }, { name: 'delete', label: 'Delete', icon: BinIcon, danger: true, url: (_id) => `/dashboard/management/productskus/info?productSkuId=${_id}&action=delete` } ], url: (id) => `/dashboard/management/productskus/info?productSkuId=${id}`, columns: [ '_reference', 'name', 'product', 'barcode', 'overrideCost', 'cost', 'costWithTax', 'overridePrice', 'price', 'priceWithTax', 'createdAt', 'updatedAt' ], filters: [ '_id', 'barcode', 'product', 'product._id', 'name', 'cost', 'costWithTax', 'price', 'priceWithTax' ], sorters: [ 'barcode', 'product', 'name', 'cost', 'costWithTax', 'price', 'priceWithTax', 'createdAt', 'updatedAt' ], properties: [ { name: '_id', label: 'ID', type: 'id', objectType: 'productSku', showCopy: true, readOnly: true, columnWidth: 140 }, { name: 'createdAt', label: 'Created At', type: 'dateTime', readOnly: true, columnWidth: 175 }, { name: '_reference', label: 'Reference', type: 'reference', columnFixed: 'left', objectType: 'productSku', showCopy: true, readOnly: true, columnWidth: 180 }, { name: 'name', label: 'Name', required: true, type: 'text', columnWidth: 200, columnFixed: 'left' }, { name: 'updatedAt', label: 'Updated At', type: 'dateTime', readOnly: true, columnWidth: 175 }, { name: 'product', label: 'Product', type: 'object', objectType: 'product', required: true, showHyperlink: true, columnWidth: 200 }, { name: 'barcode', label: 'Barcode', required: false, type: 'text', columnWidth: 150 }, { name: 'description', label: 'Description', required: false, type: 'text', columnWidth: 200 }, { name: 'priceMode', label: 'Price Mode', required: false, type: 'priceMode', columnWidth: 150 }, { name: 'overrideCost', label: 'Override Cost', required: false, type: 'bool', value: (objectData) => objectData?.overrideCost ?? false, columnWidth: 150 }, { name: 'overridePrice', label: 'Override Price', required: false, type: 'bool', value: (objectData) => objectData?.overridePrice ?? false, columnWidth: 150 }, { name: 'cost', label: 'Cost', required: false, type: 'number', prefix: '£', min: 0, step: 0.01, disabled: (objectData) => !objectData?.overrideCost, value: (objectData) => objectData?.overrideCost ? objectData?.cost : undefined, columnWidth: 100 }, { name: 'costWithTax', label: 'Cost w/ Tax', required: false, readOnly: true, type: 'number', prefix: '£', min: 0, step: 0.01, disabled: (objectData) => !objectData?.overrideCost, value: (objectData) => { if (!objectData?.overrideCost) return undefined const cost = objectData?.cost const taxRate = objectData?.costTaxRate if (!cost) return 0 if (taxRate?.rateType == 'percentage') { return (cost * (1 + taxRate?.rate / 100)).toFixed(2) || 0 } else if (taxRate?.rateType == 'amount') { return (cost + taxRate?.rate).toFixed(2) || 0 } return cost }, columnWidth: 150 }, { name: 'costTaxRate', label: 'Cost Tax Rate', required: false, type: 'object', objectType: 'taxRate', showHyperlink: true, disabled: (objectData) => !objectData?.overrideCost, value: (objectData) => objectData?.overrideCost ? objectData?.costTaxRate : undefined, columnWidth: 150 }, { name: 'price', label: 'Price', required: false, type: 'number', prefix: '£', min: 0, step: 0.1, disabled: (objectData) => !objectData?.overridePrice, readOnly: (objectData) => objectData?.overridePrice && objectData?.priceMode == 'margin', value: (objectData) => { if (!objectData?.overridePrice) return undefined const priceMode = objectData?.priceMode ?? objectData?.product?.priceMode const cost = objectData?.overrideCost ? objectData?.cost : objectData?.product?.cost const margin = objectData?.margin ?? objectData?.product?.margin if ( priceMode == 'margin' && margin !== undefined && margin !== null && cost != null ) { return (cost * (1 + margin / 100)).toFixed(2) || undefined } return objectData?.price }, columnWidth: 100 }, { name: 'priceWithTax', label: 'Price w/ Tax', required: false, readOnly: true, type: 'number', prefix: '£', min: 0, step: 0.01, disabled: (objectData) => !objectData?.overridePrice, value: (objectData) => { if (!objectData?.overridePrice) return undefined let price const priceMode = objectData?.priceMode ?? objectData?.product?.priceMode const cost = objectData?.overrideCost ? objectData?.cost : objectData?.product?.cost const margin = objectData?.margin ?? objectData?.product?.margin if (priceMode == 'margin' && margin != null && cost != null) { price = cost * (1 + margin / 100) } else { price = objectData?.price } if (!price) return 0 const taxRate = objectData?.priceTaxRate ?? objectData?.product?.priceTaxRate if (taxRate?.rateType == 'percentage') { return (price * (1 + taxRate?.rate / 100)).toFixed(2) || 0 } else if (taxRate?.rateType == 'amount') { return (price + taxRate?.rate).toFixed(2) || 0 } return price }, columnWidth: 150 }, { name: 'margin', label: 'Margin', required: false, type: 'number', disabled: (objectData) => !objectData?.overridePrice || objectData?.priceMode == 'amount', suffix: '%', min: 0, max: 100, step: 0.01, value: (objectData) => objectData?.overridePrice ? objectData?.margin : undefined, columnWidth: 85 }, { name: 'priceTaxRate', label: 'Price Tax Rate', required: false, type: 'object', objectType: 'taxRate', showHyperlink: true, disabled: (objectData) => !objectData?.overridePrice, value: (objectData) => objectData?.overridePrice ? objectData?.priceTaxRate : undefined, columnWidth: 150 }, { name: 'parts', label: 'Parts', type: 'objectChildren', size: 'medium', properties: [ { name: 'part', label: 'Part', type: 'object', objectType: 'part', required: true, showHyperlink: true }, { name: 'partSku', label: 'Part SKU', type: 'object', objectType: 'partSku', required: true, showHyperlink: true, masterFilter: (objectData) => { const partId = objectData?.part?._id if (partId == null) return {} return { part: partId } } }, { name: 'quantity', label: 'Quantity', type: 'number', required: true } ], rollups: [ { name: 'totalQuantity', label: 'Total', type: 'number', property: 'quantity', value: (objectData) => { return objectData?.parts?.reduce( (acc, part) => acc + part.quantity, 0 ) } } ] } ] }