AX2012中有个模块叫做出差和支出,用于管理出差以及相关的费用,用户只能在员工自助服务EP站点上提交出差申请、费用报销报告,在Client程序中做审核以及后续的支付动作等,最后形成相关的财务分录。
出差申请
在自助服务站点的Expense下用户可以新建一个“Travel requistion”,需要填写的内容包括出差原因、出差目的地、以及预计的出差费用行。
出差原因在“Travel and expense>Setup>Optional setup>Expense purpose”维护,出差的目的地在“Travel and expense>Setup>Optional setup>Travel locations”维护。费用行需要首先选择一个Expense category,支出类别在“Travel and expense>Setup>Travel and expense entry>Expense category”维护。支出类别不是表面看起来那样简单,根据支出类别类型的不同能设置的内容也不同。新建一个支出类别前需要新建一个共享类别(Travel and expense>Setup>Travel and expense entry>Shared categories),诚如其名,这个类别为多个模块共享,在Project management and accouting、Organization administration的设置中都能找到Shared categories。
一个共享类别可以用于项目、支出、或者生产,但是一个共享类别不能同时用于支出和生产,如果你同时选中“Can be used in expense”和“Can be used in production”,系统会给出警告提示。如果选择了用于支出,你必须选择一个支出类型(枚举TrvExpType),比如津贴、旅馆、航线等,而根据支出类型是否支持明细的不同(TrvExpenseType::supportsItemization()),你还可以设置子类别,比如上图中的Airline是可以有明细的。
有了可用于支出的共享分类,才能新建支出分类,新建支出分类时只能从可用于支出的共享分类中选择。
在支出分类中可以设置支付方式、是否强制明细、是否启用、统计组、以及财务主科目。有的支出类型是不能设置财务科目的,比如个人花费(Personal expenses)。其中有两个支出分类是比较特殊的,Mileage和Perdiem:
Mileage用于私车公用(瓷器国听到的多是公车私用啊)情况,后续在计算费用的时候是根据里程×费率来计算的,在“Travel and expense parameters”的“Standard rate of mileage”中可以维护标准费率(在Human resource中打开某个员工,Expense management>Mileage下可以维护年度费率,是否和支出有联系又是具体怎么用还没来得及研究)。
Perdiem中文叫做出差津贴,在Travel and expense>Setup>Per diems>Per diems维护,首先需要在Per diem locations中维护津贴地点,比如出差的城市,根据出差城市的不同在津贴维护中设置相应的酒店费用、餐费和其他费用、起止日期,在Per diem rate ties中还可以根据出差时长设置报销的比率。后续支出报告中根据选择的津贴城市、时长具体计算津贴的总费用。
回到出差申请的创建,在添加一些类型的支出行时,还可以选择相应的商业单位(Merchants),比如航空公司、酒店名称等,在“Travel and expense>Setup>Optional setup>Merchants”维护。编辑完支出行点击保存时会自动计算费用,完成所有支出行的编辑后就可以提交出差申请了。根据工作流的设置(Travel and expense>Setup>Travel and expense workflows)出差申请会为具有批准权限的用户创建工作事项,有意思的是在试图打开出差申请的工作项时会有错误(\Classes\WorkflowQueueDocumentView\main在打开工作项相关MenuItem的Form时因为菜单项名称空提示FormRun未初始化),原因在于在Client中没有一个Form来查看出差申请(支出报告是有的),出差申请的批准也只能在自助服务的审核中完成。审核完成的出差申请不能再编辑,在“Travel requisitions”列表中我们可以看到相应的审核状态,还有一个状态叫做Reconciliation status,显示的是出差申请费用是否结清,在操作板上有个“Close”的按钮可以用来手工关闭出差申请为结清状态。
支出报表
其实翻译成费用报销更为合适,同样也是在自助服务EP站点中创建,在新建一个Expense report时会弹出一个对话框,提示选择未结的费用:
这里显示的记录来自于Data set TrvUnreconciledExpenseTransaction,它基于视图TrvUnreconciledExpenseTransUnion,视图TrvUnreconciledExpenseTransUnion又来自于查询TrvUnreconciledExpenseTransUnion,查询TrvUnreconciledExpenseTransUnion是视图TrvUnreconciledCreditCardTrans和视图TrvUnreconciledExpenseTrans的联合,前者的数据来自于表TrvPBSMaindata,后者的数据来自于表TrvUnreconciledExpenseTransaction(这一长串的关系!)。
TrvPBSMaindata表示的是这样的数据-比如出差中使用了公司的信用卡付费,这些付费的记录就保存在表TrvPBSMaindata中,这些记录可以通过Travel and expense>Periodic>Credit card transactions查看,但是系统中是没有地方输入这些记录的,它们可以使用Travel and expense>Periodic>Credit cards>Credit card import from folder或者Travel and expense>Periodic>Credit cards>Import a specific credit card file,前者导入一个目录下的所有文件,后者导入一个指定的文件。那么文件是什么样的格式呢?在导入对话框中是需要选择一个导入格式的,其实是一个AIF的入口端口名称,我们需要使用服务TrvPBSMaindataService创建一个入站的文档服务,文件的格式则是文档服务描述的XML格式。导入功能会间接的调用TrvPBSMaindataService服务来导入数据,大致的执行路径(导入文件夹为例)是TrvSysImportFolderBatch.run()->SysImportBatchProcessor.run()->SysImportProcessor.processInput()->AifImportUtil::ProcessFile(sourceFile, _inputFileFormat),参数_inputFileFormat就是入站端口的名称。
还有一些费用报销凭据来自于消费的收据,收据数据(传真件,比如tif格式的图片)可以通过Travel and expense>Periodic>Receipts>Import faxed receipts for employee或者Travel and expense>Periodic>Receipts>Import faxed receipts for expense report导入,导入的结果就保存在表TrvUnreconciledExpenseTransaction中。导入文件通过文件名称来确定员工或者支出报告号,比如文件名“员工编号$01_20130618.tif”,员工编号必须在首位,使用“$”和“_”分离其他内容,在EP站点中选择一个支出报表我们可以通过操作板上的Employee cover page或者Expense report cover page打印传真的封面页(在我的系统中显示不出相应报表中的图片!)。导入传真的员工收据的执行路径TrvImportReceiptsBatch_Employee.main()->TrvImportReceiptsBatch.run()->TrvImportReceiptsBatch_Employee.importFile()->TrvReceiptsHelper.attachFileToEmployee(hcmWorker.RecId, _filename, _file),它在TrvUnreconciledExpenseTransaction表中查找/创建员工的记录,并将导入的文件作为附件保存到表docref中,在这一过程中看不到任何导入具体费用金额的地方;导入传真的支出报告收据的执行路径TrvImportReceiptsBatch_ExpenseReport.main()->TrvImportReceiptsBatch.run()->TrvImportReceiptsBatch_ExpenseReport.importFile()->TrvReceiptsHelper.attachFileToExpenseReport(TrvExpNumber _expNumber, Filename _filename, DocuValueFile _file, Description _documentDescription = ''),它只是简单的把导入的文件作为支出报表的附件创建相应的docref记录,也没看到具体导入金额的地方。那么具体如何导入消费的具体信息呢?同样可以使用AIF服务,这次用到的服务名称是TrvUnreconciledExpenseService,在系统中没有找到和导入信用卡记录类似的操作,看来只能手工调用这个服务来操作了,另外也没有看到任何窗口可以查看这些导入的TrvUnreconciledExpenseTransaction记录。
表TrvPBSMaindata和TrvUnreconciledExpenseTransaction数据的合集称为未结的支出消费,在创建支出报表时我们可以选择这些未结支出,它会自动为我们创建相应的支出行并做详细化(Itemization),我们也可以在支出报表中使用“Add unreconciled expenses”手工选择未结支出来创建支出行。
当然也可以使用New expense line手工创建支出行,这和出差申请的支出行类似,不再赘述。
在费用支出上,我们是可以设置策略的(Travel and expense>Setup>Polices>Expense report),比如在某个城市的酒店住宿费不能超过多少,如果超过限制金额则不运行提交。另外在支出报表的Travel requistion一栏可以选择一个出差申请,表示费用报销是基于哪次出差的,在Tranvel and expense parameters中有个设置叫做“Pre-authorization of travel is mandatory”,如果勾选这个选项,支出报表必须选择一个出差申请(Tables\TrvExpTable\validateSubmit中验证)。
同样,完成支出报表的编辑后提交到工作流,所有的支出报表在Travel and expense>Expense reports>All expense reports中看到,我们可以直接在这里批准,而不需要转到工作列表或者EP上的审核列表。已经批准的支出报表可以过账(Post)为财务分录,记账科目为支出类别以及支付方式的不同而不同(留待以后研究)。
更多相关内容可以参考http://technet.microsoft.com/en-us/library/hh242148.aspx、http://technet.microsoft.com/en-us/library/hh299217.aspx。