ranskills / billing-boss
一个通过领域特定语言(DSL)表达要应用的计费结构的库
Requires
- php: ^7.3
Requires (Dev)
This package is auto-updated.
Last update: 2024-09-08 18:56:22 UTC
README
计费老板 是一个免费、开源的库,它通过领域特定语言(DSL)实现计费,以表达要应用的计费结构。
该库在以下语言中有实现
功能
为什么使用这个库
- 这是一个完全测试过的库
- 让您能够专注于开发下一个伟大的应用程序,而无需实现if,循环等来应用计费、折扣等。
- 可用于任何基于其他金额(如计费、折扣等)的金额的地方
- 由于其使用DSL,计费结构可以持久化并在需要时加载,允许将不同的计费定义与相关的实体(如客户、客户组等)一起存储。
安装
建议通过 composer 进行安装,运行以下命令
$ composer require ranskills/billing-boss
或者
从项目的发布页面 下载 最新存档。
测试
使用以下命令运行测试
$ composer test
确保已安装测试依赖项,如果需要,请运行 composer install
用法
<?php // 1. Import the required classes from the library use BillingBoss\BillingBoss; use BillingBoss\BillContext; // 2. Define the context to be interpreted $ctxt = new BillContext(1000, '2.5%, 1 - *'); // 3. Pass the context to be interpreted $bill = BillingBoss::interpret($ctxt); // $bill = 25.00
记法
解释整个库中使用的常见记法。
支持的计费类型/解释器
固定费率
固定费率,即固定费率计费
对于同一范围内的所有可计费金额应用相同的金额。
结构:
number, range (| number, range)*
示例 1:
0.50, 1 - *
读取:对1或以上的所有金额收取0.50的固定费率
示例 2:
1, 1 - 499.99 | 10, 500 - *
对于低于500的金额,收取1的费用,否则对500以上的金额收取10的费用
百分比
账单是账单金额的百分比
结构:
number%, range (| number%, range)*
示例 1:1%, 1 - *
读取:对于大于或等于1的金额,收取1%的费用
示例 2:1%, 1 - 500 | 3%, 501 - 2000 | 5%, 2001 - *
读取:
- 对1到500的金额收取1%的费用
- 对501到2,000的金额收取3%的费用
- 对金额收取5%的费用
上限
账单以可计费金额的百分比表示,但它受到限制或上限,与 百分比计费 不同,在指定的边界内,账单不能超出该边界。
结构:
number% [min, max], range_start - range_end
示例 1: 1% [5, 100], 1 - *
读取:对于至少 1 的金额
如果费用低于最低值,取最低值(5)
如果费用高于最高值,取最高值(100)
否则应用费用
示例 2: 1% [5, 100], 1 - 20000 | 2% [500, 1500], 20001 - *
对于 1 到 1,000 之间的金额,收费 1%,上限为 5 到 100。所有至少 1,001 的金额应收费 2%,上限为 10 到 200。
递增
逐步/迭代应用计费结构,直到剩余待计费金额用尽
结构:
percent%, amount ( > percent%, amount)+
示例:
0%, 261 > 5%, 70 > 10%, 100 > 17.5%, 2810 > 25%, *
此示例代表加纳所得税的结构。
- 赚取的前 261.00 GHS 不收税
- 到下一个 70.00 GHS 收取 5%
- 到下一个 100.00 GHS 收取 10%
- 到下一个 2,810.00 GHS 收取 17.5%
- 25%适用于剩余金额
阶梯
每一步,金额递增到吸引固定费用。计费金额是这些费用的累积
结构:
charge, amount+
示例:
1, 100+
扩展库
可以添加自定义解释器来扩展库的功能,前提是你的独特场景不能通过定义的解释器来处理。
步骤
-
要么 实现 BillInterpreter 接口,要么 扩展 提供一些便捷方法的 AbstractBillInterpreter 抽象类
-
根据需要,定义账单的独特结构,使用上面讨论的 符号
示例实现指南
让我们实现一个账单,假设账单是要计费金额的平方。
bill = amount * amount
需要做出的重要决定是使用什么符号来表示这种类型的账单。符号应该能指示账单的性质,因此让我们使用 ^2
注意:每个符号 MUST 是唯一的,以确保它只能由单个解释器来解释
-
在 SquareBillInterpreter.php 文件中实现
BillInterpreter
接口或扩展AbstractBillInterpreter
<?php namespace YourProject\BillingBoss\Interpreter; use BillingBoss\AbstractBillInterpreter; class SquareBillInterpreter extends AbstractBillInterpreter { public function __construct() { // Defining the regular expression to match the notation ^2 parent::__construct('/^\^2$/'); } public function interpret(BillContext context) { if (!isValid(context)) return 0.0; return context.getAmount() * context.getAmount(); } }
-
通过将其添加到
BillingBoss
来注册您的新自定义解释器BillingBoss::addInterpreter(new SquareBillInterpreter())
就是这样,你已经完成了。
- 测试
$ctxt = new BillContext(50, "^2"); double bill = BillingBoss::bill($ctxt); // bill will be 2500 $ctxt.setAmount(10); bill = BillingBoss::bill($ctxt); // bill will be 100
报告
在此处报告问题、功能请求等。