diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9308be149..242adc004 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,7 @@
# Changelog Fab Manager
- Fix a bug: Users with role 'member' cannot download their invoices
+- [TODO DEPLOY] `rake db:migrate`
## v4.0.4 2019 August 14
- Fix a bug: #140 VAT rate is erronous in invoices.
diff --git a/app/assets/javascripts/controllers/events.js.erb b/app/assets/javascripts/controllers/events.js.erb
index dc43d3e2a..70b8cfdd2 100644
--- a/app/assets/javascripts/controllers/events.js.erb
+++ b/app/assets/javascripts/controllers/events.js.erb
@@ -617,16 +617,22 @@ Application.Controllers.controller('ShowEventController', ['$scope', '$state', '
},
coupon () {
return $scope.coupon.applied;
+ },
+ cartItems () {
+ return mkRequestParams(reservation, $scope.coupon.applied);
}
},
- controller: ['$scope', '$uibModalInstance', '$state', 'reservation', 'price', 'cgv', 'Auth', 'Reservation', 'growl', 'wallet', 'helpers', '$filter', 'coupon',
- function ($scope, $uibModalInstance, $state, reservation, price, cgv, Auth, Reservation, growl, wallet, helpers, $filter, coupon) {
+ controller: ['$scope', '$uibModalInstance', '$state', 'reservation', 'price', 'cgv', 'Auth', 'Reservation', 'growl', 'wallet', 'helpers', '$filter', 'coupon', 'cartItems',
+ function ($scope, $uibModalInstance, $state, reservation, price, cgv, Auth, Reservation, growl, wallet, helpers, $filter, coupon, cartItems) {
// User's wallet amount
$scope.walletAmount = wallet.amount;
// Price
$scope.amount = helpers.getAmountToPay(price.price, wallet.amount);
+ // Cart items
+ $scope.cartItems = cartItems;
+
// CGV
$scope.cgv = cgv.custom_asset;
@@ -636,23 +642,9 @@ Application.Controllers.controller('ShowEventController', ['$scope', '$state', '
// Used in wallet info template to interpolate some translations
$scope.numberFilter = $filter('number');
- // Callback for the stripe payment authorization
- return $scope.payment = function (status, response) {
- if (response.error) {
- return growl.error(response.error.message);
- } else {
- $scope.attempting = true;
- $scope.reservation.card_token = response.id;
- Reservation.save(mkRequestParams($scope.reservation, coupon), function (reservation) { $uibModalInstance.close(reservation); }
- , function (response) {
- $scope.alerts = [];
- $scope.alerts.push({
- msg: response.data.card[0],
- type: 'danger'
- });
- return $scope.attempting = false;
- });
- }
+ // Callback to handle the post-payment and reservation
+ return $scope.onPaymentSuccess = function (reservation) {
+ $uibModalInstance.close(reservation);
};
}
]
diff --git a/app/assets/javascripts/directives/cart.js.erb b/app/assets/javascripts/directives/cart.js.erb
index 69089cb7f..f34e3a289 100644
--- a/app/assets/javascripts/directives/cart.js.erb
+++ b/app/assets/javascripts/directives/cart.js.erb
@@ -487,7 +487,7 @@ Application.Directives.directive('cart', [ '$rootScope', '$uibModal', 'dialogs',
// Price
$scope.amount = helpers.getAmountToPay(price.price, wallet.amount);
- // cartItems
+ // Cart items
$scope.cartItems = cartItems;
// CGV
@@ -500,7 +500,7 @@ Application.Directives.directive('cart', [ '$rootScope', '$uibModal', 'dialogs',
$scope.numberFilter = $filter('number');
/**
- * Callback to process the payment with Stripe, triggered on button click
+ * Callback to handle the post-payment and reservation
*/
$scope.onPaymentSuccess = function (response) {
$uibModalInstance.close(response);
diff --git a/app/assets/javascripts/directives/stripe-form.js.erb b/app/assets/javascripts/directives/stripe-form.js.erb
index 187c73318..e61416f2b 100644
--- a/app/assets/javascripts/directives/stripe-form.js.erb
+++ b/app/assets/javascripts/directives/stripe-form.js.erb
@@ -1,5 +1,11 @@
/* global Stripe */
+/**
+ * This directive allows to extend a form with the Stripe payment input and error handling area.
+ * Strong-customer authentication is supported.
+ * --
+ * https://stripe.com/docs/payments/payment-intents/web-manual
+ */
Application.Directives.directive('stripeForm', ['Payment', 'growl', '_t',
function (Payment, growl, _t) {
return ({
@@ -48,7 +54,6 @@ Application.Directives.directive('stripeForm', ['Payment', 'growl', '_t',
const button = form.find('button');
button.prop('disabled', true);
- // TODO https://stripe.com/docs/payments/payment-intents/web-manual
stripe.createPaymentMethod('card', card).then(function({ paymentMethod, error }) {
if (error) {
growl.error(error.message);
@@ -58,14 +63,18 @@ Application.Directives.directive('stripeForm', ['Payment', 'growl', '_t',
Payment.confirm({ payment_method_id: paymentMethod.id, cart_items: $scope.cartItems }, function (response) {
// Handle server response (see Step 3)
handleServerResponse(response, button);
- });
+ }, function(error) { handleServerResponse({ error }) });
}
});
});
function handleServerResponse(response, confirmButton) {
if (response.error) {
- growl.error(`${_t('payment_card_error')} ${response.error}`);
+ if (response.error.statusText) {
+ growl.error(response.error.statusText);
+ } else {
+ growl.error(`${_t('payment_card_error')} ${response.error}`);
+ }
confirmButton.prop('disabled', false);
} else if (response.requires_action) {
// Use Stripe.js to handle required card action
@@ -80,7 +89,7 @@ Application.Directives.directive('stripeForm', ['Payment', 'growl', '_t',
// The PaymentIntent can be confirmed again on the server
Payment.confirm({ payment_intent_id: result.paymentIntent.id, cart_items: $scope.cartItems }, function(confirmResult) {
handleServerResponse(confirmResult, confirmButton);
- });
+ }, function(error) { handleServerResponse({ error }) });
}
});
} else {
diff --git a/app/assets/templates/stripe/payment_modal.html.erb b/app/assets/templates/stripe/payment_modal.html.erb
index 748279373..955750e79 100644
--- a/app/assets/templates/stripe/payment_modal.html.erb
+++ b/app/assets/templates/stripe/payment_modal.html.erb
@@ -7,7 +7,7 @@