Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F15396111
D20739.id49448.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
14 KB
Referenced Files
None
Subscribers
None
D20739.id49448.diff
View Options
diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -5299,6 +5299,7 @@
'PhortuneDisplayException' => 'applications/phortune/exception/PhortuneDisplayException.php',
'PhortuneErrCode' => 'applications/phortune/constants/PhortuneErrCode.php',
'PhortuneExternalController' => 'applications/phortune/controller/external/PhortuneExternalController.php',
+ 'PhortuneExternalOrderController' => 'applications/phortune/controller/external/PhortuneExternalOrderController.php',
'PhortuneExternalOverviewController' => 'applications/phortune/controller/external/PhortuneExternalOverviewController.php',
'PhortuneExternalUnsubscribeController' => 'applications/phortune/controller/external/PhortuneExternalUnsubscribeController.php',
'PhortuneInvoiceView' => 'applications/phortune/view/PhortuneInvoiceView.php',
@@ -11891,6 +11892,7 @@
'PhortuneDisplayException' => 'Exception',
'PhortuneErrCode' => 'PhortuneConstants',
'PhortuneExternalController' => 'PhortuneController',
+ 'PhortuneExternalOrderController' => 'PhortuneExternalController',
'PhortuneExternalOverviewController' => 'PhortuneExternalController',
'PhortuneExternalUnsubscribeController' => 'PhortuneExternalController',
'PhortuneInvoiceView' => 'AphrontTagView',
diff --git a/src/applications/phortune/application/PhabricatorPhortuneApplication.php b/src/applications/phortune/application/PhabricatorPhortuneApplication.php
--- a/src/applications/phortune/application/PhabricatorPhortuneApplication.php
+++ b/src/applications/phortune/application/PhabricatorPhortuneApplication.php
@@ -112,6 +112,9 @@
'external/(?P<addressKey>[^/]+)/(?P<accessKey>[^/]+)/' => array(
'' => 'PhortuneExternalOverviewController',
'unsubscribe/' => 'PhortuneExternalUnsubscribeController',
+ 'order/' => array(
+ '(?P<orderID>[^/]+)/' => 'PhortuneExternalOrderController',
+ ),
),
'merchant/' => array(
$this->getQueryRoutePattern()
diff --git a/src/applications/phortune/controller/external/PhortuneExternalController.php b/src/applications/phortune/controller/external/PhortuneExternalController.php
--- a/src/applications/phortune/controller/external/PhortuneExternalController.php
+++ b/src/applications/phortune/controller/external/PhortuneExternalController.php
@@ -127,19 +127,11 @@
$crumb = id(new PHUICrumbView())
->setIcon('fa-diamond')
- ->setName($crumb_name);
-
- $can_see = PhabricatorPolicyFilter::hasCapability(
- $viewer,
- $account,
- PhabricatorPolicyCapability::CAN_VIEW);
- if ($can_see) {
- $crumb->setHref($account->getURI());
- }
+ ->setName($crumb_name)
+ ->setHref($email->getExternalURI());
$crumbs
- ->addCrumb($crumb)
- ->addTextCrumb(pht('Viewing As "%s"', $email->getAddress()));
+ ->addCrumb($crumb);
} else {
$crumb = id(new PHUICrumbView())
->setIcon('fa-diamond')
@@ -153,11 +145,22 @@
final protected function newExternalView() {
$email = $this->getAccountEmail();
+ $xviewer = $this->getExternalViewer();
+
+ $origin_phid = $email->getAuthorPHID();
+
+ $handles = $xviewer->loadHandles(array($origin_phid));
+
$messages = array();
$messages[] = pht(
'You are viewing this payment account as: %s',
phutil_tag('strong', array(), $email->getAddress()));
+
+ $messages[] = pht(
+ 'This email address was added to this payment account by: %s',
+ phutil_tag('strong', array(), $handles[$origin_phid]->getFullName()));
+
$messages[] = pht(
'Anyone who has a link to this page can view order history for '.
'this payment account.');
diff --git a/src/applications/phortune/controller/external/PhortuneExternalOrderController.php b/src/applications/phortune/controller/external/PhortuneExternalOrderController.php
new file mode 100644
--- /dev/null
+++ b/src/applications/phortune/controller/external/PhortuneExternalOrderController.php
@@ -0,0 +1,40 @@
+<?php
+
+final class PhortuneExternalOrderController
+ extends PhortuneExternalController {
+
+ protected function handleExternalRequest(AphrontRequest $request) {
+ $xviewer = $this->getExternalViewer();
+ $email = $this->getAccountEmail();
+ $account = $email->getAccount();
+
+ $order = id(new PhortuneCartQuery())
+ ->setViewer($xviewer)
+ ->withAccountPHIDs(array($account->getPHID()))
+ ->withIDs(array($request->getURIData('orderID')))
+ ->executeOne();
+ if (!$order) {
+ return new Aphront404Response();
+ }
+
+ $timeline = $this->buildTransactionTimeline(
+ $order,
+ new PhortuneCartTransactionQuery());
+ $timeline->setShouldTerminate(true);
+
+ $crumbs = $this->newExternalCrumbs()
+ ->addTextCrumb($order->getObjectName());
+
+ $view = id(new PHUITwoColumnView())
+ ->setMainColumn(
+ array(
+ $timeline,
+ ));
+
+ return $this->newPage()
+ ->setTitle(pht('Order %d', $order->getID()))
+ ->setCrumbs($crumbs)
+ ->appendChild($view);
+ }
+
+}
diff --git a/src/applications/phortune/controller/external/PhortuneExternalOverviewController.php b/src/applications/phortune/controller/external/PhortuneExternalOverviewController.php
--- a/src/applications/phortune/controller/external/PhortuneExternalOverviewController.php
+++ b/src/applications/phortune/controller/external/PhortuneExternalOverviewController.php
@@ -9,6 +9,7 @@
$account = $email->getAccount();
$crumbs = $this->newExternalCrumbs()
+ ->addTextCrumb(pht('Viewing As "%s"', $email->getAddress()))
->setBorder(true);
$header = id(new PHUIHeaderView())
@@ -61,6 +62,7 @@
$invoices_table = id(new PhortuneOrderTableView())
->setViewer($xviewer)
+ ->setAccountEmail($email)
->setCarts($invoices)
->setIsInvoices(true);
@@ -87,6 +89,7 @@
$receipts_table = id(new PhortuneOrderTableView())
->setViewer($xviewer)
+ ->setAccountEmail($email)
->setCarts($receipts);
return id(new PHUIObjectBoxView())
diff --git a/src/applications/phortune/editor/PhortuneCartEditor.php b/src/applications/phortune/editor/PhortuneCartEditor.php
--- a/src/applications/phortune/editor/PhortuneCartEditor.php
+++ b/src/applications/phortune/editor/PhortuneCartEditor.php
@@ -246,5 +246,102 @@
return $xactions;
}
+ protected function newAuxiliaryMail($object, array $xactions) {
+ $xviewer = PhabricatorUser::getOmnipotentUser();
+ $account = $object->getAccount();
+
+ $addresses = id(new PhortuneAccountEmailQuery())
+ ->setViewer($xviewer)
+ ->withAccountPHIDs(array($account->getPHID()))
+ ->withStatuses(
+ array(
+ PhortuneAccountEmailStatus::STATUS_ACTIVE,
+ ))
+ ->execute();
+
+ $messages = array();
+ foreach ($addresses as $address) {
+ $message = $this->newExternalMail($address, $object, $xactions);
+ if ($message) {
+ $messages[] = $message;
+ }
+ }
+
+ return $messages;
+ }
+
+ private function newExternalMail(
+ PhortuneAccountEmail $email,
+ PhortuneCart $cart,
+ array $xactions) {
+ $xviewer = PhabricatorUser::getOmnipotentUser();
+ $account = $cart->getAccount();
+
+ $id = $cart->getID();
+ $name = $cart->getName();
+
+ $origin_user = id(new PhabricatorPeopleQuery())
+ ->setViewer($xviewer)
+ ->withPHIDs(array($email->getAuthorPHID()))
+ ->executeOne();
+ if (!$origin_user) {
+ return null;
+ }
+
+ if ($this->isInvoice()) {
+ $subject = pht('[Invoice #%d] %s', $id, $name);
+ $order_header = pht('INVOICE DETAIL');
+ } else {
+ $subject = pht('[Order #%d] %s', $id, $name);
+ $order_header = pht('ORDER DETAIL');
+ }
+
+ $body = id(new PhabricatorMetaMTAMailBody())
+ ->setViewer($xviewer)
+ ->setContextObject($cart);
+
+ $origin_username = $origin_user->getUsername();
+ $origin_realname = $origin_user->getRealName();
+ if (strlen($origin_realname)) {
+ $origin_display = pht('%s (%s)', $origin_username, $origin_realname);
+ } else {
+ $origin_display = pht('%s', $origin_username);
+ }
+
+ $body->addRawSection(
+ pht(
+ 'This email address (%s) was added to a payment account (%s) '.
+ 'by %s.',
+ $email->getAddress(),
+ $account->getName(),
+ $origin_display));
+
+ $body->addLinkSection(
+ $order_header,
+ PhabricatorEnv::getProductionURI($email->getExternalOrderURI($cart)));
+
+ $body->addLinkSection(
+ pht('FULL ORDER HISTORY'),
+ PhabricatorEnv::getProductionURI($email->getExternalURI()));
+
+ $body->addLinkSection(
+ pht('UNSUBSCRIBE'),
+ PhabricatorEnv::getProductionURI($email->getUnsubscribeURI()));
+
+ return id(new PhabricatorMetaMTAMail())
+ ->setFrom($this->getActingAsPHID())
+ ->setSubject($subject)
+ ->addRawTos(
+ array(
+ $email->getAddress(),
+ ))
+ ->setForceDelivery(true)
+ ->setIsBulk(true)
+ ->setSensitiveContent(true)
+ ->setBody($body->render())
+ ->setHTMLBody($body->renderHTML());
+
+ }
+
}
diff --git a/src/applications/phortune/query/PhortuneAccountEmailQuery.php b/src/applications/phortune/query/PhortuneAccountEmailQuery.php
--- a/src/applications/phortune/query/PhortuneAccountEmailQuery.php
+++ b/src/applications/phortune/query/PhortuneAccountEmailQuery.php
@@ -7,6 +7,7 @@
private $phids;
private $accountPHIDs;
private $addressKeys;
+ private $statuses;
public function withIDs(array $ids) {
$this->ids = $ids;
@@ -28,6 +29,11 @@
return $this;
}
+ public function withStatuses(array $statuses) {
+ $this->statuses = $statuses;
+ return $this;
+ }
+
public function newResultObject() {
return new PhortuneAccountEmail();
}
@@ -90,6 +96,13 @@
$this->addressKeys);
}
+ if ($this->statuses !== null) {
+ $where[] = qsprintf(
+ $conn,
+ 'address.status IN (%Ls)',
+ $this->statuses);
+ }
+
return $where;
}
diff --git a/src/applications/phortune/storage/PhortuneAccountEmail.php b/src/applications/phortune/storage/PhortuneAccountEmail.php
--- a/src/applications/phortune/storage/PhortuneAccountEmail.php
+++ b/src/applications/phortune/storage/PhortuneAccountEmail.php
@@ -92,6 +92,14 @@
$this->getAccessKey());
}
+ public function getExternalOrderURI(PhortuneCart $cart) {
+ return urisprintf(
+ '/phortune/external/%s/%s/order/%d/',
+ $this->getAddressKey(),
+ $this->getAccessKey(),
+ $cart->getID());
+ }
+
/* -( PhabricatorPolicyInterface )----------------------------------------- */
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
@@ -656,6 +656,10 @@
return idx($this->metadata, $key, $default);
}
+ public function getObjectName() {
+ return pht('Order %d', $this->getID());
+ }
+
/* -( PhabricatorApplicationTransactionInterface )------------------------- */
diff --git a/src/applications/phortune/view/PhortuneOrderTableView.php b/src/applications/phortune/view/PhortuneOrderTableView.php
--- a/src/applications/phortune/view/PhortuneOrderTableView.php
+++ b/src/applications/phortune/view/PhortuneOrderTableView.php
@@ -6,6 +6,7 @@
private $noDataString;
private $isInvoices;
private $isMerchantView;
+ private $accountEmail;
public function setCarts(array $carts) {
$this->carts = $carts;
@@ -43,13 +44,24 @@
return $this->isMerchantView;
}
+ public function setAccountEmail(PhortuneAccountEmail $account_email) {
+ $this->accountEmail = $account_email;
+ return $this;
+ }
+
+ public function getAccountEmail() {
+ return $this->accountEmail;
+ }
+
public function render() {
$carts = $this->getCarts();
$viewer = $this->getUser();
$is_invoices = $this->getIsInvoices();
$is_merchant = $this->getIsMerchantView();
- $is_external = (!$viewer->getPHID());
+ $is_external = (bool)$this->getAccountEmail();
+
+ $email = $this->getAccountEmail();
$phids = array();
foreach ($carts as $cart) {
@@ -65,7 +77,16 @@
$rows = array();
$rowc = array();
foreach ($carts as $cart) {
- $cart_link = $handles[$cart->getPHID()]->renderLink();
+ if ($is_external) {
+ $cart_link = phutil_tag(
+ 'a',
+ array(
+ 'href' => $email->getExternalOrderURI($cart),
+ ),
+ $handles[$cart->getPHID()]->getName());
+ } else {
+ $cart_link = $handles[$cart->getPHID()]->renderLink();
+ }
$purchases = $cart->getPurchases();
if (count($purchases) == 1) {
diff --git a/src/applications/phortune/worker/PhortuneSubscriptionWorker.php b/src/applications/phortune/worker/PhortuneSubscriptionWorker.php
--- a/src/applications/phortune/worker/PhortuneSubscriptionWorker.php
+++ b/src/applications/phortune/worker/PhortuneSubscriptionWorker.php
@@ -22,6 +22,7 @@
return;
}
+
$account = $subscription->getAccount();
$merchant = $subscription->getMerchant();
diff --git a/src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php b/src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php
--- a/src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php
+++ b/src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php
@@ -1520,6 +1520,10 @@
}
}
+ foreach ($this->newAuxiliaryMail($object, $xactions) as $message) {
+ $messages[] = $message;
+ }
+
// NOTE: This actually sends the mail. We do this last to reduce the chance
// that we send some mail, hit an exception, then send the mail again when
// retrying.
@@ -4799,6 +4803,10 @@
return $extensions;
}
+ protected function newAuxiliaryMail($object, array $xactions) {
+ return array();
+ }
+
private function generateMailStamps($object, $data) {
if (!$data || !is_array($data)) {
return null;
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Mon, Mar 17, 11:56 AM (1 w, 22 h ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7589529
Default Alt Text
D20739.id49448.diff (14 KB)
Attached To
Mode
D20739: In Phortune, send order email to account external addresses
Attached
Detach File
Event Timeline
Log In to Comment