Skip to content

Commit 47e0147

Browse files
committed
Merge branch 'tom-120-cancel'
2 parents c476af3 + c5a4eeb commit 47e0147

19 files changed

+750
-83
lines changed

lib/email.js

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,5 +397,63 @@ Email.prototype.promise_reset_password_email = function(args){
397397
});
398398
};
399399

400+
Email.prototype.promise_leave_request_cancel_emails = function(args){
401+
var self = this,
402+
leave = args.leave,
403+
send_mail = self.get_send_email();
404+
405+
var promise_email_to_supervisor = self.promise_rendered_email_template({
406+
template_name : 'leave_request_cancel_to_supervisor',
407+
context : {
408+
leave : leave,
409+
approver : leave.get('approver'),
410+
requester : leave.get('user'),
411+
user : leave.get('approver'),
412+
}
413+
})
414+
.then(function(email_obj){
415+
416+
return send_mail({
417+
from : config.get('application_sender_email'),
418+
to : leave.get('approver').email,
419+
subject : email_obj.subject,
420+
html : email_obj.body,
421+
})
422+
.then(function(send_result){
423+
return leave.get('approver').record_email_addressed_to_me(email_obj)
424+
.then(function(){ return bluebird.resolve( send_result ); });
425+
});
426+
});
427+
428+
var promise_email_to_requestor = self.promise_rendered_email_template({
429+
template_name : 'leave_request_cancel_to_requestor',
430+
context : {
431+
leave : leave,
432+
approver : leave.get('approver'),
433+
requester : leave.get('user'),
434+
user : leave.get('user'),
435+
}
436+
})
437+
.then(function(email_obj){
438+
439+
return send_mail({
440+
from : config.get('application_sender_email'),
441+
to : leave.get('user').email,
442+
subject : email_obj.subject,
443+
html : email_obj.body,
444+
})
445+
.then(function(send_result){
446+
return leave.get('user').record_email_addressed_to_me(email_obj)
447+
.then(function(){ return bluebird.resolve( send_result ); });
448+
});
449+
});
450+
451+
return bluebird.join(
452+
promise_email_to_supervisor, promise_email_to_requestor,
453+
function(){
454+
return bluebird.resolve();
455+
}
456+
);
457+
};
400458

401459
module.exports = Email;

lib/model/db/leave.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,10 @@ module.exports = function(sequelize, DataTypes) {
8383
return 4;
8484
},
8585

86+
status_canceled : function() {
87+
return 5;
88+
},
89+
8690

8791
leave_day_part_all : function(){
8892
return 1;
@@ -381,6 +385,18 @@ promise_to_revoke : function(){
381385
})
382386
},
383387

388+
promise_to_cancel : function(){
389+
var self = this;
390+
391+
if ( ! self.is_new_leave() ) {
392+
throw new Error('An attempt to cancel non-new leave request id : '+self.id);
393+
}
394+
395+
self.status = Leave.status_canceled();
396+
397+
return self.save();
398+
},
399+
384400
get_leave_type_name : function() {
385401
var leave_type = this.get('leave_type');
386402

@@ -405,6 +421,7 @@ promise_approver : function() {
405421
})
406422
},
407423

424+
408425
},
409426
});
410427

