summaryrefslogtreecommitdiff
path: root/addons/hr_attendance/static/src/js/greeting_message.js
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/hr_attendance/static/src/js/greeting_message.js
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/hr_attendance/static/src/js/greeting_message.js')
-rw-r--r--addons/hr_attendance/static/src/js/greeting_message.js182
1 files changed, 182 insertions, 0 deletions
diff --git a/addons/hr_attendance/static/src/js/greeting_message.js b/addons/hr_attendance/static/src/js/greeting_message.js
new file mode 100644
index 00000000..101f6dae
--- /dev/null
+++ b/addons/hr_attendance/static/src/js/greeting_message.js
@@ -0,0 +1,182 @@
+odoo.define('hr_attendance.greeting_message', function (require) {
+"use strict";
+
+var AbstractAction = require('web.AbstractAction');
+var core = require('web.core');
+var time = require('web.time');
+
+var _t = core._t;
+
+
+var GreetingMessage = AbstractAction.extend({
+ contentTemplate: 'HrAttendanceGreetingMessage',
+
+ events: {
+ "click .o_hr_attendance_button_dismiss": function() { this.do_action(this.next_action, {clear_breadcrumbs: true}); },
+ },
+
+ init: function(parent, action) {
+ var self = this;
+ this._super.apply(this, arguments);
+ this.activeBarcode = true;
+
+ // if no correct action given (due to an erroneous back or refresh from the browser), we set the dismiss button to return
+ // to the (likely) appropriate menu, according to the user access rights
+ if(!action.attendance) {
+ this.activeBarcode = false;
+ this.getSession().user_has_group('hr_attendance.group_hr_attendance_user').then(function(has_group) {
+ if(has_group) {
+ self.next_action = 'hr_attendance.hr_attendance_action_kiosk_mode';
+ } else {
+ self.next_action = 'hr_attendance.hr_attendance_action_my_attendances';
+ }
+ });
+ return;
+ }
+
+ this.next_action = action.next_action || 'hr_attendance.hr_attendance_action_my_attendances';
+ // no listening to barcode scans if we aren't coming from the kiosk mode (and thus not going back to it with next_action)
+ if (this.next_action != 'hr_attendance.hr_attendance_action_kiosk_mode' && this.next_action.tag != 'hr_attendance_kiosk_mode') {
+ this.activeBarcode = false;
+ }
+
+ this.attendance = action.attendance;
+ // We receive the check in/out times in UTC
+ // This widget only deals with display, which should be in browser's TimeZone
+ this.attendance.check_in = this.attendance.check_in && moment.utc(this.attendance.check_in).local();
+ this.attendance.check_out = this.attendance.check_out && moment.utc(this.attendance.check_out).local();
+ this.previous_attendance_change_date = action.previous_attendance_change_date && moment.utc(action.previous_attendance_change_date).local();
+
+ // check in/out times displayed in the greeting message template.
+ this.format_time = time.getLangTimeFormat();
+ this.attendance.check_in_time = this.attendance.check_in && this.attendance.check_in.format(this.format_time);
+ this.attendance.check_out_time = this.attendance.check_out && this.attendance.check_out.format(this.format_time);
+
+ if (action.hours_today) {
+ var duration = moment.duration(action.hours_today, "hours");
+ this.hours_today = duration.hours() + ' hours, ' + duration.minutes() + ' minutes';
+ }
+
+ this.employee_name = action.employee_name;
+ this.attendanceBarcode = action.barcode;
+ },
+
+ start: function() {
+ if (this.attendance) {
+ this.attendance.check_out ? this.farewell_message() : this.welcome_message();
+ }
+ if (this.activeBarcode) {
+ core.bus.on('barcode_scanned', this, this._onBarcodeScanned);
+ }
+ return this._super.apply(this, arguments);
+ },
+
+ welcome_message: function() {
+ var self = this;
+ var now = this.attendance.check_in.clone();
+ this.return_to_main_menu = setTimeout( function() { self.do_action(self.next_action, {clear_breadcrumbs: true}); }, 5000);
+
+ if (now.hours() < 5) {
+ this.$('.o_hr_attendance_message_message').append(_t("Good night"));
+ } else if (now.hours() < 12) {
+ if (now.hours() < 8 && Math.random() < 0.3) {
+ if (Math.random() < 0.75) {
+ this.$('.o_hr_attendance_message_message').append(_t("The early bird catches the worm"));
+ } else {
+ this.$('.o_hr_attendance_message_message').append(_t("First come, first served"));
+ }
+ } else {
+ this.$('.o_hr_attendance_message_message').append(_t("Good morning"));
+ }
+ } else if (now.hours() < 17){
+ this.$('.o_hr_attendance_message_message').append(_t("Good afternoon"));
+ } else if (now.hours() < 23){
+ this.$('.o_hr_attendance_message_message').append(_t("Good evening"));
+ } else {
+ this.$('.o_hr_attendance_message_message').append(_t("Good night"));
+ }
+ if(this.previous_attendance_change_date){
+ var last_check_out_date = this.previous_attendance_change_date.clone();
+ if(now - last_check_out_date > 24*7*60*60*1000){
+ this.$('.o_hr_attendance_random_message').html(_t("Glad to have you back, it's been a while!"));
+ } else {
+ if(Math.random() < 0.02){
+ this.$('.o_hr_attendance_random_message').html(_t("If a job is worth doing, it is worth doing well!"));
+ }
+ }
+ }
+ },
+
+ farewell_message: function() {
+ var self = this;
+ var now = this.attendance.check_out.clone();
+ this.return_to_main_menu = setTimeout( function() { self.do_action(self.next_action, {clear_breadcrumbs: true}); }, 5000);
+
+ if(this.previous_attendance_change_date){
+ var last_check_in_date = this.previous_attendance_change_date.clone();
+ if(now - last_check_in_date > 1000*60*60*12){
+ this.$('.o_hr_attendance_warning_message').show().append(_t("<b>Warning! Last check in was over 12 hours ago.</b><br/>If this isn't right, please contact Human Resource staff"));
+ clearTimeout(this.return_to_main_menu);
+ this.activeBarcode = false;
+ } else if(now - last_check_in_date > 1000*60*60*8){
+ this.$('.o_hr_attendance_random_message').html(_t("Another good day's work! See you soon!"));
+ }
+ }
+
+ if (now.hours() < 12) {
+ this.$('.o_hr_attendance_message_message').append(_t("Have a good day!"));
+ } else if (now.hours() < 14) {
+ this.$('.o_hr_attendance_message_message').append(_t("Have a nice lunch!"));
+ if (Math.random() < 0.05) {
+ this.$('.o_hr_attendance_random_message').html(_t("Eat breakfast as a king, lunch as a merchant and supper as a beggar"));
+ } else if (Math.random() < 0.06) {
+ this.$('.o_hr_attendance_random_message').html(_t("An apple a day keeps the doctor away"));
+ }
+ } else if (now.hours() < 17) {
+ this.$('.o_hr_attendance_message_message').append(_t("Have a good afternoon"));
+ } else {
+ if (now.hours() < 18 && Math.random() < 0.2) {
+ this.$('.o_hr_attendance_message_message').append(_t("Early to bed and early to rise, makes a man healthy, wealthy and wise"));
+ } else {
+ this.$('.o_hr_attendance_message_message').append(_t("Have a good evening"));
+ }
+ }
+ },
+
+ _onBarcodeScanned: function(barcode) {
+ var self = this;
+ if (this.attendanceBarcode !== barcode){
+ if (this.return_to_main_menu) { // in case of multiple scans in the greeting message view, delete the timer, a new one will be created.
+ clearTimeout(this.return_to_main_menu);
+ }
+ core.bus.off('barcode_scanned', this, this._onBarcodeScanned);
+ this._rpc({
+ model: 'hr.employee',
+ method: 'attendance_scan',
+ args: [barcode, ],
+ })
+ .then(function (result) {
+ if (result.action) {
+ self.do_action(result.action);
+ } else if (result.warning) {
+ self.do_warn(result.warning);
+ setTimeout( function() { self.do_action(self.next_action, {clear_breadcrumbs: true}); }, 5000);
+ }
+ }, function () {
+ setTimeout( function() { self.do_action(self.next_action, {clear_breadcrumbs: true}); }, 5000);
+ });
+ }
+ },
+
+ destroy: function () {
+ core.bus.off('barcode_scanned', this, this._onBarcodeScanned);
+ clearTimeout(this.return_to_main_menu);
+ this._super.apply(this, arguments);
+ },
+});
+
+core.action_registry.add('hr_attendance_greeting_message', GreetingMessage);
+
+return GreetingMessage;
+
+});