2016-03-23 18:39:41 +01:00
|
|
|
'use strict'
|
|
|
|
|
2016-07-08 17:24:51 +02:00
|
|
|
Application.Controllers.controller "PlansIndexController", ["$scope", "$rootScope", "$state", '$uibModal', 'Auth', 'dialogs', 'growl', 'plansPromise', 'groupsPromise', 'Subscription', 'Member', 'subscriptionExplicationsPromise', '_t', 'Wallet', 'helpers'
|
|
|
|
, ($scope, $rootScope, $state, $uibModal, Auth, dialogs, growl, plansPromise, groupsPromise, Subscription, Member, subscriptionExplicationsPromise, _t, Wallet, helpers) ->
|
2016-03-23 18:39:41 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### PUBLIC SCOPE ###
|
|
|
|
|
|
|
|
## list of groups
|
|
|
|
$scope.groups = groupsPromise
|
|
|
|
|
|
|
|
## default : do not show the group changing form
|
|
|
|
## group ID of the current/selected user
|
2016-04-11 19:26:40 +02:00
|
|
|
$scope.group =
|
|
|
|
change: false
|
|
|
|
id: null
|
2016-03-23 18:39:41 +01:00
|
|
|
|
|
|
|
## list of plans, classified by group
|
|
|
|
$scope.plansClassifiedByGroup = []
|
|
|
|
for group in groupsPromise
|
|
|
|
groupObj = { id: group.id, name: group.name, plans: [] }
|
|
|
|
for plan in plansPromise
|
|
|
|
groupObj.plans.push(plan) if plan.group_id == group.id
|
|
|
|
$scope.plansClassifiedByGroup.push(groupObj)
|
|
|
|
|
|
|
|
## user to deal with
|
|
|
|
$scope.ctrl =
|
|
|
|
member: null
|
|
|
|
member_id: null
|
|
|
|
|
|
|
|
## already subscribed plan of the current user
|
|
|
|
$scope.paidPlan = null
|
|
|
|
|
|
|
|
## plan to subscribe (shopping cart)
|
|
|
|
$scope.selectedPlan = null
|
|
|
|
|
2016-06-16 14:26:10 +02:00
|
|
|
## text that appears in the bottom-right box of the page (subscriptions rules details)
|
2016-03-23 18:39:41 +01:00
|
|
|
$scope.subscriptionExplicationsAlert = subscriptionExplicationsPromise.setting.value
|
|
|
|
|
|
|
|
##
|
|
|
|
# Callback to deal with the subscription of the user selected in the dropdown list instead of the current user's
|
|
|
|
# subscription. (admins only)
|
|
|
|
##
|
|
|
|
$scope.updateMember = ->
|
|
|
|
$scope.selectedPlan = null
|
|
|
|
$scope.paidPlan = null
|
2016-04-11 19:26:40 +02:00
|
|
|
$scope.group.change = false
|
2016-06-14 09:57:39 +02:00
|
|
|
Member.get {id: $scope.ctrl.member.id}, (member) ->
|
|
|
|
$scope.ctrl.member = member
|
|
|
|
$scope.group.id = $scope.ctrl.member.group_id
|
|
|
|
|
2016-03-23 18:39:41 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
##
|
|
|
|
# Add the provided plan to the shopping basket
|
|
|
|
# @param plan {Object} The plan to subscribe to
|
|
|
|
##
|
|
|
|
$scope.selectPlan = (plan) ->
|
|
|
|
if $scope.isAuthenticated()
|
|
|
|
if $scope.selectedPlan != plan
|
|
|
|
$scope.selectedPlan = plan
|
|
|
|
else
|
|
|
|
$scope.selectedPlan = null
|
|
|
|
else
|
|
|
|
$scope.login()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
##
|
|
|
|
# Callback to trigger the payment process of the subscription
|
|
|
|
##
|
|
|
|
$scope.openSubscribePlanModal = ->
|
2016-07-08 17:24:51 +02:00
|
|
|
Wallet.getWalletByUser {user_id: $scope.ctrl.member.id}, (wallet) ->
|
|
|
|
amountToPay = helpers.getAmountToPay($scope.selectedPlan.amount, wallet.amount)
|
|
|
|
if $scope.currentUser.role isnt 'admin' and amountToPay > 0
|
|
|
|
payByStripe()
|
|
|
|
else
|
|
|
|
if $scope.currentUser.role is 'admin' or amountToPay is 0
|
|
|
|
payOnSite()
|
2016-03-23 18:39:41 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
##
|
2016-04-11 19:26:40 +02:00
|
|
|
# Return the group object, identified by the ID set in $scope.group.id
|
2016-03-23 18:39:41 +01:00
|
|
|
##
|
|
|
|
$scope.getUserGroup = ->
|
|
|
|
for group in $scope.groups
|
2016-04-11 19:26:40 +02:00
|
|
|
if group.id == $scope.group.id
|
2016-03-23 18:39:41 +01:00
|
|
|
return group
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
##
|
2016-04-11 19:26:40 +02:00
|
|
|
# Change the group of the current/selected user to the one set in $scope.group.id
|
2016-03-23 18:39:41 +01:00
|
|
|
##
|
|
|
|
$scope.selectGroup = ->
|
2016-04-11 19:26:40 +02:00
|
|
|
Member.update {id: $scope.ctrl.member.id}, {user: {group_id: $scope.group.id}}, (user) ->
|
2016-03-23 18:39:41 +01:00
|
|
|
$scope.ctrl.member = user
|
2016-04-11 19:26:40 +02:00
|
|
|
$scope.group.change = false
|
2016-03-23 18:39:41 +01:00
|
|
|
if $scope.currentUser.role isnt 'admin'
|
2016-04-11 19:26:40 +02:00
|
|
|
$rootScope.currentUser = user
|
2016-04-12 10:10:16 +02:00
|
|
|
Auth._currentUser.group_id = user.group_id
|
2016-03-23 18:39:41 +01:00
|
|
|
growl.success(_t('your_group_was_successfully_changed'))
|
|
|
|
else
|
|
|
|
growl.success(_t('the_user_s_group_was_successfully_changed'))
|
|
|
|
, (err) ->
|
|
|
|
if $scope.currentUser.role isnt 'admin'
|
|
|
|
growl.error(_t('an_error_prevented_your_group_from_being_changed'))
|
|
|
|
else
|
|
|
|
growl.error(_t('an_error_prevented_to_change_the_user_s_group'))
|
|
|
|
console.error(err)
|
|
|
|
|
|
|
|
|
|
|
|
##
|
|
|
|
# Return an enumerable meaninful string for the gender of the provider user
|
|
|
|
# @param user {Object} Database user record
|
|
|
|
# @return {string} 'male' or 'female'
|
|
|
|
##
|
|
|
|
$scope.getGender = (user) ->
|
2016-04-12 10:10:16 +02:00
|
|
|
if user and user.profile
|
2016-03-23 18:39:41 +01:00
|
|
|
if user.profile.gender == "true" then 'male' else 'female'
|
|
|
|
else 'other'
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-06-14 09:57:39 +02:00
|
|
|
##
|
|
|
|
# Test if the provided date is in the future
|
|
|
|
# @param dateTime {Date}
|
|
|
|
# @return {boolean}
|
|
|
|
##
|
|
|
|
$scope.isInFuture = (dateTime)->
|
|
|
|
if moment().diff(moment(dateTime)) < 0
|
|
|
|
true
|
|
|
|
else
|
|
|
|
false
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-03-23 18:39:41 +01:00
|
|
|
### PRIVATE SCOPE ###
|
|
|
|
|
|
|
|
##
|
|
|
|
# Kind of constructor: these actions will be realized first when the controller is loaded
|
|
|
|
##
|
|
|
|
initialize = ->
|
|
|
|
if $scope.currentUser
|
|
|
|
if $scope.currentUser.role isnt 'admin'
|
|
|
|
$scope.ctrl.member = $scope.currentUser
|
|
|
|
$scope.paidPlan = $scope.currentUser.subscribed_plan
|
2016-04-11 19:26:40 +02:00
|
|
|
$scope.group.id = $scope.currentUser.group_id
|
2016-03-23 18:39:41 +01:00
|
|
|
|
|
|
|
$scope.$on 'devise:new-session', (event, user)->
|
|
|
|
$scope.ctrl.member = user
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
##
|
|
|
|
# Open a modal window which trigger the stripe payment process
|
|
|
|
##
|
|
|
|
payByStripe = ->
|
|
|
|
$uibModal.open
|
|
|
|
templateUrl: '<%= asset_path "stripe/payment_modal.html" %>'
|
|
|
|
size: 'md'
|
|
|
|
resolve:
|
|
|
|
selectedPlan: -> $scope.selectedPlan
|
|
|
|
member: -> $scope.ctrl.member
|
2016-07-08 17:24:51 +02:00
|
|
|
wallet: ->
|
|
|
|
Wallet.getWalletByUser({user_id: $scope.ctrl.member.id}).$promise
|
2016-07-19 16:24:50 +02:00
|
|
|
controller: ['$scope', '$uibModalInstance', '$state', 'selectedPlan', 'member', 'Subscription', 'CustomAsset', 'wallet', 'helpers', '$locale', '$filter', ($scope, $uibModalInstance, $state, selectedPlan, member, Subscription, CustomAsset, wallet, helpers, $locale, $filter) ->
|
2016-07-08 17:24:51 +02:00
|
|
|
# user wallet amount
|
|
|
|
$scope.walletAmount = wallet.amount
|
|
|
|
|
|
|
|
$scope.amount = helpers.getAmountToPay(selectedPlan.amount, wallet.amount)
|
|
|
|
|
2016-03-23 18:39:41 +01:00
|
|
|
$scope.selectedPlan = selectedPlan
|
2016-07-08 17:24:51 +02:00
|
|
|
|
|
|
|
$scope.currencySymbol = $locale.NUMBER_FORMATS.CURRENCY_SYM
|
2016-07-19 16:24:50 +02:00
|
|
|
|
|
|
|
$scope.numberFilter = $filter('number')
|
|
|
|
|
2016-03-23 18:39:41 +01:00
|
|
|
# retrieve the CGV
|
|
|
|
CustomAsset.get {name: 'cgv-file'}, (cgv) ->
|
|
|
|
$scope.cgv = cgv.custom_asset
|
|
|
|
$scope.payment = (status, response) ->
|
|
|
|
if response.error
|
|
|
|
growl.error(response.error.message)
|
|
|
|
else
|
|
|
|
$scope.attempting = true
|
|
|
|
Subscription.save
|
|
|
|
subscription:
|
|
|
|
plan_id: selectedPlan.id
|
|
|
|
user_id: member.id
|
|
|
|
card_token: response.id
|
|
|
|
, (data, status) -> # success
|
|
|
|
$uibModalInstance.close(data)
|
|
|
|
, (data, status) -> # failed
|
|
|
|
$scope.alerts = []
|
|
|
|
$scope.alerts.push({msg: _t('an_error_occured_during_the_payment_process_please_try_again_later'), type: 'danger' })
|
|
|
|
$scope.attempting = false
|
|
|
|
]
|
|
|
|
.result['finally'](null).then (subscription)->
|
|
|
|
$scope.ctrl.member.subscribed_plan = angular.copy($scope.selectedPlan)
|
|
|
|
Auth._currentUser.subscribed_plan = angular.copy($scope.selectedPlan)
|
|
|
|
$scope.paidPlan = angular.copy($scope.selectedPlan)
|
|
|
|
$scope.selectedPlan = null
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
##
|
|
|
|
# Open a modal window which trigger the local payment process
|
|
|
|
##
|
|
|
|
payOnSite = ->
|
|
|
|
$uibModal.open
|
|
|
|
templateUrl: '<%= asset_path "plans/payment_modal.html" %>'
|
|
|
|
size: 'sm'
|
|
|
|
resolve:
|
|
|
|
selectedPlan: -> $scope.selectedPlan
|
|
|
|
member: -> $scope.ctrl.member
|
2016-07-08 17:24:51 +02:00
|
|
|
wallet: ->
|
|
|
|
Wallet.getWalletByUser({user_id: $scope.ctrl.member.id}).$promise
|
|
|
|
controller: ['$scope', '$uibModalInstance', '$state', 'selectedPlan', 'member', 'Subscription', 'wallet', 'helpers', '$locale', '$filter', ($scope, $uibModalInstance, $state, selectedPlan, member, Subscription, wallet, helpers, $locale, $filter) ->
|
|
|
|
# user wallet amount
|
|
|
|
$scope.walletAmount = wallet.amount
|
|
|
|
|
|
|
|
$scope.price = selectedPlan.amount
|
|
|
|
|
|
|
|
# price to pay
|
|
|
|
$scope.amount = helpers.getAmountToPay($scope.price, wallet.amount)
|
|
|
|
|
|
|
|
$scope.currencySymbol = $locale.NUMBER_FORMATS.CURRENCY_SYM
|
|
|
|
|
2016-07-19 16:24:50 +02:00
|
|
|
$scope.numberFilter = $filter('number')
|
|
|
|
|
2016-03-23 18:39:41 +01:00
|
|
|
$scope.plan = selectedPlan
|
|
|
|
$scope.member = member
|
2016-07-08 17:24:51 +02:00
|
|
|
|
|
|
|
# Button label
|
|
|
|
if $scope.amount > 0
|
2016-07-25 12:10:10 +02:00
|
|
|
$scope.validButtonName = _t('confirm_payment_of_html', {ROLE:$scope.currentUser.role, AMOUNT:$filter('currency')($scope.amount)}, "messageformat")
|
2016-07-08 17:24:51 +02:00
|
|
|
else
|
2016-07-21 15:32:49 +02:00
|
|
|
if price.price > 0 and $scope.walletAmount == 0
|
2016-07-25 12:10:10 +02:00
|
|
|
$scope.validButtonName = _t('confirm_payment_of_html', {ROLE:$scope.currentUser.role, AMOUNT:$filter('currency')(price.price)}, "messageformat")
|
2016-07-08 17:24:51 +02:00
|
|
|
else
|
|
|
|
$scope.validButtonName = _t('confirm')
|
|
|
|
|
2016-03-23 18:39:41 +01:00
|
|
|
$scope.ok = ->
|
|
|
|
$scope.attempting = true
|
|
|
|
Subscription.save
|
|
|
|
subscription:
|
|
|
|
plan_id: selectedPlan.id
|
|
|
|
user_id: member.id
|
|
|
|
, (data, status) -> # success
|
|
|
|
$uibModalInstance.close(data)
|
|
|
|
, (data, status) -> # failed
|
|
|
|
$scope.alerts = []
|
|
|
|
$scope.alerts.push({msg: _t('an_error_occured_during_the_payment_process_please_try_again_later'), type: 'danger' })
|
|
|
|
$scope.attempting = false
|
|
|
|
|
|
|
|
$scope.cancel = ->
|
|
|
|
$uibModalInstance.dismiss('cancel')
|
|
|
|
]
|
|
|
|
.result['finally'](null).then (reservation)->
|
|
|
|
$scope.ctrl.member.subscribed_plan = angular.copy($scope.selectedPlan)
|
|
|
|
Auth._currentUser.subscribed_plan = angular.copy($scope.selectedPlan)
|
|
|
|
index = $scope.members.indexOf($scope.ctrl.member)
|
|
|
|
$scope.members.splice(index, 1)
|
|
|
|
$scope.ctrl.member = null
|
|
|
|
$scope.paidPlan = angular.copy($scope.selectedPlan)
|
|
|
|
$scope.selectedPlan = null
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## !!! MUST BE CALLED AT THE END of the controller
|
|
|
|
initialize()
|
|
|
|
]
|