ranskills/billing-boss

一个通过领域特定语言(DSL)表达要应用的计费结构的库

1.0.0-rc2 2019-05-07 13:51 UTC

This package is auto-updated.

Last update: 2024-09-08 18:56:22 UTC


README

Build Status codecov Scrutinizer Code Quality License: MIT

计费老板 是一个免费、开源的库,它通过领域特定语言(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

记法

解释整个库中使用的常见记法。

支持的计费类型/解释器

  1. 固定费率
  2. 百分比
  3. 上限
  4. 递增
  5. 阶梯

固定费率

固定费率,即固定费率计费

对于同一范围内的所有可计费金额应用相同的金额。

结构: 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)*

示例 11%, 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+

扩展库

可以添加自定义解释器来扩展库的功能,前提是你的独特场景不能通过定义的解释器来处理。

步骤

  1. 要么 实现 BillInterpreter 接口,要么 扩展 提供一些便捷方法的 AbstractBillInterpreter 抽象类

  2. 根据需要,定义账单的独特结构,使用上面讨论的 符号

示例实现指南

让我们实现一个账单,假设账单是要计费金额的平方。

bill = amount * amount

需要做出的重要决定是使用什么符号来表示这种类型的账单。符号应该能指示账单的性质,因此让我们使用 ^2

注意:每个符号 MUST 是唯一的,以确保它只能由单个解释器来解释

  1. 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();
        }
    }
  2. 通过将其添加到 BillingBoss 来注册您的新自定义解释器

    BillingBoss::addInterpreter(new SquareBillInterpreter())

就是这样,你已经完成了。

  1. 测试
    $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

报告

在此报告问题、功能请求等。