3 final class PhortuneAccountSubscriptionViewController
4 extends PhortuneAccountController
{
6 protected function shouldRequireAccountEditCapability() {
10 protected function handleAccountRequest(AphrontRequest
$request) {
11 $viewer = $this->getViewer();
13 $subscription = id(new PhortuneSubscriptionQuery())
15 ->withIDs(array($request->getURIData('subscriptionID')))
19 return new Aphront404Response();
22 $can_edit = PhabricatorPolicyFilter
::hasCapability(
25 PhabricatorPolicyCapability
::CAN_EDIT
);
27 $merchant = $subscription->getMerchant();
28 $account = $subscription->getAccount();
30 $account_id = $account->getID();
31 $subscription_id = $subscription->getID();
33 $title = $subscription->getSubscriptionFullName();
35 $header = id(new PHUIHeaderView())
37 ->setHeaderIcon('fa-retweet');
39 $edit_uri = $subscription->getEditURI();
41 $crumbs = $this->buildApplicationCrumbs()
42 ->addTextCrumb($subscription->getSubscriptionCrumbName())
45 $properties = id(new PHUIPropertyListView())
48 $next_invoice = $subscription->getTrigger()->getNextEventPrediction();
49 $properties->addProperty(
51 phabricator_datetime($next_invoice, $viewer));
53 $autopay = $this->newAutopayView($subscription);
55 $details = id(new PHUIObjectBoxView())
56 ->setHeaderText(pht('Subscription Details'))
57 ->setBackground(PHUIObjectBoxView
::BLUE_PROPERTY
)
58 ->addPropertyList($properties);
60 $due_box = $this->buildDueInvoices($subscription);
61 $invoice_box = $this->buildPastInvoices($subscription);
63 $timeline = $this->buildTransactionTimeline(
65 new PhortuneSubscriptionTransactionQuery());
66 $timeline->setShouldTerminate(true);
68 $view = id(new PHUITwoColumnView())
79 return $this->newPage()
85 private function buildDueInvoices(PhortuneSubscription
$subscription) {
86 $viewer = $this->getViewer();
88 $invoices = id(new PhortuneCartQuery())
90 ->withSubscriptionPHIDs(array($subscription->getPHID()))
95 $invoice_table = id(new PhortuneOrderTableView())
98 ->setIsInvoices(true);
100 $invoice_header = id(new PHUIHeaderView())
101 ->setHeader(pht('Invoices Due'));
103 return id(new PHUIObjectBoxView())
104 ->setHeader($invoice_header)
105 ->setBackground(PHUIObjectBoxView
::BLUE_PROPERTY
)
106 ->appendChild($invoice_table);
109 private function buildPastInvoices(PhortuneSubscription
$subscription) {
110 $viewer = $this->getViewer();
112 $invoices = id(new PhortuneCartQuery())
114 ->withSubscriptionPHIDs(array($subscription->getPHID()))
115 ->needPurchases(true)
118 PhortuneCart
::STATUS_PURCHASING
,
119 PhortuneCart
::STATUS_CHARGED
,
120 PhortuneCart
::STATUS_HOLD
,
121 PhortuneCart
::STATUS_REVIEW
,
122 PhortuneCart
::STATUS_PURCHASED
,
127 $invoice_table = id(new PhortuneOrderTableView())
129 ->setCarts($invoices);
131 $account = $subscription->getAccount();
132 $merchant = $subscription->getMerchant();
134 $account_id = $account->getID();
135 $merchant_id = $merchant->getID();
136 $subscription_id = $subscription->getID();
138 $invoices_uri = $this->getApplicationURI(
139 "{$account_id}/subscription/order/{$subscription_id}/");
141 $invoice_header = id(new PHUIHeaderView())
142 ->setHeader(pht('Past Invoices'))
144 id(new PHUIButtonView())
147 ->setHref($invoices_uri)
148 ->setText(pht('View All Invoices')));
150 return id(new PHUIObjectBoxView())
151 ->setHeader($invoice_header)
152 ->setBackground(PHUIObjectBoxView
::BLUE_PROPERTY
)
153 ->appendChild($invoice_table);
156 private function newAutopayView(PhortuneSubscription
$subscription) {
157 $viewer = $this->getViewer();
158 $account = $subscription->getAccount();
160 $add_method_uri = urisprintf(
161 '/account/%d/methods/new/?subscriptionID=%s',
163 $subscription->getID());
164 $add_method_uri = $this->getApplicationURI($add_method_uri);
166 $can_edit = PhabricatorPolicyFilter
::hasCapability(
169 PhabricatorPolicyCapability
::CAN_EDIT
);
171 $methods = id(new PhortunePaymentMethodQuery())
173 ->withAccountPHIDs(array($subscription->getAccountPHID()))
174 ->withMerchantPHIDs(array($subscription->getMerchantPHID()))
177 PhortunePaymentMethod
::STATUS_ACTIVE
,
180 $methods = mpull($methods, null, 'getPHID');
182 $autopay_phid = $subscription->getDefaultPaymentMethodPHID();
183 $autopay_method = idx($methods, $autopay_phid);
185 $header = id(new PHUIHeaderView())
186 ->setHeader(pht('Autopay'))
188 id(new PHUIButtonView())
191 ->setHref($add_method_uri)
192 ->setText(pht('Add Payment Method'))
193 ->setWorkflow(!$can_edit)
194 ->setDisabled(!$can_edit));
196 $methods = array_select_keys($methods, array($autopay_phid)) +
$methods;
200 foreach ($methods as $method) {
201 $is_autopay = ($autopay_method === $method);
203 $remove_uri = urisprintf(
204 '/card/%d/disable/?subscriptionID=%d',
206 $subscription->getID());
207 $remove_uri = $this->getApplicationURI($remove_uri);
209 $autopay_uri = urisprintf(
210 '/account/%d/subscriptions/%d/autopay/%d/',
212 $subscription->getID(),
214 $autopay_uri = $this->getApplicationURI($autopay_uri);
216 $remove_button = id(new PHUIButtonView())
219 ->setIcon('fa-times')
220 ->setText(pht('Delete'))
221 ->setHref($remove_uri)
223 ->setDisabled(!$can_edit);
226 $autopay_button = id(new PHUIButtonView())
228 ->setIcon('fa-times')
229 ->setText(pht('Stop Autopay'));
231 if ($autopay_method) {
232 $make_color = 'grey';
234 $make_color = 'green';
237 $autopay_button = id(new PHUIButtonView())
238 ->setColor($make_color)
239 ->setIcon('fa-retweet')
240 ->setText(pht('Start Autopay'));
245 ->setHref($autopay_uri)
247 ->setDisabled(!$can_edit);
254 'href' => $method->getURI(),
256 $method->getFullDisplayName()),
257 $method->getDisplayExpires(),
263 $rowc[] = 'highlighted';
269 $method_table = id(new AphrontTableView($rows))
273 pht('Payment Method'),
278 ->setRowClasses($rowc)
288 if (!$autopay_method) {
289 $method_table->setNotice(
291 id(new PHUIIconView())->setIcon('fa-warning yellow'),
293 pht('Autopay is not currently configured for this subscription.'),
296 $method_table->setNotice(
298 id(new PHUIIconView())->setIcon('fa-check green'),
301 'Autopay is configured using %s.',
305 'href' => $autopay_method->getURI(),
307 $autopay_method->getFullDisplayName())),
311 return id(new PHUIObjectBoxView())
313 ->setBackground(PHUIObjectBoxView
::BLUE_PROPERTY
)
314 ->setTable($method_table);