/**
* FX-CRM 物件對照表
*
* 包含:
* 1. 物件 API 名稱 → 分類
* 2. 物件 API 名稱 → 商機關聯欄位
*/
import { ObjectCategory } from './types.js'
/** 物件資訊 */
export interface ObjectInfo {
/** 中文名稱 */
name: string
/** 分類 */
category: ObjectCategory
/** 商機關聯欄位(用於權限檢查) */
opportunityField?: string
/** 是否透過其他物件間接關聯商機 */
indirectOpportunity?: {
/** 關聯欄位 */
field: string
/** 關聯物件 */
object: string
}
}
/** 物件對照表 */
export const OBJECT_INFO_MAP: Record<string, ObjectInfo> = {
// ==================== 純料業務流程 ====================
'object_hX8zM__c': {
name: '採購單(採購計劃)',
category: ObjectCategory.PURE_MATERIAL,
opportunityField: 'field_21eo7__c',
},
'object_UZy4k__c': {
name: '採購單明細',
category: ObjectCategory.PURE_MATERIAL,
indirectOpportunity: {
field: 'field_tKx1L__c',
object: 'object_hX8zM__c',
},
},
'object_ijT28__c': {
name: '銷貨單',
category: ObjectCategory.PURE_MATERIAL,
opportunityField: 'field_21eo7__c',
},
'object_Xr131__c': {
name: '銷貨單明細',
category: ObjectCategory.PURE_MATERIAL,
indirectOpportunity: {
field: 'field_w10Xz__c',
object: 'object_ijT28__c',
},
},
'ReturnedGoodsInvoiceObj': {
name: '退貨單',
category: ObjectCategory.PURE_MATERIAL,
},
'ReturnedGoodsInvoiceProductObj': {
name: '退貨單產品',
category: ObjectCategory.PURE_MATERIAL,
},
'object_w6sBU__c': {
name: '雜項支出',
category: ObjectCategory.PURE_MATERIAL,
opportunityField: 'field_z170D__c',
},
'object_qQiNd__c': {
name: '雜項支出明細',
category: ObjectCategory.PURE_MATERIAL,
indirectOpportunity: {
field: 'field_8mqeF__c',
object: 'object_w6sBU__c',
},
},
'RefundObj': {
name: '退款',
category: ObjectCategory.PURE_MATERIAL,
},
'hengying_logistics_order__c': {
name: '和穎物流單',
category: ObjectCategory.PURE_MATERIAL,
},
// ==================== 工程業務流程 ====================
'object_bfeui__c': {
name: 'SPC工單',
category: ObjectCategory.ENGINEERING,
opportunityField: 'field_Dcob1__c',
},
'object_k1XqG__c': {
name: 'SPC維修單',
category: ObjectCategory.ENGINEERING,
opportunityField: 'field_sxZVc__c',
},
'object_xf87w__c': {
name: 'SPC工單維修請款單',
category: ObjectCategory.ENGINEERING,
opportunityField: 'field_8sc98__c',
},
'object_eDSNp__c': {
name: 'SPC工單維修請款單明細',
category: ObjectCategory.ENGINEERING,
indirectOpportunity: {
field: 'field_n2m8a__c',
object: 'object_xf87w__c',
},
},
'object_8W9cb__c': {
name: '案場(SPC)',
category: ObjectCategory.ENGINEERING,
opportunityField: 'field_1P96q__c',
},
'object_50HJ8__c': {
name: '工地師父',
category: ObjectCategory.ENGINEERING,
},
'progress_management_announ__c': {
name: '進度管理公告',
category: ObjectCategory.ENGINEERING,
},
'engineering_management_cor__c': {
name: '工程專案角色',
category: ObjectCategory.ENGINEERING,
},
// ==================== 統包管理 ====================
'construction_unit__c': {
name: '施工單位',
category: ObjectCategory.PACKAGE,
opportunityField: 'business_opportunity__c',
},
'space__c': {
name: '空間',
category: ObjectCategory.PACKAGE,
indirectOpportunity: {
field: 'construction_unit__c',
object: 'construction_unit__c',
},
},
'construction__c': {
name: '工程',
category: ObjectCategory.PACKAGE,
opportunityField: 'business_opportunity__c',
},
'construction_procedure__c': {
name: '工序',
category: ObjectCategory.PACKAGE,
},
'work_type__c': {
name: '工程類別',
category: ObjectCategory.PACKAGE,
},
'work_item__c': {
name: '統包工項',
category: ObjectCategory.PACKAGE,
opportunityField: 'business_opportunity__c',
},
'bathroom_cabinet_installat__c': {
name: '浴櫃安裝',
category: ObjectCategory.PACKAGE,
},
// ==================== 元心人工作 ====================
'JournalObj': {
name: '日志',
category: ObjectCategory.PERSONNEL,
},
'ActiveRecordObj': {
name: '銷售跟進記錄',
category: ObjectCategory.PERSONNEL,
},
'ScheduleObj': {
name: '日程',
category: ObjectCategory.PERSONNEL,
},
'object_2Pj2d__c': {
name: '元心人申請',
category: ObjectCategory.PERSONNEL,
},
'PersonnelObj': {
name: '人員',
category: ObjectCategory.PERSONNEL,
},
'CheckinsObj': {
name: '高級外勤',
category: ObjectCategory.PERSONNEL,
},
'cleaning_work__c': {
name: '掃除工作',
category: ObjectCategory.PERSONNEL,
},
// ==================== 獎金(特殊處理)====================
'object_11NI1__c': {
name: '獎金',
category: ObjectCategory.BONUS,
opportunityField: 'field_02F0d__c',
},
'bonus_details__c': {
name: '獎金明細',
category: ObjectCategory.BONUS,
indirectOpportunity: {
field: 'field_MaUfc__c',
object: 'object_11NI1__c',
},
},
// ==================== 客戶管理 ====================
'AccountObj': {
name: '客戶',
category: ObjectCategory.CUSTOMER,
},
'ContactObj': {
name: '連絡人',
category: ObjectCategory.CUSTOMER,
},
'PartnerObj': {
name: '合作伙伴',
category: ObjectCategory.CUSTOMER,
},
// ==================== 商機管理 ====================
'NewOpportunityObj': {
name: '商機',
category: ObjectCategory.OPPORTUNITY,
// 商機本身就是商機
},
'NewOpportunityLinesObj': {
name: '商機明細',
category: ObjectCategory.OPPORTUNITY,
},
'NewOpportunityContactsObj': {
name: '商機連絡人',
category: ObjectCategory.OPPORTUNITY,
},
'QuoteObj': {
name: '報價單',
category: ObjectCategory.OPPORTUNITY,
},
'QuoteLinesObj': {
name: '報價單明細',
category: ObjectCategory.OPPORTUNITY,
},
'SalesOrderObj': {
name: '訂單合約',
category: ObjectCategory.OPPORTUNITY,
},
'SalesOrderProductObj': {
name: '訂單產品',
category: ObjectCategory.OPPORTUNITY,
},
// ==================== 其他案場相關 ====================
'site_problem_report__c': {
name: '案場狀況回報',
category: ObjectCategory.ENGINEERING,
},
}
/**
* 取得物件資訊
*/
export function getObjectInfo(objectApiName: string): ObjectInfo | null {
return OBJECT_INFO_MAP[objectApiName] || null
}
/**
* 取得物件的商機關聯欄位
*/
export function getOpportunityField(objectApiName: string): string | null {
const info = OBJECT_INFO_MAP[objectApiName]
return info?.opportunityField || null
}
/**
* 取得用於過濾的商機關聯欄位(用於查詢時)
* 如果物件沒有直接商機欄位,返回預設值 'opportunity_id__c'
*/
export function getOpportunityFilterField(objectApiName: string): string {
const info = OBJECT_INFO_MAP[objectApiName]
return info?.opportunityField || 'opportunity_id__c'
}
/**
* 取得物件的分類
*/
export function getObjectCategory(objectApiName: string): ObjectCategory | null {
const info = OBJECT_INFO_MAP[objectApiName]
return info?.category || null
}
/**
* 判斷是否為獎金物件
*/
export function isBonusObject(objectApiName: string): boolean {
return getObjectCategory(objectApiName) === ObjectCategory.BONUS
}
/** 所有人可編輯的物件分類(工程業務流程 + 統包管理) */
export const PUBLIC_EDITABLE_CATEGORIES = [
ObjectCategory.ENGINEERING,
ObjectCategory.PACKAGE,
]
/**
* 判斷是否為所有人可編輯的物件(工程/統包物件)
*/
export function isPublicEditable(objectApiName: string): boolean {
const category = getObjectCategory(objectApiName)
if (!category) return false
return PUBLIC_EDITABLE_CATEGORIES.includes(category)
}
/**
* @deprecated 使用 isPublicEditable 替代
*/
export function isConstructionEditable(objectApiName: string): boolean {
return isPublicEditable(objectApiName)
}