当前位置:文档之家› AP业务流程技术总结_v2.0

AP业务流程技术总结_v2.0

AMS

AP一般业务流程技术总结

文档作者: 张舫

创建日期: 2013-12-30

更新日期: 2014-05-31

当前版本:

拷贝编号:_____

文档控制

变更记录

2

1

审核记录

分发记录

目录

文档控制 (2)

一、概述 (4)

1.1 文档作用 (4)

1.2 文档内容 (4)

二、发票 (5)

2.1 表关系及主要表结构 (5)

2.1.1 发票头 (5)

2.1.2 发票行 (6)

2.1.3 发票行分配 (7)

2.1.4 发票暂挂 (7)

2.1.5 计划付款 (8)

2.2 业务操作对后台影响及主要查询语句 (8)

2.2.1 手工创建发票头、行、分配 (8)

2.2.2 验证发票 (9)

2.2.3 创建会计科目并过账 (10)

2.2.4 发票暂挂 (11)

2.2.5 发票匹配 (12)

2.2.6 创建计划付款 (13)

2.2.7 发票取消 (13)

三、付款 (15)

3.1 表关系及主要表结构 (15)

3.1.1 付款头 (15)

3.1.2 付款行 (16)

3.2 业务操作对后台影响及主要查询语句 (16)

3.2.1 创建付款 (16)

3.2.2 对付款创建会计分录 (17)

3.2.3 取消付款 (18)

四、问题与解决 (20)

4.1 R12与11i之间区别 (20)

4.1.1 R12与11i之间区别 (20)

4.2 其他来源的会计事件 (21)

4.2.1其他来源的会计事件 (21)

一、概述

二、

1.1 文档作用

本文档主要描述了AP模块一般业务的后台表结构。

1.2 文档内容

1.发票表结构及各种业务操作最后台表数据造成的影响;

2.付款表结构及各种业务操作最后台表数据造成的影响;

3.研究过程中存在的问题。

二、发票

2.1 表关系及主要表结构

下述为发票主要表结构,这里只列出常用字段的说明

2.1.1 发票头

ap_invoices_all

2.1.2 发票行

ap_invoice_lines_all

2.1.3 发票行分配

ap_invoice_distributions_all

2.1.4 发票暂挂

ap_holds_all

2.1.5 计划付款

Ap_Payment_Schedules_All

2.2 业务操作对后台影响及主要查询语句

2.2.1 手工创建发票头、行、分配

创建发票头行分配后,会在ap_invoices_all,ap_invoice_lines_all,

ap_invoice_distributions_all中生成记录。其中发票头上source是不会显示在FORM

界面中,手工录入时,值为“Manual Invoice Entry”。此时发票日期,GL日期是必

输的,而且要手动选择,选择发票日期后,GL日期(包括发票行和发票分配行上的

GL日期),付款汇率日期会默认等于发票日期,条件日期会默认为系统当前日期。在

R12中,发票日期先于发票编号录入,会提示是否用发票日期做发票编号。

SELECT ap.invoice_num "发票编号",

ap.source "来源",

ap.invoice_type_lookup_code "发票类型代码",

ap.vendor_id "供应商ID",

pov.vendor_name "供应商名称",

pov.segment1 "供应商编号",

ap.vendor_site_id "供应商地点ID",

pvs.vendor_site_code "供应商地点",

invoice_type.meaning "发票类型",

ap.invoice_amount "发票金额",

ap.invoice_date "发票日期",

ap.invoice_currency_code "发票币种",

ap.gl_date "GL日期",

ap.payment_currency_code "付款币种",

ap.payment_cross_rate_date "付款汇率日期",

ap.terms_date "条件日期",

ap.terms_id "条件ID",

https://www.doczj.com/doc/022031942.html, "付款条件",

ipm.payment_method_name "付款方法",

ail.line_number "行号",

ail.amount "行金额",

ail.line_type_lookup_code "行类型代码",

ail_type.meaning "行类型",

ail.quantity_invoiced "开票数量",

ail.unit_meas_lookup_code "单位",

ail.unit_price "单价",

ail.description "摘要",

ail.accounting_date "GL日期",

