po审批问题
今天遇到一个PO审批的问题
现象为:po订单为34万,按照审批流程到副总就可以结束,但是流程到了总经理审批。
原因是:采购修改了gcc的科目,但是没有及时修改审批组的科目,导致po的dist中的科目与approval group的什么规则 approval rules不一致。
小知识:
po的审批主要以两个维度审核,金额和科目,金额是订单的总金额,科目为po分配行(dist中的科目)
由谁来审批,是根据po的采购员决定,首先由采购员审批,如果采购员由权限则审批结束,否则由他所属组织的上一级继续审批,同理上一级没有权限则再上一级审批,直到有权限或者最后一位审批者才会结束。
审批组织架构维护为
po用户->Setup->Personnel->Position Hierarchy
界面中有多个审批组织,其中name为“职位”
岗位
po用户->Setup->Approvals->Approval Assignments
使用Position Hierarchy中的name可以查找该职位对应的岗位
审批组
po用户->Setup->Approvals->Approval Groups
使用Approval Assignments的Job可以在该界面找到对应的审批权限(金额和科目)
审批组说明
审批组有两种类型 DOCUMENT_TOTAL / ACCOUNT_RANGE
1、DOCUMENT_TOTAL:整单总金额规则(头级、全 PO 金额)
- 管控对象:整张 PO 含税总金额(PO 头合计)
- rule_type=I(INCLUDE):该审批人最多可审批 amount_limit 以内整单例:DOCUMENT_TOTAL I、限额 50000 →≤5 万副总终审;>5 万自动往上流总经理
- 只要审批组配了这条,就代表按整单金额做权限上限
只配 DOCUMENT_TOTAL、没有任何 ACCOUNT_RANGE=I → 隐性 = 所有科目都不在审批范围,哪怕金额在限额内,单据依旧向上走总经理(就是你之前遇到的场景)
2、ACCOUNT_RANGE:科目区间规则(行分配科目级)GL 科目弹性域
管控对象:PO分配行对应的费用科目(CODE_COMBINATIONS 科目组合),分两种:
- ACCOUNT_RANGE + I (包含):这个科目区间的费用,才受上面 DOCUMENT_TOTAL 金额管控例:I 科目从 6601~6609、限额 5 万→ PO 全部科目落在 6601-6609、金额≤5 万:副总直接终审
- ACCOUNT_RANGE + E (排除):黑名单科目,无论金额多少,一律不能被本审批人终审,强制上浮例:E 6701 科目 → PO 只要有一行科目是 6701,哪怕金额 100 元,副总批完继续流转总经理
配套另外 2 个常用 object_code(顺带)
- ITEM_CATEGORY_RANGE:物料类别管控
- ITEM_RANGE:单个物料编码管控
一句话总结你的业务疑问
- 审批组:只有 DOCUMENT_TOTAL、无 ACCOUNT_RANGE I全科目不在审批权限 → 金额≤副总限额也不能终审,继续到总经理
- 审批组:DOCUMENT_TOTAL + ACCOUNT_RANGE I(全科目全覆盖)PO 科目全在包含区间、金额≤限额 →副总直接终审停流
- DOCUMENT_TOTAL + I 全科目 + E 个别科目命中 E 黑名单科目 → 无论金额大小,必须继续上总经理
常用代码
查询po的金额和科目
SELECT poh.segment1 po_no, poh.currency_code curr_code, NVL(poh.rate, 1) ex_rate, pol.quantity * pol.unit_price, gcc.concatenated_segments 完整会计科目, --拼接全科目 gcc.segment1 段1, gcc.segment2 段2, gcc.segment3 科目段, --通常自然科目在本段(审批ACCOUNT_RANGE管控段) gcc.segment4 段4 FROM po_headers_all poh INNER JOIN po_lines_all pol ON poh.po_header_id = pol.po_header_id INNER JOIN po_distributions_all pda ON pol.po_line_id = pda.po_line_id JOIN gl_code_combinations_kfv gcc ON pda.code_combination_id = gcc.code_combination_id WHERE poh.segment1 = '&po编号';查询po使用的审批流
SELECT hou.name 经营单位, pha.segment1 PO单号, pp.full_name 采购员, ppos.name 采购员职位, pj.name 岗位, pcg.control_group_name 审批组名称, decode(pcr.object_code, 'DOCUMENT_TOTAL', '整单金额规则', 'ACCOUNT_RANGE', 'GL科目区间规则', 'ITEM_CATEGORY_RANGE', '物料类别', '其他') 规则类型, --decode(pcr.RULE_TYPE_CODE,'I','INCLUDE包含(可审批)','E','EXCLUDE排除(黑名单)') 规则属性, pcr.control_rule_id, pcr.object_code, pcr.RULE_TYPE_CODE, pcr.amount_limit 审批限额, pcr.segment1_low, pcr.segment2_low, pcr.segment3_low, pcr.segment1_high, pcr.segment2_high, pcr.segment3_high FROM po_headers_all pha JOIN hr_operating_units hou ON pha.org_id = hou.organization_id JOIN per_all_people_f pp ON pha.agent_id = pp.person_id AND SYSDATE BETWEEN pp.effective_start_date AND pp.effective_end_date JOIN per_assignments_f pas ON pp.person_id = pas.person_id AND pha.creation_date BETWEEN pas.effective_start_date AND pas.effective_end_date JOIN per_positions_v ppos ON pas.position_id = ppos.position_id JOIN per_jobs_vl pj ON ppos.job_id = pj.job_id JOIN po_position_controls_all ppca ON ppca.position_id = ppos.position_id AND ppca.org_id = pha.org_id JOIN po_control_functions pocf ON ppca.control_function_id = pocf.control_function_id JOIN po_control_groups_all pcg ON ppca.control_group_id = pcg.control_group_id LEFT JOIN po_control_rules pcr ON pcg.control_group_id = pcr.control_group_id WHERE pha.segment1 = '&po编号' --替换成你的PO号 AND SYSDATE BETWEEN ppca.start_date AND NVL(ppca.end_date, SYSDATE + 1) AND pcg.enabled_flag = 'Y';po已经完成的审批流程
SELECT pahv.sequence_num, poh.segment1 PO单号, pahv.employee_name 审批人姓名, pap.full_name HR员工全称, ppos.name 职位名称, pj.name 岗位, pahv.action_code 审批动作, pahv.action_date 审批日期 FROM po_action_history_v pahv JOIN po_headers_all poh ON pahv.object_id=poh.po_header_id AND pahv.object_type_code='PO' JOIN per_all_people_f pap ON pahv.employee_id=pap.person_id LEFT JOIN per_assignments_f pas ON pap.person_id=pas.person_id LEFT JOIN per_positions_v ppos ON pas.position_id=ppos.position_id LEFT JOIN per_jobs_vl pj ON ppos.job_id=pj.job_id WHERE SYSDATE BETWEEN pap.effective_start_date AND pap.effective_end_date AND SYSDATE BETWEEN pas.effective_start_date AND pas.effective_end_date AND poh.segment1='&po编号' ORDER BY pahv.sequence_num;审批组规则
SELECT hou.name 经营单位, pj.name 岗位名称, pcg.control_group_name 审批组, pcr.amount_limit 本位币审批限额, --限额字段在这里 pcr.object_code, pcr.RULE_TYPE_CODE, pcr.segment1_low, pcr.segment2_low, pcr.segment3_low, pcr.segment1_high, pcr.segment2_high, pcr.segment3_high, pcr.* --科目起止段 FROM po_position_controls_all ppca JOIN po_control_groups_all pcg ON ppca.control_group_id = pcg.control_group_id JOIN po_control_rules pcr ON pcg.control_group_id = pcr.control_group_id JOIN per_jobs_vl pj ON ppca.job_id = pj.job_id JOIN hr_operating_units hou ON ppca.org_id = hou.organization_id WHERE 1=1 AND pcr.object_code = 'DOCUMENT_TOTAL' --单据总金额控制 AND SYSDATE BETWEEN ppca.start_date AND NVL(ppca.end_date, SYSDATE + 1) AND pcg.enabled_flag = 'Y' --AND pj.name LIKE '%副總%'; AND pj.name IN ('123','456');