ayeo/

price

简单的价格模型

2.0.6 2023-01-24 11:24 UTC

README

Build Status Software License Packagist Version Coverage

价格

简单的DDD价格模型。目标是使模型的使用尽可能简单。创建对象很容易,不需要任何额外的对象。对象作为值对象 - 是不可变的且自我验证的。它被设计为无副作用。

API

构建

$price = new Price(float $nett, float $gross, "GBP")
$price = Price::buildByNett(float $nett, integer $tax, "USD") - returns Price
$price = Price::buildByGross(float $gross, integer $tax, "EUR") - returns Price

税收

税收方面可能一开始看起来有些困惑。您可能需要构建提供税率的价格

$price = Price::buildByNett(100.00, 8, "USD"):

在这种情况下,税率已知且等于8%。当您添加或减去具有相同税率的金额时,结果金额将具有相同的税率。但是,如果您使用不同的税率进行操作,结果金额的税率将是未知的。

$A = Price::buildByNett(100.00, 8, "USD"):
$B = Price::buildByNett(10.00, 11, "USD"):
$C = $A->add($B);
$C->hasTaxRate(); //returns false

您仍然可以使用以下方法获取税率百分比值(但它不是比率!):

$C->getTax()->getValue(); 

操作

$priceA->add(Price $priceB) - returns Price
$priceA->subtract(Price $priceB) - returns Price
$priceA->multiply(integer $times) - returns Price

$priceA->addGross(float $value) - returns Price
$priceA->subtractGross(float $value) - returns Price

不可变

操作创建新实例

$A = new Price(100.00, 120.00, 'USD');
$B = new Price(10.00, 12.00, 'USD');

$sum = $A->add($B);
$sum->getGross(); //returns 132.00
$A->getGross(); //returns 120.00
$B->getGross(); //returns 12.00

比较

$priceA->isEqual(Price $priceB) - returns bool
$priceA->isLower(Price $priceB) - returns bool
$priceA->isGreater(Price $priceB) - returns bool

约束

  • 净额和总额必须是正数
  • 总额不得低于净额
  • 税率必须是整数
  • 货币符号是可选的,但如果出现,则必须遵循iso 4217(3个大写字母)

待办事项

存在具有不同于2的精度的货币。必须开发该映射。 https://en.wikipedia.org/wiki/ISO_4217#Active_codes

贡献

请随意提交PR,测试必须通过。