使用 Freemarker 为发票上的特定项目返回数量 1

Returning a quantity of 1 for specific items on an invoice with Freemarker

我在 NetSuite 的高级 PDF/HTML 模板中使用 Freemarker 来生成发票。对于特定的项目类型,我想在发票上显示“1”而不是实际数量。这是基于 "Services" 的项目类别下拉字段选择。我目前的尝试如下。

<#if record.custitem_item_category?string?contains("Services")>
<td align="center" colspan="3" line-height="150%">1</td>
<#else>
<td align="center" colspan="3" line-height="150%">${item.quantity}</td>
</#if>

我尝试用 ?has_content 验证最初的 #if 语句,但它只是跳到 #else 语句,所以我想我错过了一些东西。

您的 if 语句看起来是正确的,这意味着 record.custitem_item_category?string?contains("Services") 没有返回您认为的值。通常你只会在数字上使用 ?string 将其转换为字符串,如果它已经是一个字符串,这是不必要的。

试着在每一行打印出 ${record.custitem_item_category},看看你得到了什么结果。如果其中一些包含 'Service' 那么你应该可以在你的 if 语句中使用 record.custitem_item_category?contains("Services")

从字段名称 custitem_xx 看来您正在尝试访问自定义项目字段。这里有两个问题。首先,您需要读取每一行的值(即它应该是 item.item.custitem_item_category 而不是 record.custitem_item_category。但是另外(除非它最近被修复),在 NetSuite 中这样做只是 returns 来自每个单行项目的子列表的第一行。

您需要做的是创建一个自定义交易行字段并从项目的值中获取来源,然后您可以像 item.custcol_item_category 一样访问它。

[当您创建自定义字段时,取消选中存储值以确保它始终以最新值作为来源,并确保它在表单上的屏幕字段下被选中以显示在 UI - 否则它也不适用于您的模板。如果您确实想将其隐藏在 UI 中,您只需将标签空白即可。]

以下内容有效...

<#if item.colname=="Package">(这里可以设置1)

<#elseif item.colname=="Discount"/>(这里可以设置2)

<#else>