vaened/php-price-engine

一个强大的产品和服务的定价计算器,具有全面的税务和折扣计算。

v1.0 2024-08-30 19:15 UTC

This package is auto-updated.

Last update: 2024-08-30 19:15:59 UTC


README

Build Status Software License

定价计算库是一个工具,允许你在应用程序中执行价格、税费、折扣和收费的复杂计算。这个库基于 Brick\Money 库,以确保精确的货币计算。

安装

你可以使用 composer 安装此库。

composer require vaened/php-price-engine

用法

初始化收银员

要开始使用定价引擎,创建任何 收银员 的实例,并提供一个 Amount

$cashier = new SimpleCashier(
    Amount::taxable(
        Money::of(100, 'USD'),
        TaxCodes::any()
    ),
    quantity : 1,
    taxes    : Taxes::from([
        Tax\Inclusive::proporcional(21, TaxCode::IVA),
    ])
);

更新数量

你可以使用 update() 方法更新数量,该方法将在下一个总结中计算总计。

$cashier->update(10);

应用折扣

要应用折扣,请使用 apply() 方法,该方法将在下一个总结中计算总计,并将接收 N 个 Discount 参数。

$cashier->apply(
    Discount::proporcional(2)->named('NEW_USERS'),
    Discount::fixed(5)->named('PROMOTIONAL'),
);

添加费用

要添加费用,请使用 add() 方法,它将在下一个总结中计算总计,并接收 N 个 Charge 参数。

$cashier->add(
    Charge::proporcional(5)->named('POS'),
    Charge::fixed(10)->named('DELIVERY')
);

获取单个总计

要获取任何价格调整器的单个值,你可以使用 tax() charge()discount() 函数,这些函数都接收在创建时建立的代码,并返回一个 Adjustment 实例。

$cashier->taxes()->locate('IVA');
$cashier->charges()->locate('DELIVERY');
$cashier->discounts()->locate('NEW_USERS');

获取总计

要获取总计,你可以使用单个函数,每个函数都返回一个 Brick\Money 实例。

$cashier->quantity();
$cashier->unitPrice();
$cashier->subtotal();
$cashier->taxes()->total();
$cashier->charges()->total();
$cashier->discounts()->total();
$cashier->total();

配置

目前有 2 种内置方式来处理计算

收银员

  • SimpleCashier: 这个 cashier 基于毛利润概念操作。这意味着提供的价格将被清理以获得不含税的最终价格。调整直接应用于毛利润,并在调整后单独计算税费。

  • RegularCashier: 这个 cashier 基于单价 + 税的概念操作。这意味着配置的税费将保持或添加到指示的价格中,折扣和费用将包含税费应用于此价格。

选择最适合您特定业务需求和要求的 cashier。您可以创建自己的收银员以适应任何与您的业务相关的特定逻辑或规则。如果您需要创建额外的收银员或实现自定义逻辑,可以通过扩展 Cashier 来完成。此库提供了一个灵活的基础,以有效地处理各种定价场景。

金额

有 2 种方式来创建金额。

  • 包含税的金额:这些金额受税费影响,无论它们是 包含税 还是 不含税,可以按以下方式定义。

    Amount::taxable(
        Money::of(100, 'PEN'),
        TaxCodes::only(['IGV'])
    );

    税费代码确定哪些税费适用于金额

  • 不含税金额:这些金额不适用任何税费,不会应用税费。

    Amount::taxexempt(
        Money::of(10, 'PEN')
    );

    这相当于创建一个应税金额,但通过将 税码 设置为 none() 作为允许的代码。

税费

税费可以通过两种方式确定。

  • 含税:税费包含在单价中,将在计算过程中扣除
    use Vaened\PriceEngine\Adjustments\Tax;
    
    $amount->impose([
      Tax\Inclusive::proporcional(18, 'IGV'); // 18%
      Tax\Inclusive::fixed(2, 'ISC'); // 2 PEN
    ]);
    // or
    $cashier = new RegularCashier(
      ...
      taxes : Taxes::from([
        Tax\Inclusive::proporcional(18, 'IGV'); // 18%
        Tax\Inclusive::fixed(2, 'ISC'); // 2 PEN
      ])
    );
  • 不含税:税费不包含在单价中,将在最终计算中添加。
    use Vaened\PriceEngine\Adjustments\Tax;
    
    $amount->impose([
      Tax\Exclusive::proporcional(18, 'IGV'); // 18%
      Tax\Exclusive::fixed(2, 'ISC'); // 2 PEN
    ]);
    // or
    $cashier = new RegularCashier(
      ...
      taxes : Taxes::from([
        Tax\Exclusive::proporcional(18, 'IGV'); // 18%
        Tax\Exclusive::fixed(2, 'ISC'); // 2 PEN
      ])
    );

许可

此库遵循MIT许可证。有关更多信息,请参阅 许可 文件。