定价规则与价格覆盖
Carbon 如何确定行上的价格——从基础价格到价格覆盖和定价规则。
Carbon 为每条报价单或行解析单价。它从基础价格开始,选择适用的,应用匹配的,并把计算轨迹保存在行上。价格覆盖定义协商价格和数量阶梯;定价规则定义公司范围的折扣和加价。
定价规则
定价规则是按公司划分、用于上调或下调价格的规则。每条规则是 Discount(折扣)或 Markup(加价),以 Percentage(百分比)或 Fixed(固定金额)表示,或者是为已配置部件选项定价的 Configuration(配置)规则(见下文)。规则仅在行匹配其条件时触发。
Discount(降低价格)、Markup(提高价格)或 Configuration(为已配置部件选项定价)。Percentage 或 Fixed。百分比以 0 到 1 的小数存储(10% 为 0.10),因此表单上限为 100%。0。只有当所有已设置条件都成立时,规则才匹配行:数量在 min/max 内、日期在有效窗口内、物料和客户落在物料/客户限制内(空限制表示无限制)。只有匹配且启用的规则进入计算。
百分比是小数,不是整数
Percentage 金额是 0 到 1 之间的小数(10% 为 0.10)。规则表单拒绝大于 1 的值。如果你输入 15 期望 15%,那实际是 1500% 的调整。
配置规则
Configuration 规则没有自己的金额或物料范围。你选择一个已配置部件(只列出需要配置的部件),表单会显示 Configuration Prices(配置价格) 区域,列出该部件的配置参数。每个金额是在行的配置匹配时加到行单价上的单位附加费:
- 列表参数按选项取值(
Color = Red → 10)。 - 布尔参数在值为真时取值。
- 数值参数按值单位取值(
0.50 × Length)。
文本、日期和原材料参数无法定价。金额带符号,负值表示折让。所有匹配的配置规则附加费会叠加。它们在折扣和加价规则之前加入,因此折扣也作用于附加费。每个附加费在价格轨迹中显示为以参数名标注的 Configuration 步骤。客户范围、日期、数量范围和优先级与其他规则一致。不应用后续规则的价格覆盖仍会采用配置价格,因为配置价格是为所选选项定价,而不是为部件定价。
只要行有配置,配置价格就会应用:报价行在配置或重新配置时重新定价;销售订单行有自己的 Configure(配置) 按钮。
价格覆盖
价格覆盖为特定物料固定协商价格,可选带数量阶梯。与规则不同,价格覆盖直接替换基础价格,而不是调整它。价格覆盖有三种范围,单个覆盖只针对一个范围:
- 客户——此物料,此客户。
- 客户类型——此物料,该客户类型的所有客户。
- 所有客户——此物料,所有客户。在覆盖表单选择 All Customers;通过 API 发送
allCustomers: true。
价格覆盖只指定一个范围。客户和客户类型都留空会被拒绝,而不是理解为所有客户,因为面向所有客户的价格会在每张报价单上替换物料的标价。
价格覆盖列在销售 → 价格表中。在范围选择器中选择客户、客户类型或 All Customers。客户的价格表还会显示其从客户类型和所有客户继承的覆盖,每个都标记来源范围(Override、Type Override、All Override),因此为该客户定了不同价格的每个物料都会出现。每个覆盖带一组数量阶梯——数量 → 覆盖价格 的档位。对于给定行数量,Carbon 选择数量不大于订购数量的最高档位。档位为 1、5、10 时订购 8 个,得到 5 档的价格。
数量 → 覆盖价格 档位。重复数量会被拒绝。你可以用 Duplicate price list(复制价格表) 从另一个客户或类型复制价格表,对目标已定价的物料选择 skip(跳过)或 overwrite(覆盖)策略。
价格覆盖是价格表,不是折扣
价格覆盖直接设置起始价格。之后规则是否调整它由该覆盖的 Apply rules on top 标志逐条决定,而不是全局设置。
引擎如何确定价格
解析自上而下运行。结果连同每个步骤作为价格轨迹保存在行上,行还会记录驱动最终数字的 pricing rule(如有)。
从基础价格开始。 物料的单位销售价,或报价已计算出的成本滚动价。轨迹来源:Base。
应用最佳匹配的覆盖(如有)。 Carbon 按严格优先级检查三个范围,并采用第一个产生档位的范围:客户覆盖 → 客户类型覆盖 → 所有客户覆盖。 一旦某个范围匹配,就不会再落到更低范围。如果订购数量低于覆盖的最小档,该范围不匹配,Carbon 尝试下一个。胜出的覆盖设置起始价格。轨迹来源:Override、Type Override 或 All Override。在价格轨迹中,该步骤会链接到所应用的覆盖(在此链接出现之前存储的轨迹显示为纯文本)。
叠加定价规则,除非胜出的覆盖把 Apply rules on top 设为关闭。所有匹配的启用规则在此应用,顺序如下。轨迹来源:Rule。
截断并记录。 负结果下限为零,最终价格连同完整轨迹写入行。
因此优先级是:客户覆盖 > 客户类型覆盖 > 所有客户覆盖 > 基础价格,然后规则在胜出的起始价格之上运行。
规则冲突时谁胜出
折扣和加价的组合方式不同,这也是最让人意外的地方:
- 折扣不叠加——优先级最高的单个折扣胜出。 多条折扣规则匹配时,Carbon 按优先级排序(并列时按较大的有效金额),只应用最高的一条,其余丢弃。同一行永远不会有两个折扣。
- 加价叠加并复合。 所有匹配的加价规则按优先级顺序应用,每条都基于已经调整过的当前价格计算。20% 之后的 10% 是复合,而不是简单相加。
配置价格先加,然后折扣,然后加价栈,最后零下限。
两个折扣永远不会合并
如果客户同时符合 10% 和 15% 的折扣规则,只能得到 15%——绝不是 25%,也绝不是依次应用两者。加价相反:全部应用并复合。
价格解析是取值,不是锁定
解析在行上的物料或数量变化时运行并填入单价。它只是一个起点,你仍可手工编辑;轨迹记录建议数字是如何得出的。
应用位置
同一引擎为两个界面定价。在报价行上,它在成本滚动和重新定价时运行。在销售订单行上,行表单在你选择物料或修改数量时调用同一解析,填入单价并保存轨迹。两种行都携带解析后的价格及其来源,因此价格可以追溯到产生它的确切覆盖和规则。
Carbon 没有单独的价格表单据。价格表就是限定到某个客户或客户类型的一组覆盖。价格由应用解析,数据库不做解析。