Visualforce:从机会对象访问价格计算

Visualforce: Access pricecalculation from Opportunity object

我强迫我必须构建一个基于机会对象的自动发票生成器的问题。

我的代码如下:

    <apex:page standardController="Opportunity" showHeader="false" Language="de" renderAs="pdf" >
<!-- Reference to Style Sheet, saved under Static Resources in Salesforce. -->
<apex:stylesheet value="{!$Resource.InvoiceCSS}" />
<div>
        <!-- Below the optional text paragraph we put the table with all the products selected as Opportunity Line Items. -->
       
        <table class="products" width="100%">
            <tr>
               <td width="100%" style="vertical-align:top;">
                    <apex:dataTable width="100%" value="{!Opportunity.OpportunityLineItems}" var="oli">
                        <apex:column width="200px" headerClass="tableheaderleft" footerClass="tablefooterleft" styleClass="tablebodyleft">
                            <apex:facet name="header">Description</apex:facet>
                            <apex:OutputField value="{!oli.Name}"/>
                            
                            
                         </apex:column>
                        <apex:column width="{!If(oli.Discount!=null,If((oli.Discount>0),"25px","15px"),"15px")}" headerClass="tableheadercenter" footerClass="tablefootercenter" styleClass="tablebodycenter">
                            <apex:facet name="header">Quantity</apex:facet>
                            <apex:OutputField value="{!oli.Quantity}"/>
                            <apex:facet name="footer"></apex:facet>
                        </apex:column>
                        <apex:column width="95px" headerClass="tableheaderright" footerClass="tablefooterright" styleClass="tablebodyright">
                            <apex:facet name="header">Amount</apex:facet>
                            <apex:OutputField value="{!oli.UnitPrice}"/>
                            <apex:facet name="footer"></apex:facet>
                        </apex:column>
                
                    </apex:dataTable>
                </td>
            </tr>
            <tr><td width="50%" headerClass="tableheaderright" footerClass="tablefooterright" styleClass="tablebodyright">Subamount</td><td width="50%">EUR XXXX,XX</td></tr>
            <tr><td>VAT</td><td>EUR XXXX,XX</td></tr>
            <tr><td>Total amount</td><td>XXXX,XX</td></tr>
        </table>
        </div>

由于到目前为止产品列表工作正常,现在我需要添加增值税、小计金额和金额的字段,但我不知道该怎么做。

我的想法是创建引用 Pricebook 或 Opportunity Products 对象的自定义公式字段,但我无法在公式生成器中访问这些字段。 这正是我的问题所在:我不知道这些对象之间的关系是如何工作的,也不知道我需要参考哪些字段来完成这个计算。是否有可能访问金额、增值税和子金额的标准字段?如果是,我该如何访问它?

非常感谢!!

实体关系图可以提供帮助:https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/sforce_api_erd_products.htm。虽然有点烂。

如果您在上面有自定义位,请尝试使用设置 -> 架构生成器。

Opportunity 通过 OpportunityLineItem 与 Product 存在多对多关系。您在 ERD 上看不到它,但绝对有一个 OpportunityLineItem.Product2Id 查找(外键)。

与 Pricebook 的关系有点混乱。商机 -> 下至订单项 -> 上至价格手册条目 -> 上至价格手册。

好的,那么您可以做什么...您可以在商机上创建 rollup summary 字段,将总税额作为订单项税额的总和?然后,您将在 PDF 中显示 {!Opportunity.Amount}{!Opportunity.TotalTax__c} 或其他内容。我不知道你是如何计算税金的,它是 OppLineItem 上的自定义字段吗?谁来决定利率?产品?账户所在国家?价目表条目和您有不同的条目/产品?还是您只关心 1 个国家/地区,所以您只需支付 1 个统一费率就可以完成工作?如果它是总数的 20%,那么你已经有了 Opportunity.Amount,再做一个关于机会和工作完成的公式?

如果您不想创建一个字段 - 您可以添加一块 Apex 作为 controller extension,查询数据,在那里进行计算并显示您的值。这可能……不太好。当我制作与会计相关的 PDF 时,我尽量使它们尽可能简单。没有计算,只是尽职尽责地获取由其他东西计算的值并按原样显示它们,可能带有一些格式。在测试期间,用户可能并不总能发现 PDF 中的错误。如果是真实的领域,能上报的东西更容易被抓到。因此,即使税收计算对于公式和汇总来说太混乱了,我也可能会用 flow/trigger;将值保存到辅助字段,而不是将其隐藏在 PDF 后面。

(也有在纯 Visualforce 中执行此操作的方法,没有自定义代码,巧妙地滥用了 apex:repeatapex:variable tags...但是,我再次建议不要这样做。太重要了在表示层中有舍入误差等)