diff --git a/src/applications/phortune/controller/PhortuneCartListController.php b/src/applications/phortune/controller/PhortuneCartListController.php index faf143131..0537417f7 100644 --- a/src/applications/phortune/controller/PhortuneCartListController.php +++ b/src/applications/phortune/controller/PhortuneCartListController.php @@ -1,132 +1,134 @@ <?php final class PhortuneCartListController extends PhortuneController { private $merchant; private $account; private $subscription; + private $engine; public function handleRequest(AphrontRequest $request) { $viewer = $this->getViewer(); $merchant_id = $request->getURIData('merchantID'); $account_id = $request->getURIData('accountID'); $subscription_id = $request->getURIData('subscriptionID'); - $engine = new PhortuneCartSearchEngine(); + $engine = id(new PhortuneCartSearchEngine()) + ->setViewer($viewer); if ($merchant_id) { $merchant = id(new PhortuneMerchantQuery()) ->setViewer($viewer) ->withIDs(array($merchant_id)) ->requireCapabilities( array( PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT, )) ->executeOne(); if (!$merchant) { return new Aphront404Response(); } $this->merchant = $merchant; $viewer->grantAuthority($merchant); $engine->setMerchant($merchant); } else if ($account_id) { $account = id(new PhortuneAccountQuery()) ->setViewer($viewer) ->withIDs(array($account_id)) ->requireCapabilities( array( PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT, )) ->executeOne(); if (!$account) { return new Aphront404Response(); } $this->account = $account; $engine->setAccount($account); } else { return new Aphront404Response(); } // NOTE: We must process this after processing the merchant authority, so // it becomes visible in merchant contexts. if ($subscription_id) { $subscription = id(new PhortuneSubscriptionQuery()) ->setViewer($viewer) ->withIDs(array($subscription_id)) ->executeOne(); if (!$subscription) { return new Aphront404Response(); } $this->subscription = $subscription; $engine->setSubscription($subscription); } + $this->engine = $engine; + $controller = id(new PhabricatorApplicationSearchController()) ->setQueryKey($request->getURIData('queryKey')) ->setSearchEngine($engine) ->setNavigation($this->buildSideNavView()); return $this->delegateToController($controller); } public function buildSideNavView() { $viewer = $this->getRequest()->getUser(); $nav = new AphrontSideNavFilterView(); $nav->setBaseURI(new PhutilURI($this->getApplicationURI())); - id(new PhortuneCartSearchEngine()) - ->setViewer($viewer) - ->addNavigationItems($nav->getMenu()); + $this->engine->addNavigationItems($nav->getMenu()); $nav->selectFilter(null); return $nav; } protected function buildApplicationCrumbs() { $crumbs = parent::buildApplicationCrumbs(); $subscription = $this->subscription; $merchant = $this->merchant; if ($merchant) { $id = $merchant->getID(); $this->addMerchantCrumb($crumbs, $merchant); if (!$subscription) { $crumbs->addTextCrumb( pht('Orders'), $this->getApplicationURI("merchant/orders/{$id}/")); } } $account = $this->account; if ($account) { $id = $account->getID(); $this->addAccountCrumb($crumbs, $account); if (!$subscription) { $crumbs->addTextCrumb( pht('Orders'), $this->getApplicationURI("{$id}/order/")); } } if ($subscription) { if ($merchant) { $subscription_uri = $subscription->getMerchantURI(); } else { $subscription_uri = $subscription->getURI(); } $crumbs->addTextCrumb( $subscription->getSubscriptionName(), $subscription_uri); } return $crumbs; } } diff --git a/src/applications/phortune/query/PhortuneCartSearchEngine.php b/src/applications/phortune/query/PhortuneCartSearchEngine.php index ef91dc47a..ad29ed4e0 100644 --- a/src/applications/phortune/query/PhortuneCartSearchEngine.php +++ b/src/applications/phortune/query/PhortuneCartSearchEngine.php @@ -1,232 +1,234 @@ <?php final class PhortuneCartSearchEngine extends PhabricatorApplicationSearchEngine { private $merchant; private $account; private $subscription; public function canUseInPanelContext() { // These only make sense in an account or merchant context. return false; } public function setAccount(PhortuneAccount $account) { $this->account = $account; return $this; } public function getAccount() { return $this->account; } public function setMerchant(PhortuneMerchant $merchant) { $this->merchant = $merchant; return $this; } public function getMerchant() { return $this->merchant; } public function setSubscription(PhortuneSubscription $subscription) { $this->subscription = $subscription; return $this; } public function getSubscription() { return $this->subscription; } public function getResultTypeDescription() { return pht('Phortune Orders'); } public function getApplicationClassName() { return 'PhabricatorPhortuneApplication'; } public function buildSavedQueryFromRequest(AphrontRequest $request) { $saved = new PhabricatorSavedQuery(); return $saved; } public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) { $query = id(new PhortuneCartQuery()) - ->needPurchases(true) - ->withStatuses( - array( - PhortuneCart::STATUS_PURCHASING, - PhortuneCart::STATUS_CHARGED, - PhortuneCart::STATUS_HOLD, - PhortuneCart::STATUS_REVIEW, - PhortuneCart::STATUS_PURCHASED, - )); + ->needPurchases(true); $viewer = $this->requireViewer(); $merchant = $this->getMerchant(); $account = $this->getAccount(); if ($merchant) { $can_edit = PhabricatorPolicyFilter::hasCapability( $viewer, $merchant, PhabricatorPolicyCapability::CAN_EDIT); if (!$can_edit) { throw new Exception( pht('You can not query orders for a merchant you do not control.')); } $query->withMerchantPHIDs(array($merchant->getPHID())); } else if ($account) { $can_edit = PhabricatorPolicyFilter::hasCapability( $viewer, $account, PhabricatorPolicyCapability::CAN_EDIT); if (!$can_edit) { throw new Exception( pht( 'You can not query orders for an account you are not '. 'a member of.')); } $query->withAccountPHIDs(array($account->getPHID())); } else { $accounts = id(new PhortuneAccountQuery()) ->withMemberPHIDs(array($viewer->getPHID())) ->execute(); if ($accounts) { $query->withAccountPHIDs(mpull($accounts, 'getPHID')); } else { throw new Exception(pht('You have no accounts!')); } } $subscription = $this->getSubscription(); if ($subscription) { $query->withSubscriptionPHIDs(array($subscription->getPHID())); } + if ($saved->getParameter('invoices')) { + $query->withInvoices(true); + } else { + $query->withStatuses( + array( + PhortuneCart::STATUS_PURCHASING, + PhortuneCart::STATUS_CHARGED, + PhortuneCart::STATUS_HOLD, + PhortuneCart::STATUS_REVIEW, + PhortuneCart::STATUS_PURCHASED, + )); + } + return $query; } public function buildSearchForm( AphrontFormView $form, PhabricatorSavedQuery $saved_query) {} protected function getURI($path) { $merchant = $this->getMerchant(); $account = $this->getAccount(); if ($merchant) { - return '/phortune/merchant/'.$merchant->getID().'/order/'.$path; + return '/phortune/merchant/orders/'.$merchant->getID().'/'.$path; } else if ($account) { - return '/phortune/'.$account->getID().'/order/'; + return '/phortune/'.$account->getID().'/order/'.$path; } else { return '/phortune/order/'.$path; } } protected function getBuiltinQueryNames() { $names = array( - 'all' => pht('All Orders'), + 'all' => pht('Order History'), + 'invoices' => pht('Unpaid Invoices'), ); return $names; } public function buildSavedQueryFromBuiltin($query_key) { $query = $this->newSavedQuery(); $query->setQueryKey($query_key); switch ($query_key) { case 'all': return $query; + case 'invoices': + return $query->setParameter('invoices', true); } return parent::buildSavedQueryFromBuiltin($query_key); } protected function getRequiredHandlePHIDsForResultList( array $carts, PhabricatorSavedQuery $query) { $phids = array(); foreach ($carts as $cart) { $phids[] = $cart->getPHID(); $phids[] = $cart->getMerchantPHID(); $phids[] = $cart->getAuthorPHID(); } return $phids; } protected function renderResultList( array $carts, PhabricatorSavedQuery $query, array $handles) { assert_instances_of($carts, 'PhortuneCart'); $viewer = $this->requireViewer(); $rows = array(); foreach ($carts as $cart) { $merchant = $cart->getMerchant(); if ($this->getMerchant()) { $href = $this->getApplicationURI( 'merchant/'.$merchant->getID().'/cart/'.$cart->getID().'/'); } else { $href = $cart->getDetailURI(); } $rows[] = array( $cart->getID(), - phutil_tag( - 'a', - array( - 'href' => $href, - ), - $cart->getName()), $handles[$cart->getPHID()]->renderLink(), $handles[$merchant->getPHID()]->renderLink(), $handles[$cart->getAuthorPHID()]->renderLink(), $cart->getTotalPriceAsCurrency()->formatForDisplay(), PhortuneCart::getNameForStatus($cart->getStatus()), phabricator_datetime($cart->getDateModified(), $viewer), ); } $table = id(new AphrontTableView($rows)) ->setNoDataString(pht('No orders match the query.')) ->setHeaders( array( pht('ID'), pht('Order'), pht('Merchant'), pht('Authorized By'), pht('Amount'), pht('Status'), pht('Updated'), )) ->setColumnClasses( array( '', 'pri', '', '', 'wide right', '', 'right', )); $merchant = $this->getMerchant(); if ($merchant) { $header = pht('Orders for %s', $merchant->getName()); } else { $header = pht('Your Orders'); } return id(new PHUIObjectBoxView()) ->setHeaderText($header) ->appendChild($table); } }