4 * A purchase represents a user buying something.
6 final class PhortunePurchase
extends PhortuneDAO
7 implements PhabricatorPolicyInterface
{
9 const STATUS_PENDING
= 'purchase:pending';
10 const STATUS_PROCESSING
= 'purchase:processing';
11 const STATUS_ACTIVE
= 'purchase:active';
12 const STATUS_CANCELED
= 'purchase:canceled';
13 const STATUS_DELIVERED
= 'purchase:delivered';
14 const STATUS_FAILED
= 'purchase:failed';
16 protected $productPHID;
17 protected $accountPHID;
18 protected $authorPHID;
20 protected $basePriceAsCurrency;
23 protected $metadata = array();
25 private $cart = self
::ATTACHABLE
;
26 private $product = self
::ATTACHABLE
;
28 public static function initializeNewPurchase(
29 PhabricatorUser
$actor,
30 PhortuneProduct
$product) {
31 return id(new PhortunePurchase())
32 ->setAuthorPHID($actor->getPHID())
33 ->setProductPHID($product->getPHID())
34 ->attachProduct($product)
36 ->setStatus(self
::STATUS_PENDING
)
37 ->setBasePriceAsCurrency($product->getPriceAsCurrency());
40 protected function getConfiguration() {
42 self
::CONFIG_AUX_PHID
=> true,
43 self
::CONFIG_SERIALIZATION
=> array(
44 'metadata' => self
::SERIALIZATION_JSON
,
46 self
::CONFIG_APPLICATION_SERIALIZERS
=> array(
47 'basePriceAsCurrency' => new PhortuneCurrencySerializer(),
49 self
::CONFIG_COLUMN_SCHEMA
=> array(
50 'cartPHID' => 'phid?',
51 'basePriceAsCurrency' => 'text64',
52 'quantity' => 'uint32',
55 self
::CONFIG_KEY_SCHEMA
=> array(
57 'columns' => array('cartPHID'),
60 ) + parent
::getConfiguration();
63 public function generatePHID() {
64 return PhabricatorPHID
::generateNewPHID(
65 PhortunePurchasePHIDType
::TYPECONST
);
68 public function attachCart(PhortuneCart
$cart) {
73 public function getCart() {
74 return $this->assertAttached($this->cart
);
77 public function attachProduct(PhortuneProduct
$product) {
78 $this->product
= $product;
82 public function getProduct() {
83 return $this->assertAttached($this->product
);
86 public function getFullDisplayName() {
87 return $this->getProduct()->getPurchaseName($this);
90 public function getURI() {
91 return $this->getProduct()->getPurchaseURI($this);
94 public function getTotalPriceAsCurrency() {
95 $base = $this->getBasePriceAsCurrency();
97 $price = PhortuneCurrency
::newEmptyCurrency();
98 for ($ii = 0; $ii < $this->getQuantity(); $ii++
) {
99 $price = $price->add($base);
105 public function getMetadataValue($key, $default = null) {
106 return idx($this->metadata
, $key, $default);
109 public function setMetadataValue($key, $value) {
110 $this->metadata
[$key] = $value;
115 /* -( PhabricatorPolicyInterface )----------------------------------------- */
118 public function getCapabilities() {
120 PhabricatorPolicyCapability
::CAN_VIEW
,
121 PhabricatorPolicyCapability
::CAN_EDIT
,
125 public function getPolicy($capability) {
126 return $this->getCart()->getPolicy($capability);
129 public function hasAutomaticCapability($capability, PhabricatorUser
$viewer) {
130 return $this->getCart()->hasAutomaticCapability($capability, $viewer);
133 public function describeAutomaticCapability($capability) {
134 return pht('Purchases have the policies of their cart.');