财务

职责:费用申请、挂单经营费用(多态)、付款主体公司、开票资料(多态)、采购/销售发票。
边界:简易销售单见订单;账期对账导出见数据分析;不写存货成本层(规则 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 同一机制)。
  • 单据页不做「已付款」按钮(付款仅在审批节点完成)。
  • 不走 14、不改库存。
  • 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 注册地址 / 电话,可空
email 数电票接收邮箱,可空
is_default 同一属主至多一条为 true
status 启用 / 停用
remark 可空
created_at / updated_at / deleted_at 时间戳;软删除
  • 索引:(profileable_type, profileable_id);应用层保证同一属主至多一条 is_default=true。
  • P0 属主:客户、供应商。其它模型要抬头时直接 Morph,不改表。
  • 供应商 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 对称:动作进节点,不在销售单据页另做「收款」按钮)。

维护方式

  1. 费用申请:选公司与分类 → 填起止日/金额/收款户/开票情况 → 提交工作流;付款节点通过即已付。
  2. 挂单经营费用:选分类 → 挂一条采购或销售(销售可填渠道)→ 确认;采购侧按重分摊展示。
  3. 开票资料:在客户/供应商(等属主)上维护抬头税号;可多条,标一条默认。
  4. 采购发票:采购员挂多采购单 → 财务审;采购页看开票情况。
  5. 销售发票:财务挂多销售单 → 开具;销售审批流可挂关键节点 invoice(开票)、collect(收款)。

验收标准(P0)

  • [ ] companies 主数据可维护;费用申请必选付款主体公司。
  • [ ] expenses 费用申请:双分类、部门中文快照、付款方式四选一、开票五选一;走 15;on_approve=pay 写 paid_at→paid;无单据页「已付款」。
  • [ ] document_expenses MorphMany 挂采购/销售;金额可负;采购按重分摊公式固定。
  • [ ] 费用申请与挂单费用二分;expenses 走 15。
  • [ ] invoice_profiles MorphMany 挂客户/供应商;同一属主可多条、至多一条默认。
  • [ ] 采购发票多对多 + 财务审驳;销售发票财务开 + 多销售单。

P0 / 延后

P0 延后
费用申请(含公司主数据、节点付款)、挂单经营费用、开票资料多态、两类发票 费用进存货成本、回款账期强闭环