openerp 7.0 升级笔记 HR考勤(二)

要想实现在一定条件下,点击签到图标弹出对话窗口,还是有一定的麻烦,使用一般的窗口弹出代码没有效果,经过2个晚上的研究,才通过修改js程序实现了这个目的。

在hr_attendance下有个static目录,全部copy到extension目录下,删除css和xml,只保留js,因为hr_attendance_extension类继承自hr_attendance,因此这个新的js文件将完全代替原目录下的js文件,这点和django是一样的。

修改原来的do_update_attendance函数,如下:

do_update_attendance: function () {
            var self = this;
            //jerry add start 弹出考勤说明对话框
            var action = {
                type: 'ir.actions.act_window',
                res_model: 'hr.attendance.reason',
                view_mode: 'form',
                view_type: 'form',
                views: [[false, 'form']],
                target: 'new',
                context: {}
            };
            var hr_attendance_extension =new instance.web.Model("hr.attendance")
            var self = this;
            hr_attendance_extension.call('get_status', [[]]).then(function (result){                
                //员工迟到1小时之内,或者下班前一小时之内,弹出对话框               
                if(result=='late' || result=='leave_early'){
                    instance.client.action_manager.do_action(action);
                }
                //原计划弹出对话框后,先不要将考勤情况写入,图标也不要变化,但是实现不了。
                //因此改成,点击对话框的确定按钮后,更新之前的记录,加入考勤说明
            //jerry add end*************************************
                var hr_employee = new instance.web.DataSet(self, 'hr.employee');
                hr_employee.call('attendance_action_change', [
                    [self.employee.id]
                ]).done(function (result) {
                        //签到图标更换
                        self.last_sign = new Date();
                        self.set({"signed_in": ! self.get("signed_in")});
                    });
            });
        },

由于对js一点也不熟悉,导致走了好多冤枉路,不过最终有成果,还是令人欣慰的。

这里记录一下遇到的问题,和仍有价值的弯路。

1、javescript时间计算,copy自网络,感谢原作者。

/*
         * 获得时间差,时间格式为 年-月-日 小时:分钟:秒 或者 年/月/日 小时:分钟:秒
         * 其中,年月日为全格式,例如 : 2010-10-12 01:00:00
         * 返回精度为:秒,分,小时,天
         */
        GetDateDiff:function(startTime, endTime, diffType) {
            //将xxxx-xx-xx的时间格式,转换为 xxxx/xx/xx的格式
            //startTime = startTime.replace(/\-/g, "/");
            //endTime = endTime.replace(/\-/g, "/");
            //将计算间隔类性字符转换为小写
            diffType = diffType.toLowerCase();
            var sTime = new Date(startTime); //开始时间
            var eTime = new Date(endTime); //结束时间
            //作为除数的数字
            var divNum = 1;
            switch (diffType) {
                case "second":
                    divNum = 1000;
                    break;
                case "minute":
                    divNum = 1000 * 60;
                    break;
                case "hour":
                    divNum = 1000 * 3600;
                    break;
                case "day":
                    divNum = 1000 * 3600 * 24;
                    break;
                default:
                    break;
            }
            return parseInt((eTime.getTime() - sTime.getTime()) / parseInt(divNum));
        },

一开始为了使用这个函数,计算当前时间和设定的工作时间的差,在py文件中建立了一个获取work_time的函数,并且转为datetime类型的,然后在js中调用,结果总是提示internal 500 error,耽误了不少时间,后来直接将所有的动作都在py中完成,只将status传进来,就再也没有问题了。

2、Float转datetime的函数,也许以后会用到。

def _time_to_datetime(self,time):
        now=datetime.datetime.now()
        float_time=string.atof(time)
        h=int(float_time)
        m=int((float_time-h)*60)
        datetime_time=datetime.datetime(year=now.year,month=now.month,day=now.day,hour=h,minute=m)
        return datetime_time

考勤的基本功能就是这样,接下来是数据统计,准备来尝试实现考勤的报表,另外与工资模块结合,晚点再做。

原文地址:https://www.cnblogs.com/jerry2005/p/2804199.html