ayeo / price
简单的价格模型
2.0.6
2023-01-24 11:24 UTC
Requires
- php: >=7.4
Requires (Dev)
- phpunit/phpunit: ^9.1
README
价格
简单的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,测试必须通过。