Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F14355840
D16762.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
22 KB
Referenced Files
None
Subscribers
None
D16762.diff
View Options
diff --git a/resources/celerity/map.php b/resources/celerity/map.php
--- a/resources/celerity/map.php
+++ b/resources/celerity/map.php
@@ -89,6 +89,7 @@
'rsrc/css/application/pholio/pholio-inline-comments.css' => '8e545e49',
'rsrc/css/application/pholio/pholio.css' => 'ca89d380',
'rsrc/css/application/phortune/phortune-credit-card-form.css' => '8391eb02',
+ 'rsrc/css/application/phortune/phortune-invoice.css' => '476055e2',
'rsrc/css/application/phortune/phortune.css' => '5b99dae0',
'rsrc/css/application/phrequent/phrequent.css' => 'ffc185ad',
'rsrc/css/application/phriction/phriction-document-css.css' => '4282e4ad',
@@ -840,6 +841,7 @@
'phortune-credit-card-form' => '2290aeef',
'phortune-credit-card-form-css' => '8391eb02',
'phortune-css' => '5b99dae0',
+ 'phortune-invoice-css' => '476055e2',
'phrequent-css' => 'ffc185ad',
'phriction-document-css' => '4282e4ad',
'phui-action-panel-css' => '91c7b835',
diff --git a/resources/sql/autopatches/20161029.phortune.invoice.1.sql b/resources/sql/autopatches/20161029.phortune.invoice.1.sql
new file mode 100644
--- /dev/null
+++ b/resources/sql/autopatches/20161029.phortune.invoice.1.sql
@@ -0,0 +1,5 @@
+ALTER TABLE {$NAMESPACE}_phortune.phortune_merchant
+ ADD invoiceEmail VARCHAR(255) COLLATE {$COLLATE_TEXT} NOT NULL;
+
+ALTER TABLE {$NAMESPACE}_phortune.phortune_merchant
+ ADD invoiceFooter LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL;
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
@@ -4174,6 +4174,7 @@
'PhortuneCurrencyTestCase' => 'applications/phortune/currency/__tests__/PhortuneCurrencyTestCase.php',
'PhortuneDAO' => 'applications/phortune/storage/PhortuneDAO.php',
'PhortuneErrCode' => 'applications/phortune/constants/PhortuneErrCode.php',
+ 'PhortuneInvoiceView' => 'applications/phortune/view/PhortuneInvoiceView.php',
'PhortuneLandingController' => 'applications/phortune/controller/PhortuneLandingController.php',
'PhortuneMemberHasAccountEdgeType' => 'applications/phortune/edge/PhortuneMemberHasAccountEdgeType.php',
'PhortuneMemberHasMerchantEdgeType' => 'applications/phortune/edge/PhortuneMemberHasMerchantEdgeType.php',
@@ -9422,6 +9423,7 @@
'PhortuneCurrencyTestCase' => 'PhabricatorTestCase',
'PhortuneDAO' => 'PhabricatorLiskDAO',
'PhortuneErrCode' => 'PhortuneConstants',
+ 'PhortuneInvoiceView' => 'AphrontTagView',
'PhortuneLandingController' => 'PhortuneController',
'PhortuneMemberHasAccountEdgeType' => 'PhabricatorEdgeType',
'PhortuneMemberHasMerchantEdgeType' => 'PhabricatorEdgeType',
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
@@ -61,6 +61,7 @@
'cart/(?P<id>\d+)/' => array(
'' => 'PhortuneCartViewController',
'checkout/' => 'PhortuneCartCheckoutController',
+ '(?P<action>print)/' => 'PhortuneCartViewController',
'(?P<action>cancel|refund)/' => 'PhortuneCartCancelController',
'update/' => 'PhortuneCartUpdateController',
),
diff --git a/src/applications/phortune/controller/PhortuneCartViewController.php b/src/applications/phortune/controller/PhortuneCartViewController.php
--- a/src/applications/phortune/controller/PhortuneCartViewController.php
+++ b/src/applications/phortune/controller/PhortuneCartViewController.php
@@ -3,9 +3,12 @@
final class PhortuneCartViewController
extends PhortuneCartController {
+ private $action = null;
+
public function handleRequest(AphrontRequest $request) {
$viewer = $request->getViewer();
$id = $request->getURIData('id');
+ $this->action = $request->getURIData('action');
$authority = $this->loadMerchantAuthority();
require_celerity_resource('phortune-css');
@@ -129,7 +132,7 @@
$header = id(new PHUIHeaderView())
->setUser($viewer)
- ->setHeader(pht('Order Detail'))
+ ->setHeader($cart->getName())
->setHeaderIcon('fa-shopping-cart');
if ($cart->getStatus() == PhortuneCart::STATUS_PURCHASED) {
@@ -188,36 +191,75 @@
$crumbs->addTextCrumb(pht('Cart %d', $cart->getID()));
$crumbs->setBorder(true);
- $timeline = $this->buildTransactionTimeline(
- $cart,
- new PhortuneCartTransactionQuery());
- $timeline
- ->setShouldTerminate(true);
-
- $view = id(new PHUITwoColumnView())
- ->setHeader($header)
- ->setCurtain($curtain)
- ->setMainColumn(array(
- $error_view,
- $details,
- $cart_box,
- $description,
- $charges,
- $timeline,
- ));
+ if (!$this->action) {
+ $class = 'phortune-cart-page';
+ $timeline = $this->buildTransactionTimeline(
+ $cart,
+ new PhortuneCartTransactionQuery());
+ $timeline
+ ->setShouldTerminate(true);
+
+ $view = id(new PHUITwoColumnView())
+ ->setHeader($header)
+ ->setCurtain($curtain)
+ ->setMainColumn(array(
+ $error_view,
+ $details,
+ $cart_box,
+ $description,
+ $charges,
+ $timeline,
+ ));
+
+ } else {
+ $class = 'phortune-invoice-view';
+ $crumbs = null;
+ $merchant_phid = $cart->getMerchantPHID();
+ $buyer_phid = $cart->getAuthorPHID();
+ $merchant = id(new PhortuneMerchantQuery())
+ ->setViewer($viewer)
+ ->withPHIDs(array($merchant_phid))
+ ->needProfileImage(true)
+ ->executeOne();
+ $buyer = id(new PhabricatorPeopleQuery())
+ ->setViewer($viewer)
+ ->withPHIDs(array($buyer_phid))
+ ->needProfileImage(true)
+ ->executeOne();
+ // TODO: Add account "Contact" info
+
+ $merchant_contact = new PHUIRemarkupView(
+ $viewer, $merchant->getContactInfo());
+ $description = null;
+
+ $view = id(new PhortuneInvoiceView())
+ ->setMerchantName($merchant->getName())
+ ->setMerchantLogo($merchant->getProfileImageURI())
+ ->setMerchantContact($merchant_contact)
+ ->setMerchantFooter($merchant->getInvoiceFooter())
+ ->setAccountName($buyer->getRealName())
+ ->setStatus($error_view)
+ ->setContent(array(
+ $description,
+ $details,
+ $cart_box,
+ $charges,
+ ));
+ }
- return $this->newPage()
+ $page = $this->newPage()
->setTitle(pht('Cart %d', $cart->getID()))
- ->setCrumbs($crumbs)
- ->addClass('phortune-cart-page')
+ ->addClass($class)
->appendChild($view);
+ if ($crumbs) {
+ $page->setCrumbs($crumbs);
+ }
+ return $page;
}
private function buildDetailsView(PhortuneCart $cart) {
-
$viewer = $this->getViewer();
-
$view = id(new PHUIPropertyListView())
->setUser($viewer)
->setObject($cart);
@@ -229,9 +271,10 @@
$cart->getMerchantPHID(),
));
- $view->addProperty(
- pht('Order Name'),
- $cart->getName());
+ if ($this->action == 'print') {
+ $view->addProperty(pht('Order Name'), $cart->getName());
+ }
+
$view->addProperty(
pht('Account'),
$handles[$cart->getAccountPHID()]->renderLink());
@@ -276,7 +319,7 @@
$refund_uri = $this->getApplicationURI("{$prefix}cart/{$id}/refund/");
$update_uri = $this->getApplicationURI("{$prefix}cart/{$id}/update/");
$accept_uri = $this->getApplicationURI("{$prefix}cart/{$id}/accept/");
- $print_uri = $this->getApplicationURI("{$prefix}cart/{$id}/?__print__=1");
+ $print_uri = $this->getApplicationURI("{$prefix}cart/{$id}/print/");
$curtain->addAction(
id(new PhabricatorActionView())
diff --git a/src/applications/phortune/controller/PhortuneMerchantViewController.php b/src/applications/phortune/controller/PhortuneMerchantViewController.php
--- a/src/applications/phortune/controller/PhortuneMerchantViewController.php
+++ b/src/applications/phortune/controller/PhortuneMerchantViewController.php
@@ -129,6 +129,13 @@
$view->addProperty(pht('Status'), $status_view);
+ $invoice_from = $merchant->getInvoiceEmail();
+ if (!$invoice_from) {
+ $invoice_from = pht('No email address set');
+ $invoice_from = phutil_tag('em', array(), $invoice_from);
+ }
+ $view->addProperty(pht('Invoice From'), $invoice_from);
+
$description = $merchant->getDescription();
if (strlen($description)) {
$description = new PHUIRemarkupView($viewer, $description);
@@ -147,6 +154,15 @@
$view->addTextContent($contact_info);
}
+ $footer_info = $merchant->getInvoiceFooter();
+ if (strlen($footer_info)) {
+ $footer_info = new PHUIRemarkupView($viewer, $footer_info);
+ $view->addSectionHeader(
+ pht('Invoice Footer'),
+ PHUIPropertyListView::ICON_SUMMARY);
+ $view->addTextContent($footer_info);
+ }
+
return id(new PHUIObjectBoxView())
->setHeaderText(pht('Details'))
->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
diff --git a/src/applications/phortune/editor/PhortuneMerchantEditEngine.php b/src/applications/phortune/editor/PhortuneMerchantEditEngine.php
--- a/src/applications/phortune/editor/PhortuneMerchantEditEngine.php
+++ b/src/applications/phortune/editor/PhortuneMerchantEditEngine.php
@@ -84,6 +84,21 @@
->setTransactionType(PhortuneMerchantTransaction::TYPE_NAME)
->setValue($object->getName()),
+ id(new PhabricatorUsersEditField())
+ ->setKey('members')
+ ->setAliases(array('memberPHIDs'))
+ ->setLabel(pht('Members'))
+ ->setUseEdgeTransactions(true)
+ ->setTransactionType(PhabricatorTransactions::TYPE_EDGE)
+ ->setMetadataValue(
+ 'edge:type',
+ PhortuneMerchantHasMemberEdgeType::EDGECONST)
+ ->setDescription(pht('Initial merchant members.'))
+ ->setConduitDescription(pht('Set merchant members.'))
+ ->setConduitTypeDescription(pht('New list of members.'))
+ ->setInitialValue($object->getMemberPHIDs())
+ ->setValue($member_phids),
+
id(new PhabricatorRemarkupEditField())
->setKey('description')
->setLabel(pht('Description'))
@@ -100,20 +115,22 @@
->setTransactionType(PhortuneMerchantTransaction::TYPE_CONTACTINFO)
->setValue($object->getContactInfo()),
- id(new PhabricatorUsersEditField())
- ->setKey('members')
- ->setAliases(array('memberPHIDs'))
- ->setLabel(pht('Members'))
- ->setUseEdgeTransactions(true)
- ->setTransactionType(PhabricatorTransactions::TYPE_EDGE)
- ->setMetadataValue(
- 'edge:type',
- PhortuneMerchantHasMemberEdgeType::EDGECONST)
- ->setDescription(pht('Initial merchant members.'))
- ->setConduitDescription(pht('Set merchant members.'))
- ->setConduitTypeDescription(pht('New list of members.'))
- ->setInitialValue($object->getMemberPHIDs())
- ->setValue($member_phids),
+ id(new PhabricatorTextEditField())
+ ->setKey('invoiceEmail')
+ ->setLabel(pht('Invoice From Email'))
+ ->setDescription(pht('Email address invoices are sent from.'))
+ ->setConduitTypeDescription(
+ pht('Email address invoices are sent from.'))
+ ->setTransactionType(PhortuneMerchantTransaction::TYPE_INVOICEEMAIL)
+ ->setValue($object->getInvoiceEmail()),
+
+ id(new PhabricatorRemarkupEditField())
+ ->setKey('invoiceFooter')
+ ->setLabel(pht('Invoice Footer'))
+ ->setDescription(pht('Footer on invoice forms.'))
+ ->setConduitTypeDescription(pht('Footer on invoice forms.'))
+ ->setTransactionType(PhortuneMerchantTransaction::TYPE_INVOICEFOOTER)
+ ->setValue($object->getInvoiceFooter()),
);
}
diff --git a/src/applications/phortune/editor/PhortuneMerchantEditor.php b/src/applications/phortune/editor/PhortuneMerchantEditor.php
--- a/src/applications/phortune/editor/PhortuneMerchantEditor.php
+++ b/src/applications/phortune/editor/PhortuneMerchantEditor.php
@@ -18,6 +18,8 @@
$types[] = PhortuneMerchantTransaction::TYPE_DESCRIPTION;
$types[] = PhortuneMerchantTransaction::TYPE_CONTACTINFO;
$types[] = PhortuneMerchantTransaction::TYPE_PICTURE;
+ $types[] = PhortuneMerchantTransaction::TYPE_INVOICEEMAIL;
+ $types[] = PhortuneMerchantTransaction::TYPE_INVOICEFOOTER;
$types[] = PhabricatorTransactions::TYPE_VIEW_POLICY;
$types[] = PhabricatorTransactions::TYPE_EDGE;
@@ -34,6 +36,10 @@
return $object->getDescription();
case PhortuneMerchantTransaction::TYPE_CONTACTINFO:
return $object->getContactInfo();
+ case PhortuneMerchantTransaction::TYPE_INVOICEEMAIL:
+ return $object->getInvoiceEmail();
+ case PhortuneMerchantTransaction::TYPE_INVOICEFOOTER:
+ return $object->getInvoiceFooter();
case PhortuneMerchantTransaction::TYPE_PICTURE:
return $object->getProfileImagePHID();
}
@@ -49,6 +55,8 @@
case PhortuneMerchantTransaction::TYPE_NAME:
case PhortuneMerchantTransaction::TYPE_DESCRIPTION:
case PhortuneMerchantTransaction::TYPE_CONTACTINFO:
+ case PhortuneMerchantTransaction::TYPE_INVOICEEMAIL:
+ case PhortuneMerchantTransaction::TYPE_INVOICEFOOTER:
case PhortuneMerchantTransaction::TYPE_PICTURE:
return $xaction->getNewValue();
}
@@ -70,6 +78,12 @@
case PhortuneMerchantTransaction::TYPE_CONTACTINFO:
$object->setContactInfo($xaction->getNewValue());
return;
+ case PhortuneMerchantTransaction::TYPE_INVOICEEMAIL:
+ $object->setInvoiceEmail($xaction->getNewValue());
+ return;
+ case PhortuneMerchantTransaction::TYPE_INVOICEFOOTER:
+ $object->setInvoiceFooter($xaction->getNewValue());
+ return;
case PhortuneMerchantTransaction::TYPE_PICTURE:
$object->setProfileImagePHID($xaction->getNewValue());
return;
@@ -86,6 +100,8 @@
case PhortuneMerchantTransaction::TYPE_NAME:
case PhortuneMerchantTransaction::TYPE_DESCRIPTION:
case PhortuneMerchantTransaction::TYPE_CONTACTINFO:
+ case PhortuneMerchantTransaction::TYPE_INVOICEEMAIL:
+ case PhortuneMerchantTransaction::TYPE_INVOICEFOOTER:
case PhortuneMerchantTransaction::TYPE_PICTURE:
return;
}
@@ -116,6 +132,29 @@
$error->setIsMissingFieldError(true);
$errors[] = $error;
}
+ break;
+ case PhortuneMerchantTransaction::TYPE_INVOICEEMAIL:
+ foreach ($xactions as $xaction) {
+ switch ($xaction->getTransactionType()) {
+ case PhortuneMerchantTransaction::TYPE_INVOICEEMAIL:
+ $new_email = $xaction->getNewValue();
+ break;
+ }
+ }
+ if (strlen($new_email)) {
+ $email = new PhutilEmailAddress($new_email);
+ $domain = $email->getDomainName();
+
+ if (!$domain) {
+ $error = new PhabricatorApplicationTransactionValidationError(
+ $type,
+ pht('Invalid'),
+ pht('%s is not a valid email.', $new_email),
+ nonempty(last($xactions), null));
+
+ $errors[] = $error;
+ }
+ }
break;
}
diff --git a/src/applications/phortune/storage/PhortuneMerchant.php b/src/applications/phortune/storage/PhortuneMerchant.php
--- a/src/applications/phortune/storage/PhortuneMerchant.php
+++ b/src/applications/phortune/storage/PhortuneMerchant.php
@@ -9,6 +9,8 @@
protected $viewPolicy;
protected $description;
protected $contactInfo;
+ protected $invoiceEmail;
+ protected $invoiceFooter;
protected $profileImagePHID;
private $memberPHIDs = self::ATTACHABLE;
@@ -27,6 +29,8 @@
'name' => 'text255',
'description' => 'text',
'contactInfo' => 'text',
+ 'invoiceEmail' => 'text255',
+ 'invoiceFooter' => 'text',
'profileImagePHID' => 'phid?',
),
) + parent::getConfiguration();
diff --git a/src/applications/phortune/storage/PhortuneMerchantTransaction.php b/src/applications/phortune/storage/PhortuneMerchantTransaction.php
--- a/src/applications/phortune/storage/PhortuneMerchantTransaction.php
+++ b/src/applications/phortune/storage/PhortuneMerchantTransaction.php
@@ -6,6 +6,8 @@
const TYPE_NAME = 'merchant:name';
const TYPE_DESCRIPTION = 'merchant:description';
const TYPE_CONTACTINFO = 'merchant:contactinfo';
+ const TYPE_INVOICEEMAIL = 'merchant:invoiceemail';
+ const TYPE_INVOICEFOOTER = 'merchant:invoicefooter';
const TYPE_PICTURE = 'merchant:picture';
public function getApplicationName() {
@@ -48,6 +50,14 @@
return pht(
'%s updated the contact information for this merchant.',
$this->renderHandleLink($author_phid));
+ case self::TYPE_INVOICEEMAIL:
+ return pht(
+ '%s updated the invoice email for this merchant.',
+ $this->renderHandleLink($author_phid));
+ case self::TYPE_INVOICEFOOTER:
+ return pht(
+ '%s updated the invoice footer for this merchant.',
+ $this->renderHandleLink($author_phid));
}
return parent::getTitle();
@@ -58,6 +68,8 @@
switch ($this->getTransactionType()) {
case self::TYPE_DESCRIPTION:
case self::TYPE_CONTACTINFO:
+ case self::TYPE_INVOICEEMAIL:
+ case self::TYPE_INVOICEFOOTER:
return ($old === null);
}
return parent::shouldHide();
@@ -69,6 +81,10 @@
return ($this->getOldValue() !== null);
case self::TYPE_CONTACTINFO:
return ($this->getOldValue() !== null);
+ case self::TYPE_INVOICEEMAIL:
+ return ($this->getOldValue() !== null);
+ case self::TYPE_INVOICEFOOTER:
+ return ($this->getOldValue() !== null);
}
return parent::hasChangeDetails();
diff --git a/src/applications/phortune/view/PhortuneInvoiceView.php b/src/applications/phortune/view/PhortuneInvoiceView.php
new file mode 100644
--- /dev/null
+++ b/src/applications/phortune/view/PhortuneInvoiceView.php
@@ -0,0 +1,159 @@
+<?php
+
+final class PhortuneInvoiceView extends AphrontTagView {
+
+ private $merchantName;
+ private $merchantLogo;
+ private $merchantContact;
+ private $merchantFooter;
+ private $accountName;
+ private $accountContact;
+ private $status;
+ private $content;
+
+ public function setMerchantName($name) {
+ $this->merchantName = $name;
+ return $this;
+ }
+
+ public function setMerchantLogo($logo) {
+ $this->merchantLogo = $logo;
+ return $this;
+ }
+
+ public function setMerchantContact($contact) {
+ $this->merchantContact = $contact;
+ return $this;
+ }
+
+ public function setMerchantFooter($footer) {
+ $this->merchantFooter = $footer;
+ return $this;
+ }
+
+ public function setAccountName($name) {
+ $this->accountName = $name;
+ return $this;
+ }
+
+ public function setAccountContact($contact) {
+ $this->accountContact = $contact;
+ return $this;
+ }
+
+ public function setStatus($status) {
+ $this->status = $status;
+ return $this;
+ }
+
+ public function setContent($content) {
+ $this->content = $content;
+ return $this;
+ }
+
+ protected function getTagAttributes() {
+ $classes = array();
+ $classes[] = 'phortune-invoice-view';
+
+ return array(
+ 'class' => implode(' ', $classes),
+ );
+ }
+
+ protected function getTagContent() {
+ require_celerity_resource('phortune-invoice-css');
+
+ $logo = phutil_tag(
+ 'div',
+ array(
+ 'class' => 'phortune-invoice-logo',
+ ),
+ phutil_tag(
+ 'img',
+ array(
+ 'height' => '50',
+ 'width' => '50',
+ 'alt' => $this->merchantName,
+ 'src' => $this->merchantLogo,
+ )));
+
+ $to_title = phutil_tag(
+ 'div',
+ array(
+ 'class' => 'phortune-mini-header',
+ ),
+ pht('To:'));
+
+ $bill_to = phutil_tag(
+ 'td',
+ array(
+ 'class' => 'phortune-invoice-to',
+ 'width' => '50%',
+ ),
+ array(
+ $to_title,
+ phutil_tag('strong', array(), $this->accountName),
+ phutil_tag('br', array()),
+ $this->accountContact,
+ ));
+
+ $from_title = phutil_tag(
+ 'div',
+ array(
+ 'class' => 'phortune-mini-header',
+ ),
+ pht('From:'));
+
+ $bill_from = phutil_tag(
+ 'td',
+ array(
+ 'class' => 'phortune-invoice-from',
+ 'width' => '50%',
+ ),
+ array(
+ $from_title,
+ phutil_tag('strong', array(), $this->merchantName),
+ phutil_tag('br', array()),
+ $this->merchantContact,
+ ));
+
+ $contact = phutil_tag(
+ 'table',
+ array(
+ 'class' => 'phortune-invoice-contact',
+ 'width' => '100%',
+ ),
+ phutil_tag(
+ 'tr',
+ array(),
+ array(
+ $bill_to,
+ $bill_from,
+ )));
+
+ $status = null;
+ if ($this->status) {
+ $status = phutil_tag(
+ 'div',
+ array(
+ 'class' => 'phortune-invoice-status',
+ ),
+ $this->status);
+ }
+
+ $footer = phutil_tag(
+ 'div',
+ array(
+ 'class' => 'phortune-invoice-footer',
+ ),
+ $this->merchantFooter);
+
+ return array(
+ $logo,
+ $contact,
+ $status,
+ $this->content,
+ $footer,
+ );
+ }
+}
diff --git a/webroot/rsrc/css/application/phortune/phortune-invoice.css b/webroot/rsrc/css/application/phortune/phortune-invoice.css
new file mode 100644
--- /dev/null
+++ b/webroot/rsrc/css/application/phortune/phortune-invoice.css
@@ -0,0 +1,75 @@
+/**
+ * @provides phortune-invoice-css
+ */
+
+.phortune-invoice-view {
+ max-width: 800px;
+ margin: 16px auto;
+ background: #fff;
+}
+
+.phortune-invoice-view .phabricator-main-menu {
+ display: none;
+}
+
+.phortune-invoice-view .phabricator-standard-page-footer {
+ display: none;
+}
+
+.device-desktop .phortune-invoice-view .phui-property-list-key {
+ width: 16%;
+}
+
+.device-desktop .phortune-invoice-view .phui-property-list-value {
+ width: 80%;
+}
+
+.phortune-invoice-logo {
+ margin-bottom: 24px;
+}
+
+.phortune-invoice-logo img {
+ margin: 0 auto;
+}
+
+.phortune-invoice-contact {
+ margin-bottom: 32px;
+}
+
+.phortune-invoice-contact td {
+ padding: 4px 16px;
+}
+
+.phortune-invoice-to {
+ border-right: 1px solid {$lightblueborder};
+}
+
+.phortune-mini-header {
+ color: {$lightbluetext};
+ font-weight: bold;
+ text-transform: uppercase;
+ margin-bottom: 4px;
+ letter-spacing: 0.3em;
+}
+
+.phortune-invoice-status {
+ margin-bottom: 24px;
+}
+
+.phortune-invoice-status .phui-info-view {
+ margin: 0;
+}
+
+.phortune-invoice-view .phui-box.phui-object-box {
+ margin-bottom: 24px;
+}
+
+.phortune-invoice-footer {
+ color: {$lightgreytext};
+ margin: 48px 0 64px;
+ text-align: center;
+}
+
+.phortune-invoice-footer strong {
+ color: #000;
+}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Dec 20, 6:37 PM (18 h, 53 m)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
6911602
Default Alt Text
D16762.diff (22 KB)
Attached To
Mode
D16762: Add a basic invoice view for printing to Phortune
Attached
Detach File
Event Timeline
Log In to Comment