Remove all "FileHasObject" edge reads and writes
[phabricator.git] / src / applications / phortune / storage / PhortunePurchase.php
blobdf930820a1bdfe00393df401be675b4e6864fe18
1 <?php
3 /**
4 * A purchase represents a user buying something.
5 */
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;
19 protected $cartPHID;
20 protected $basePriceAsCurrency;
21 protected $quantity;
22 protected $status;
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)
35 ->setQuantity(1)
36 ->setStatus(self::STATUS_PENDING)
37 ->setBasePriceAsCurrency($product->getPriceAsCurrency());
40 protected function getConfiguration() {
41 return array(
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',
53 'status' => 'text32',
55 self::CONFIG_KEY_SCHEMA => array(
56 'key_cart' => 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) {
69 $this->cart = $cart;
70 return $this;
73 public function getCart() {
74 return $this->assertAttached($this->cart);
77 public function attachProduct(PhortuneProduct $product) {
78 $this->product = $product;
79 return $this;
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);
102 return $price;
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;
111 return $this;
115 /* -( PhabricatorPolicyInterface )----------------------------------------- */
118 public function getCapabilities() {
119 return array(
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.');