mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-25 08:12:40 +01:00
0195e751c6
Summary: This allows a merchant to send a user an invoice for something arbitrary, like services rendered. Two major missing parts: - These don't actually get marked as invoices. I'll fix that in the next diff, but it's not entirely trivial because `subscriptionPHID` is currently overloaded to also mean "is invoice". - We don't send email automatically. I don't plan to fix that for now, since all our invoicing needs are covered by personal email. Test Plan: Merchants have a new "new invoice" option: {F376999} This leads to selecting a user and account, and then you can generate the invoice (only one actual "purchase" / line item for the moment). You can add a longer-form remarkup description to contextualize the billable items: {F377001} This sends the invoice and takes you to the merchant order overview screen: {F377002} For now, you copy/paste that link into a nice personal enterprisey business-to-business email; the recipient sees this: {F377003} Reviewers: btrahan Reviewed By: btrahan Subscribers: epriestley Differential Revision: https://secure.phabricator.com/D12478
67 lines
1.5 KiB
PHP
67 lines
1.5 KiB
PHP
<?php
|
|
|
|
abstract class PhortuneCartController
|
|
extends PhortuneController {
|
|
|
|
protected function buildCartContentTable(PhortuneCart $cart) {
|
|
|
|
$rows = array();
|
|
foreach ($cart->getPurchases() as $purchase) {
|
|
$rows[] = array(
|
|
$purchase->getFullDisplayName(),
|
|
$purchase->getBasePriceAsCurrency()->formatForDisplay(),
|
|
$purchase->getQuantity(),
|
|
$purchase->getTotalPriceAsCurrency()->formatForDisplay(),
|
|
);
|
|
}
|
|
|
|
$rows[] = array(
|
|
phutil_tag('strong', array(), pht('Total')),
|
|
'',
|
|
'',
|
|
phutil_tag('strong', array(),
|
|
$cart->getTotalPriceAsCurrency()->formatForDisplay()),
|
|
);
|
|
|
|
$table = new AphrontTableView($rows);
|
|
$table->setHeaders(
|
|
array(
|
|
pht('Item'),
|
|
pht('Price'),
|
|
pht('Qty.'),
|
|
pht('Total'),
|
|
));
|
|
$table->setColumnClasses(
|
|
array(
|
|
'wide',
|
|
'right',
|
|
'right',
|
|
'right',
|
|
));
|
|
|
|
return $table;
|
|
}
|
|
|
|
protected function renderCartDescription(PhortuneCart $cart) {
|
|
$description = $cart->getDescription();
|
|
if (!strlen($description)) {
|
|
return null;
|
|
}
|
|
|
|
$output = PhabricatorMarkupEngine::renderOneObject(
|
|
id(new PhabricatorMarkupOneOff())
|
|
->setPreserveLinebreaks(true)
|
|
->setContent($description),
|
|
'default',
|
|
$this->getViewer());
|
|
|
|
$box = id(new PHUIBoxView())
|
|
->addMargin(PHUI::MARGIN_LARGE)
|
|
->appendChild($output);
|
|
|
|
return id(new PHUIObjectBoxView())
|
|
->setHeaderText(pht('Description'))
|
|
->appendChild($box);
|
|
}
|
|
|
|
}
|