Files
erp/crates/erp-plugin-freelance/plugin.toml

1080 lines
24 KiB
TOML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 自由职业者工作台 — plugin.toml
# 汕头市智界科技有限公司 IT 服务行业插件
[metadata]
id = "erp-freelance"
name = "自由职业者工作台"
version = "0.1.0"
description = "一人 IT 服务公司的全链路业务管理:客户→商机→报价→合同→项目→工时→开票→收支"
author = "ERP Platform"
min_platform_version = "0.1.0"
# ── 权限声明10 实体 × 2 = 20 个权限码)──
[[permissions]]
code = "client.list"
name = "查看客户"
description = "查看客户列表和详情"
[[permissions]]
code = "client.manage"
name = "管理客户"
description = "创建、编辑、删除客户"
[[permissions]]
code = "opportunity.list"
name = "查看商机"
description = "查看商机列表和详情"
[[permissions]]
code = "opportunity.manage"
name = "管理商机"
description = "创建、编辑、删除商机"
[[permissions]]
code = "quote.list"
name = "查看报价"
description = "查看报价单列表和详情"
[[permissions]]
code = "quote.manage"
name = "管理报价"
description = "创建、编辑、删除报价单"
[[permissions]]
code = "quote_line.list"
name = "查看报价明细"
description = "查看报价明细列表"
[[permissions]]
code = "quote_line.manage"
name = "管理报价明细"
description = "创建、编辑、删除报价明细"
[[permissions]]
code = "contract.list"
name = "查看合同"
description = "查看合同列表和详情"
[[permissions]]
code = "contract.manage"
name = "管理合同"
description = "创建、编辑、删除合同"
[[permissions]]
code = "project.list"
name = "查看项目"
description = "查看项目列表和详情"
[[permissions]]
code = "project.manage"
name = "管理项目"
description = "创建、编辑、删除项目"
[[permissions]]
code = "task.list"
name = "查看任务"
description = "查看任务列表和详情"
[[permissions]]
code = "task.manage"
name = "管理任务"
description = "创建、编辑、删除任务"
[[permissions]]
code = "time_entry.list"
name = "查看工时"
description = "查看工时记录列表"
[[permissions]]
code = "time_entry.manage"
name = "管理工时"
description = "创建、编辑、删除工时记录"
[[permissions]]
code = "invoice.list"
name = "查看发票"
description = "查看发票/收款列表和详情"
[[permissions]]
code = "invoice.manage"
name = "管理发票"
description = "创建、编辑、删除发票/收款记录"
[[permissions]]
code = "expense.list"
name = "查看支出"
description = "查看支出列表和详情"
[[permissions]]
code = "expense.manage"
name = "管理支出"
description = "创建、编辑、删除支出记录"
# ── 实体定义 ──
# ── 2.3.1 client客户──
[[schema.entities]]
name = "client"
display_name = "客户"
is_public = true
[[schema.entities.fields]]
name = "name"
field_type = "string"
required = true
display_name = "客户名称"
searchable = true
[[schema.entities.fields]]
name = "contact_name"
field_type = "string"
display_name = "联系人"
[[schema.entities.fields]]
name = "phone"
field_type = "string"
display_name = "电话"
[[schema.entities.fields]]
name = "email"
field_type = "string"
display_name = "邮箱"
[[schema.entities.fields]]
name = "industry"
field_type = "string"
display_name = "行业"
ui_widget = "select"
filterable = true
options = [
{ label = "制造业", value = "manufacturing" },
{ label = "零售", value = "retail" },
{ label = "教育", value = "education" },
{ label = "医疗", value = "healthcare" },
{ label = "政府", value = "government" },
{ label = "金融", value = "finance" },
{ label = "其他", value = "other" }
]
[[schema.entities.fields]]
name = "source"
field_type = "string"
display_name = "来源"
ui_widget = "select"
options = [
{ label = "转介绍", value = "referral" },
{ label = "线上", value = "online" },
{ label = "展会", value = "exhibition" },
{ label = "老客户", value = "repeat" },
{ label = "主动开发", value = "outreach" }
]
[[schema.entities.fields]]
name = "level"
field_type = "string"
display_name = "重要等级"
ui_widget = "select"
filterable = true
options = [
{ label = "A", value = "a" },
{ label = "B", value = "b" },
{ label = "C", value = "c" }
]
[[schema.entities.fields]]
name = "status"
field_type = "string"
required = true
display_name = "状态"
ui_widget = "select"
filterable = true
default = "potential"
options = [
{ label = "潜在", value = "potential" },
{ label = "活跃", value = "active" },
{ label = "休眠", value = "dormant" },
{ label = "流失", value = "lost" }
]
[[schema.entities.fields]]
name = "address"
field_type = "string"
display_name = "地址"
[[schema.entities.fields]]
name = "notes"
field_type = "string"
display_name = "备注"
ui_widget = "textarea"
# ── 2.3.2 opportunity商机──
[[schema.entities]]
name = "opportunity"
display_name = "商机"
[[schema.entities.fields]]
name = "client_id"
field_type = "uuid"
required = true
display_name = "客户"
ui_widget = "entity_select"
ref_entity = "client"
ref_label_field = "name"
ref_search_fields = ["name"]
[[schema.entities.fields]]
name = "title"
field_type = "string"
required = true
display_name = "商机名称"
searchable = true
[[schema.entities.fields]]
name = "business_type"
field_type = "string"
required = true
display_name = "业务类型"
ui_widget = "select"
filterable = true
options = [
{ label = "软件开发", value = "software_development" },
{ label = "AI 开发", value = "ai_development" },
{ label = "系统集成", value = "system_integration" },
{ label = "软件外包", value = "software_outsourcing" },
{ label = "IT 咨询", value = "it_consulting" },
{ label = "数字内容", value = "digital_content" },
{ label = "营销策划", value = "marketing_planning" }
]
[[schema.entities.fields]]
name = "stage"
field_type = "string"
required = true
display_name = "阶段"
ui_widget = "select"
filterable = true
default = "visit"
options = [
{ label = "初访", value = "visit" },
{ label = "需求确认", value = "requirement" },
{ label = "报价", value = "quote" },
{ label = "谈判", value = "negotiation" },
{ label = "成交", value = "won" },
{ label = "失败", value = "lost" }
]
[[schema.entities.fields]]
name = "estimated_amount"
field_type = "decimal"
display_name = "预估金额"
sortable = true
[[schema.entities.fields]]
name = "probability"
field_type = "integer"
display_name = "成交概率(%)"
[[schema.entities.fields]]
name = "expected_close_date"
field_type = "date"
display_name = "预计成交日期"
[[schema.entities.fields]]
name = "next_follow_up"
field_type = "date"
display_name = "下次跟进日期"
[[schema.entities.fields]]
name = "description"
field_type = "string"
display_name = "需求描述"
ui_widget = "textarea"
# ── 2.3.3 quote报价单──
[[schema.entities]]
name = "quote"
display_name = "报价单"
[[schema.entities.fields]]
name = "client_id"
field_type = "uuid"
required = true
display_name = "客户"
ui_widget = "entity_select"
ref_entity = "client"
ref_label_field = "name"
ref_search_fields = ["name"]
[[schema.entities.fields]]
name = "opportunity_id"
field_type = "uuid"
display_name = "关联商机"
ref_entity = "opportunity"
[[schema.entities.fields]]
name = "quote_number"
field_type = "string"
required = true
display_name = "报价单号"
unique = true
[[schema.entities.fields]]
name = "status"
field_type = "string"
required = true
display_name = "状态"
ui_widget = "select"
filterable = true
default = "draft"
options = [
{ label = "草稿", value = "draft" },
{ label = "已发送", value = "sent" },
{ label = "已接受", value = "accepted" },
{ label = "已拒绝", value = "rejected" },
{ label = "已过期", value = "expired" }
]
[[schema.entities.fields]]
name = "valid_until"
field_type = "date"
display_name = "有效期至"
[[schema.entities.fields]]
name = "subtotal"
field_type = "decimal"
display_name = "小计"
sortable = true
[[schema.entities.fields]]
name = "tax_rate"
field_type = "decimal"
display_name = "税率(%)"
[[schema.entities.fields]]
name = "total_amount"
field_type = "decimal"
display_name = "总金额"
sortable = true
[[schema.entities.fields]]
name = "notes"
field_type = "string"
display_name = "备注"
ui_widget = "textarea"
[[schema.entities.relations]]
entity = "quote_line"
foreign_key = "quote_id"
on_delete = "cascade"
name = "lines"
type = "one_to_many"
display_field = "item_name"
# ── 2.3.4 quote_line报价明细行──
[[schema.entities]]
name = "quote_line"
display_name = "报价明细"
[[schema.entities.fields]]
name = "quote_id"
field_type = "uuid"
required = true
display_name = "报价单"
ref_entity = "quote"
[[schema.entities.fields]]
name = "item_name"
field_type = "string"
required = true
display_name = "项目名称"
[[schema.entities.fields]]
name = "description"
field_type = "string"
display_name = "描述"
[[schema.entities.fields]]
name = "quantity"
field_type = "decimal"
required = true
display_name = "数量"
default = 1
[[schema.entities.fields]]
name = "unit_price"
field_type = "decimal"
required = true
display_name = "单价"
[[schema.entities.fields]]
name = "unit"
field_type = "string"
display_name = "单位"
ui_widget = "select"
default = "project"
options = [
{ label = "项目", value = "project" },
{ label = "人月", value = "person_month" },
{ label = "人天", value = "person_day" },
{ label = "小时", value = "hour" },
{ label = "个", value = "piece" },
{ label = "套", value = "set" }
]
[[schema.entities.fields]]
name = "amount"
field_type = "decimal"
display_name = "金额"
# ── 2.3.5 contract合同──
[[schema.entities]]
name = "contract"
display_name = "合同"
[[schema.entities.fields]]
name = "client_id"
field_type = "uuid"
required = true
display_name = "客户"
ui_widget = "entity_select"
ref_entity = "client"
ref_label_field = "name"
ref_search_fields = ["name"]
[[schema.entities.fields]]
name = "opportunity_id"
field_type = "uuid"
display_name = "关联商机"
ref_entity = "opportunity"
[[schema.entities.fields]]
name = "quote_id"
field_type = "uuid"
display_name = "关联报价"
ref_entity = "quote"
[[schema.entities.fields]]
name = "contract_number"
field_type = "string"
required = true
display_name = "合同编号"
unique = true
[[schema.entities.fields]]
name = "title"
field_type = "string"
required = true
display_name = "合同名称"
searchable = true
[[schema.entities.fields]]
name = "type"
field_type = "string"
required = true
display_name = "合同类型"
ui_widget = "select"
filterable = true
options = [
{ label = "开发合同", value = "development" },
{ label = "集成合同", value = "integration" },
{ label = "外包合同", value = "outsourcing" },
{ label = "咨询合同", value = "consulting" },
{ label = "维保合同", value = "maintenance" },
{ label = "销售合同", value = "sales" },
{ label = "其他", value = "other" }
]
[[schema.entities.fields]]
name = "status"
field_type = "string"
required = true
display_name = "状态"
ui_widget = "select"
filterable = true
default = "drafting"
options = [
{ label = "草拟中", value = "drafting" },
{ label = "待签署", value = "pending_signature" },
{ label = "执行中", value = "active" },
{ label = "已完成", value = "completed" },
{ label = "已终止", value = "terminated" }
]
[[schema.entities.fields]]
name = "amount"
field_type = "decimal"
required = true
display_name = "合同金额"
sortable = true
[[schema.entities.fields]]
name = "paid_amount"
field_type = "decimal"
display_name = "已付金额"
default = 0
[[schema.entities.fields]]
name = "start_date"
field_type = "date"
display_name = "开始日期"
[[schema.entities.fields]]
name = "end_date"
field_type = "date"
display_name = "结束日期"
[[schema.entities.fields]]
name = "payment_terms"
field_type = "string"
display_name = "付款条款"
[[schema.entities.fields]]
name = "notes"
field_type = "string"
display_name = "备注"
ui_widget = "textarea"
# ── 2.3.6 project项目──
[[schema.entities]]
name = "project"
display_name = "项目"
[[schema.entities.fields]]
name = "client_id"
field_type = "uuid"
required = true
display_name = "客户"
ui_widget = "entity_select"
ref_entity = "client"
ref_label_field = "name"
ref_search_fields = ["name"]
[[schema.entities.fields]]
name = "contract_id"
field_type = "uuid"
display_name = "关联合同"
ref_entity = "contract"
[[schema.entities.fields]]
name = "opportunity_id"
field_type = "uuid"
display_name = "关联商机"
ref_entity = "opportunity"
[[schema.entities.fields]]
name = "name"
field_type = "string"
required = true
display_name = "项目名称"
searchable = true
[[schema.entities.fields]]
name = "business_type"
field_type = "string"
display_name = "业务类型"
ui_widget = "select"
filterable = true
options = [
{ label = "软件开发", value = "software_development" },
{ label = "AI 开发", value = "ai_development" },
{ label = "系统集成", value = "system_integration" },
{ label = "软件外包", value = "software_outsourcing" },
{ label = "IT 咨询", value = "it_consulting" },
{ label = "数字内容", value = "digital_content" },
{ label = "营销策划", value = "marketing_planning" }
]
[[schema.entities.fields]]
name = "deliverable_type"
field_type = "string"
display_name = "交付物类型"
ui_widget = "select"
options = [
{ label = "软件", value = "software" },
{ label = "网站", value = "website" },
{ label = "小程序", value = "miniprogram" },
{ label = "视频", value = "video" },
{ label = "设计稿", value = "design" },
{ label = "文档", value = "document" },
{ label = "咨询报告", value = "consulting_report" }
]
[[schema.entities.fields]]
name = "status"
field_type = "string"
required = true
display_name = "状态"
ui_widget = "select"
filterable = true
default = "pending"
options = [
{ label = "待开始", value = "pending" },
{ label = "进行中", value = "in_progress" },
{ label = "已交付", value = "delivered" },
{ label = "验收中", value = "accepting" },
{ label = "已完成", value = "completed" },
{ label = "已搁置", value = "shelved" }
]
[[schema.entities.fields]]
name = "start_date"
field_type = "date"
display_name = "开始日期"
[[schema.entities.fields]]
name = "end_date"
field_type = "date"
display_name = "截止日期"
[[schema.entities.fields]]
name = "contract_amount"
field_type = "decimal"
display_name = "合同金额"
sortable = true
[[schema.entities.fields]]
name = "description"
field_type = "string"
display_name = "项目说明"
ui_widget = "textarea"
[[schema.entities.relations]]
entity = "task"
foreign_key = "project_id"
on_delete = "cascade"
name = "tasks"
type = "one_to_many"
display_field = "title"
[[schema.entities.relations]]
entity = "time_entry"
foreign_key = "project_id"
on_delete = "cascade"
name = "time_entries"
type = "one_to_many"
display_field = "description"
# ── 2.3.7 task任务──
[[schema.entities]]
name = "task"
display_name = "任务"
[[schema.entities.fields]]
name = "project_id"
field_type = "uuid"
required = true
display_name = "所属项目"
ui_widget = "entity_select"
ref_entity = "project"
ref_label_field = "name"
ref_search_fields = ["name"]
[[schema.entities.fields]]
name = "title"
field_type = "string"
required = true
display_name = "任务标题"
searchable = true
[[schema.entities.fields]]
name = "status"
field_type = "string"
required = true
display_name = "状态"
ui_widget = "select"
filterable = true
default = "todo"
options = [
{ label = "待办", value = "todo" },
{ label = "进行中", value = "in_progress" },
{ label = "已完成", value = "done" },
{ label = "已取消", value = "cancelled" }
]
[[schema.entities.fields]]
name = "priority"
field_type = "string"
required = true
display_name = "优先级"
ui_widget = "select"
filterable = true
default = "medium"
options = [
{ label = "紧急", value = "urgent" },
{ label = "高", value = "high" },
{ label = "中", value = "medium" },
{ label = "低", value = "low" }
]
[[schema.entities.fields]]
name = "due_date"
field_type = "date"
display_name = "截止日期"
[[schema.entities.fields]]
name = "estimated_hours"
field_type = "decimal"
display_name = "预估工时"
[[schema.entities.fields]]
name = "actual_hours"
field_type = "decimal"
display_name = "实际工时"
[[schema.entities.fields]]
name = "description"
field_type = "string"
display_name = "详细说明"
ui_widget = "textarea"
# ── 2.3.8 time_entry工时记录──
[[schema.entities]]
name = "time_entry"
display_name = "工时记录"
[[schema.entities.fields]]
name = "task_id"
field_type = "uuid"
display_name = "关联任务"
ui_widget = "entity_select"
ref_entity = "task"
ref_label_field = "title"
ref_search_fields = ["title"]
[[schema.entities.fields]]
name = "project_id"
field_type = "uuid"
required = true
display_name = "关联项目"
ui_widget = "entity_select"
ref_entity = "project"
ref_label_field = "name"
ref_search_fields = ["name"]
[[schema.entities.fields]]
name = "date"
field_type = "date"
required = true
display_name = "日期"
[[schema.entities.fields]]
name = "hours"
field_type = "decimal"
required = true
display_name = "时长(小时)"
[[schema.entities.fields]]
name = "description"
field_type = "string"
display_name = "工作内容"
# ── 2.3.9 invoice发票/收款)──
[[schema.entities]]
name = "invoice"
display_name = "发票/收款"
[[schema.entities.fields]]
name = "client_id"
field_type = "uuid"
required = true
display_name = "客户"
ui_widget = "entity_select"
ref_entity = "client"
ref_label_field = "name"
ref_search_fields = ["name"]
[[schema.entities.fields]]
name = "project_id"
field_type = "uuid"
display_name = "关联项目"
ref_entity = "project"
[[schema.entities.fields]]
name = "contract_id"
field_type = "uuid"
display_name = "关联合同"
ref_entity = "contract"
[[schema.entities.fields]]
name = "invoice_number"
field_type = "string"
required = true
display_name = "发票号"
unique = true
[[schema.entities.fields]]
name = "type"
field_type = "string"
required = true
display_name = "类型"
ui_widget = "select"
filterable = true
options = [
{ label = "开票", value = "invoice" },
{ label = "收款记录", value = "payment" }
]
[[schema.entities.fields]]
name = "amount"
field_type = "decimal"
required = true
display_name = "金额"
sortable = true
[[schema.entities.fields]]
name = "status"
field_type = "string"
required = true
display_name = "状态"
ui_widget = "select"
filterable = true
default = "pending"
options = [
{ label = "待开票", value = "pending" },
{ label = "已开票", value = "issued" },
{ label = "部分收款", value = "partial" },
{ label = "已收款", value = "paid" },
{ label = "已逾期", value = "overdue" }
]
[[schema.entities.fields]]
name = "issue_date"
field_type = "date"
display_name = "开票日期"
[[schema.entities.fields]]
name = "due_date"
field_type = "date"
display_name = "到期日"
[[schema.entities.fields]]
name = "payment_date"
field_type = "date"
display_name = "实际收款日期"
[[schema.entities.fields]]
name = "notes"
field_type = "string"
display_name = "备注"
ui_widget = "textarea"
# ── 2.3.10 expense支出──
[[schema.entities]]
name = "expense"
display_name = "支出"
[[schema.entities.fields]]
name = "project_id"
field_type = "uuid"
display_name = "关联项目"
ref_entity = "project"
[[schema.entities.fields]]
name = "category"
field_type = "string"
required = true
display_name = "类别"
ui_widget = "select"
filterable = true
options = [
{ label = "硬件", value = "hardware" },
{ label = "软件订阅", value = "software" },
{ label = "云服务", value = "cloud" },
{ label = "差旅", value = "travel" },
{ label = "餐饮", value = "meal" },
{ label = "办公用品", value = "office" },
{ label = "其他", value = "other" }
]
[[schema.entities.fields]]
name = "amount"
field_type = "decimal"
required = true
display_name = "金额"
sortable = true
[[schema.entities.fields]]
name = "date"
field_type = "date"
required = true
display_name = "日期"
[[schema.entities.fields]]
name = "vendor"
field_type = "string"
display_name = "供应商"
[[schema.entities.fields]]
name = "description"
field_type = "string"
display_name = "描述"
# ── 编号规则 ──
[[numbering]]
entity = "quote"
field = "quote_number"
prefix = "QT"
format = "{PREFIX}-{YEAR}-{SEQ}"
seq_length = 4
[[numbering]]
entity = "contract"
field = "contract_number"
prefix = "CT"
format = "{PREFIX}-{YEAR}-{SEQ}"
seq_length = 4
[[numbering]]
entity = "invoice"
field = "invoice_number"
prefix = "INV"
format = "{PREFIX}-{YEAR}-{SEQ}"
seq_length = 4
# ── 页面设计 ──
# 页面 1全局工作台
[[ui.pages]]
type = "dashboard"
label = "工作台"
icon = "DashboardOutlined"
# 页面 2客户管理列表 + 详情 + 商机看板)
[[ui.pages]]
type = "tabs"
label = "客户管理"
icon = "team"
[[ui.pages.tabs]]
label = "客户列表"
type = "crud"
entity = "client"
enable_search = true
[[ui.pages]]
type = "detail"
entity = "client"
label = "客户详情"
[[ui.pages.sections]]
type = "fields"
label = "基本信息"
fields = ["name", "contact_name", "phone", "email", "industry", "source", "level", "status", "address", "notes"]
[[ui.pages.sections]]
type = "crud"
label = "商机"
entity = "opportunity"
filter_field = "client_id"
[[ui.pages.sections]]
type = "crud"
label = "报价/合同"
entity = "quote"
filter_field = "client_id"
[[ui.pages.sections]]
type = "crud"
label = "项目"
entity = "project"
filter_field = "client_id"
[[ui.pages.sections]]
type = "crud"
label = "发票"
entity = "invoice"
filter_field = "client_id"
# 商机看板
[[ui.pages]]
type = "kanban"
entity = "opportunity"
label = "商机看板"
icon = "swap"
lane_field = "stage"
lane_order = ["visit", "requirement", "quote", "negotiation", "won", "lost"]
card_title_field = "title"
card_subtitle_field = "estimated_amount"
card_fields = ["business_type", "probability"]
enable_drag = true
# 页面 3项目管理 + 详情
[[ui.pages]]
type = "crud"
entity = "project"
label = "项目管理"
icon = "project"
enable_search = true
[[ui.pages]]
type = "detail"
entity = "project"
label = "项目详情"
[[ui.pages.sections]]
type = "fields"
label = "项目信息"
fields = ["name", "client_id", "contract_id", "business_type", "deliverable_type", "status", "start_date", "end_date", "contract_amount", "description"]
[[ui.pages.sections]]
type = "crud"
label = "任务"
entity = "task"
filter_field = "project_id"
[[ui.pages.sections]]
type = "crud"
label = "工时记录"
entity = "time_entry"
filter_field = "project_id"
[[ui.pages.sections]]
type = "crud"
label = "发票"
entity = "invoice"
filter_field = "project_id"
# 页面 4财务中心
[[ui.pages]]
type = "tabs"
label = "财务中心"
icon = "account-book"
[[ui.pages.tabs]]
label = "报价管理"
type = "crud"
entity = "quote"
enable_search = true
[[ui.pages.tabs]]
label = "合同管理"
type = "crud"
entity = "contract"
enable_search = true
[[ui.pages.tabs]]
label = "发票/收款"
type = "crud"
entity = "invoice"
enable_search = true
# 页面 5支出管理
[[ui.pages]]
type = "crud"
entity = "expense"
label = "支出管理"
icon = "pay-circle"
enable_search = true