mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-18 19:40:55 +01:00
Add cart transactions to Phortune
Summary: Ref T2787. I mostly just want these in place so I can glue emails to them, but they're also useful on their own. Test Plan: {F216515} Reviewers: btrahan Reviewed By: btrahan Subscribers: epriestley Maniphest Tasks: T2787 Differential Revision: https://secure.phabricator.com/D10688
This commit is contained in:
parent
8ba2a1fd44
commit
214b5b7158
8 changed files with 240 additions and 7 deletions
19
resources/sql/autopatches/20141012.phortunecartxaction.sql
Normal file
19
resources/sql/autopatches/20141012.phortunecartxaction.sql
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
CREATE TABLE {$NAMESPACE}_phortune.phortune_carttransaction (
|
||||||
|
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
phid VARCHAR(64) COLLATE utf8_bin NOT NULL,
|
||||||
|
authorPHID VARCHAR(64) COLLATE utf8_bin NOT NULL,
|
||||||
|
objectPHID VARCHAR(64) COLLATE utf8_bin NOT NULL,
|
||||||
|
viewPolicy VARCHAR(64) COLLATE utf8_bin NOT NULL,
|
||||||
|
editPolicy VARCHAR(64) COLLATE utf8_bin NOT NULL,
|
||||||
|
commentPHID VARCHAR(64) COLLATE utf8_bin DEFAULT NULL,
|
||||||
|
commentVersion INT UNSIGNED NOT NULL,
|
||||||
|
transactionType VARCHAR(32) COLLATE utf8_bin NOT NULL,
|
||||||
|
oldValue LONGTEXT COLLATE utf8_bin NOT NULL,
|
||||||
|
newValue LONGTEXT COLLATE utf8_bin NOT NULL,
|
||||||
|
contentSource LONGTEXT COLLATE utf8_bin NOT NULL,
|
||||||
|
metadata LONGTEXT COLLATE utf8_bin NOT NULL,
|
||||||
|
dateCreated INT UNSIGNED NOT NULL,
|
||||||
|
dateModified INT UNSIGNED NOT NULL,
|
||||||
|
UNIQUE KEY `key_phid` (`phid`),
|
||||||
|
KEY `key_object` (`objectPHID`)
|
||||||
|
) ENGINE=InnoDB, COLLATE utf8_general_ci;
|
|
@ -2563,11 +2563,14 @@ phutil_register_library_map(array(
|
||||||
'PhortuneCartCancelController' => 'applications/phortune/controller/PhortuneCartCancelController.php',
|
'PhortuneCartCancelController' => 'applications/phortune/controller/PhortuneCartCancelController.php',
|
||||||
'PhortuneCartCheckoutController' => 'applications/phortune/controller/PhortuneCartCheckoutController.php',
|
'PhortuneCartCheckoutController' => 'applications/phortune/controller/PhortuneCartCheckoutController.php',
|
||||||
'PhortuneCartController' => 'applications/phortune/controller/PhortuneCartController.php',
|
'PhortuneCartController' => 'applications/phortune/controller/PhortuneCartController.php',
|
||||||
|
'PhortuneCartEditor' => 'applications/phortune/editor/PhortuneCartEditor.php',
|
||||||
'PhortuneCartImplementation' => 'applications/phortune/cart/PhortuneCartImplementation.php',
|
'PhortuneCartImplementation' => 'applications/phortune/cart/PhortuneCartImplementation.php',
|
||||||
'PhortuneCartListController' => 'applications/phortune/controller/PhortuneCartListController.php',
|
'PhortuneCartListController' => 'applications/phortune/controller/PhortuneCartListController.php',
|
||||||
'PhortuneCartPHIDType' => 'applications/phortune/phid/PhortuneCartPHIDType.php',
|
'PhortuneCartPHIDType' => 'applications/phortune/phid/PhortuneCartPHIDType.php',
|
||||||
'PhortuneCartQuery' => 'applications/phortune/query/PhortuneCartQuery.php',
|
'PhortuneCartQuery' => 'applications/phortune/query/PhortuneCartQuery.php',
|
||||||
'PhortuneCartSearchEngine' => 'applications/phortune/query/PhortuneCartSearchEngine.php',
|
'PhortuneCartSearchEngine' => 'applications/phortune/query/PhortuneCartSearchEngine.php',
|
||||||
|
'PhortuneCartTransaction' => 'applications/phortune/storage/PhortuneCartTransaction.php',
|
||||||
|
'PhortuneCartTransactionQuery' => 'applications/phortune/query/PhortuneCartTransactionQuery.php',
|
||||||
'PhortuneCartUpdateController' => 'applications/phortune/controller/PhortuneCartUpdateController.php',
|
'PhortuneCartUpdateController' => 'applications/phortune/controller/PhortuneCartUpdateController.php',
|
||||||
'PhortuneCartViewController' => 'applications/phortune/controller/PhortuneCartViewController.php',
|
'PhortuneCartViewController' => 'applications/phortune/controller/PhortuneCartViewController.php',
|
||||||
'PhortuneCharge' => 'applications/phortune/storage/PhortuneCharge.php',
|
'PhortuneCharge' => 'applications/phortune/storage/PhortuneCharge.php',
|
||||||
|
@ -5631,10 +5634,13 @@ phutil_register_library_map(array(
|
||||||
'PhortuneCartCancelController' => 'PhortuneCartController',
|
'PhortuneCartCancelController' => 'PhortuneCartController',
|
||||||
'PhortuneCartCheckoutController' => 'PhortuneCartController',
|
'PhortuneCartCheckoutController' => 'PhortuneCartController',
|
||||||
'PhortuneCartController' => 'PhortuneController',
|
'PhortuneCartController' => 'PhortuneController',
|
||||||
|
'PhortuneCartEditor' => 'PhabricatorApplicationTransactionEditor',
|
||||||
'PhortuneCartListController' => 'PhortuneController',
|
'PhortuneCartListController' => 'PhortuneController',
|
||||||
'PhortuneCartPHIDType' => 'PhabricatorPHIDType',
|
'PhortuneCartPHIDType' => 'PhabricatorPHIDType',
|
||||||
'PhortuneCartQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
'PhortuneCartQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
||||||
'PhortuneCartSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
'PhortuneCartSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
||||||
|
'PhortuneCartTransaction' => 'PhabricatorApplicationTransaction',
|
||||||
|
'PhortuneCartTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
||||||
'PhortuneCartUpdateController' => 'PhortuneCartController',
|
'PhortuneCartUpdateController' => 'PhortuneCartController',
|
||||||
'PhortuneCartViewController' => 'PhortuneCartController',
|
'PhortuneCartViewController' => 'PhortuneCartController',
|
||||||
'PhortuneCharge' => array(
|
'PhortuneCharge' => array(
|
||||||
|
|
|
@ -267,14 +267,10 @@ final class PhortuneAccountViewController extends PhortuneController {
|
||||||
->withObjectPHIDs(array($account->getPHID()))
|
->withObjectPHIDs(array($account->getPHID()))
|
||||||
->execute();
|
->execute();
|
||||||
|
|
||||||
$engine = id(new PhabricatorMarkupEngine())
|
|
||||||
->setViewer($user);
|
|
||||||
|
|
||||||
$xaction_view = id(new PhabricatorApplicationTransactionView())
|
$xaction_view = id(new PhabricatorApplicationTransactionView())
|
||||||
->setUser($user)
|
->setUser($user)
|
||||||
->setObjectPHID($account->getPHID())
|
->setObjectPHID($account->getPHID())
|
||||||
->setTransactions($xactions)
|
->setTransactions($xactions);
|
||||||
->setMarkupEngine($engine);
|
|
||||||
|
|
||||||
return $xaction_view;
|
return $xaction_view;
|
||||||
}
|
}
|
||||||
|
|
|
@ -160,11 +160,23 @@ final class PhortuneCartViewController
|
||||||
$this->addAccountCrumb($crumbs, $cart->getAccount());
|
$this->addAccountCrumb($crumbs, $cart->getAccount());
|
||||||
$crumbs->addTextCrumb(pht('Cart %d', $cart->getID()));
|
$crumbs->addTextCrumb(pht('Cart %d', $cart->getID()));
|
||||||
|
|
||||||
|
$xactions = id(new PhortuneCartTransactionQuery())
|
||||||
|
->setViewer($viewer)
|
||||||
|
->withObjectPHIDs(array($cart->getPHID()))
|
||||||
|
->execute();
|
||||||
|
|
||||||
|
$xaction_view = id(new PhabricatorApplicationTransactionView())
|
||||||
|
->setUser($viewer)
|
||||||
|
->setObjectPHID($cart->getPHID())
|
||||||
|
->setTransactions($xactions)
|
||||||
|
->setShouldTerminate(true);
|
||||||
|
|
||||||
return $this->buildApplicationPage(
|
return $this->buildApplicationPage(
|
||||||
array(
|
array(
|
||||||
$crumbs,
|
$crumbs,
|
||||||
$cart_box,
|
$cart_box,
|
||||||
$charges,
|
$charges,
|
||||||
|
$xaction_view,
|
||||||
),
|
),
|
||||||
array(
|
array(
|
||||||
'title' => pht('Cart'),
|
'title' => pht('Cart'),
|
||||||
|
|
95
src/applications/phortune/editor/PhortuneCartEditor.php
Normal file
95
src/applications/phortune/editor/PhortuneCartEditor.php
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
final class PhortuneCartEditor
|
||||||
|
extends PhabricatorApplicationTransactionEditor {
|
||||||
|
|
||||||
|
public function getEditorApplicationClass() {
|
||||||
|
return 'PhabricatorPhortuneApplication';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getEditorObjectsDescription() {
|
||||||
|
return pht('Phortune Carts');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getTransactionTypes() {
|
||||||
|
$types = parent::getTransactionTypes();
|
||||||
|
|
||||||
|
$types[] = PhortuneCartTransaction::TYPE_CREATED;
|
||||||
|
$types[] = PhortuneCartTransaction::TYPE_PURCHASED;
|
||||||
|
$types[] = PhortuneCartTransaction::TYPE_HOLD;
|
||||||
|
$types[] = PhortuneCartTransaction::TYPE_REVIEW;
|
||||||
|
$types[] = PhortuneCartTransaction::TYPE_CANCEL;
|
||||||
|
$types[] = PhortuneCartTransaction::TYPE_REFUND;
|
||||||
|
|
||||||
|
return $types;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getCustomTransactionOldValue(
|
||||||
|
PhabricatorLiskDAO $object,
|
||||||
|
PhabricatorApplicationTransaction $xaction) {
|
||||||
|
|
||||||
|
switch ($xaction->getTransactionType()) {
|
||||||
|
case PhortuneCartTransaction::TYPE_CREATED:
|
||||||
|
case PhortuneCartTransaction::TYPE_PURCHASED:
|
||||||
|
case PhortuneCartTransaction::TYPE_HOLD:
|
||||||
|
case PhortuneCartTransaction::TYPE_REVIEW:
|
||||||
|
case PhortuneCartTransaction::TYPE_CANCEL:
|
||||||
|
case PhortuneCartTransaction::TYPE_REFUND:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return parent::getCustomTransactionOldValue($object, $xaction);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getCustomTransactionNewValue(
|
||||||
|
PhabricatorLiskDAO $object,
|
||||||
|
PhabricatorApplicationTransaction $xaction) {
|
||||||
|
|
||||||
|
switch ($xaction->getTransactionType()) {
|
||||||
|
case PhortuneCartTransaction::TYPE_CREATED:
|
||||||
|
case PhortuneCartTransaction::TYPE_PURCHASED:
|
||||||
|
case PhortuneCartTransaction::TYPE_HOLD:
|
||||||
|
case PhortuneCartTransaction::TYPE_REVIEW:
|
||||||
|
case PhortuneCartTransaction::TYPE_CANCEL:
|
||||||
|
case PhortuneCartTransaction::TYPE_REFUND:
|
||||||
|
return $xaction->getNewValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
return parent::getCustomTransactionNewValue($object, $xaction);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function applyCustomInternalTransaction(
|
||||||
|
PhabricatorLiskDAO $object,
|
||||||
|
PhabricatorApplicationTransaction $xaction) {
|
||||||
|
|
||||||
|
switch ($xaction->getTransactionType()) {
|
||||||
|
case PhortuneCartTransaction::TYPE_CREATED:
|
||||||
|
case PhortuneCartTransaction::TYPE_PURCHASED:
|
||||||
|
case PhortuneCartTransaction::TYPE_HOLD:
|
||||||
|
case PhortuneCartTransaction::TYPE_REVIEW:
|
||||||
|
case PhortuneCartTransaction::TYPE_CANCEL:
|
||||||
|
case PhortuneCartTransaction::TYPE_REFUND:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
return parent::applyCustomInternalTransaction($object, $xaction);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function applyCustomExternalTransaction(
|
||||||
|
PhabricatorLiskDAO $object,
|
||||||
|
PhabricatorApplicationTransaction $xaction) {
|
||||||
|
|
||||||
|
switch ($xaction->getTransactionType()) {
|
||||||
|
case PhortuneCartTransaction::TYPE_CREATED:
|
||||||
|
case PhortuneCartTransaction::TYPE_PURCHASED:
|
||||||
|
case PhortuneCartTransaction::TYPE_HOLD:
|
||||||
|
case PhortuneCartTransaction::TYPE_REVIEW:
|
||||||
|
case PhortuneCartTransaction::TYPE_CANCEL:
|
||||||
|
case PhortuneCartTransaction::TYPE_REFUND:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
return parent::applyCustomExternalTransaction($object, $xaction);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
final class PhortuneCartTransactionQuery
|
||||||
|
extends PhabricatorApplicationTransactionQuery {
|
||||||
|
|
||||||
|
public function getTemplateApplicationTransaction() {
|
||||||
|
return new PhortuneCartTransaction();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -70,7 +70,26 @@ final class PhortuneCart extends PhortuneDAO
|
||||||
}
|
}
|
||||||
|
|
||||||
public function activateCart() {
|
public function activateCart() {
|
||||||
$this->setStatus(self::STATUS_READY)->save();
|
$this->openTransaction();
|
||||||
|
$this->beginReadLocking();
|
||||||
|
|
||||||
|
$copy = clone $this;
|
||||||
|
$copy->reload();
|
||||||
|
|
||||||
|
if ($copy->getStatus() !== self::STATUS_BUILDING) {
|
||||||
|
throw new Exception(
|
||||||
|
pht(
|
||||||
|
'Cart has wrong status ("%s") to call willApplyCharge().',
|
||||||
|
$copy->getStatus()));
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->setStatus(self::STATUS_READY)->save();
|
||||||
|
|
||||||
|
$this->endReadLocking();
|
||||||
|
$this->saveTransaction();
|
||||||
|
|
||||||
|
$this->recordCartTransaction(PhortuneCartTransaction::TYPE_CREATED);
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -140,6 +159,8 @@ final class PhortuneCart extends PhortuneDAO
|
||||||
|
|
||||||
$this->endReadLocking();
|
$this->endReadLocking();
|
||||||
$this->saveTransaction();
|
$this->saveTransaction();
|
||||||
|
|
||||||
|
$this->recordCartTransaction(PhortuneCartTransaction::TYPE_HOLD);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function didApplyCharge(PhortuneCharge $charge) {
|
public function didApplyCharge(PhortuneCharge $charge) {
|
||||||
|
@ -199,7 +220,7 @@ final class PhortuneCart extends PhortuneDAO
|
||||||
$this->endReadLocking();
|
$this->endReadLocking();
|
||||||
$this->saveTransaction();
|
$this->saveTransaction();
|
||||||
|
|
||||||
// TODO: Notify merchant to review order.
|
$this->recordCartTransaction(PhortuneCartTransaction::TYPE_REVIEW);
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
@ -228,6 +249,8 @@ final class PhortuneCart extends PhortuneDAO
|
||||||
$this->endReadLocking();
|
$this->endReadLocking();
|
||||||
$this->saveTransaction();
|
$this->saveTransaction();
|
||||||
|
|
||||||
|
$this->recordCartTransaction(PhortuneCartTransaction::TYPE_PURCHASED);
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -384,6 +407,30 @@ final class PhortuneCart extends PhortuneDAO
|
||||||
$this->saveTransaction();
|
$this->saveTransaction();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function recordCartTransaction($type) {
|
||||||
|
$omnipotent_user = PhabricatorUser::getOmnipotentUser();
|
||||||
|
$phortune_phid = id(new PhabricatorPhortuneApplication())->getPHID();
|
||||||
|
|
||||||
|
$xactions = array();
|
||||||
|
|
||||||
|
$xactions[] = id(new PhortuneCartTransaction())
|
||||||
|
->setTransactionType($type)
|
||||||
|
->setNewValue(true);
|
||||||
|
|
||||||
|
$content_source = PhabricatorContentSource::newForSource(
|
||||||
|
PhabricatorContentSource::SOURCE_PHORTUNE,
|
||||||
|
array());
|
||||||
|
|
||||||
|
$editor = id(new PhortuneCartEditor())
|
||||||
|
->setActor($omnipotent_user)
|
||||||
|
->setActingAsPHID($phortune_phid)
|
||||||
|
->setContentSource($content_source)
|
||||||
|
->setContinueOnMissingFields(true)
|
||||||
|
->setContinueOnNoEffect(true);
|
||||||
|
|
||||||
|
$editor->applyTransactions($this, $xactions);
|
||||||
|
}
|
||||||
|
|
||||||
public function getName() {
|
public function getName() {
|
||||||
return $this->getImplementation()->getName($this);
|
return $this->getImplementation()->getName($this);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
final class PhortuneCartTransaction
|
||||||
|
extends PhabricatorApplicationTransaction {
|
||||||
|
|
||||||
|
const TYPE_CREATED = 'cart:created';
|
||||||
|
const TYPE_HOLD = 'cart:hold';
|
||||||
|
const TYPE_REVIEW = 'cart:review';
|
||||||
|
const TYPE_CANCEL = 'cart:cancel';
|
||||||
|
const TYPE_REFUND = 'cart:refund';
|
||||||
|
const TYPE_PURCHASED = 'cart:purchased';
|
||||||
|
|
||||||
|
public function getApplicationName() {
|
||||||
|
return 'phortune';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getApplicationTransactionType() {
|
||||||
|
return PhortuneCartPHIDType::TYPECONST;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getApplicationTransactionCommentObject() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getTitle() {
|
||||||
|
$old = $this->getOldValue();
|
||||||
|
$new = $this->getNewValue();
|
||||||
|
|
||||||
|
switch ($this->getTransactionType()) {
|
||||||
|
case self::TYPE_CREATED:
|
||||||
|
return pht('This order was created.');
|
||||||
|
case self::TYPE_HOLD:
|
||||||
|
return pht('This order was put on hold until payment clears.');
|
||||||
|
case self::TYPE_REVIEW:
|
||||||
|
return pht(
|
||||||
|
'This order was flagged for manual processing by the merchant.');
|
||||||
|
case self::TYPE_CANCEL:
|
||||||
|
return pht('This order was cancelled.');
|
||||||
|
case self::TYPE_REFUND:
|
||||||
|
return pht('This order was refunded.');
|
||||||
|
case self::TYPE_PURCHASED:
|
||||||
|
return pht('Payment for this order was completed.');
|
||||||
|
}
|
||||||
|
|
||||||
|
return parent::getTitle();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in a new issue