职责:费用申请、挂单经营费用(多态)、付款主体公司、开票资料(多态)、采购/销售发票。
边界:简易销售单见订单;账期对账导出见数据分析;不写存货成本层(规则 16)。
对照:13;采购财务看板见 05。
二分法:
| 概念 | 表 | 说明 |
|---|---|---|
| 费用申请 | expenses |
独立申请单;人审;付款在审批节点 on_approve=pay 完成 |
| 挂单经营费用 | document_expenses |
装卸/运费等 MorphMany 挂采购/销售;可正可负、可按重分摊;确认进盈亏 |
表:expense_categories
| 字段 | 说明 |
|---|---|
| id | 主键 |
| parent_id | 大类为空,小类挂大类 |
| name | 名称 |
| status | 启用 / 停用 |
| sort | 排序 |
| deleted_at | 软删除,可空 |
费用申请、挂单经营费用共用分类树。单据禁止自由写分类名。
表:companies
| 字段 | 说明 |
|---|---|
| id | 主键 |
| name | 公司全称 |
| code | 编码,可空,唯一 |
| status | 启用 / 停用 |
| remark | 可空 |
| created_at / updated_at / deleted_at | 时间戳;软删除 |
费用申请「付款主体公司」下拉选本表启用行。
表:expenses;expense_no 唯一。
| 字段 | 说明 |
|---|---|
| id | 主键 |
| expense_no | 唯一 |
| user_id | 申请人(→ users) |
| department_name | 所在部门(中文名快照;开单默认抄申请人部门名,可改;不外键 organizations) |
| company_id | 付款主体公司(→ companies) |
| parent_category_id | 费用大类(→ expense_categories,parent_id 为空) |
| category_id | 费用小类(→ expense_categories;其 parent_id 须等于 parent_category_id) |
| start_date / end_date | 费用日期起止;均 不得晚于当天(可早于当天) |
| description | 费用描述 |
| pay_method | 付款方式(必填,见下表) |
| invoice_status | 开票情况(必填,见下表) |
| amount | 费用总金额(>0) |
| account_name / bank_account / bank_name | 收款户名 / 账号 / 开户行 |
| paid_at | 付款时间,可空(付款节点通过时写入) |
| status | 见状态机 |
| operator_id | 经手/录入人(→ users;可与 user_id 相同) |
| created_at / updated_at / deleted_at | 时间戳;软删除 |
付款方式(定死四选一):
| 取值 | 文案 |
|---|---|
bank_transfer |
银行转账 |
ticket_discount |
票折 |
account_deduction |
账扣 |
payroll |
工资发放 |
开票情况(定死五选一):
| 取值 | 文案 |
|---|---|
invoice_then_pay |
先票后款 |
pay_then_invoice |
先款后票 |
cannot_invoice |
无法开票 |
no_invoice_needed |
无需开票 |
not_applicable |
不涉及发票 |
分类:单据同时存大类与小类;保存时校验小类.parent_id = 大类。
draft → pending → paid(流程内付款节点通过后)
↘ rejected / cancelled(未付款前)
rejected → draft(可改再提)
| 时机 | expenses.status |
|---|---|
| 草稿可改 | draft |
prepareWorkflowSubmit |
→ pending |
| 实例 Running | pending |
节点 on_approve=pay 执行后 |
→ paid,写 paid_at |
| 终态 Approved 且流程内未付款 | → approved(少见;默认流程应含付款节点) |
| 终态 Rejected | → rejected;未 paid 时可回 draft |
| 作废实例 | → cancelled(仅未付款) |
已 paid 后不可驳回(同销售出库后禁驳回)。
Expense 实现 WorkflowSubject + WorkflowActionable,在 config/workflows.php 注册:condition_fields 至少 amount;assignee_fields 含 user_id;actions 含 pay => 付款。config.on_approve = pay:节点通过时写 paid_at = now()、状态 → paid(与销售 ship/accept 同一机制)。paid(及若有的 approved)计入期间费用(见 10)。表:document_expenses;document_expense_no 唯一。属主用 MorphMany(列在本表)。
| 字段 | 说明 |
|---|---|
| id | 主键 |
| document_expense_no | 唯一 |
| expenseable_type | 属主表名:purchases / orders(可扩展) |
| expenseable_id | 属主主键 |
| customer_id | 可空;挂销售时可限定渠道(空=整单) |
| category_id | 费用小类 |
| product_id | 归属产品,可空 |
| warehouse_id | 可空 |
| amount | 可正可负 |
| business_date | 费用日;不得晚于当天 |
| status | draft 草稿 / confirmed 已确认 / cancelled 已取消 |
| remark | 可空 |
| operator_id | 操作人 |
| source | wecom 企微 / web 网页 / manual 手工 |
| created_at / updated_at / deleted_at | 时间戳;软删除 |
Purchase / Order(及后续扩展模型)morphMany('documentExpenses');DocumentExpense morphTo('expenseable')。一张属主可挂多条;一条只属一个属主。挂销售且需精确到渠道时填 customer_id。
状态机:draft → confirmed(计入盈亏汇总);draft → cancelled。已确认改金额:先作废/冲红新开(P0:仅 draft 可改,confirmed 只读;纠错开红字 amount 取反)。
对挂单费用 amount,按该采购单明细重量比例分摊到行(展示 / 盈亏用,不写存货成本层;亦不同于结存上的加工费/包装费/隐形分摊件数单价预估字段):
行分摊额 = amount × (该行 weight_kg / 该采购全部明细 weight_kg 合计)
分母为 0 则均分到行(P0 固定)。
抬头 / 税号 / 四要素,挂在客户、供应商等主数据上。不是 invoices 发票单据。
表:invoice_profiles。属主用 MorphMany(列在本表)。一张属主可挂多条(连锁多法人、专票/普票各一套)。
| 字段 | 说明 |
|---|---|
| id | 主键 |
| profileable_type | 属主表名:customers / suppliers(可扩展) |
| profileable_id | 属主主键 |
| title | 抬头 |
| tax_no | 纳税人识别号,可空(果农无票可空) |
| kind | vat_special 专票 / vat_normal 普票 |
| bank_name / bank_account / account_name | 开户行 / 账号 / 开户名,可空 |
| registered_address / registered_phone | 注册地址 / 电话,可空 |
| 数电票接收邮箱,可空 | |
| is_default | 同一属主至多一条为 true |
| status | 启用 / 停用 |
| remark | 可空 |
| created_at / updated_at / deleted_at | 时间戳;软删除 |
(profileable_type, profileable_id);应用层保证同一属主至多一条 is_default=true。bank_* 是货款收款户;开票资料是税务四要素,二者分开。Customer / Supplier(及后续扩展模型)morphMany('invoiceProfiles');InvoiceProfile morphTo('profileable')。
表:invoices;invoice_no 业务单号 唯一(税务票号另字段)。
| 字段 | 说明 |
|---|---|
| id | 主键 |
| invoice_no | 系统单号,唯一 |
| tax_invoice_no | 税务发票号,可空 |
| type | purchase 采购发票 / sales 销售发票 |
| amount | 开票金额 |
| status | 见下 |
| issuer_id | 提交/开具人 |
| supplier_id | 采购票可填供应商 |
| customer_id | 销售票可填客户 |
| reviewed_at / reviewed_by / reject_reason | 审核,可空 |
| issued_at | 开具日,可空 |
| remark | 可空 |
| created_at / updated_at / deleted_at | 时间戳;软删除 |
invoice_purchases| 字段 | 说明 |
|---|---|
| invoice_id | 发票 |
| purchase_id | 采购单 |
| amount | 本单分摊开票额,可空(默认按比例或整单) |
谁开:采购员。
状态:draft 草稿 → pending 待审 → approved 已通过 | rejected 已驳回;rejected 可改后再提。
财务审「是否可用」;采购单财务页展示关联已通过发票金额及 purchases.invoice_complete。
invoice_orders| 字段 | 说明 |
|---|---|
| invoice_id | 发票 |
| order_id | 销售单 |
| amount | 可空 |
谁开:财务。
状态:draft 草稿 → issued 已开具(P0 财务直接开具;若需复核可用 pending 待审 → issued)。
销售单审批流关键节点 on_approve=invoice(开票):节点通过即标记该销售单已开票,并与本表销售发票衔接(见 15、06)。
表:payments:客户回款,可挂 invoice_id / order_id;SoftDeletes。P0 可建表;强闭环与账期导出仍可 P1。
销售单审批流关键节点 on_approve=collect(收款):节点通过即标记该销售单已收款,并与本表回款衔接(与费用申请节点 pay 对称:动作进节点,不在销售单据页另做「收款」按钮)。
invoice(开票)、collect(收款)。companies 主数据可维护;费用申请必选付款主体公司。expenses 费用申请:双分类、部门中文快照、付款方式四选一、开票五选一;走 15;on_approve=pay 写 paid_at→paid;无单据页「已付款」。document_expenses MorphMany 挂采购/销售;金额可负;采购按重分摊公式固定。expenses 走 15。invoice_profiles MorphMany 挂客户/供应商;同一属主可多条、至多一条默认。| P0 | 延后 |
|---|---|
| 费用申请(含公司主数据、节点付款)、挂单经营费用、开票资料多态、两类发票 | 费用进存货成本、回款账期强闭环 |