-
Notifications
You must be signed in to change notification settings - Fork 57
/
Copy pathvirtuo.js
139 lines (123 loc) · 3.1 KB
/
virtuo.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/*eslint-disable space-unary-ops*/
'use strict';
const VIRTUO = (() => { //eslint-disable-line
const DEDUCTIBLE_PER_DAY = 4;
const PERCENT_COMMISSION = 0.3;
const PERCENT_INSURANCE = 0.5;
const TREASURY_TAX_DAY = 1;
const MS_PER_DAY = 1000 * 60 * 60 * 24;
/**
* Get car information
*
* @return {Object}
*/
const getCar = () => {
return {
'name': document.querySelector('#car .js-name').value,
'pricePerDay': document.querySelector('#car .js-price-by-day').value,
'pricePerKm': document.querySelector('#car .js-price-by-km').value
};
};
/**
* Number of rental days from begin and end date
*
* @param {Date} begin
* @param {Date} end
* @return {Integer}
*/
var getDays = (begin, end) => {
const beginMs = new Date(begin).getTime();
const endMs = new Date(end).getTime();
return Math.floor(Math.abs(endMs - beginMs) / MS_PER_DAY) + 1;
};
/**
* Get discount percent according rental days
*
* @param {Number} days
* @return {Number}
*/
const discount = days => {
if (days > 10) {
return 0.5;
}
if (days > 4) {
return 0.7;
}
if (days > 1) {
return 0.9;
}
return 1;
};
/**
* Compute rental commission
*
* @param {Number} price
* @param {Number} days
* @return {Object}
*/
const rentalCommission = (price, days) => {
const value = parseFloat((price * PERCENT_COMMISSION).toFixed(2));
const insurance = parseFloat((value * PERCENT_INSURANCE).toFixed(2));
const treasury = days * TREASURY_TAX_DAY;
return {
insurance,
treasury,
value,
'virtuo': parseFloat((value - insurance - treasury).toFixed(2))
};
};
/**
* Compute the rental price
*
* @param {Object} car
* @param {Number} days
* @param {Number} distance
* @return {Number} price
*/
const rentalPrice = (car, days, distance) => {
const percent = discount(days);
const pricePerDay = car.pricePerDay * percent;
return parseFloat((days * pricePerDay + distance * car.pricePerKm).toFixed(2));
};
/**
* Pay each actors
*
* @param {Object} car
* @param {String} distance
* @param {String} volume
* @param {Boolean} option
* @return {Object}
*/
const payActors = (car, begin, end, distance, option) => {
const days = getDays(begin, end);
const price = rentalPrice(car, days, distance);
const commission = rentalCommission(price, days);
const deductibleOption = DEDUCTIBLE_PER_DAY * days * +option;
var actors = [{
'who': 'driver',
'type': 'debit',
'amount': price + deductibleOption
}, {
'who': 'partner',
'type': 'credit',
'amount': price - commission.value
}, {
'who': 'insurance',
'type': 'credit',
'amount': commission.insurance
}, {
'who': 'treasury',
'type': 'credit',
'amount': commission.treasury
}, {
'who': 'virtuo',
'type': 'credit',
'amount': commission.virtuo + deductibleOption
}];
return actors;
};
return {
'getCar': getCar,
'payActors': payActors
};
})();