aid.distribution_line_number "分配行号",

aid.line_type_lookup_code "分配行类型代码",

aid_type.meaning "分配行类型",

aid.amount "分配金额",

aid.accounting_date "GL日期",

gcc.concatenated_segments "账户"

FROM ap_invoices_all ap,

ap_invoice_lines_all ail,

ap_invoice_distributions_all aid,

fnd_lookup_values_vl invoice_type,

po_vendors pov,

po_vendor_sites_all pvs,

ap_terms at,

iby_payment_methods_vl ipm,

fnd_lookup_values_vl ail_type,

fnd_lookup_values_vl aid_type,

gl_code_combinations_kfv gcc

WHERE ap.invoice_id = ail.invoice_id

AND aid.invoice_id = ail.invoice_id

AND aid.invoice_line_number = ail.line_number

AND ap.invoice_num = '10001'

AND https://www.doczj.com/doc/022031942.html,_id = 7911

AND ap.invoice_type_lookup_code = invoice_type.lookup_code

AND invoice_type.lookup_type = 'INVOICE TYPE'

AND ap.vendor_id = pov.vendor_id

AND ap.vendor_site_id = pvs.vendor_site_id

AND ap.terms_id = at.term_id

AND ap.payment_method_code = ipm.payment_method_code

AND ail.line_type_lookup_code = ail_type.lookup_code

AND ail_type.lookup_type = 'INVOICE LINE TYPE'

AND aid.line_type_lookup_code = aid_type.lookup_code

AND aid_type.lookup_type = 'INVOICE DISTRIBUTION TYPE'

AND aid.dist_code_combination_id = gcc.code_combination_id;

2.2.2 验证发票

发票验证时会验证分配行金额,发票行金额,发票金额是否相等,发票是否有暂挂,发

票是否审批通过等。如果系统启用了税务控制,则在发票验证时会首先生成税行及税分

配行,然后再验证金额等。Oracle提供了一个标准包可以查询当前发票的状态

ap_invoices_pkg.get_approval_status。如果发票验证不成功,返回结果是“NEEDS

REAPPROVAL”,FORM上会显示“需要重新验证”,如下图:

如果验证成功,返回结果是“APPROVED”,FORM上显示结果是“已验证”。

2.2.3 创建会计科目并过账

入账状态可以通过ap_invoices_pkg.get_posting_status标准程序查询。创建会计科目

之后会修改ap_invoice_distributions_all中posted_flag字段为“Y”,同时为

accounting_event_id赋值,此值是会计事件的ID,可以通过此值追溯分录行。查询会

计分录的SQL脚本如下,其中xla_ae_headers,xla_ae_lines是分录头行表。注意,11i

和R12在这里是不同的,详见2.3问题及解决。

SELECT aia.invoice_num,

xah.doc_sequence_value,

xal.ae_line_num,

xal.entered_dr,

xal.entered_cr,

xal.accounted_dr,

xal.accounted_cr

FROM ap_invoices_all aia,

xla.xla_transaction_entities xte,

xla_events xe,

xla_ae_headers xah,

xla_ae_lines xal

WHERE aia.invoice_id = 216301

AND xte.source_id_int_1 = aia.invoice_id

AND xte.application_id = 200

AND xte.entity_id = xe.entity_id

AND xte.application_id = xe.application_id

AND xah.event_id = xe.event_id

AND xal.ae_header_id = xah.ae_header_id

AND xte.entity_code = 'AP_INVOICES'

查询结果如下:

2.2.4 发票暂挂

发票暂挂有两种,一种是人为手工暂挂,一种是由系统自动生成的暂挂。上文说到,在

验证发票时会验证发票金额,发票行金额,发票分配行金额是否一致,如果不一致就会

由系统生成暂挂,出现暂挂说明当前这张发票有问题,除非将暂挂释放,否则不能进入

下一步环节。手工暂挂是由于用户根据业务情况认为当前发票有问题,暂时不能进入下

面的环节进行处理,此时可以根据需要手动选择暂挂原因进行暂挂。这里需要注意的是,

由系统自动生成的暂挂,其暂挂依据是“系统”,但是后台对应的账户名称是APPSMGR,

