mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-29 10:12:41 +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',
|
||||
'PhortuneCartPHIDType' => 'applications/phortune/phid/PhortuneCartPHIDType.php',
|
||||
'PhortuneCartQuery' => 'applications/phortune/query/PhortuneCartQuery.php',
|
||||
'PhortuneCartReplyHandler' => 'applications/phortune/mail/PhortuneCartReplyHandler.php',
|
||||
'PhortuneCartSearchEngine' => 'applications/phortune/query/PhortuneCartSearchEngine.php',
|
||||
'PhortuneCartTransaction' => 'applications/phortune/storage/PhortuneCartTransaction.php',
|
||||
'PhortuneCartTransactionQuery' => 'applications/phortune/query/PhortuneCartTransactionQuery.php',
|
||||
|
@ -5638,6 +5639,7 @@ phutil_register_library_map(array(
|
|||
'PhortuneCartListController' => 'PhortuneController',
|
||||
'PhortuneCartPHIDType' => 'PhabricatorPHIDType',
|
||||
'PhortuneCartQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
||||
'PhortuneCartReplyHandler' => 'PhabricatorMailReplyHandler',
|
||||
'PhortuneCartSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
||||
'PhortuneCartTransaction' => 'PhabricatorApplicationTransaction',
|
||||
'PhortuneCartTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
||||
|
|
|
@ -261,6 +261,18 @@ final class FundInitiativeEditor
|
|||
->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) {
|
||||
return array($object->getOwnerPHID());
|
||||
|
|
|
@ -92,4 +92,76 @@ final class PhortuneCartEditor
|
|||
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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
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 $status;
|
||||
protected $metadata = array();
|
||||
protected $mailKey;
|
||||
|
||||
private $account = self::ATTACHABLE;
|
||||
private $purchases = self::ATTACHABLE;
|
||||
|
@ -514,6 +515,7 @@ final class PhortuneCart extends PhortuneDAO
|
|||
self::CONFIG_COLUMN_SCHEMA => array(
|
||||
'status' => 'text32',
|
||||
'cartClass' => 'text128',
|
||||
'mailKey' => 'bytes20',
|
||||
),
|
||||
self::CONFIG_KEY_SCHEMA => array(
|
||||
'key_account' => array(
|
||||
|
@ -531,6 +533,13 @@ final class PhortuneCart extends PhortuneDAO
|
|||
PhortuneCartPHIDType::TYPECONST);
|
||||
}
|
||||
|
||||
public function save() {
|
||||
if (!$this->getMailKey()) {
|
||||
$this->setMailKey(Filesystem::readRandomCharacters(20));
|
||||
}
|
||||
return parent::save();
|
||||
}
|
||||
|
||||
public function attachPurchases(array $purchases) {
|
||||
assert_instances_of($purchases, 'PhortunePurchase');
|
||||
$this->purchases = $purchases;
|
||||
|
|
|
@ -22,6 +22,15 @@ final class PhortuneCartTransaction
|
|||
return null;
|
||||
}
|
||||
|
||||
public function shouldHideForMail(array $xactions) {
|
||||
switch ($this->getTransactionType()) {
|
||||
case self::TYPE_CREATED:
|
||||
return true;
|
||||
}
|
||||
|
||||
return parent::shouldHideForMail($xactions);
|
||||
}
|
||||
|
||||
public function getTitle() {
|
||||
$old = $this->getOldValue();
|
||||
$new = $this->getNewValue();
|
||||
|
|
Loading…
Reference in a new issue