feat(核算)!: 添加 T+ 正式核算与采集托管

补齐源快照、资料预演、正式导入及工资核算的依赖链路。
新增版本化输入、逐段 FIFO、生成锁和结构化当月调整,
并提供默认关闭的周期采集、有限重试及 Windows 托管。

原始客户资料、私有配置及首页改动不纳入本次提交。

BREAKING CHANGE: 升级前需应用新增迁移,并通过
PAYROLL_MAKER_USER_ID 绑定实际工资制作人,否则业务只读。
旧单批次核算默认关闭;历史兼容需显式启用
PAYROLL_ALLOW_LEGACY_CALCULATION。生产启用和真实金额待验收。
This commit is contained in:
liuwenxin committed 2026-11-02 09:42:53 +08:00
1 parent 1b074576fe
commit 108bf87225
154 files changed
+9515 -645

No files matched your search

+21 -1
View File
@@ -93,6 +93,13 @@ def pending_statuses_for_roles(role_codes: Iterable[str]) -> tuple[int, ...]:
admin 不代办审批,但作为管理视角可查看全部在途单(与审批管理列表
的可见性一致);财务/领导只看到本节点可操作的条目。
"""
from app.core.config import get_settings
if (
not get_settings().payroll_allow_legacy_calculation
and not get_settings().payroll_approval_enabled
):
return ()
codes = set(role_codes)
if ROLE_ADMIN in codes:
return _PENDING_STATUSES
@@ -129,8 +136,14 @@ def submit_order(
落库时包一层信封并固化采集时间——审批期间业务再改,复核者看到的仍是
送审内容。开关关闭的自动通过路径同样写快照,留痕不走样。
"""
_withdraw_pending(session, order_type=order_type, ref_id=ref_id, operator=submitter)
from app.core.config import get_settings
if not get_settings().payroll_allow_legacy_calculation and (
not get_settings().payroll_approval_enabled or not is_enabled(session, order_type)
):
raise BadRequestError("审核功能未开启,不创建审批单或自动通过痕迹")
_withdraw_pending(session, order_type=order_type, ref_id=ref_id, operator=submitter)
order = ApprovalOrder(
order_no=next_no(
session,
@@ -250,6 +263,13 @@ def act(
"""
codes = set(user_repository.get_role_codes(operator))
verb = ACTION_APPROVE if payload.action == APPROVAL_ACTION_APPROVE else ACTION_REJECT
from app.core.config import get_settings
if (
not get_settings().payroll_allow_legacy_calculation
and not get_settings().payroll_approval_enabled
):
raise BadRequestError("当前工资流程无需系统审批,历史记录仅供查看")
with audit_service.audit(
session,
operator=operator,