export default { // Page titles & navigation title: 'Sales Forecast Management', list: 'Forecast Order List', create: 'New Forecast Order', edit: 'Edit Forecast Order', overview: 'Forecast Overview', // === List column labels (flat keys for template) === addForecast: 'New Forecast', all: 'All', foStatus: 'Status', forecastOrderNo: 'Forecast Order No.', forecastOrderType: 'Type', tradeType: 'Trade Type', customerCode: 'Customer Code', customerName: 'Customer Name', productCode: 'Product Code', productName: 'Product Name', productCategory: 'Category', materialLevel: 'Material Level', forecastQty: 'Forecast Qty (kg)', unit: 'Unit', expectedDeliveryDate: 'Delivery Date', convertedQty: 'Converted Qty', remainingQty: 'Remaining Qty', submitter: 'Submitter', submitTime: 'Submit Time', creationDate: 'Create Time', // === Action buttons (flat keys) === discard: 'Discard', delete: 'Delete', submit: 'Submit', resubmit: 'Resubmit', withdraw: 'Withdraw', addChange: 'Change Request', convertToFo: 'Transfer to FO', convertQty: 'Transfer Qty', lowCarbonRatio: 'Low-Carbon Ratio', reject: 'Reject', rejectReason: 'Rejection Reason', accept: 'Accept', planSuggestedQty: 'Suggested Qty', planReplyDate: 'Planned Date', planReplyComment: 'Reply Comment', overviewPage: { byCustomer: 'By Customer', byProduct: 'By Product', byTime: 'By Time', dimensionValue: 'Dimension Value', orderCount: 'Order Count', totalDemand: 'Total Demand (kg)', convertedTotal: 'Converted Total (kg)', remainingTotal: 'Remaining Total (kg)', viewDetail: 'View Detail', }, systemConfig: 'Forecast Parameter Config', changeOrder: 'Forecast Change Management', // Status labels status: { DRAFT: 'Draft', SUBMITTED: 'Submitted', REJECTED: 'Rejected', PLAN_RECEIVED: 'Plan Received', SCHEDULED: 'Scheduled - Pending Transfer', PARTIAL_CONVERTED: 'Partially Converted', FULL_CONVERTED: 'Fully Converted', RELEASED: 'Released', DISCARDED: 'Discarded', // Change order status CHANGE_DRAFT: 'Draft', CHANGE_SUBMITTED: 'Submitted', CHANGE_CHANGED: 'Changed', CHANGE_REJECTED: 'Rejected', CHANGE_DISCARDED: 'Discarded', }, // List page listPage: { search: 'Search', reset: 'Reset', forecastOrderNo: 'Forecast Order No.', customerCode: 'Customer Code', customerName: 'Customer Name', productCode: 'Product Code', productName: 'Product Name', productCategory: 'Product Category', status: 'Status', submitter: 'Submitter', submitTime: 'Submit Time', createTime: 'Create Time', updateTime: 'Update Time', tradeType: 'Trade Type', noData: 'No forecast orders', createNew: 'New Forecast Order', action: 'Actions', total: 'Total {total} records', selectStatus: 'Select status', selectProductCategory: 'Select product category', notGenerated: 'Not Generated', changeInProgress: 'Change In Progress', pendingBadge: 'Pending', }, // Form form: { saveDraft: 'Save Draft', submit: 'Submit for Review', update: 'Save', cancel: 'Cancel', // Customer info customerInfo: 'Customer Information', selectCustomer: 'Select Customer', customerCode: 'Customer Code', customerName: 'Customer Name', groupCustomerCode: 'Group Customer Code', groupCustomerName: 'Group Customer Name', // Product info productInfo: 'Product Information', selectProduct: 'Select Product', productCode: 'Product Code', productName: 'Product Name', productCategory: 'Product Category', materialLevel: 'Material Level', standardization: 'Standardization', minOrderQty: 'Min Order Qty', // Supplement info supplementInfo: 'Supplement Information', // Demand info demandInfo: 'Demand Information', tradeType: 'Trade Type', forecastQty: 'Forecast Quantity (kg)', shippingPoint: 'Expected Shipping Point', expectedDeliveryDate: 'Expected Delivery Date', customsManualNo: 'Customs Bonded Manual No.', rawMaterialOrigin: 'Raw Material Origin Requirement', lowCarbonRatio: 'Low-Carbon Ratio', processingFlag: 'Processing Trade Flag', designatedFactory: 'Designated Factory', reasonDesc: 'Reason Description', // Validation required: 'This field is required', forecastQtyRequired: 'Forecast quantity is required', forecastQtyPositive: 'Forecast quantity must be greater than 0', customerRequired: 'Please select a customer', productRequired: 'Please select a product', deliveryDateRequired: 'Expected delivery date is required', advanceDaysHint: 'Must be >= today + advance days (configurable, currently {0} days)', advanceDaysError: 'Expected delivery date does not meet the advance deadline (>= today + {0} days)', moqConfirm: 'Current quantity is below MOQ ({0} kg). Confirm submission?', // Unit unit: 'kg', // Selector customerStopped: 'This customer has been deactivated and is not selectable', productDiscontinued: 'This product has been discontinued and is not selectable', }, // Detail drawer detail: { title: 'Forecast Order Detail', basicInfo: 'Basic Information', customerInfo: 'Customer Information', materialInfo: 'Material Demand Information', reviewInfo: 'Review Information', rejectInfo: 'Rejection Reason', feedingInfo: 'Feeding Information', transferInfo: 'Transfer Information', changeHistory: 'Change History', forecastOrderNo: 'Forecast Order No.', forecastOrderType: 'Forecast Order Type', status: 'Status', submitter: 'Submitter', submitTime: 'Submit Time', forecastReplyTime: 'Forecast Reply Time', planSuggestedQty: 'Suggested Qty (kg)', planReplyDate: 'Planned Delivery Date', planReplyComment: 'Reply Comment', rejectReason: 'Rejection Reason', actualScheduleQty: 'Actual Scheduled Qty (kg)', convertedQty: 'Converted Qty (kg)', releasedQty: 'Released Qty (kg)', remainingQty: 'Remaining Qty to Convert (kg)', relatedSoNos: 'Related SO No.', forceConvertDeadline: 'Force Convert Deadline', changeOrderNo: 'Change Order No.', changeStatus: 'Change Status', changeSummary: 'Change Summary', applicant: 'Applicant', applyTime: 'Apply Time', }, // Action buttons action: { detail: 'Detail', edit: 'Edit', delete: 'Delete', withdraw: 'Withdraw', submitChange: 'Request Change', convertToOrder: 'Convert to Order', discard: 'Discard', review: 'Review', approve: 'Approve', resubmit: 'Resubmit', // Review reviewAccept: 'Accept', reviewReject: 'Reject', planSuggestedQty: 'Suggested Qty', planReplyDate: 'Planned Delivery Date', planReplyComment: 'Reply Comment', replyTime: 'Reply Time', rejectReasonRequired: 'Rejection reason is required', // Approve approvePass: 'Approve', approveReject: 'Reject', approveComment: 'Approval Comment', }, // Change order change: { title: 'Forecast Change Request', snapshotArea: 'Original Information', changeFields: 'Change Fields', hint: 'Only filled fields will be changed; empty fields remain unchanged', newCustomer: 'New Customer', newCustomerName: 'New Customer Name', newDeliveryDate: 'New Delivery Date', newCustomsManualNo: 'New Customs Manual No.', releaseQty: 'Release Quantity (kg)', releaseQtyHint: 'Available to release: {0} kg', releaseQtyExceeded: 'Release quantity cannot exceed remaining quantity ({0} kg)', noChangeableProduct: 'Product type cannot be changed', customerStoppedError: 'Target customer has been deactivated and cannot be changed to', activeChangeExists: 'An active change order exists for this forecast. Please resolve it first.', nonStandardNoRelease: 'Non-standard products do not support quantity release', // Approval approveTitle: 'Change Approval', compareArea: 'Change Comparison', original: 'Original', changed: 'Changed', noChanges: 'No Changes', }, // Transfer transfer: { title: 'Forecast to Order Transfer', confirmMessage: 'Confirm to convert the following forecast to sales order?', customer: 'Customer', product: 'Product', remainingQty: 'Remaining Qty', jumpToM07: 'After confirmation, you will be redirected to M07 SO creation page', notScheduledError: 'Only scheduled or partially-converted forecasts can be transferred', releasedError: 'Released forecasts cannot be transferred', convertSuccess: 'Transfer succeeded', demoMode: 'Demo mode - simulated transfer success', }, // System config config: { title: 'Forecast Parameter Configuration', currentParams: 'Current Parameters', advanceDays: 'Advance Days', advanceDaysDesc: 'Required lead time for forecast submission (1-365 days)', forceConvertDays: 'Force Convert Days', forceConvertDaysDesc: 'Auto-release period for overdue standard products after scheduling (1-180 days)', lastModifiedBy: 'Last Modified By', lastModifiedTime: 'Last Modified Time', modifyRecord: 'Modification History', modifyDescription: 'Modification Description', save: 'Save Configuration', noChange: 'No changes detected, nothing to save', advanceDaysError: 'Advance days must be between 1 and 365', forceConvertDaysError: 'Force convert days must be between 1 and 180', forceConvertRiskWarning: 'Changing force convert days will affect the auto-release timing of all scheduled standard products. Confirm to proceed?', }, // Selector selector: { customerTitle: 'Select Customer', productTitle: 'Select Product', search: 'Search', code: 'Code', name: 'Name', tradeType: 'Trade Type', status: 'Status', productCategory: 'Product Category', noData: 'No data', confirm: 'Confirm Selection', }, // Error messages error: { loadFailed: 'Failed to load data', saveFailed: 'Failed to save', submitFailed: 'Failed to submit', deleteFailed: 'Failed to delete', versionConflict: 'Data has been modified by another user. Please refresh and try again.', networkError: 'Network error. Please try again later.', unknownError: 'Unknown error', // Backend error code mapping '3103_crm_forecast_order_001': 'Forecast order ID is required', '3103_crm_forecast_order_002': 'Customer code is required', '3103_crm_forecast_order_003': 'Product code is required', '3103_crm_forecast_order_004': 'Material level is required', '3103_crm_forecast_order_005': 'Forecast quantity is required', '3103_crm_forecast_order_006': 'Forecast quantity must be a positive number', '3103_crm_forecast_order_007': 'Expected delivery date is required', '3103_crm_forecast_order_008': 'Reason description must not exceed 500 characters', '3103_crm_forecast_order_010': 'Expected delivery date does not meet the advance deadline', '3103_crm_forecast_order_011': 'Only submitted forecasts can be reviewed', '3103_crm_forecast_order_012': 'Released forecast orders cannot be transferred', '3103_crm_forecast_order_013': 'Only scheduled or partially-converted forecasts can be transferred', '3103_crm_forecast_order_014': 'Drafts without order numbers can be physically deleted; drafts with numbers should be discarded', '3103_crm_forecast_order_015': 'Review information is incomplete. Please check suggested quantity and reply date.', '3103_crm_forecast_order_016': 'Rejection reason is required', '3103_crm_forecast_change_order_001': 'Change order ID is required', '3103_crm_forecast_change_order_002': 'Related forecast order ID is required', '3103_crm_forecast_change_order_010': 'An active change order exists. Please resolve it first.', '3103_crm_forecast_change_order_011': 'Release quantity cannot exceed remaining transferable quantity', '3103_crm_forecast_change_order_012': 'Target customer has been deactivated and cannot be changed to', '3103_crm_forecast_change_order_013': 'Non-standard products do not support quantity release', '3103_crm_forecast_config_001': 'Config key is required', '3103_crm_forecast_config_002': 'Config value is required', '3103_crm_forecast_config_003': 'Config value is out of valid range', }, // Enum display values enum: { tradeType: { DOMESTIC: 'Domestic', EXPORT: 'Export', }, forecastOrderType: { NORMAL: 'Standard', }, standardization: { STANDARD: 'Standard', NON_STANDARD: 'Non-Standard', }, materialLevel: { FINISHED: 'Finished', INGOT: 'Ingot', COLD_ROLLED: 'Cold Rolled', }, shippingPoint: { SHANGHAI: 'Shanghai', CHONGQING: 'Chongqing', }, processingFlag: { 0: 'No', 1: 'Yes', }, }, // Common common: { confirm: 'Confirm', cancel: 'Cancel', close: 'Close', yes: 'Yes', no: 'No', loading: 'Loading...', today: 'Today', empty: 'No Data', }, // Toast messages toast: { saveDraftSuccess: 'Draft saved successfully', submitSuccess: 'Submitted for review', updateSuccess: 'Updated successfully', withdrawSuccess: 'Withdrawn successfully', discardSuccess: 'Discarded successfully', deleteSuccess: 'Deleted successfully', reviewAcceptSuccess: 'Accepted successfully', reviewRejectSuccess: 'Rejected successfully', resubmitSuccess: 'Resubmitted successfully', convertToFoSuccess: 'Transfer succeeded', changeDraftSaved: 'Change draft saved', changeSubmitted: 'Change request submitted', approveSuccess: 'Approved', rejectSuccess: 'Rejected', rejectReasonRequired: 'Rejection reason is required', }, // Confirm dialogs confirm: { tip: 'Tip', submit: 'Confirm to submit this forecast order?', withdraw: 'Confirm to withdraw this forecast order?', discard: 'Confirm to discard this forecast order? This cannot be undone.', delete: 'Confirm to delete this draft? This cannot be undone.', resubmit: 'Confirm to resubmit this forecast order?', }, // Validation validation: { customerRequired: 'Please select a customer', productRequired: 'Please select a product', forecastQtyRequired: 'Forecast quantity must be greater than 0', deliveryDateRequired: 'Expected delivery date is required', convertQtyRequired: 'Transfer quantity is required', convertQtyExceeded: 'Transfer quantity cannot exceed remaining', convertQtyPositive: 'Transfer quantity must be greater than 0', rejectReasonRequired: 'Rejection reason is required', releaseQtyExceeded: 'Release quantity cannot exceed remaining ({remaining} kg)', releaseQtyPositive: 'Release quantity must be greater than 0', noChangeField: 'Please fill in at least one change field', }, }