lib/model/mixin/user/absence_aware.js

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,10 @@ module.exports = function(sequelize){
134134

135135
return this_user.getMy_leaves({
136136
where : {
137-
status : { $ne : sequelize.models.Leave.status_rejected()},
137+
$and : [
138+
{ status : { $ne : sequelize.models.Leave.status_rejected() } },
139+
{ status : { $ne : sequelize.models.Leave.status_canceled() } },
140+
],
138141

139142
$or : {
140143
date_start : days_filter,
@@ -309,6 +312,23 @@ module.exports = function(sequelize){
309312
});
310313
}; // END of promise_leaves_to_be_processed
311314

315+
this.promise_cancelable_leaves = function(){
316+
var self = this;
317+
318+
return self.promise_my_leaves({
319+
ignore_year : true,
320+
filter_status : [ sequelize.models.Leave.status_new() ],
321+
})
322+
.then(function(leaves){
323+
return Promise.map(leaves, function(leave){
324+
return leave.user.promise_schedule_I_obey();
325+
},{
326+
concurrency : 10,
327+
})
328+
.then(function(){ return Promise.resolve(leaves) });
329+
});
330+
};
331+
312332

313333
this.calculate_number_of_days_taken_from_allowance = function(args){
314334
var self = this,

lib/route/requests.js

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,60 @@ router.post(
119119
})
120120
);
121121

122+
router.post('/cancel/', function(req, res){
123+
124+
var request_id = validator.trim( req.param('request') );
125+
126+
Promise.try(function(){
127+
return req.user.promise_cancelable_leaves()
128+
})
129+
.then(function(leaves){
130+
var leave_to_cancel = _.find(leaves, function(leave){
131+
return String(leave.id) === String(request_id);
132+
});
133+
134+
if ( ! leave_to_cancel ) {
135+
throw new Error('Given leave request is not amoung those current user can cancel');
136+
}
137+
138+
return Promise.resolve(leave_to_cancel);
139+
})
140+
.then(function(leave){
141+
return leave.promise_to_cancel()
142+
.then(function(){ return Promise.resolve(leave)});
143+
})
144+
.then(function(leave){
145+
return leave.reload({
146+
include : [
147+
{model : req.app.get('db_model').User, as : 'user'},
148+
{model : req.app.get('db_model').User, as : 'approver'},
149+
{model : req.app.get('db_model').LeaveType, as : 'leave_type' },
150+
],
151+
});
152+
})
153+
.then(function(leave){
154+
155+
var Email = new EmailTransport();
156+
157+
return Email.promise_leave_request_cancel_emails({
158+
leave : leave,
159+
})
160+
.then(function(){
161+
return Promise.resolve(leave);
162+
});
163+
})
164+
.then(function(leave){
165+
req.session.flash_message('The leave request was canceled');
166+
})
167+
.catch(function(error){
168+
console.log('An error occurred: '+error);
169+
req.session.flash_error('Failed to cancel leave request');
170+
})
171+
.finally(function(){
172+
return res.redirect_with_session('/requests/');
173+
});
174+
});
175+
122176
router.post(
123177
'/revoke/',
124178
function(req, res){

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "TimeOff.Management",
3-
"version": "0.4.4",
3+
"version": "0.5.0",
44
"private": false,
55
"description": "Simple yet powerful absence management software for small and medium size business",
66
"dependencies": {

t/integration/basic_leave_request.js renamed to t/integration/leave_request/basic_leave_request.js

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,22 @@
22
'use strict';
33

44
var test = require('selenium-webdriver/testing'),
5-
config = require('../lib/config'),
5+
config = require('../../lib/config'),
66
application_host = config.get_application_host(),
77
By = require('selenium-webdriver').By,
88
expect = require('chai').expect,
99
_ = require('underscore'),
1010
Promise = require("bluebird"),
1111
moment = require('moment'),
1212
until = require('selenium-webdriver').until,
13-
login_user_func = require('../lib/login_with_user'),
14-
register_new_user_func = require('../lib/register_new_user'),
15-
logout_user_func = require('../lib/logout_user'),
16-
open_page_func = require('../lib/open_page'),
17-
submit_form_func = require('../lib/submit_form'),
18-
check_elements_func = require('../lib/check_elements'),
19-
check_booking_func = require('../lib/check_booking_on_calendar'),
20-
add_new_user_func = require('../lib/add_new_user');
13+
login_user_func = require('../../lib/login_with_user'),
14+
register_new_user_func = require('../../lib/register_new_user'),
15+
logout_user_func = require('../../lib/logout_user'),
16+
open_page_func = require('../../lib/open_page'),
17+
submit_form_func = require('../../lib/submit_form'),
18+
check_elements_func = require('../../lib/check_elements'),
19+
check_booking_func = require('../../lib/check_booking_on_calendar'),
20+
add_new_user_func = require('../../lib/add_new_user');
2121

2222

2323
/*

t/integration/book_leave_request_form.js renamed to t/integration/leave_request/book_leave_request_form.js

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,22 @@
22
'use strict';
33

44
var test = require('selenium-webdriver/testing'),
5-
config = require('../lib/config'),
5+
config = require('../../lib/config'),
66
application_host = config.get_application_host(),
77
By = require('selenium-webdriver').By,
88
expect = require('chai').expect,
99
_ = require('underscore'),
1010
Promise = require("bluebird"),
1111
moment = require('moment'),
1212
until = require('selenium-webdriver').until,
13-
login_user_func = require('../lib/login_with_user'),
14-
register_new_user_func = require('../lib/register_new_user'),
15-
logout_user_func = require('../lib/logout_user'),
16-
open_page_func = require('../lib/open_page'),
17-
submit_form_func = require('../lib/submit_form'),
18-
check_elements_func = require('../lib/check_elements'),
19-
check_booking_func = require('../lib/check_booking_on_calendar'),
20-
add_new_user_func = require('../lib/add_new_user');
13+
login_user_func = require('../../lib/login_with_user'),
14+
register_new_user_func = require('../../lib/register_new_user'),
15+
logout_user_func = require('../../lib/logout_user'),
16+
open_page_func = require('../../lib/open_page'),
17+
submit_form_func = require('../../lib/submit_form'),
18+
check_elements_func = require('../../lib/check_elements'),
19+
check_booking_func = require('../../lib/check_booking_on_calendar'),
20+
add_new_user_func = require('../../lib/add_new_user');
2121

2222
describe("Check the client side logic to facilitate filling new absence form", function(){
2323

0 commit comments

Comments
 (0)