diff --git a/addons/hr_recruitment/hr_recruitment.py b/addons/hr_recruitment/hr_recruitment.py index 5be33854c57..fca26885ae9 100644 --- a/addons/hr_recruitment/hr_recruitment.py +++ b/addons/hr_recruitment/hr_recruitment.py @@ -19,6 +19,9 @@ # ############################################################################## +import time +from datetime import datetime, timedelta + from osv import fields, osv from crm import crm import tools @@ -77,6 +80,43 @@ class hr_applicant(osv.osv, crm.crm_case): _description = "Applicant" _order = "id desc" _inherit = ['mailgate.thread'] + + def _compute_day(self, cr, uid, ids, fields, args, context=None): + if context is None: + context = {} + """ + @param cr: the current row, from the database cursor, + @param uid: the current user’s ID for security checks, + @param ids: List of Openday’s IDs + @return: difference between current date and log date + @param context: A standard dictionary for contextual values + """ + res = {} + for issue in self.browse(cr, uid, ids, context=context): + for field in fields: + res[issue.id] = {} + duration = 0 + ans = False + hours = 0 + + if field in ['day_open']: + if issue.date_open: + date_create = datetime.strptime(issue.create_date, "%Y-%m-%d %H:%M:%S") + date_open = datetime.strptime(issue.date_open, "%Y-%m-%d %H:%M:%S") + ans = date_open - date_create + date_until = issue.date_open + + elif field in ['day_close']: + if issue.date_closed: + date_create = datetime.strptime(issue.create_date, "%Y-%m-%d %H:%M:%S") + date_close = datetime.strptime(issue.date_closed, "%Y-%m-%d %H:%M:%S") + date_until = issue.date_closed + ans = date_close - date_create + if ans: + duration = float(ans.days) + res[issue.id][field] = abs(float(duration)) + return res + _columns = { 'name': fields.char('Name', size=128, required=True), 'message_ids': fields.one2many('mailgate.message', 'res_id', 'Messages', domain=[('model','=',_name)]), @@ -100,6 +140,7 @@ class hr_applicant(osv.osv, crm.crm_case): 'user_id': fields.many2one('res.users', 'Responsible'), # Applicant Columns 'date_closed': fields.datetime('Closed', readonly=True), + 'date_open': fields.datetime('Opened', readonly=True), 'date': fields.datetime('Date'), 'date_action': fields.date('Next Action Date'), 'title_action': fields.char('Next Action', size=64), @@ -117,6 +158,10 @@ class hr_applicant(osv.osv, crm.crm_case): 'survey' : fields.related('job_id', 'survey_id', type='many2one', relation='survey', string='Survey'), 'response' : fields.integer("Response"), 'reference': fields.char('Reference', size=128), + 'day_open': fields.function(_compute_day, string='Days to Open', \ + method=True, multi='day_open', type="float", store=True), + 'day_close': fields.function(_compute_day, string='Days to Close', \ + method=True, multi='day_close', type="float", store=True), } def _get_stage(self, cr, uid, context=None): @@ -343,7 +388,6 @@ class hr_applicant(osv.osv, crm.crm_case): return res def msg_send(self, cr, uid, id, *args, **argv): - """ Send The Message @param self: The object pointer @param cr: the current row, from the database cursor, @@ -363,6 +407,9 @@ class hr_applicant(osv.osv, crm.crm_case): @param *args: Give Tuple Value """ res = super(hr_applicant, self).case_open(cr, uid, ids, *args) + date = self.read(cr, uid, ids, ['date_open'])[0] + if not date['date_open']: + self.write(cr, uid, ids, {'date_open': time.strftime('%Y-%m-%d %H:%M:%S'),}) for (id, name) in self.name_get(cr, uid, ids): message = _('Job request for') + " '" + name + "' "+ _("is Open.") self.log(cr, uid, id, message) @@ -382,6 +429,19 @@ class hr_applicant(osv.osv, crm.crm_case): self.log(cr, uid, id, message) return res + def case_reset(self, cr, uid, ids, *args): + """Resets case as draft + @param self: The object pointer + @param cr: the current row, from the database cursor, + @param uid: the current user’s ID for security checks, + @param ids: List of case Ids + @param *args: Tuple Value for additional Params + """ + res = super(hr_applicant, self).case_reset(cr, uid, ids, *args) + self.write(cr, uid, ids, {'date_open': False, 'date_closed':False}) + return res + + hr_applicant() class hr_job(osv.osv): diff --git a/addons/hr_recruitment/hr_recruitment_view.xml b/addons/hr_recruitment/hr_recruitment_view.xml index 6a622a09ddf..10bf9a3a2b7 100644 --- a/addons/hr_recruitment/hr_recruitment_view.xml +++ b/addons/hr_recruitment/hr_recruitment_view.xml @@ -131,6 +131,7 @@ + diff --git a/addons/hr_recruitment/report/hr_recruitment_report.py b/addons/hr_recruitment/report/hr_recruitment_report.py index 62011b21a04..9fa22343ceb 100644 --- a/addons/hr_recruitment/report/hr_recruitment_report.py +++ b/addons/hr_recruitment/report/hr_recruitment_report.py @@ -93,6 +93,7 @@ class hr_recruitment_report(osv.osv): ('10','October'), ('11','November'), ('12','December')], 'Month',readonly=True), 'day': fields.char('Day', size=128, readonly=True), 'date': fields.date('Date', readonly=True), + 'opening_date': fields.date('Date of Opening', readonly=True), 'date_closed': fields.date('Closed', readonly=True), 'job_id': fields.many2one('hr.job', 'Applied Job',readonly=True), 'stage_id': fields.many2one ('hr.recruitment.stage', 'Stage'), @@ -103,7 +104,11 @@ class hr_recruitment_report(osv.osv): 'salary_exp' : fields.float("Salary Expected"), 'partner_id': fields.many2one('res.partner', 'Partner',readonly=True), 'partner_address_id': fields.many2one('res.partner.address', 'Partner Contact Name',readonly=True), - 'available' : fields.float("Availability") + 'available' : fields.float("Availability"), + 'delay_open': fields.float('Avg. Delay to Open', digits=(16,2), readonly=True, group_operator="avg", + help="Number of Days to close the project issue"), + 'delay_close': fields.float('Avg. Delay to Close', digits=(16,2), readonly=True, group_operator="avg", + help="Number of Days to close the project issue"), } _order = 'date desc' @@ -131,6 +136,8 @@ class hr_recruitment_report(osv.osv): s.stage_id, sum(salary_proposed) as salary_prop, sum(salary_expected) as salary_exp, + extract('epoch' from (s.date_open-s.create_date))/(3600*24) as delay_open, + extract('epoch' from (s.date_closed-s.create_date))/(3600*24) as delay_close, count(*) as nbr from hr_applicant s group by @@ -139,6 +146,9 @@ class hr_recruitment_report(osv.osv): to_char(s.create_date, 'YYYY-MM-DD') , date_trunc('day',s.create_date), date_trunc('day',s.date_closed), + s.date_open, + s.create_date, + s.date_closed, s.state, s.partner_id, s.partner_address_id, diff --git a/addons/hr_recruitment/report/hr_recruitment_report_view.xml b/addons/hr_recruitment/report/hr_recruitment_report_view.xml index a6cc5830de8..a789206b518 100644 --- a/addons/hr_recruitment/report/hr_recruitment_report_view.xml +++ b/addons/hr_recruitment/report/hr_recruitment_report_view.xml @@ -23,6 +23,8 @@ + + diff --git a/addons/hr_recruitment/security/ir.model.access.csv b/addons/hr_recruitment/security/ir.model.access.csv index 40e82cb1a15..bad86afd5c0 100644 --- a/addons/hr_recruitment/security/ir.model.access.csv +++ b/addons/hr_recruitment/security/ir.model.access.csv @@ -1,3 +1,5 @@ "id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" "access_hr_applicant","hr.applicant","model_hr_applicant","hr.group_hr_user",1,1,1,1 "access_hr_recruitment_report","hr.recruitment.report","model_hr_recruitment_report","hr.group_hr_manager",1,0,0,0 +"access_hr_recruitment_stage","hr.recruitment.stage","model_hr_recruitment_stage","hr.group_hr_user",1,1,1,1 +"access_hr_recruitment_degree","hr.recruitment.degree","model_hr_recruitment_degree","hr.group_hr_user",1,1,1,1