FEATURE: Implement refunds from dashboard (#27)

An implementation of refunds from the Admin dashboard. To refund, go to Plugins > Subscriptions > Subscriptions then click the `Cancel` button. You'll be presented with a modal. If you wish to refund only the most recent payment, check the box. 

This only implements refunds for Subscriptions, not One Time Payments. One Time Payments will still need to be handled manually at this time.
This commit is contained in:
Justin DiRose
2020-10-29 10:31:12 -05:00
committed by GitHub
parent b950926538
commit b92627677f
8 changed files with 87 additions and 27 deletions
@@ -1,3 +1,12 @@
import Controller from "@ember/controller";
import showModal from "discourse/lib/show-modal";
export default Controller.extend({});
export default Controller.extend({
actions: {
showCancelModal(subscription) {
showModal("admin-cancel-subscription", {
model: subscription,
});
},
},
});
@@ -19,9 +19,13 @@ const AdminSubscription = EmberObject.extend({
return getURL(`/admin/users/${metadata.user_id}/${metadata.username}`);
},
destroy() {
destroy(refund) {
const data = {
refund: refund,
};
return ajax(`/s/admin/subscriptions/${this.id}`, {
method: "delete",
data,
}).then((result) => AdminSubscription.create(result));
},
});
@@ -1,6 +1,6 @@
import I18n from "I18n";
import Route from "@ember/routing/route";
import AdminSubscription from "discourse/plugins/discourse-subscriptions/discourse/models/admin-subscription";
import I18n from "I18n";
export default Route.extend({
model() {
@@ -8,29 +8,24 @@ export default Route.extend({
},
actions: {
cancelSubscription(subscription) {
bootbox.confirm(
I18n.t(
"discourse_subscriptions.user.subscriptions.operations.destroy.confirm"
),
I18n.t("no_value"),
I18n.t("yes_value"),
(confirmed) => {
if (confirmed) {
subscription.set("loading", true);
subscription
.destroy()
.then((result) => subscription.set("status", result.status))
.catch((data) =>
bootbox.alert(data.jqXHR.responseJSON.errors.join("\n"))
)
.finally(() => {
subscription.set("loading", false);
});
}
}
);
cancelSubscription(model) {
const subscription = model.subscription;
const refund = model.refund;
subscription.set("loading", true);
subscription
.destroy(refund)
.then((result) => {
subscription.set("status", result.status);
this.send("closeModal");
bootbox.alert(I18n.t("discourse_subscriptions.admin.canceled"));
})
.catch((data) =>
bootbox.alert(data.jqXHR.responseJSON.errors.join("\n"))
)
.finally(() => {
subscription.set("loading", false);
this.refresh();
});
},
},
});
@@ -34,7 +34,7 @@
{{#if subscription.loading}}
{{loading-spinner size="small"}}
{{else}}
{{d-button disabled=subscription.canceled label="cancel" action=(route-action "cancelSubscription" subscription) icon="times"}}
{{d-button disabled=subscription.canceled label="cancel" action=(action "showCancelModal" subscription) icon="times"}}
{{/if}}
</td>
</tr>
@@ -0,0 +1,21 @@
<div>
{{#d-modal-body rawTitle=(i18n "discourse_subscriptions.user.subscriptions.operations.destroy.confirm")}}
{{input type="checkbox" checked=refund}}
{{i18n "discourse_subscriptions.admin.ask_refund"}}
{{/d-modal-body}}
<div class="modal-footer">
{{#if model.loading}}
{{loading-spinner}}
{{else}}
{{d-button
label="yes_value"
action=(route-action "cancelSubscription" (hash subscription=model refund=refund))
icon="times"
class="btn-danger"
}}
{{d-button label="no_value" action=(route-action "closeModal")}}
{{/if}}
</div>
</div>