mirror of
https://github.com/LaCasemate/fab-manager.git
synced 2025-02-26 20:54:21 +01:00
compute price including coupon discount
This commit is contained in:
parent
2f2099b723
commit
a679bc1638
@ -268,8 +268,8 @@ Application.Controllers.controller "ShowMachineController", ['$scope', '$state',
|
|||||||
# This controller workflow is pretty similar to the trainings reservation controller.
|
# This controller workflow is pretty similar to the trainings reservation controller.
|
||||||
##
|
##
|
||||||
|
|
||||||
Application.Controllers.controller "ReserveMachineController", ["$scope", "$state", '$stateParams', "$uibModal", '_t', "moment", 'Machine', 'Auth', 'dialogs', '$timeout', 'Price', 'Member', 'Availability', 'Slot', 'Setting', 'CustomAsset', 'plansPromise', 'groupsPromise', 'growl', 'settingsPromise', 'Wallet', 'helpers', 'uiCalendarConfig', 'CalendarConfig',
|
Application.Controllers.controller "ReserveMachineController", ["$scope", "$state", '$stateParams', "$uibModal", '_t', "moment", 'Machine', 'Auth', 'dialogs', '$timeout', 'Price', 'Member', 'Availability', 'Slot', 'Setting', 'CustomAsset', 'plansPromise', 'groupsPromise', 'growl', 'machinePromise', 'settingsPromise', 'Wallet', 'helpers', 'uiCalendarConfig', 'CalendarConfig',
|
||||||
($scope, $state, $stateParams, $uibModal, _t, moment, Machine, Auth, dialogs, $timeout, Price, Member, Availability, Slot, Setting, CustomAsset, plansPromise, groupsPromise, growl, settingsPromise, Wallet, helpers, uiCalendarConfig, CalendarConfig) ->
|
($scope, $state, $stateParams, $uibModal, _t, moment, Machine, Auth, dialogs, $timeout, Price, Member, Availability, Slot, Setting, CustomAsset, plansPromise, groupsPromise, growl, machinePromise, settingsPromise, Wallet, helpers, uiCalendarConfig, CalendarConfig) ->
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -309,6 +309,10 @@ Application.Controllers.controller "ReserveMachineController", ["$scope", "$stat
|
|||||||
## total amount of the bill to pay
|
## total amount of the bill to pay
|
||||||
$scope.amountTotal = 0
|
$scope.amountTotal = 0
|
||||||
|
|
||||||
|
## Discount coupon to apply to the basket, if any
|
||||||
|
$scope.coupon =
|
||||||
|
applied: null
|
||||||
|
|
||||||
## is the user allowed to change the date of his booking
|
## is the user allowed to change the date of his booking
|
||||||
$scope.enableBookingMove = true
|
$scope.enableBookingMove = true
|
||||||
|
|
||||||
@ -328,7 +332,7 @@ Application.Controllers.controller "ReserveMachineController", ["$scope", "$stat
|
|||||||
member: {}
|
member: {}
|
||||||
|
|
||||||
## current machine to reserve
|
## current machine to reserve
|
||||||
$scope.machine = {}
|
$scope.machine = machinePromise
|
||||||
|
|
||||||
## fullCalendar (v2) configuration
|
## fullCalendar (v2) configuration
|
||||||
$scope.calendarConfig = CalendarConfig
|
$scope.calendarConfig = CalendarConfig
|
||||||
@ -599,11 +603,10 @@ Application.Controllers.controller "ReserveMachineController", ["$scope", "$stat
|
|||||||
if $scope.currentUser.role isnt 'admin'
|
if $scope.currentUser.role isnt 'admin'
|
||||||
$scope.ctrl.member = $scope.currentUser
|
$scope.ctrl.member = $scope.currentUser
|
||||||
|
|
||||||
$scope.machine = Machine.get {id: $stateParams.id}
|
# watch when a coupon is applied to re-compute the total price
|
||||||
, ->
|
$scope.$watch 'coupon.applied', (newValue, oldValue) ->
|
||||||
return
|
unless newValue == null and oldValue == null
|
||||||
, ->
|
updateCartPrice()
|
||||||
$state.go('app.public.machines_list')
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -638,7 +641,10 @@ Application.Controllers.controller "ReserveMachineController", ["$scope", "$stat
|
|||||||
updateCartPrice = ->
|
updateCartPrice = ->
|
||||||
if Object.keys($scope.ctrl.member).length > 0
|
if Object.keys($scope.ctrl.member).length > 0
|
||||||
r = mkReservation($scope.ctrl.member, $scope.eventsReserved, $scope.selectedPlan)
|
r = mkReservation($scope.ctrl.member, $scope.eventsReserved, $scope.selectedPlan)
|
||||||
Price.compute {reservation: r}, (res) ->
|
params = {reservation: r}
|
||||||
|
if $scope.coupon.applied
|
||||||
|
params['coupon_id'] = $scope.coupon.applied.id
|
||||||
|
Price.compute params, (res) ->
|
||||||
$scope.amountTotal = res.price
|
$scope.amountTotal = res.price
|
||||||
setSlotsDetails(res.details)
|
setSlotsDetails(res.details)
|
||||||
else
|
else
|
||||||
|
@ -3,6 +3,7 @@ Application.Directives.directive 'coupon', [ 'Coupon', 'growl', '_t', (Coupon, g
|
|||||||
restrict: 'E'
|
restrict: 'E'
|
||||||
scope:
|
scope:
|
||||||
show: '='
|
show: '='
|
||||||
|
coupon: '='
|
||||||
templateUrl: '<%= asset_path "shared/_coupon.html" %>'
|
templateUrl: '<%= asset_path "shared/_coupon.html" %>'
|
||||||
link: ($scope, element, attributes) ->
|
link: ($scope, element, attributes) ->
|
||||||
|
|
||||||
@ -24,12 +25,15 @@ Application.Directives.directive 'coupon', [ 'Coupon', 'growl', '_t', (Coupon, g
|
|||||||
$scope.validateCode = ->
|
$scope.validateCode = ->
|
||||||
if $scope.couponCode == ''
|
if $scope.couponCode == ''
|
||||||
$scope.status = 'pending'
|
$scope.status = 'pending'
|
||||||
|
$scope.coupon = null
|
||||||
else
|
else
|
||||||
Coupon.validate {code: $scope.couponCode}, (res) ->
|
Coupon.validate {code: $scope.couponCode}, (res) ->
|
||||||
$scope.status = 'valid'
|
$scope.status = 'valid'
|
||||||
|
$scope.coupon = res
|
||||||
growl.success(_t('the_coupon_has_been_applied_you_get_PERCENT_discount', {PERCENT: res.percent_off}))
|
growl.success(_t('the_coupon_has_been_applied_you_get_PERCENT_discount', {PERCENT: res.percent_off}))
|
||||||
, (err) ->
|
, (err) ->
|
||||||
$scope.status = 'invalid'
|
$scope.status = 'invalid'
|
||||||
|
$scope.coupon = null
|
||||||
growl.error(_t('unable_to_apply_the_coupon_because_'+err.data.status))
|
growl.error(_t('unable_to_apply_the_coupon_because_'+err.data.status))
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -351,6 +351,9 @@ angular.module('application.router', ['ui.router']).
|
|||||||
groupsPromise: ['Group', (Group)->
|
groupsPromise: ['Group', (Group)->
|
||||||
Group.query().$promise
|
Group.query().$promise
|
||||||
]
|
]
|
||||||
|
machinePromise: ['Machine', '$stateParams', (Machine, $stateParams)->
|
||||||
|
Machine.get(id: $stateParams.id).$promise
|
||||||
|
]
|
||||||
settingsPromise: ['Setting', (Setting)->
|
settingsPromise: ['Setting', (Setting)->
|
||||||
Setting.query(names: "['machine_explications_alert',
|
Setting.query(names: "['machine_explications_alert',
|
||||||
'booking_window_start',
|
'booking_window_start',
|
||||||
|
@ -78,7 +78,7 @@
|
|||||||
<div class="clear"><a class="pull-right m-b-sm text-u-l ng-scope m-r-sm" href="#" ng-click="removeMachineSlot(machineSlot, $event)" ng-if="machineSlot.isValid" translate>{{ 'remove_this_slot' }}</a></div>
|
<div class="clear"><a class="pull-right m-b-sm text-u-l ng-scope m-r-sm" href="#" ng-click="removeMachineSlot(machineSlot, $event)" ng-if="machineSlot.isValid" translate>{{ 'remove_this_slot' }}</a></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<coupon show="machineSlotsValid() && (!plansAreShown || selectedPlan)"></coupon>
|
<coupon show="machineSlotsValid() && (!plansAreShown || selectedPlan)" coupon="coupon.applied" callback="setCouponCb()"></coupon>
|
||||||
|
|
||||||
<span ng-hide="fablabWithoutPlans">
|
<span ng-hide="fablabWithoutPlans">
|
||||||
<div ng-if="machineSlotsValid() && !ctrl.member.subscribed_plan" ng-show="!plansAreShown">
|
<div ng-if="machineSlotsValid() && !ctrl.member.subscribed_plan" ng-show="!plansAreShown">
|
||||||
|
@ -44,7 +44,7 @@ class API::PricesController < API::ApiController
|
|||||||
@amount = {elements: nil, total: 0}
|
@amount = {elements: nil, total: 0}
|
||||||
else
|
else
|
||||||
_reservable = _price_params[:reservable_type].constantize.find(_price_params[:reservable_id])
|
_reservable = _price_params[:reservable_type].constantize.find(_price_params[:reservable_id])
|
||||||
@amount = Price.compute(current_user.is_admin?, _user, _reservable, _price_params[:slots_attributes], _price_params[:plan_id], _price_params[:nb_reserve_places], _price_params[:nb_reserve_reduced_places])
|
@amount = Price.compute(current_user.is_admin?, _user, _reservable, _price_params[:slots_attributes], _price_params[:plan_id], _price_params[:nb_reserve_places], _price_params[:nb_reserve_reduced_places], coupon_params[:coupon_id])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
@ -64,4 +64,8 @@ class API::PricesController < API::ApiController
|
|||||||
params.require(:reservation).permit(:reservable_id, :reservable_type, :plan_id, :user_id, :nb_reserve_places, :nb_reserve_reduced_places,
|
params.require(:reservation).permit(:reservable_id, :reservable_type, :plan_id, :user_id, :nb_reserve_places, :nb_reserve_reduced_places,
|
||||||
slots_attributes: [:id, :start_at, :end_at, :availability_id, :offered])
|
slots_attributes: [:id, :start_at, :end_at, :availability_id, :offered])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def coupon_params
|
||||||
|
params.permit(:coupon_id)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
@ -14,9 +14,10 @@ class Price < ActiveRecord::Base
|
|||||||
# @param [plan_id] {Number} if the user is subscribing to a plan at the same time of his reservation, specify the plan's ID here
|
# @param [plan_id] {Number} if the user is subscribing to a plan at the same time of his reservation, specify the plan's ID here
|
||||||
# @param [nb_places] {Number} for _reservable_ of type Event, pass here the number of booked places
|
# @param [nb_places] {Number} for _reservable_ of type Event, pass here the number of booked places
|
||||||
# @param [nb_reduced_places] {Number} for _reservable_ of type Event, pass here the number of booked places at reduced price
|
# @param [nb_reduced_places] {Number} for _reservable_ of type Event, pass here the number of booked places at reduced price
|
||||||
|
# @param [coupon_id] {Number} ID of the coupon to apply to the total price
|
||||||
# @return {Hash} total and price detail
|
# @return {Hash} total and price detail
|
||||||
##
|
##
|
||||||
def self.compute(admin, user, reservable, slots, plan_id = nil, nb_places = nil, nb_reduced_places = nil)
|
def self.compute(admin, user, reservable, slots, plan_id = nil, nb_places = nil, nb_reduced_places = nil, coupon_id = nil)
|
||||||
_amount = 0
|
_amount = 0
|
||||||
_elements = Hash.new
|
_elements = Hash.new
|
||||||
_elements[:slots] = Array.new
|
_elements[:slots] = Array.new
|
||||||
@ -110,6 +111,12 @@ class Price < ActiveRecord::Base
|
|||||||
_amount += plan.amount
|
_amount += plan.amount
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# === apply Coupon if any ===
|
||||||
|
unless coupon_id.nil?
|
||||||
|
_coupon = Coupon.find(coupon_id)
|
||||||
|
_amount = _amount - (_amount * _coupon.percent_off / 100)
|
||||||
|
end
|
||||||
|
|
||||||
# return result
|
# return result
|
||||||
{elements: _elements, total: _amount}
|
{elements: _elements, total: _amount}
|
||||||
end
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user