手工暂挂的暂挂依据会显示实际暂挂的用户,而不是员工。

出现发票暂挂后要对暂挂进行释放,否则不能进行验证发票等操作。同样,释放发票包

括系统释放和手工释放。系统暂挂只能由系统释放,手工暂挂只能由用户手工释放。释

放者和暂挂依据类型。

暂挂日期和释放日期是不允许修改的,即为暂挂或释放的日期。暂挂日期有一个与之对

应的字段,即hold_date,而释放日期没有与之对应的字段,而是在release_lookup_code

字段没有值时,取last_update_date这个字段。

发票暂挂的后台查询脚本如下:

SELECT ap.invoice_num "发票编号",

ah.hold_lookup_code "暂挂名代码",

hold_code.meaning "暂挂名",

hold_code.description "暂挂原因",

ah.hold_date "暂挂日期",

ah.held_by "暂挂依据ID",

decode(ah.held_by,

5,

(SELECT flv.meaning

FROM fnd_lookup_values_vl flv

WHERE flv.lookup_type = 'NLS TRANSLATION'

AND flv.lookup_code = 'SYSTEM'),

hold_https://www.doczj.com/doc/022031942.html,er_name) "暂挂依据",

ah.release_lookup_code "释放名称代码",

release_code.meaning "释放名称",

release_code.description "释放原因",

https://www.doczj.com/doc/022031942.html,st_updated_by "释放者ID",

decode(ah.held_by,

5,

(SELECT flv2.meaning

FROM fnd_lookup_values_vl flv2

WHERE flv2.lookup_type = 'NLS TRANSLATION'

AND flv2.lookup_code = 'SYSTEM'),

release_https://www.doczj.com/doc/022031942.html,er_name) "释放者",

decode(ah.release_lookup_code, NULL, NULL, https://www.doczj.com/doc/022031942.html,st_update_date) "释放日期",

ah.wf_status "工作流状态"

FROM ap_invoices_all ap,

ap_holds_all ah,

fnd_lookup_values_vl hold_code,

fnd_lookup_values_vl release_code,

fnd_user hold_by,

fnd_user release_by

WHERE ap.invoice_num = '10004'

AND ap.invoice_id = ah.invoice_id

AND ah.hold_lookup_code = hold_code.lookup_code

AND hold_code.lookup_type = 'HOLD CODE'

AND ah.release_lookup_code = release_code.lookup_code

AND release_code.lookup_type = 'HOLD CODE'

AND ah.held_by = hold_https://www.doczj.com/doc/022031942.html,er_id

AND https://www.doczj.com/doc/022031942.html,st_updated_by = release_https://www.doczj.com/doc/022031942.html,er_id;

查询结果:

2.2.5 发票匹配

发票可以通过匹配功能自动匹配采购订单和接收。录入完发票头需要的信息后,点击匹

配按钮进入匹配界面,注意,自动匹配只能匹配已经进行过接收的采购订单。在应付发

票头,行,分配上均有和采购订单有关的字段。发票头上有po_header_id,发票行上

有po_header_id,po_line_id,po_release_id,po_line_location_id,po_distribution_id,

rcv_transaction_id,rcv_shipment_line_id,分配行上有po_distribution_id,

rcv_transaction_id。发票的匹配是以接收行为准,即有几个接收行,就会有几个发票

行。

但是这里需要注意一个问题,在匹配采购订单的时候这些字段并不是全部都会自动给

值。比如,发票头上的po_header_id,发票行上的po_release_id,po_distribution_id。

事实上,发票头上的po_header_id是不会自动带出的,但是可以手动去选择采购订单。

而发票行上po_release_id字段没有详细测试,推测在没有采购发放的时候此字段是空

的。Po_distribution_id这个字段比较特殊。对于启用税务控制的系统而言,如果发票

行的类别为ITEM,则行上po_distribution_id对应的是该ITEM对应的采购分配行ID,

如果发票行类别为TAX,即为税行的时候,行上的po_distribution_id是空的,但是

分配行上po_distribution_id是有值的,见下图。

SELECT aia.po_header_id header_po_header_id,

ail.line_type_lookup_code,

ail.po_header_id line_po_header_id,

ail.po_line_id line_po_line_id,

ail.po_line_location_id line_po_line_location_id,

ail.po_distribution_id,

aid.po_distribution_id

FROM ap_invoices_all aia,

ap_invoice_lines_all ail,

ap_invoice_distributions_all aid

WHERE aia.invoice_num LIKE'5211_APINVOICE003'

AND ail.invoice_id(+) = aia.invoice_id

AND aid.invoice_id = aia.invoice_id

AND aid.invoice_line_number = ail.line_number;

2.2.6 创建计划付款

用户可以在计划付款页签下为发票创建计划付款,并可以点击支付快速创建付款。在创

建计划付款时,计划付款总额必须等于发票总额,到期日必须晚于条件日期。在未支付

的情况下,该计划付款行可以任意修改,在支付完成后(只要产生付款记录并保存),

改行就会被锁定不允许修改,付款标识payment_status_flag会被置为Y。由计划付款

创建的付款,类型为Q(快速)。查询发票,计划付款,付款之间关系的sql脚本如下:

SELECT ai.invoice_num "发票编号",

aps.payment_num "计划付款序号",

aps.gross_amount "总额",

aps.amount_remaining "余额",

aps.hold_flag "暂挂标识",

aps.iby_hold_reason "暂挂原因",

aps.due_date "到期日",

aps.payment_priority "优先级",

aps.payment_method_code "付款方法代码",

ipm.payment_method_name "付款方法",

aps.payment_status_flag "已付款标识",

ac.check_number "付款编号",

ac.amount "付款额",

ac.payment_type_flag "付款类型",

aip.amount "付款金额",

aip.accrual_posted_flag "应计项目过账标识",

aip.cash_posted_flag "现金过账标识",

aip.posted_flag "过账标识"

FROM ap_payment_schedules_all aps,

ap_invoices_all ai,

iby_payment_methods_vl ipm,

ap_invoice_payments_all aip,

ap_checks_all ac

WHERE aps.invoice_id = ai.invoice_id

AND ai.invoice_num = '10010'

AND https://www.doczj.com/doc/022031942.html,_id = 7911

AND aps.payment_method_code = ipm.payment_method_code

AND aps.invoice_id = aip.invoice_id

AND aps.payment_num = aip.payment_num

AND aip.check_id = ac.check_id;

2.2.7 发票取消

发票取消后会在头表中记录下取消的用户(cancelled_by),取消的日期

(cancelled_date),取消的金额(cancelled_amount),同时会将发票金额清0。而

行表中cancelled_flag会置为Y,行金额amount会置为0,同时会记录下取消前的金

额original_amount。而发票分配表中,会生成一条金额为负的分配行,金额与之前金

额相加总额为0。见下图。

查询脚本如下:

SELECT t.invoice_num "发票号",

ap_invoices_pkg.get_approval_status(t.invoice_id,

t.invoice_amount,

t.payment_status_flag,

t.invoice_type_lookup_code) "发票状态", t.cancelled_date "取消日期",

t.cancelled_by "取消人",

t.cancelled_amount "取消金额",

t.invoice_amount "发票金额",

ail.line_number "行号",

ail.cancelled_flag "行取消标识",

ail.amount "行金额",

ail.original_amount "行原金额",

aid.distribution_line_number "分配行号",

aid.amount "分配金额"

FROM ap_invoices_all t,

ap_invoice_lines_all ail,

ap_invoice_distributions_all aid

WHERE t.invoice_num = '10009'

AND t.invoice_id = ail.invoice_id

AND t.invoice_id = aid.invoice_id

AND aid.invoice_line_number = ail.line_number;

为取消的发票重新创建会计科目,结果如下:

从查询结果中可以看出,发票取消的科目与发票创建的科目借贷方向是相反的,并且发

票取消的event_type_code为‘INVOICE CANCELLED’,而发票创建的

event_type_code为‘INVOICE VALIDATED’,但是来源entity_code都相同

‘AP_INVOICES’。

三、付款

3.1表关系及主要表结构

3.1.1 付款头

3.1.2 付款行

3.2 业务操作对后台影响及主要查询语句

3.2.1 创建付款

付款的创建有两种方式(这里只讨论系统内生成方法,暂不考虑外部导入),一个是通

过发票计划付款快速创建(见上文),另一种是手工创建。在手工创建付款时,付款头

部分可以通过手工来录入,但是付款行部分必须通过界面下方“输入/调整发票”来选

择发票,自动生成付款行。因此,无论是通过哪种方式创建付款,都必须关联到发票上。

并且付款行是以发票为单位创建的,即一个付款行对应一个发票,但是一个发票可以对

应多个付款行,典型的例子就是计划付款,如果一个发票有多个计划付款行,可以生成

多个付款。

以下为查询付款常用信息脚本:

SELECT decode(ac.payment_type_flag,

'M',

'人工',

'Q',

'快速',

'R',

'退款',

NULL) "类型",

https://www.doczj.com/doc/022031942.html, "业务实体",

ac.vendor_id "贸易伙伴ID",

pov.vendor_name "贸易伙伴",

pov.segment1 "供应商编号",

ac.vendor_site_code "供应商地点",

ac.address_line1 || ',' || ac.address_line2 || ',' ||

ac.address_line3 "贸易伙伴地址",

ac.country "国家代码",

ft.territory_short_name "国家",

ac.check_date "付款日期",

ac.amount "付款额",

ac.bank_account_name "银行账户名称",

ac.bank_account_num "银行账户编号",

ac.bank_account_type "银行账户类型",

ac.bank_num "银行编号",

cba.currency_code "账户币种",

ac.currency_code "付款币种",

ac.payment_method_code "付款方法代码",

ipm.payment_method_name "付款方法名称",

ac.check_number "付款编号",

ac.payment_profile_id "付款配置文件ID",

ipp.payment_profile_name "付款配置文件名称",

ac.status_lookup_code "付款状态代码",

flv.meaning "付款状态",

ac.check_id "付款ID",

aip.invoice_id "发票ID",

aia.invoice_num "发票编号",

aia.invoice_date "日期",

aia.invoice_amount "金额",

aip.accounting_date "GL日期",

aip.amount "付款金额",

aip.payment_num "计划付款行号",

aip.period_name "期间",

aip.accrual_posted_flag "应计帐过账标识",

aip.cash_posted_flag "现金账过账标识",

aip.posted_flag "过账标识"

FROM ap_checks_all ac,

ap_invoice_payments_all aip,

ap_invoices_all aia,

hr_organization_units hou,

po_vendors pov,

fnd_territories_vl ft,

iby_payment_methods_vl ipm,

ce_bank_accounts cba,

iby_payment_profiles ipp,

fnd_lookup_values_vl flv

WHERE ac.check_id = aip.check_id

AND aip.invoice_id = aia.invoice_id

AND ac.check_number = '8289'

AND https://www.doczj.com/doc/022031942.html,_id = 7911

AND https://www.doczj.com/doc/022031942.html,_id = https://www.doczj.com/doc/022031942.html,anization_id

AND ac.vendor_id = pov.vendor_id

AND ac.country = ft.territory_code

AND ac.payment_method_code = ipm.payment_method_code

AND ac.bank_account_name = cba.bank_account_name

AND ac.payment_profile_id = ipp.payment_profile_id

AND ac.status_lookup_code = flv.lookup_code

AND flv.lookup_type = 'CHECK STATE'

ORDER BY aia.invoice_num

3.2.2 对付款创建会计分录

付款创建会计分录时是以付款行为单位创建的,这点与发票不同(发票是以发票分配行

为单位),比如,付款总额为300,有两个付款行,一个100,一个200,在创建会计

科目的时候是直接生产金额为300的会计科目。查询脚本如下:

SELECT ac.check_number,

xte.transaction_number,

xte.entity_code,

xe.event_type_code,

xe.event_number,

xal.entered_dr,

xal.entered_cr,

xe.event_status_code

FROM ap_checks_all ac,

xla.xla_transaction_entities xte,

xla_events xe,

xla_ae_headers xah,

xla_ae_lines xal

WHERE ac.check_number = '8289'

AND xte.source_id_int_1 = ac.check_id

AND xte.application_id = 200

AND https://www.doczj.com/doc/022031942.html,_id = xte.security_id_int_1

AND xte.entity_id = xe.entity_id

AND https://www.doczj.com/doc/022031942.html,_id = 7911

AND xah.entity_id = xte.entity_id

AND xal.ae_header_id = xah.ae_header_id;

查询结果如下:

3.2.3 取消付款

付款的取消和发票的取消有点类似。在对付款取消后,首先会将付款的状态

(ap_checks_all.status_lookup_code)修改为‘VOIDED’(已取消),同时会生成一个取

消日期(ap_checks_all.void_date)。而付款行上,会生成一行与之前付款行金额相反的

付款行,使得付款行总金额为0,同时会将取消标识

(ap_invoice_payments_all.reversal_flag)置为‘Y’,而新生成的金额为负的付款行

上记录了对应取消的付款行ID(reversal_inv_pmt_id)。付款对应的发票的付款金额

同时会修改为付款之前的金额。见下述代码:

SELECT ac.check_number "付款编号",

ac.status_lookup_code "付款状态",

ac.void_date "付款日期",

aip.reversal_flag "取消标识",

aip.reversal_inv_pmt_id "取消付款行ID",

aip.invoice_payment_id "付款行ID",

aip.amount "付款行金额",

aia.amount_paid "发票金额"

FROM ap_checks_all ac, ap_invoice_payments_all aip, ap_invoices_all aia WHERE ac.check_id = aip.check_id

AND aip.invoice_id = aia.invoice_id

AND ac.check_number = '8289'

AND https://www.doczj.com/doc/022031942.html,_id = 7911;

查询结果如下:

取消付款生成的会计科目如下:

可以看出借贷方向与付款的科目是相反的,并且,付款科目的event_type_code是“PAYMENT CREATED”,而取消付款科目的event_type_code是“PAYMENT

CANCELLED”。但是来源entity_code是相同的,均为ap_payments。

四、问题与解决

五、

4.1 R12与11i之间区别

4.1.1 R12与11i之间区别

11i和r12系统的应付是有区别的,在11i中没有发票行表ap_invoice_lines_all,

并且11i中应付生成日记账发票的几张表AP_ACCOUNTING_EVENTS_ALL,

AP_AE_HEADERS_ALL,AP_AE_LINES_ALL,在R12中已经不再使用。在R12中整

合了AP,AR,GL的事务处理,事务处理表为xla_transaction_entities,事务

处理信息表为xla_events,会计分录头xla_ae_headers,行xla_ae_lines。

而在11i中各财务模块是分离的,见下述发票生成会计科目脚本。

SELECT aia.invoice_num "发票编号",

aid.distribution_line_number "分配行号",

aae.event_number "会计事件行号",

aae.event_type_code "会计事件类型",

aae.event_status_code "会计事件状态",

aae.source_table "会计事件来源",

aal.source_table "会计分录行来源",

aal.entered_dr "贷",

aal.entered_cr "借"

FROM ap_invoices_all aia,

ap_invoice_distributions_all aid,

ap_accounting_events_all aae,

ap_ae_headers_all aah,

ap_ae_lines_all aal

WHERE aia.invoice_id = 2507799

AND aia.invoice_id = aid.invoice_id

AND aid.accounting_event_id = aae.accounting_event_id

AND aae.accounting_event_id = aah.accounting_event_id

AND aal.ae_header_id = aah.ae_header_id;

查询结果如下:

我们再看下11i中付款的脚本以及查询结果:

SELECT DISTINCT ac.check_number "付款编号",

aip.payment_num "付款行号",

aae.event_number "会计事件行号",

aae.event_type_code "会计事件类型",

aae.event_status_code "会计事件状态",

aae.source_table "会计事件来源",

aal.source_table "会计分录行来源",

aal.entered_dr "贷",

aal.entered_cr "借",

gcc.concatenated_segments "账户"

FROM ap_checks_all ac,

ap_invoice_payments_all aip,

ap_accounting_events_all aae,

ap_ae_headers_all aah,

相关主题
文本预览
相关文档 最新文档