Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F15666940
D10652.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
32 KB
Referenced Files
None
Subscribers
None
D10652.diff
View Options
diff --git a/resources/sql/autopatches/20141007.fundmerchant.sql b/resources/sql/autopatches/20141007.fundmerchant.sql
new file mode 100644
--- /dev/null
+++ b/resources/sql/autopatches/20141007.fundmerchant.sql
@@ -0,0 +1,2 @@
+ALTER TABLE {$NAMESPACE}_fund.fund_initiative
+ ADD merchantPHID VARBINARY(64);
diff --git a/resources/sql/autopatches/20141007.phortunecartmerchant.sql b/resources/sql/autopatches/20141007.phortunecartmerchant.sql
new file mode 100644
--- /dev/null
+++ b/resources/sql/autopatches/20141007.phortunecartmerchant.sql
@@ -0,0 +1,5 @@
+ALTER TABLE {$NAMESPACE}_phortune.phortune_cart
+ ADD merchantPHID VARBINARY(64) NOT NULL;
+
+ALTER TABLE {$NAMESPACE}_phortune.phortune_cart
+ ADD KEY `key_merchant` (merchantPHID);
diff --git a/resources/sql/autopatches/20141007.phortunecharge.sql b/resources/sql/autopatches/20141007.phortunecharge.sql
new file mode 100644
--- /dev/null
+++ b/resources/sql/autopatches/20141007.phortunecharge.sql
@@ -0,0 +1,16 @@
+TRUNCATE TABLE {$NAMESPACE}_phortune.phortune_charge;
+
+ALTER TABLE {$NAMESPACE}_phortune.phortune_charge
+ DROP paymentProviderKey;
+
+ALTER TABLE {$NAMESPACE}_phortune.phortune_charge
+ ADD merchantPHID VARBINARY(64) NOT NULL;
+
+ALTER TABLE {$NAMESPACE}_phortune.phortune_charge
+ ADD providerPHID VARBINARY(64) NOT NULL;
+
+ALTER TABLE {$NAMESPACE}_phortune.phortune_charge
+ ADD KEY `key_merchant` (merchantPHID);
+
+ALTER TABLE {$NAMESPACE}_phortune.phortune_charge
+ ADD KEY `key_provider` (providerPHID);
diff --git a/resources/sql/autopatches/20141007.phortunepayment.sql b/resources/sql/autopatches/20141007.phortunepayment.sql
new file mode 100644
--- /dev/null
+++ b/resources/sql/autopatches/20141007.phortunepayment.sql
@@ -0,0 +1,16 @@
+TRUNCATE TABLE {$NAMESPACE}_phortune.phortune_paymentmethod;
+
+ALTER TABLE {$NAMESPACE}_phortune.phortune_paymentmethod
+ DROP providerType;
+
+ALTER TABLE {$NAMESPACE}_phortune.phortune_paymentmethod
+ DROP providerDomain;
+
+ALTER TABLE {$NAMESPACE}_phortune.phortune_paymentmethod
+ ADD merchantPHID VARBINARY(64) NOT NULL;
+
+ALTER TABLE {$NAMESPACE}_phortune.phortune_paymentmethod
+ ADD providerPHID VARBINARY(64) NOT NULL;
+
+ALTER TABLE {$NAMESPACE}_phortune.phortune_paymentmethod
+ ADD KEY `key_merchant` (merchantPHID, accountPHID);
diff --git a/src/applications/fund/controller/FundInitiativeBackController.php b/src/applications/fund/controller/FundInitiativeBackController.php
--- a/src/applications/fund/controller/FundInitiativeBackController.php
+++ b/src/applications/fund/controller/FundInitiativeBackController.php
@@ -21,6 +21,14 @@
return new Aphront404Response();
}
+ $merchant = id(new PhortuneMerchantQuery())
+ ->setViewer($viewer)
+ ->withPHIDs(array($initiative->getMerchantPHID()))
+ ->executeOne();
+ if (!$merchant) {
+ return new Aphront404Response();
+ }
+
$initiative_uri = '/'.$initiative->getMonogram();
if ($initiative->isClosed()) {
@@ -73,7 +81,7 @@
$cart_implementation = id(new FundBackerCart())
->setInitiative($initiative);
- $cart = $account->newCart($viewer, $cart_implementation);
+ $cart = $account->newCart($viewer, $cart_implementation, $merchant);
$purchase = $cart->newPurchase($viewer, $product);
$purchase
diff --git a/src/applications/fund/controller/FundInitiativeEditController.php b/src/applications/fund/controller/FundInitiativeEditController.php
--- a/src/applications/fund/controller/FundInitiativeEditController.php
+++ b/src/applications/fund/controller/FundInitiativeEditController.php
@@ -48,6 +48,9 @@
$e_name = true;
$v_name = $initiative->getName();
+ $e_merchant = null;
+ $v_merchant = $initiative->getMerchantPHID();
+
$v_desc = $initiative->getDescription();
if ($is_new) {
@@ -65,10 +68,12 @@
$v_desc = $request->getStr('description');
$v_view = $request->getStr('viewPolicy');
$v_edit = $request->getStr('editPolicy');
+ $v_merchant = $request->getStr('merchantPHID');
$v_projects = $request->getArr('projects');
$type_name = FundInitiativeTransaction::TYPE_NAME;
$type_desc = FundInitiativeTransaction::TYPE_DESCRIPTION;
+ $type_merchant = FundInitiativeTransaction::TYPE_MERCHANT;
$type_view = PhabricatorTransactions::TYPE_VIEW_POLICY;
$type_edit = PhabricatorTransactions::TYPE_EDIT_POLICY;
@@ -83,6 +88,10 @@
->setNewValue($v_desc);
$xactions[] = id(new FundInitiativeTransaction())
+ ->setTransactionType($type_merchant)
+ ->setNewValue($v_merchant);
+
+ $xactions[] = id(new FundInitiativeTransaction())
->setTransactionType($type_view)
->setNewValue($v_view);
@@ -110,6 +119,7 @@
$validation_exception = $ex;
$e_name = $ex->getShortMessage($type_name);
+ $e_merchant = $ex->getShortMessage($type_merchant);
$initiative->setViewPolicy($v_view);
$initiative->setEditPolicy($v_edit);
@@ -127,6 +137,45 @@
$project_handles = array();
}
+ $merchants = id(new PhortuneMerchantQuery())
+ ->setViewer($viewer)
+ ->requireCapabilities(
+ array(
+ PhabricatorPolicyCapability::CAN_VIEW,
+ PhabricatorPolicyCapability::CAN_EDIT,
+ ))
+ ->execute();
+
+ $merchant_options = array();
+ foreach ($merchants as $merchant) {
+ $merchant_options[$merchant->getPHID()] = pht(
+ 'Merchant %d %s',
+ $merchant->getID(),
+ $merchant->getName());
+ }
+
+ if ($v_merchant && empty($merchant_options[$v_merchant])) {
+ $merchant_options = array(
+ $v_merchant => pht('(Restricted Merchant)'),
+ ) + $merchant_options;
+ }
+
+ if (!$merchant_options) {
+ return $this->newDialog()
+ ->setTitle(pht('No Valid Phortune Merchant Accounts'))
+ ->appendParagraph(
+ pht(
+ 'You do not control any merchant accounts which can receive '.
+ 'payments from this initiative. When you create an initiative, '.
+ 'you need to specify a merchant account where funds will be paid '.
+ 'to.'))
+ ->appendParagraph(
+ pht(
+ 'Create a merchant account in the Phortune application before '.
+ 'creating an initiative in Fund.'))
+ ->addCancelButton($this->getApplicationURI());
+ }
+
$form = id(new AphrontFormView())
->setUser($viewer)
->appendChild(
@@ -136,6 +185,13 @@
->setValue($v_name)
->setError($e_name))
->appendChild(
+ id(new AphrontFormSelectControl())
+ ->setName('merchantPHID')
+ ->setLabel(pht('Pay To Merchant'))
+ ->setValue($v_merchant)
+ ->setError($e_merchant)
+ ->setOptions($merchant_options))
+ ->appendChild(
id(new PhabricatorRemarkupControl())
->setName('description')
->setLabel(pht('Description'))
diff --git a/src/applications/fund/editor/FundInitiativeEditor.php b/src/applications/fund/editor/FundInitiativeEditor.php
--- a/src/applications/fund/editor/FundInitiativeEditor.php
+++ b/src/applications/fund/editor/FundInitiativeEditor.php
@@ -18,6 +18,7 @@
$types[] = FundInitiativeTransaction::TYPE_DESCRIPTION;
$types[] = FundInitiativeTransaction::TYPE_STATUS;
$types[] = FundInitiativeTransaction::TYPE_BACKER;
+ $types[] = FundInitiativeTransaction::TYPE_MERCHANT;
$types[] = PhabricatorTransactions::TYPE_VIEW_POLICY;
$types[] = PhabricatorTransactions::TYPE_EDIT_POLICY;
@@ -36,6 +37,8 @@
return $object->getStatus();
case FundInitiativeTransaction::TYPE_BACKER:
return null;
+ case FundInitiativeTransaction::TYPE_MERCHANT:
+ return $object->getMerchantPHID();
}
return parent::getCustomTransactionOldValue($object, $xaction);
@@ -50,6 +53,7 @@
case FundInitiativeTransaction::TYPE_DESCRIPTION:
case FundInitiativeTransaction::TYPE_STATUS:
case FundInitiativeTransaction::TYPE_BACKER:
+ case FundInitiativeTransaction::TYPE_MERCHANT:
return $xaction->getNewValue();
}
@@ -67,6 +71,9 @@
case FundInitiativeTransaction::TYPE_DESCRIPTION:
$object->setDescription($xaction->getNewValue());
return;
+ case FundInitiativeTransaction::TYPE_MERCHANT:
+ $object->setMerchantPHID($xaction->getNewValue());
+ return;
case FundInitiativeTransaction::TYPE_STATUS:
$object->setStatus($xaction->getNewValue());
return;
@@ -89,6 +96,7 @@
case FundInitiativeTransaction::TYPE_NAME:
case FundInitiativeTransaction::TYPE_DESCRIPTION:
case FundInitiativeTransaction::TYPE_STATUS:
+ case FundInitiativeTransaction::TYPE_MERCHANT:
case FundInitiativeTransaction::TYPE_BACKER:
// TODO: Maybe we should apply the backer transaction from here?
return;
@@ -124,6 +132,46 @@
$errors[] = $error;
}
break;
+ case FundInitiativeTransaction::TYPE_MERCHANT:
+ $missing = $this->validateIsEmptyTextField(
+ $object->getName(),
+ $xactions);
+ if ($missing) {
+ $error = new PhabricatorApplicationTransactionValidationError(
+ $type,
+ pht('Required'),
+ pht('Payable merchant is required.'),
+ nonempty(last($xactions), null));
+
+ $error->setIsMissingFieldError(true);
+ $errors[] = $error;
+ } else if ($xactions) {
+ $merchant_phid = last($xactions)->getNewValue();
+
+ // Make sure the actor has permission to edit the merchant they're
+ // selecting. You aren't allowed to send payments to an account you
+ // do not control.
+ $merchants = id(new PhortuneMerchantQuery())
+ ->setViewer($this->requireActor())
+ ->withPHIDs(array($merchant_phid))
+ ->requireCapabilities(
+ array(
+ PhabricatorPolicyCapability::CAN_VIEW,
+ PhabricatorPolicyCapability::CAN_EDIT,
+ ))
+ ->execute();
+ if (!$merchants) {
+ $error = new PhabricatorApplicationTransactionValidationError(
+ $type,
+ pht('Invalid'),
+ pht(
+ 'You must specify a merchant account you control as the '.
+ 'recipient of funds from this initiative.'),
+ last($xactions));
+ $errors[] = $error;
+ }
+ }
+ break;
}
return $errors;
diff --git a/src/applications/fund/storage/FundInitiative.php b/src/applications/fund/storage/FundInitiative.php
--- a/src/applications/fund/storage/FundInitiative.php
+++ b/src/applications/fund/storage/FundInitiative.php
@@ -13,6 +13,7 @@
protected $name;
protected $ownerPHID;
+ protected $merchantPHID;
protected $description;
protected $viewPolicy;
protected $editPolicy;
@@ -52,6 +53,7 @@
'name' => 'text255',
'description' => 'text',
'status' => 'text32',
+ 'merchantPHID' => 'phid?',
),
self::CONFIG_KEY_SCHEMA => array(
'key_status' => array(
diff --git a/src/applications/fund/storage/FundInitiativeTransaction.php b/src/applications/fund/storage/FundInitiativeTransaction.php
--- a/src/applications/fund/storage/FundInitiativeTransaction.php
+++ b/src/applications/fund/storage/FundInitiativeTransaction.php
@@ -7,6 +7,7 @@
const TYPE_DESCRIPTION = 'fund:description';
const TYPE_STATUS = 'fund:status';
const TYPE_BACKER = 'fund:backer';
+ const TYPE_MERCHANT = 'fund:merchant';
public function getApplicationName() {
return 'fund';
@@ -20,6 +21,27 @@
return null;
}
+ public function getRequiredHandlePHIDs() {
+ $phids = parent::getRequiredHandlePHIDs();
+
+ $old = $this->getOldValue();
+ $new = $this->getNewValue();
+
+ $type = $this->getTransactionType();
+ switch ($type) {
+ case FundInitiativeTransaction::TYPE_MERCHANT:
+ if ($old) {
+ $phids[] = $old;
+ }
+ if ($new) {
+ $phids[] = $new;
+ }
+ break;
+ }
+
+ return $phids;
+ }
+
public function getTitle() {
$author_phid = $this->getAuthorPHID();
$object_phid = $this->getObjectPHID();
@@ -62,6 +84,20 @@
return pht(
'%s backed this initiative.',
$this->renderHandleLink($author_phid));
+ case FundInitiativeTransaction::TYPE_MERCHANT:
+ if ($old === null) {
+ return pht(
+ '%s set this initiative to pay to %s.',
+ $this->renderHandleLink($author_phid),
+ $this->renderHandleLink($new));
+ } else {
+ return pht(
+ '%s changed the merchant receiving funds from this '.
+ 'initiative from %s to %s.',
+ $this->renderHandleLink($author_phid),
+ $this->renderHandleLink($old),
+ $this->renderHandleLink($new));
+ }
}
return parent::getTitle();
diff --git a/src/applications/phortune/controller/PhortuneAccountViewController.php b/src/applications/phortune/controller/PhortuneAccountViewController.php
--- a/src/applications/phortune/controller/PhortuneAccountViewController.php
+++ b/src/applications/phortune/controller/PhortuneAccountViewController.php
@@ -89,13 +89,7 @@
$id = $account->getID();
$header = id(new PHUIHeaderView())
- ->setHeader(pht('Payment Methods'))
- ->addActionLink(
- id(new PHUIButtonView())
- ->setTag('a')
- ->setHref($this->getApplicationURI($id.'/card/new/'))
- ->setText(pht('Add Payment Method'))
- ->setIcon(id(new PHUIIconView())->setIconFont('fa-plus')));
+ ->setHeader(pht('Payment Methods'));
$list = id(new PHUIObjectItemListView())
->setUser($viewer)
diff --git a/src/applications/phortune/controller/PhortuneCartCheckoutController.php b/src/applications/phortune/controller/PhortuneCartCheckoutController.php
--- a/src/applications/phortune/controller/PhortuneCartCheckoutController.php
+++ b/src/applications/phortune/controller/PhortuneCartCheckoutController.php
@@ -23,6 +23,7 @@
}
$cancel_uri = $cart->getCancelURI();
+ $merchant = $cart->getMerchant();
switch ($cart->getStatus()) {
case PhortuneCart::STATUS_BUILDING:
@@ -83,6 +84,7 @@
$methods = id(new PhortunePaymentMethodQuery())
->setViewer($viewer)
->withAccountPHIDs(array($account->getPHID()))
+ ->withMerchantPHIDs(array($merchant->getPHID()))
->withStatuses(array(PhortunePaymentMethod::STATUS_ACTIVE))
->execute();
@@ -142,14 +144,22 @@
$method_control->setError($e_method);
- $payment_method_uri = $this->getApplicationURI(
- $account->getID().'/card/new/');
+ $account_id = $account->getID();
+
+ $payment_method_uri = $this->getApplicationURI("{$account_id}/card/new/");
+ $payment_method_uri = new PhutilURI($payment_method_uri);
+ $payment_method_uri->setQueryParams(
+ array(
+ 'merchantID' => $merchant->getID(),
+ 'cartID' => $cart->getID(),
+ ));
$form = id(new AphrontFormView())
->setUser($viewer)
->appendChild($method_control);
- $add_providers = PhortunePaymentProvider::getProvidersForAddPaymentMethod();
+ $add_providers = $this->loadCreatePaymentMethodProvidersForMerchant(
+ $merchant);
if ($add_providers) {
$new_method = phutil_tag(
'a',
@@ -178,7 +188,7 @@
$provider_form = null;
- $pay_providers = PhortunePaymentProvider::getProvidersForOneTimePayment();
+ $pay_providers = $this->loadOneTimePaymentProvidersForMerchant($merchant);
if ($pay_providers) {
$one_time_options = array();
foreach ($pay_providers as $provider) {
diff --git a/src/applications/phortune/controller/PhortuneController.php b/src/applications/phortune/controller/PhortuneController.php
--- a/src/applications/phortune/controller/PhortuneController.php
+++ b/src/applications/phortune/controller/PhortuneController.php
@@ -86,4 +86,50 @@
}
}
+ private function loadEnabledProvidersForMerchant(PhortuneMerchant $merchant) {
+ $viewer = $this->getRequest()->getUser();
+
+ $provider_configs = id(new PhortunePaymentProviderConfigQuery())
+ ->setViewer($viewer)
+ ->withMerchantPHIDs(array($merchant->getPHID()))
+ ->execute();
+ $providers = mpull($provider_configs, 'buildProvider', 'getID');
+
+ foreach ($providers as $key => $provider) {
+ if (!$provider->isEnabled()) {
+ unset($providers[$key]);
+ }
+ }
+
+ return $providers;
+ }
+
+ protected function loadCreatePaymentMethodProvidersForMerchant(
+ PhortuneMerchant $merchant) {
+
+ $providers = $this->loadEnabledProvidersForMerchant($merchant);
+ foreach ($providers as $key => $provider) {
+ if (!$provider->canCreatePaymentMethods()) {
+ unset($providers[$key]);
+ continue;
+ }
+ }
+
+ return $providers;
+ }
+
+ protected function loadOneTimePaymentProvidersForMerchant(
+ PhortuneMerchant $merchant) {
+
+ $providers = $this->loadEnabledProvidersForMerchant($merchant);
+ foreach ($providers as $key => $provider) {
+ if (!$provider->canProcessOneTimePayments()) {
+ unset($providers[$key]);
+ continue;
+ }
+ }
+
+ return $providers;
+ }
+
}
diff --git a/src/applications/phortune/controller/PhortunePaymentMethodCreateController.php b/src/applications/phortune/controller/PhortunePaymentMethodCreateController.php
--- a/src/applications/phortune/controller/PhortunePaymentMethodCreateController.php
+++ b/src/applications/phortune/controller/PhortunePaymentMethodCreateController.php
@@ -11,28 +11,36 @@
public function processRequest() {
$request = $this->getRequest();
- $user = $request->getUser();
+ $viewer = $request->getUser();
$account = id(new PhortuneAccountQuery())
- ->setViewer($user)
+ ->setViewer($viewer)
->withIDs(array($this->accountID))
->executeOne();
if (!$account) {
return new Aphront404Response();
}
+ $merchant = id(new PhortuneMerchantQuery())
+ ->setViewer($viewer)
+ ->withIDs(array($request->getInt('merchantID')))
+ ->executeOne();
+ if (!$merchant) {
+ return new Aphront404Response();
+ }
+
$cancel_uri = $this->getApplicationURI($account->getID().'/');
$account_uri = $this->getApplicationURI($account->getID().'/');
- $providers = PhortunePaymentProvider::getProvidersForAddPaymentMethod();
+ $providers = $this->loadCreatePaymentMethodProvidersForMerchant($merchant);
if (!$providers) {
throw new Exception(
'There are no payment providers enabled that can add payment '.
'methods.');
}
- $provider_key = $request->getStr('providerKey');
- if (empty($providers[$provider_key])) {
+ $provider_id = $request->getInt('providerID');
+ if (empty($providers[$provider_id])) {
$choices = array();
foreach ($providers as $provider) {
$choices[] = $this->renderSelectProvider($provider);
@@ -53,16 +61,16 @@
->addCancelButton($account_uri);
}
- $provider = $providers[$provider_key];
+ $provider = $providers[$provider_id];
$errors = array();
if ($request->isFormPost() && $request->getBool('isProviderForm')) {
$method = id(new PhortunePaymentMethod())
->setAccountPHID($account->getPHID())
- ->setAuthorPHID($user->getPHID())
- ->setStatus(PhortunePaymentMethod::STATUS_ACTIVE)
- ->setProviderType($provider->getProviderType())
- ->setProviderDomain($provider->getProviderDomain());
+ ->setAuthorPHID($viewer->getPHID())
+ ->setMerchantPHID($merchant->getPHID())
+ ->setProviderPHID($provider->getProviderConfig()->getPHID())
+ ->setStatus(PhortunePaymentMethod::STATUS_ACTIVE);
if (!$errors) {
$errors = $this->processClientErrors(
@@ -97,12 +105,21 @@
if (!$errors) {
$method->save();
- $save_uri = new PhutilURI($account_uri);
- $save_uri->setFragment('payment');
- return id(new AphrontRedirectResponse())->setURI($save_uri);
+ // If we added this method on a cart flow, return to the cart to
+ // check out.
+ $cart_id = $request->getInt('cartID');
+ if ($cart_id) {
+ $next_uri = $this->getApplicationURI(
+ "cart/{$cart_id}/checkout/?paymentMethodID=".$method->getID());
+ } else {
+ $next_uri = new PhutilURI($account_uri);
+ $next_uri->setFragment('payment');
+ }
+
+ return id(new AphrontRedirectResponse())->setURI($next_uri);
} else {
$dialog = id(new AphrontDialogView())
- ->setUser($user)
+ ->setUser($viewer)
->setTitle(pht('Error Adding Payment Method'))
->appendChild(id(new AphrontErrorView())->setErrors($errors))
->addCancelButton($request->getRequestURI());
@@ -114,10 +131,11 @@
$form = $provider->renderCreatePaymentMethodForm($request, $errors);
$form
- ->setUser($user)
+ ->setUser($viewer)
->setAction($request->getRequestURI())
->setWorkflow(true)
- ->addHiddenInput('providerKey', $provider_key)
+ ->addHiddenInput('providerID', $provider_id)
+ ->addHiddenInput('cartID', $request->getInt('cartID'))
->addHiddenInput('isProviderForm', true)
->appendChild(
id(new AphrontFormSubmitControl())
@@ -145,7 +163,7 @@
PhortunePaymentProvider $provider) {
$request = $this->getRequest();
- $user = $request->getUser();
+ $viewer = $request->getUser();
$description = $provider->getPaymentMethodDescription();
$icon_uri = $provider->getPaymentMethodIcon();
@@ -165,8 +183,8 @@
->setSubtext($details);
$form = id(new AphrontFormView())
- ->setUser($user)
- ->addHiddenInput('providerKey', $provider->getProviderKey())
+ ->setUser($viewer)
+ ->addHiddenInput('providerID', $provider->getProviderConfig()->getID())
->appendChild($button);
return $form;
diff --git a/src/applications/phortune/phid/PhortuneMerchantPHIDType.php b/src/applications/phortune/phid/PhortuneMerchantPHIDType.php
--- a/src/applications/phortune/phid/PhortuneMerchantPHIDType.php
+++ b/src/applications/phortune/phid/PhortuneMerchantPHIDType.php
@@ -30,7 +30,7 @@
$id = $merchant->getID();
- $handle->setName(pht('Merchant %d', $id));
+ $handle->setName(pht('Merchant %d %s', $id, $merchant->getName()));
$handle->setURI("/phortune/merchant/{$id}/");
}
}
diff --git a/src/applications/phortune/provider/PhortunePaymentProvider.php b/src/applications/phortune/provider/PhortunePaymentProvider.php
--- a/src/applications/phortune/provider/PhortunePaymentProvider.php
+++ b/src/applications/phortune/provider/PhortunePaymentProvider.php
@@ -120,36 +120,6 @@
->loadObjects();
}
- public static function getEnabledProviders() {
- $providers = self::getAllProviders();
- foreach ($providers as $key => $provider) {
- if (!$provider->isEnabled()) {
- unset($providers[$key]);
- }
- }
- return $providers;
- }
-
- public static function getProvidersForAddPaymentMethod() {
- $providers = self::getEnabledProviders();
- foreach ($providers as $key => $provider) {
- if (!$provider->canCreatePaymentMethods()) {
- unset($providers[$key]);
- }
- }
- return $providers;
- }
-
- public static function getProvidersForOneTimePayment() {
- $providers = self::getEnabledProviders();
- foreach ($providers as $key => $provider) {
- if (!$provider->canProcessOneTimePayments()) {
- unset($providers[$key]);
- }
- }
- return $providers;
- }
-
abstract public function isEnabled();
abstract public function getPaymentMethodDescription();
diff --git a/src/applications/phortune/query/PhortuneCartQuery.php b/src/applications/phortune/query/PhortuneCartQuery.php
--- a/src/applications/phortune/query/PhortuneCartQuery.php
+++ b/src/applications/phortune/query/PhortuneCartQuery.php
@@ -66,6 +66,21 @@
$cart->attachAccount($account);
}
+ $merchants = id(new PhortuneMerchantQuery())
+ ->setViewer($this->getViewer())
+ ->withPHIDs(mpull($carts, 'getMerchantPHID'))
+ ->execute();
+ $merchants = mpull($merchants, null, 'getPHID');
+
+ foreach ($carts as $key => $cart) {
+ $merchant = idx($merchants, $cart->getMerchantPHID());
+ if (!$merchant) {
+ unset($carts[$key]);
+ continue;
+ }
+ $cart->attachMerchant($merchant);
+ }
+
$implementations = array();
$cart_map = mgroup($carts, 'getCartClass');
diff --git a/src/applications/phortune/query/PhortunePaymentMethodQuery.php b/src/applications/phortune/query/PhortunePaymentMethodQuery.php
--- a/src/applications/phortune/query/PhortunePaymentMethodQuery.php
+++ b/src/applications/phortune/query/PhortunePaymentMethodQuery.php
@@ -6,6 +6,7 @@
private $ids;
private $phids;
private $accountPHIDs;
+ private $merchantPHIDs;
private $statuses;
public function withIDs(array $ids) {
@@ -23,6 +24,11 @@
return $this;
}
+ public function withMerchantPHIDs(array $phids) {
+ $this->merchantPHIDs = $phids;
+ return $this;
+ }
+
public function withStatuses(array $statuses) {
$this->statuses = $statuses;
return $this;
@@ -44,15 +50,6 @@
}
protected function willFilterPage(array $methods) {
- foreach ($methods as $key => $method) {
- try {
- $method->buildPaymentProvider();
- } catch (Exception $ex) {
- unset($methods[$key]);
- continue;
- }
- }
-
$accounts = id(new PhortuneAccountQuery())
->setViewer($this->getViewer())
->withPHIDs(mpull($methods, 'getAccountPHID'))
@@ -68,6 +65,36 @@
$method->attachAccount($account);
}
+ $merchants = id(new PhortuneMerchantQuery())
+ ->setViewer($this->getViewer())
+ ->withPHIDs(mpull($methods, 'getMerchantPHID'))
+ ->execute();
+ $merchants = mpull($merchants, null, 'getPHID');
+
+ foreach ($methods as $key => $method) {
+ $merchant = idx($merchants, $method->getMerchantPHID());
+ if (!$merchant) {
+ unset($methods[$key]);
+ continue;
+ }
+ $method->attachMerchant($merchant);
+ }
+
+ $provider_configs = id(new PhortunePaymentProviderConfigQuery())
+ ->setViewer($this->getViewer())
+ ->withPHIDs(mpull($methods, 'getProviderPHID'))
+ ->execute();
+ $provider_configs = mpull($provider_configs, null, 'getPHID');
+
+ foreach ($methods as $key => $method) {
+ $provider_config = idx($provider_configs, $method->getProviderPHID());
+ if (!$provider_config) {
+ unset($methods[$key]);
+ continue;
+ }
+ $method->attachProviderConfig($provider_config);
+ }
+
return $methods;
}
@@ -95,6 +122,13 @@
$this->accountPHIDs);
}
+ if ($this->merchantPHIDs !== null) {
+ $where[] = qsprintf(
+ $conn,
+ 'merchantPHID IN (%Ls)',
+ $this->merchantPHIDs);
+ }
+
if ($this->statuses !== null) {
$where[] = qsprintf(
$conn,
diff --git a/src/applications/phortune/storage/PhortuneAccount.php b/src/applications/phortune/storage/PhortuneAccount.php
--- a/src/applications/phortune/storage/PhortuneAccount.php
+++ b/src/applications/phortune/storage/PhortuneAccount.php
@@ -58,9 +58,10 @@
public function newCart(
PhabricatorUser $actor,
- PhortuneCartImplementation $implementation) {
+ PhortuneCartImplementation $implementation,
+ PhortuneMerchant $merchant) {
- $cart = PhortuneCart::initializeNewCart($actor, $this);
+ $cart = PhortuneCart::initializeNewCart($actor, $this, $merchant);
$cart->setCartClass(get_class($implementation));
$cart->attachImplementation($implementation);
diff --git a/src/applications/phortune/storage/PhortuneCart.php b/src/applications/phortune/storage/PhortuneCart.php
--- a/src/applications/phortune/storage/PhortuneCart.php
+++ b/src/applications/phortune/storage/PhortuneCart.php
@@ -11,6 +11,7 @@
protected $accountPHID;
protected $authorPHID;
+ protected $merchantPHID;
protected $cartClass;
protected $status;
protected $metadata = array();
@@ -18,14 +19,17 @@
private $account = self::ATTACHABLE;
private $purchases = self::ATTACHABLE;
private $implementation = self::ATTACHABLE;
+ private $merchant = self::ATTACHABLE;
public static function initializeNewCart(
PhabricatorUser $actor,
- PhortuneAccount $account) {
+ PhortuneAccount $account,
+ PhortuneMerchant $merchant) {
$cart = id(new PhortuneCart())
->setAuthorPHID($actor->getPHID())
->setStatus(self::STATUS_BUILDING)
- ->setAccountPHID($account->getPHID());
+ ->setAccountPHID($account->getPHID())
+ ->setMerchantPHID($merchant->getPHID());
$cart->account = $account;
$cart->purchases = array();
@@ -63,7 +67,8 @@
->setAccountPHID($account->getPHID())
->setCartPHID($this->getPHID())
->setAuthorPHID($actor->getPHID())
- ->setPaymentProviderKey($provider->getProviderKey())
+ ->setMerchantPHID($this->getMerchant()->getPHID())
+ ->setProviderPHID($provider->getProviderConfig()->getPHID())
->setAmountAsCurrency($this->getTotalPriceAsCurrency());
if ($method) {
@@ -154,6 +159,9 @@
'key_account' => array(
'columns' => array('accountPHID'),
),
+ 'key_merchant' => array(
+ 'columns' => array('merchantPHID'),
+ ),
),
) + parent::getConfiguration();
}
@@ -182,6 +190,15 @@
return $this->assertAttached($this->account);
}
+ public function attachMerchant(PhortuneMerchant $merchant) {
+ $this->merchant = $merchant;
+ return $this;
+ }
+
+ public function getMerchant() {
+ return $this->assertAttached($this->merchant);
+ }
+
public function attachImplementation(
PhortuneCartImplementation $implementation) {
$this->implementation = $implementation;
diff --git a/src/applications/phortune/storage/PhortuneCharge.php b/src/applications/phortune/storage/PhortuneCharge.php
--- a/src/applications/phortune/storage/PhortuneCharge.php
+++ b/src/applications/phortune/storage/PhortuneCharge.php
@@ -16,7 +16,8 @@
protected $accountPHID;
protected $authorPHID;
protected $cartPHID;
- protected $paymentProviderKey;
+ protected $providerPHID;
+ protected $merchantPHID;
protected $paymentMethodPHID;
protected $amountAsCurrency;
protected $status;
@@ -52,6 +53,12 @@
'key_account' => array(
'columns' => array('accountPHID'),
),
+ 'key_merchant' => array(
+ 'columns' => array('merchantPHID'),
+ ),
+ 'key_provider' => array(
+ 'columns' => array('providerPHID'),
+ ),
),
) + parent::getConfiguration();
}
diff --git a/src/applications/phortune/storage/PhortunePaymentMethod.php b/src/applications/phortune/storage/PhortunePaymentMethod.php
--- a/src/applications/phortune/storage/PhortunePaymentMethod.php
+++ b/src/applications/phortune/storage/PhortunePaymentMethod.php
@@ -14,6 +14,7 @@
protected $status;
protected $accountPHID;
protected $authorPHID;
+ protected $merchantPHID;
protected $providerPHID;
protected $expires;
protected $metadata = array();
@@ -21,6 +22,8 @@
protected $lastFourDigits;
private $account = self::ATTACHABLE;
+ private $merchant = self::ATTACHABLE;
+ private $providerConfig = self::ATTACHABLE;
public function getConfiguration() {
return array(
@@ -39,6 +42,9 @@
'key_account' => array(
'columns' => array('accountPHID', 'status'),
),
+ 'key_merchant' => array(
+ 'columns' => array('merchantPHID', 'accountPHID'),
+ ),
),
) + parent::getConfiguration();
}
@@ -57,6 +63,24 @@
return $this->assertAttached($this->account);
}
+ public function attachMerchant(PhortuneMerchant $merchant) {
+ $this->merchant = $merchant;
+ return $this;
+ }
+
+ public function getMerchant() {
+ return $this->assertAttached($this->merchant);
+ }
+
+ public function attachProviderConfig(PhortunePaymentProviderConfig $config) {
+ $this->providerConfig = $config;
+ return $this;
+ }
+
+ public function getProviderConfig() {
+ return $this->assertAttached($this->providerConfig);
+ }
+
public function getDescription() {
$provider = $this->buildPaymentProvider();
return $provider->getPaymentMethodProviderDescription();
@@ -72,7 +96,7 @@
}
public function buildPaymentProvider() {
- throw new Exception(pht('TODO: Reimplement this junk.'));
+ return $this->getProviderConfig()->buildProvider();
}
public function getDisplayName() {
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Mon, May 26, 9:19 AM (19 h, 34 m)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
8027637
Default Alt Text
D10652.diff (32 KB)
Attached To
Mode
D10652: Adjust payment workflows to deal with merchants and configurable providers in Phortune
Attached
Detach File
Event Timeline
Log In to Comment