mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-26 00:32:42 +01:00
Send mail about cart/order changes from Phortune
Summary: Ref T2787. When order statuses change, send merchants and users email about it. Test Plan: Used `bin/mail` to review mail. Reviewers: btrahan Reviewed By: btrahan Subscribers: epriestley Maniphest Tasks: T2787 Differential Revision: https://secure.phabricator.com/D10694
This commit is contained in:
parent
214b5b7158
commit
384fd24627
8 changed files with 144 additions and 1 deletions
2
resources/sql/autopatches/20141013.phortunecartkey.sql
Normal file
2
resources/sql/autopatches/20141013.phortunecartkey.sql
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
ALTER TABLE {$NAMESPACE}_phortune.phortune_cart
|
||||||
|
ADD mailKey BINARY(20) NOT NULL;
|
|
@ -2568,6 +2568,7 @@ phutil_register_library_map(array(
|
||||||
'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',
|
||||||
|
'PhortuneCartReplyHandler' => 'applications/phortune/mail/PhortuneCartReplyHandler.php',
|
||||||
'PhortuneCartSearchEngine' => 'applications/phortune/query/PhortuneCartSearchEngine.php',
|
'PhortuneCartSearchEngine' => 'applications/phortune/query/PhortuneCartSearchEngine.php',
|
||||||
'PhortuneCartTransaction' => 'applications/phortune/storage/PhortuneCartTransaction.php',
|
'PhortuneCartTransaction' => 'applications/phortune/storage/PhortuneCartTransaction.php',
|
||||||
'PhortuneCartTransactionQuery' => 'applications/phortune/query/PhortuneCartTransactionQuery.php',
|
'PhortuneCartTransactionQuery' => 'applications/phortune/query/PhortuneCartTransactionQuery.php',
|
||||||
|
@ -5638,6 +5639,7 @@ phutil_register_library_map(array(
|
||||||
'PhortuneCartListController' => 'PhortuneController',
|
'PhortuneCartListController' => 'PhortuneController',
|
||||||
'PhortuneCartPHIDType' => 'PhabricatorPHIDType',
|
'PhortuneCartPHIDType' => 'PhabricatorPHIDType',
|
||||||
'PhortuneCartQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
'PhortuneCartQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
||||||
|
'PhortuneCartReplyHandler' => 'PhabricatorMailReplyHandler',
|
||||||
'PhortuneCartSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
'PhortuneCartSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
||||||
'PhortuneCartTransaction' => 'PhabricatorApplicationTransaction',
|
'PhortuneCartTransaction' => 'PhabricatorApplicationTransaction',
|
||||||
'PhortuneCartTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
'PhortuneCartTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
||||||
|
|
|
@ -261,6 +261,18 @@ final class FundInitiativeEditor
|
||||||
->addHeader('Thread-Topic', $monogram);
|
->addHeader('Thread-Topic', $monogram);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function buildMailBody(
|
||||||
|
PhabricatorLiskDAO $object,
|
||||||
|
array $xactions) {
|
||||||
|
|
||||||
|
$body = parent::buildMailBody($object, $xactions);
|
||||||
|
|
||||||
|
$body->addTextSection(
|
||||||
|
pht('INITIATIVE DETAIL'),
|
||||||
|
PhabricatorEnv::getProductionURI('/'.$object->getMonogram()));
|
||||||
|
|
||||||
|
return $body;
|
||||||
|
}
|
||||||
|
|
||||||
protected function getMailTo(PhabricatorLiskDAO $object) {
|
protected function getMailTo(PhabricatorLiskDAO $object) {
|
||||||
return array($object->getOwnerPHID());
|
return array($object->getOwnerPHID());
|
||||||
|
|
|
@ -92,4 +92,76 @@ final class PhortuneCartEditor
|
||||||
return parent::applyCustomExternalTransaction($object, $xaction);
|
return parent::applyCustomExternalTransaction($object, $xaction);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function shouldSendMail(
|
||||||
|
PhabricatorLiskDAO $object,
|
||||||
|
array $xactions) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function buildMailTemplate(PhabricatorLiskDAO $object) {
|
||||||
|
$id = $object->getID();
|
||||||
|
$name = $object->getName();
|
||||||
|
|
||||||
|
return id(new PhabricatorMetaMTAMail())
|
||||||
|
->setSubject(pht('Order %d: %s', $id, $name))
|
||||||
|
->addHeader('Thread-Topic', pht('Order %s', $id));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function buildMailBody(
|
||||||
|
PhabricatorLiskDAO $object,
|
||||||
|
array $xactions) {
|
||||||
|
|
||||||
|
$body = parent::buildMailBody($object, $xactions);
|
||||||
|
|
||||||
|
$items = array();
|
||||||
|
foreach ($object->getPurchases() as $purchase) {
|
||||||
|
$name = $purchase->getFullDisplayName();
|
||||||
|
$price = $purchase->getTotalPriceAsCurrency()->formatForDisplay();
|
||||||
|
|
||||||
|
$items[] = "{$name} {$price}";
|
||||||
|
}
|
||||||
|
|
||||||
|
$body->addTextSection(pht('ORDER CONTENTS'), implode("\n", $items));
|
||||||
|
|
||||||
|
$body->addTextSection(
|
||||||
|
pht('ORDER DETAIL'),
|
||||||
|
PhabricatorEnv::getProductionURI('/phortune/cart/'.$object->getID().'/'));
|
||||||
|
|
||||||
|
return $body;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getMailTo(PhabricatorLiskDAO $object) {
|
||||||
|
$phids = array();
|
||||||
|
|
||||||
|
// Relaod the cart to pull merchant and account information, in case we
|
||||||
|
// just created the object.
|
||||||
|
$cart = id(new PhortuneCartQuery())
|
||||||
|
->setViewer($this->requireActor())
|
||||||
|
->withPHIDs(array($object->getPHID()))
|
||||||
|
->executeOne();
|
||||||
|
|
||||||
|
foreach ($cart->getAccount()->getMemberPHIDs() as $account_member) {
|
||||||
|
$phids[] = $account_member;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($cart->getMerchant()->getMemberPHIDs() as $merchant_member) {
|
||||||
|
$phids[] = $merchant_member;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $phids;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getMailCC(PhabricatorLiskDAO $object) {
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getMailSubjectPrefix() {
|
||||||
|
return 'Order';
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function buildReplyHandler(PhabricatorLiskDAO $object) {
|
||||||
|
return id(new PhortuneCartReplyHandler())
|
||||||
|
->setMailReceiver($object);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -111,5 +111,4 @@ final class PhortuneMerchantEditor
|
||||||
return $errors;
|
return $errors;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
38
src/applications/phortune/mail/PhortuneCartReplyHandler.php
Normal file
38
src/applications/phortune/mail/PhortuneCartReplyHandler.php
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
final class PhortuneCartReplyHandler extends PhabricatorMailReplyHandler {
|
||||||
|
|
||||||
|
public function validateMailReceiver($mail_receiver) {
|
||||||
|
if (!($mail_receiver instanceof PhortuneCart)) {
|
||||||
|
throw new Exception('Mail receiver is not a PhortuneCart!');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getPrivateReplyHandlerEmailAddress(
|
||||||
|
PhabricatorObjectHandle $handle) {
|
||||||
|
return $this->getDefaultPrivateReplyHandlerEmailAddress($handle, 'CART');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getPublicReplyHandlerEmailAddress() {
|
||||||
|
return $this->getDefaultPublicReplyHandlerEmailAddress('CART');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getReplyHandlerDomain() {
|
||||||
|
return PhabricatorEnv::getEnvConfig('metamta.reply-handler-domain');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getReplyHandlerInstructions() {
|
||||||
|
if ($this->supportsReplies()) {
|
||||||
|
// TODO: Implement.
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function receiveEmail(PhabricatorMetaMTAReceivedMail $mail) {
|
||||||
|
// TODO: Implement.
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -17,6 +17,7 @@ final class PhortuneCart extends PhortuneDAO
|
||||||
protected $cartClass;
|
protected $cartClass;
|
||||||
protected $status;
|
protected $status;
|
||||||
protected $metadata = array();
|
protected $metadata = array();
|
||||||
|
protected $mailKey;
|
||||||
|
|
||||||
private $account = self::ATTACHABLE;
|
private $account = self::ATTACHABLE;
|
||||||
private $purchases = self::ATTACHABLE;
|
private $purchases = self::ATTACHABLE;
|
||||||
|
@ -514,6 +515,7 @@ final class PhortuneCart extends PhortuneDAO
|
||||||
self::CONFIG_COLUMN_SCHEMA => array(
|
self::CONFIG_COLUMN_SCHEMA => array(
|
||||||
'status' => 'text32',
|
'status' => 'text32',
|
||||||
'cartClass' => 'text128',
|
'cartClass' => 'text128',
|
||||||
|
'mailKey' => 'bytes20',
|
||||||
),
|
),
|
||||||
self::CONFIG_KEY_SCHEMA => array(
|
self::CONFIG_KEY_SCHEMA => array(
|
||||||
'key_account' => array(
|
'key_account' => array(
|
||||||
|
@ -531,6 +533,13 @@ final class PhortuneCart extends PhortuneDAO
|
||||||
PhortuneCartPHIDType::TYPECONST);
|
PhortuneCartPHIDType::TYPECONST);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function save() {
|
||||||
|
if (!$this->getMailKey()) {
|
||||||
|
$this->setMailKey(Filesystem::readRandomCharacters(20));
|
||||||
|
}
|
||||||
|
return parent::save();
|
||||||
|
}
|
||||||
|
|
||||||
public function attachPurchases(array $purchases) {
|
public function attachPurchases(array $purchases) {
|
||||||
assert_instances_of($purchases, 'PhortunePurchase');
|
assert_instances_of($purchases, 'PhortunePurchase');
|
||||||
$this->purchases = $purchases;
|
$this->purchases = $purchases;
|
||||||
|
|
|
@ -22,6 +22,15 @@ final class PhortuneCartTransaction
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function shouldHideForMail(array $xactions) {
|
||||||
|
switch ($this->getTransactionType()) {
|
||||||
|
case self::TYPE_CREATED:
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return parent::shouldHideForMail($xactions);
|
||||||
|
}
|
||||||
|
|
||||||
public function getTitle() {
|
public function getTitle() {
|
||||||
$old = $this->getOldValue();
|
$old = $this->getOldValue();
|
||||||
$new = $this->getNewValue();
|
$new = $this->getNewValue();
|
||||||
|
|
Loading…
Reference in a new issue