Merge lp:~openerp-dev/openobject-addons/trunk-visibility-hr into lp:openobject-addons

Proposed by SnippetBucket.com
Status: Needs review
Proposed branch: lp:~openerp-dev/openobject-addons/trunk-visibility-hr
Merge into: lp:openobject-addons
Diff against target: 835 lines (+309/-38)
19 files modified
hr/__openerp__.py (+1/-0)
hr/hr.py (+11/-1)
hr/hr_data.xml (+2/-0)
hr/hr_department.py (+22/-0)
hr/hr_department_data.xml (+45/-0)
hr/hr_department_view.xml (+4/-0)
hr/hr_view.xml (+1/-0)
hr_contract/hr_contract.py (+11/-0)
hr_contract/hr_contract_data.xml (+4/-0)
hr_contract/hr_contract_view.xml (+4/-0)
hr_evaluation/hr_evaluation.py (+18/-2)
hr_evaluation/hr_evaluation_view.xml (+6/-0)
hr_expense/hr_expense.py (+30/-4)
hr_expense/hr_expense_view.xml (+53/-17)
hr_holidays/hr_holidays.py (+28/-2)
hr_holidays/hr_holidays_view.xml (+45/-8)
hr_recruitment/hr_recruitment.py (+9/-0)
hr_timesheet_sheet/hr_timesheet_sheet.py (+12/-2)
hr_timesheet_sheet/hr_timesheet_sheet_view.xml (+3/-2)
To merge this branch: bzr merge lp:~openerp-dev/openobject-addons/trunk-visibility-hr
Reviewer Review Type Date Requested Status
OpenERP Core Team Pending
Review via email: mp+164834@code.launchpad.net

Description of the change

Hello,

Task: Visibility hr holidays.

 * Make a human resoucre application more manager oriented (keep user's feature also)

 * Added some need action

 * Improve some complicated apss like payroll and appraisal

 * Change menus

More details are on pad.
http://pad.openerp.com/p/r.M3I0JrJ8lV6YUyNk

Thanks,
tta

To post a comment you must log in.
8707. By SnippetBucket.com

Merged lastest.

8708. By Bharat Devnani (Open ERP)

[MERGE] merged with main addons

8709. By Bharat Devnani (Open ERP)

[IMP] improved various points mentioned on pad

8710. By Bharat Devnani (Open ERP)

[MERGE] merged with main addons

8711. By Bharat Devnani (Open ERP)

[MERGE] merged with main addons

8712. By Bharat Devnani (Open ERP)

[ADD] added warning message when Home Address is not defined on employee, while generation accounting entries in hr_expense

8713. By Bharat Devnani (Open ERP)

[IMP] improved the code

8714. By Bharat Devnani (Open ERP)

[IMP] improved def post method

Unmerged revisions

8714. By Bharat Devnani (Open ERP)

[IMP] improved def post method

8713. By Bharat Devnani (Open ERP)

[IMP] improved the code

8712. By Bharat Devnani (Open ERP)

[ADD] added warning message when Home Address is not defined on employee, while generation accounting entries in hr_expense

8711. By Bharat Devnani (Open ERP)

[MERGE] merged with main addons

8710. By Bharat Devnani (Open ERP)

[MERGE] merged with main addons

8709. By Bharat Devnani (Open ERP)

[IMP] improved various points mentioned on pad

8708. By Bharat Devnani (Open ERP)

[MERGE] merged with main addons

8707. By SnippetBucket.com

Merged lastest.

8706. By SnippetBucket.com

Clean up the code.

8705. By SnippetBucket.com

[FIX] Fixed dept_id issue and corrected search for leaves.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'hr/__openerp__.py'
2--- hr/__openerp__.py 2012-11-29 22:26:45 +0000
3+++ hr/__openerp__.py 2013-05-28 06:54:28 +0000
4@@ -55,6 +55,7 @@
5 'board_hr_view.xml',
6 'hr_view.xml',
7 'hr_department_view.xml',
8+ 'hr_department_data.xml',
9 'process/hr_process.xml',
10 'hr_installer.xml',
11 'hr_data.xml',
12
13=== modified file 'hr/hr.py'
14--- hr/hr.py 2013-04-29 15:14:10 +0000
15+++ hr/hr.py 2013-05-28 06:54:28 +0000
16@@ -151,7 +151,7 @@
17 _name = "hr.employee"
18 _description = "Employee"
19 _inherits = {'resource.resource': "resource_id"}
20- _inherit = ['mail.thread']
21+ _inherit = ['mail.thread', 'ir.needaction_mixin']
22
23 def _get_image(self, cr, uid, ids, name, args, context=None):
24 result = dict.fromkeys(ids, False)
25@@ -218,6 +218,13 @@
26
27 def create(self, cr, uid, data, context=None):
28 employee_id = super(hr_employee, self).create(cr, uid, data, context=context)
29+
30+ #for the departmet followers
31+ dept_id = data.get('department_id', False)
32+ subtype_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'hr', 'mt_employees')[1]
33+ if dept_id:
34+ self.subscribe_by_department(cr, uid, [employee_id], dept_id, [subtype_id], context=context)
35+
36 try:
37 (model, mail_group_id) = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'mail', 'group_all_employees')
38 employee = self.browse(cr, uid, employee_id, context=context)
39@@ -261,6 +268,9 @@
40 work_email = self.pool.get('res.users').browse(cr, uid, user_id, context=context).email
41 return {'value': {'work_email' : work_email}}
42
43+ def _needaction_domain_get(self, cr, uid, context=None):
44+ return [('message_unread', '=', True)]
45+
46 def _get_default_image(self, cr, uid, context=None):
47 image_path = get_module_resource('hr', 'static/src/img', 'default_image.png')
48 return tools.image_resize_image_big(open(image_path, 'rb').read().encode('base64'))
49
50=== modified file 'hr/hr_data.xml'
51--- hr/hr_data.xml 2013-04-11 12:44:46 +0000
52+++ hr/hr_data.xml 2013-05-28 06:54:28 +0000
53@@ -16,6 +16,8 @@
54 <record id="employee" model="hr.employee">
55 <field name="name">Administrator</field>
56 <field name="user_id" ref="base.user_root"/>
57+ <field name="address_id" ref="base.partner_root"/>
58+ <field name="address_home_id" ref="base.partner_root"/>
59 <field name="image">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</field>
60 </record>
61
62
63=== modified file 'hr/hr_department.py'
64--- hr/hr_department.py 2013-04-15 10:23:49 +0000
65+++ hr/hr_department.py 2013-05-28 06:54:28 +0000
66@@ -21,6 +21,27 @@
67
68 from openerp.osv import fields, osv
69 from openerp import tools
70+from openerp import SUPERUSER_ID
71+
72+class mail_thread(osv.osv):
73+ _inherit = ['mail.thread']
74+ _name = 'mail.thread'
75+
76+ def subscribe_by_department(self, cr, uid, ids, dept_id, subtype_ids,context=None):
77+ new_follower_ids = []
78+ followers = self.pool.get('mail.followers')
79+ followers_objs = self.pool.get('hr.department').browse(cr, uid, dept_id,context=context).message_follower_ids
80+ for partner in followers_objs:
81+ fids = followers.search(cr, SUPERUSER_ID, [('res_model','=','hr.department'),('partner_id','=',partner.id),('res_id','=',dept_id)], context=context)
82+ if fids:
83+ follower = followers.browse(cr, uid, fids[0], context=context)
84+ list_subtype_ids = set([subtype.id for subtype in follower.subtype_ids])
85+ has_subtype = [ subtype for subtype in list_subtype_ids if subtype in subtype_ids] or False
86+ if has_subtype and partner.user_ids:
87+ new_follower_ids.append(partner.user_ids[0].id)
88+ if new_follower_ids:
89+ self.message_subscribe_users(cr, uid, ids, user_ids=new_follower_ids)
90+ return True
91
92 class hr_department(osv.osv):
93 def name_get(self, cr, uid, ids, context=None):
94@@ -42,6 +63,7 @@
95 return dict(res)
96
97 _name = "hr.department"
98+ _inherit = ['mail.thread']
99 _columns = {
100 'name': fields.char('Department Name', size=64, required=True),
101 'complete_name': fields.function(_dept_name_get_fnc, type="char", string='Name'),
102
103=== added file 'hr/hr_department_data.xml'
104--- hr/hr_department_data.xml 1970-01-01 00:00:00 +0000
105+++ hr/hr_department_data.xml 2013-05-28 06:54:28 +0000
106@@ -0,0 +1,45 @@
107+<?xml version="1.0" encoding="utf-8"?>
108+<openerp>
109+ <data noupdate="1">
110+ <record id="mt_employees" model="mail.message.subtype">
111+ <field name="name">Employees</field>
112+ <field name="res_model">hr.department</field>
113+ <field name="default" eval="False"/>
114+ </record>
115+ <record id="mt_end_of_contracts" model="mail.message.subtype">
116+ <field name="name">End of Contracts</field>
117+ <field name="res_model">hr.department</field>
118+ <field name="default" eval="False"/>
119+ </record>
120+ <record id="mt_applications" model="mail.message.subtype">
121+ <field name="name">Applications</field>
122+ <field name="res_model">hr.department</field>
123+ <field name="default" eval="False"/>
124+ </record>
125+ <record id="mt_approve_timesheet" model="mail.message.subtype">
126+ <field name="name">Approve Timesheet</field>
127+ <field name="res_model">hr.department</field>
128+ <field name="default" eval="False"/>
129+ </record>
130+ <record id="mt_approve_expenses" model="mail.message.subtype">
131+ <field name="name">Approve Expenses</field>
132+ <field name="res_model">hr.department</field>
133+ <field name="default" eval="False"/>
134+ </record>
135+ <record id="mt_first_approve_leaves" model="mail.message.subtype">
136+ <field name="name">First approval of leaves/ Allocation</field>
137+ <field name="res_model">hr.department</field>
138+ <field name="default" eval="False"/>
139+ </record>
140+ <record id="mt_second_approve_leaves" model="mail.message.subtype">
141+ <field name="name">Second approval of leaves</field>
142+ <field name="res_model">hr.department</field>
143+ <field name="default" eval="False"/>
144+ </record>
145+ <record id="mt_Appraisals" model="mail.message.subtype">
146+ <field name="name">Appraisals</field>
147+ <field name="res_model">hr.department</field>
148+ <field name="default" eval="False"/>
149+ </record>
150+ </data>
151+</openerp>
152\ No newline at end of file
153
154=== modified file 'hr/hr_department_view.xml'
155--- hr/hr_department_view.xml 2012-12-21 16:48:08 +0000
156+++ hr/hr_department_view.xml 2013-05-28 06:54:28 +0000
157@@ -16,6 +16,10 @@
158 <field name="company_id" widget="selection" groups="base.group_multi_company"/>
159 </group>
160 </sheet>
161+ <div class="oe_chatter">
162+ <field name="message_follower_ids" widget="mail_followers"/>
163+ <field name="message_ids" widget="mail_thread"/>
164+ </div>
165 </form>
166 </field>
167 </record>
168
169=== modified file 'hr/hr_view.xml'
170--- hr/hr_view.xml 2013-03-20 12:55:17 +0000
171+++ hr/hr_view.xml 2013-05-28 06:54:28 +0000
172@@ -124,6 +124,7 @@
173 <filter string="Department" icon="terp-personal+" domain="[]" context="{'group_by':'department_id'}"/>
174 <filter string="Job" icon="terp-gtk-select-all" domain="[]" context="{'group_by':'job_id'}"/>
175 <filter string="Company" icon="terp-go-home" domain="[]" context="{'group_by':'company_id'}" groups="base.group_multi_company"/>
176+ <filter icon="terp-mail-message-new" string="Unread Messages" name="message_unread" domain="[('message_unread','=',True)]"/>
177 </group>
178 </search>
179 </field>
180
181=== modified file 'hr_contract/hr_contract.py'
182--- hr_contract/hr_contract.py 2013-04-15 10:23:49 +0000
183+++ hr_contract/hr_contract.py 2013-05-28 06:54:28 +0000
184@@ -60,6 +60,7 @@
185 class hr_contract(osv.osv):
186 _name = 'hr.contract'
187 _description = 'Contract'
188+ _inherit = 'mail.thread'
189 _columns = {
190 'name': fields.char('Contract Reference', size=64, required=True),
191 'employee_id': fields.many2one('hr.employee', "Employee", required=True),
192@@ -79,6 +80,16 @@
193 'visa_expire': fields.date('Visa Expire Date'),
194 }
195
196+ def create(self, cr, uid, vals, context=None):
197+ obj_id = super(hr_contract, self).create(cr, uid, vals, context=context)
198+ emp_id = vals.get('employee_id', False)
199+ if emp_id:
200+ dept_id = self.pool.get('hr.employee').browse(cr, uid, emp_id, context=context).department_id.id or False
201+ subtype_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'hr', 'mt_end_of_contracts')[1]
202+ if dept_id:
203+ self.subscribe_by_department(cr, uid, [obj_id], dept_id, [subtype_id], context=context)
204+ return obj_id
205+
206 def _get_type(self, cr, uid, context=None):
207 type_ids = self.pool.get('hr.contract.type').search(cr, uid, [('name', '=', 'Employee')])
208 return type_ids and type_ids[0] or False
209
210=== modified file 'hr_contract/hr_contract_data.xml'
211--- hr_contract/hr_contract_data.xml 2011-04-06 13:11:49 +0000
212+++ hr_contract/hr_contract_data.xml 2013-05-28 06:54:28 +0000
213@@ -14,6 +14,10 @@
214 <record id="hr_contract_type_sub" model="hr.contract.type">
215 <field name="name">Subcontractor</field>
216 </record>
217+
218+ <record id="timesheet_group2" model="resource.calendar">
219+ <field name="name">40 Hours/Week</field>
220+ </record>
221
222 </data>
223 </openerp>
224
225=== modified file 'hr_contract/hr_contract_view.xml'
226--- hr_contract/hr_contract_view.xml 2012-11-29 22:26:45 +0000
227+++ hr_contract/hr_contract_view.xml 2013-05-28 06:54:28 +0000
228@@ -117,6 +117,10 @@
229 </page>
230 </notebook>
231 </sheet>
232+ <div class="oe_chatter">
233+ <field name="message_follower_ids" widget="mail_followers"/>
234+ <field name="message_ids" widget="mail_thread"/>
235+ </div>
236 </form>
237 </field>
238 </record>
239
240=== modified file 'hr_evaluation/hr_evaluation.py'
241--- hr_evaluation/hr_evaluation.py 2013-04-15 10:23:49 +0000
242+++ hr_evaluation/hr_evaluation.py 2013-05-28 06:54:28 +0000
243@@ -125,7 +125,7 @@
244
245 class hr_evaluation(osv.osv):
246 _name = "hr_evaluation.evaluation"
247- _inherit = "mail.thread"
248+ _inherit = ['mail.thread','ir.needaction_mixin']
249 _description = "Employee Appraisal"
250 _rec_name = 'employee_id'
251 _columns = {
252@@ -158,6 +158,16 @@
253 'state': lambda *a: 'draft',
254 }
255
256+ def create(self, cr, uid, vals, context=None):
257+ obj_id = super(hr_evaluation, self).create(cr, uid, vals, context=context)
258+ emp_id = vals.get('employee_id', False)
259+ if emp_id:
260+ dept_id = self.pool.get('hr.employee').read(cr, uid, emp_id,['department_id'], context=context).get('department_id')[0]
261+ subtype_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'hr', 'mt_Appraisals')[1]
262+ if dept_id:
263+ self.subscribe_by_department(cr, uid, [obj_id], dept_id, [subtype_id], context=context)
264+ return obj_id
265+
266 def name_get(self, cr, uid, ids, context=None):
267 if not ids:
268 return []
269@@ -269,6 +279,9 @@
270 for survey_req in evalutation.survey_request_ids:
271 obj_hr_eval_iterview.write(cr, uid, [survey_req.id], new_vals, context=context)
272 return super(hr_evaluation, self).write(cr, uid, ids, vals, context=context)
273+
274+ def _needaction_domain_get(self, cr, uid, context=None):
275+ return [('message_unread', '=', True)]
276
277
278 class survey_request(osv.osv):
279@@ -281,7 +294,7 @@
280 class hr_evaluation_interview(osv.osv):
281 _name = 'hr.evaluation.interview'
282 _inherits = {'survey.request': 'request_id'}
283- _inherit = 'mail.thread'
284+ _inherit = ['mail.thread', 'ir.needaction_mixin']
285 _rec_name = 'request_id'
286 _description = 'Appraisal Interview'
287 _columns = {
288@@ -353,5 +366,8 @@
289 value = self.pool.get("survey").action_print_survey(cr, uid, ids, context=context)
290 return value
291
292+ def _needaction_domain_get(self, cr, uid, context=None):
293+ return [('message_unread', '=', True)]
294+
295
296 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:1
297
298=== modified file 'hr_evaluation/hr_evaluation_view.xml'
299--- hr_evaluation/hr_evaluation_view.xml 2013-02-25 13:38:04 +0000
300+++ hr_evaluation/hr_evaluation_view.xml 2013-05-28 06:54:28 +0000
301@@ -240,6 +240,7 @@
302 <field name="date"/>
303 <filter icon="terp-check" string="Pending" domain="[('state','=','wait')]" help="Appraisal that are in Plan In Progress state"/>
304 <filter icon="terp-camera_test" string="In progress" domain="[('state','=','progress')]" help="Appraisal that are in waiting appreciation state"/>
305+ <filter icon="terp-mail-message-new" string="Unread Messages" name="message_unread" domain="[('message_unread','=',True)]"/>
306 <field name="employee_id" />
307 <field name="plan_id"/>
308 <group expand='0' string='Group by...'>
309@@ -317,6 +318,10 @@
310 </group>
311 </group>
312 </sheet>
313+ <div class="oe_chatter">
314+ <field name="message_follower_ids" widget="mail_followers"/>
315+ <field name="message_ids" widget="mail_thread"/>
316+ </div>
317 </form>
318 </field>
319 </record>
320@@ -348,6 +353,7 @@
321 <search string="Search Appraisal">
322 <field name="date_deadline"/>
323 <filter icon="terp-gtk-go-back-rtl" string="To Do" name="todo" domain="[('state','=','waiting_answer')]"/>
324+ <filter icon="terp-mail-message-new" string="Unread Messages" name="message_unread" domain="[('message_unread','=',True)]"/>
325 <field name="user_to_review_id"/>
326 <field name="user_id" string="Interviewer"/>
327 <group expand="0" string="Group By...">
328
329=== modified file 'hr_expense/hr_expense.py'
330--- hr_expense/hr_expense.py 2013-04-18 12:31:45 +0000
331+++ hr_expense/hr_expense.py 2013-05-28 06:54:28 +0000
332@@ -40,7 +40,7 @@
333 if context is None:
334 context = {}
335 if not default: default = {}
336- default.update({'date_confirm': False, 'date_valid': False, 'user_valid': False})
337+ default.update({'date_confirm': False, 'date_valid': False, 'user_valid': False, 'account_move_id': []})
338 return super(hr_expense_expense, self).copy(cr, uid, id, default, context=context)
339
340 def _amount(self, cr, uid, ids, field_name, arg, context=None):
341@@ -63,7 +63,7 @@
342 return self.pool.get('res.currency').search(cr, uid, [('rate','=',1.0)], context=context)[0]
343
344 _name = "hr.expense.expense"
345- _inherit = ['mail.thread']
346+ _inherit = ['mail.thread', 'ir.needaction_mixin']
347 _description = "Expense"
348 _order = "id desc"
349 _track = {
350@@ -84,7 +84,7 @@
351 'date_confirm': fields.date('Confirmation Date', select=True, help="Date of the confirmation of the sheet expense. It's filled when the button Confirm is pressed."),
352 'date_valid': fields.date('Validation Date', select=True, help="Date of the acceptation of the sheet expense. It's filled when the button Accept is pressed."),
353 'user_valid': fields.many2one('res.users', 'Validation By', readonly=True, states={'draft':[('readonly',False)], 'confirm':[('readonly',False)]}),
354- 'account_move_id': fields.many2one('account.move', 'Ledger Posting'),
355+ 'account_move_id': fields.many2one('account.move', 'Ledger Posting', track_visibility="onchange"),
356 'line_ids': fields.one2many('hr.expense.line', 'expense_id', 'Expense Lines', readonly=True, states={'draft':[('readonly',False)]} ),
357 'note': fields.text('Note'),
358 'amount': fields.function(_amount, string='Total Amount', digits_compute=dp.get_precision('Account'),
359@@ -113,7 +113,7 @@
360 'user_id': lambda cr, uid, id, c={}: id,
361 'currency_id': _get_currency,
362 }
363-
364+
365 def unlink(self, cr, uid, ids, context=None):
366 for rec in self.browse(cr, uid, ids, context=context):
367 if rec.state != 'draft':
368@@ -138,6 +138,14 @@
369 return {'value': {'department_id': department_id, 'company_id': company_id}}
370
371 def expense_confirm(self, cr, uid, ids, context=None):
372+ #for the departmet followers
373+ expense = self.browse(cr, uid, ids, context=context)
374+ dept_id = expense[0].department_id.id or False
375+ record_id = expense[0].id
376+ subtype_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'hr', 'mt_approve_expenses')[1]
377+ if dept_id:
378+ self.subscribe_by_department(cr, uid, [record_id], dept_id, [subtype_id], context=context)
379+
380 for expense in self.browse(cr, uid, ids):
381 if expense.employee_id and expense.employee_id.parent_id.user_id:
382 self.message_subscribe_users(cr, uid, [expense.id], user_ids=[expense.employee_id.parent_id.user_id.id])
383@@ -383,6 +391,9 @@
384 }
385 return result
386
387+ def _needaction_domain_get(self, cr, uid, context=None):
388+ return [('message_unread', '=', True)]
389+
390
391 class product_product(osv.osv):
392 _inherit = "product.product"
393@@ -447,6 +458,21 @@
394 res['warning'] = {'title': _('Warning'), 'message': _('Selected Unit of Measure does not belong to the same category as the product Unit of Measure')}
395 res['value'].update({'uom_id': product.uom_id.id})
396 return res
397+
398+class account_move(osv.osv):
399+
400+ _inherit = ["account.move"]
401+ _name = 'account.move'
402+
403+ def post(self, cr, uid, ids, context=None):
404+ hr_expense_obj = self.pool.get('hr.expense.expense')
405+ res = super(account_move, self).post(cr, uid, ids, context=context)
406+ if ids:
407+ name = self.browse(cr, uid, ids[0], context=context).name
408+ expense_id = hr_expense_obj.search(cr, uid, [('account_move_id', '=', ids[0])], context=context)
409+ if expense_id:
410+ hr_expense_obj.message_post(cr, uid, [expense_id[0]], body=_('Journal Entry <b> %s </b> posted.') % (name,), context=context)
411+ return res
412
413
414 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
415
416=== modified file 'hr_expense/hr_expense_view.xml'
417--- hr_expense/hr_expense_view.xml 2013-04-22 15:34:49 +0000
418+++ hr_expense/hr_expense_view.xml 2013-05-28 06:54:28 +0000
419@@ -30,7 +30,7 @@
420 <field name="department_id" invisible="1"/>
421 <field name="date"/>
422 <field name="user_id" invisible="1"/>
423- <field name="name"/>
424+ <field name="name" string="Expense Sheet"/>
425 <field name="currency_id" groups="base.group_multi_currency"/>
426 <field name="amount" sum="Total Amount"/>
427 <field name="state"/>
428@@ -46,7 +46,7 @@
429 <field name="employee_id"/>
430 <field name="date"/>
431 <field name="department_id"/>
432- <field name="name"/>
433+ <field name="name" string="Expense Sheet"/>
434 <field name="amount"/>
435 <field name="state"/>
436 <button name="confirm" states="draft" string="Confirm" type="workflow" icon="gtk-apply"/>
437@@ -79,13 +79,16 @@
438 <field name="company_id" groups="base.group_multi_company"/>
439 </group>
440 <group>
441- <field name="name"/>
442+ <field name="name" string="Expense Sheet" placeholder="e.g. Business travel at Chicago"/>
443 <field name="user_valid" attrs="{'invisible': [('state','=','draft')]}"/>
444 <field name="currency_id" groups="base.group_multi_currency" on_change="onchange_currency_id(currency_id, company_id)"/>
445 </group>
446 </group>
447 <notebook>
448- <page string="Description">
449+ <page string="Expense Lines">
450+ <group groups="account.group_account_user">
451+ <field name="journal_id" widget="selection" domain="[('type', '=', 'purchase')]" string="Journal" help="If Empty, entries will be generated in the Purchase Journal"/>
452+ </group>
453 <field name="line_ids" context="{'currency_id': currency_id, 'default_analytic_account': context.get('analytic_account')}">
454 <form string="Expense Lines" version="7.0">
455 <group>
456@@ -110,7 +113,7 @@
457 <field name="sequence" invisible="1"/>
458 <field name="product_id" on_change="onchange_product_id(product_id, context)" context="{'default_hr_expense_ok':1}"/>
459 <field name="date_value" string="Expense Date"/>
460- <field name="name"/>
461+ <field name="name" string="Description"/>
462 <field name="ref"/>
463 <field domain="[('type','in',['normal','contract'])]" name="analytic_account" groups="analytic.group_analytic_accounting"/>
464 <field name="uom_id" on_change="onchange_uom(product_id, uom_id, context)"/>
465@@ -121,7 +124,7 @@
466 </field>
467 <group>
468 <div>
469- <separator string="Notes"/>
470+ <separator string="Description"/>
471 <field name="note" placeholder="Free Notes"/>
472 </div>
473 <group class="oe_subtotal_footer oe_right">
474@@ -129,14 +132,6 @@
475 </group>
476 </group>
477 </page>
478- <page string="Accounting" groups="account.group_account_user">
479- <group>
480- <group string="Accounting Data">
481- <field name="journal_id" widget="selection" domain="[('type', '=', 'purchase')]"/>
482- <field name="account_move_id"/>
483- </group>
484- </group>
485- </page>
486 </notebook>
487 </sheet>
488 <div class="oe_chatter">
489@@ -156,8 +151,9 @@
490 <field name="name" string="Expenses"/>
491 <field name="date"/>
492 <filter icon="terp-document-new" domain="[('state','=','draft')]" string="New" help="New Expense"/>
493- <filter icon="terp-camera_test" domain="[('state','=','confirm')]" string="To Approve" help="Confirmed Expenses"/>
494- <filter icon="terp-dolar" domain="[('state','=','accepted')]" string="To Pay" help="Expenses to Invoice"/>
495+ <filter icon="terp-camera_test" domain="[('state','=','confirm')]" name="confirm" string="To Approve" help="Confirmed Expenses"/>
496+ <filter icon="terp-dolar" domain="[('state','=','accepted')]" string="To Pay" name="approved" help="Expenses to Invoice"/>
497+ <filter icon="terp-mail-message-new" string="Unread Messages" name="message_unread" domain="[('message_unread','=',True)]"/>
498 <separator/>
499 <filter domain="[('user_id', '=', uid)]" string="My Expenses"/>
500 <field name="employee_id"/>
501@@ -188,7 +184,44 @@
502 </p>
503 </field>
504 </record>
505-
506+
507+ <record id="expense_approved" model="ir.actions.act_window">
508+ <field name="name">Approved Expenses</field>
509+ <field name="res_model">hr.expense.expense</field>
510+ <field name="view_type">form</field>
511+ <field name="context">{'search_default_approved':1}</field>
512+ <field name="search_view_id" ref="view_hr_expense_filter"/>
513+ <field name="view_id" ref="view_expenses_tree"/>
514+ <field name="help" type="html">
515+ <p class="oe_view_nocontent_create">
516+ Click to register new expenses.
517+ </p><p>
518+ OpenERP will ensure the whole process is followed; the expense
519+ sheet is validated by manager(s), the employee is reimbursed
520+ from his expenses, some expenses must be re-invoiced to the
521+ customers.
522+ </p>
523+ </field>
524+ </record>
525+
526+ <record id="Expense_to_approve" model="ir.actions.act_window">
527+ <field name="name">Expense to Approve</field>
528+ <field name="res_model">hr.expense.expense</field>
529+ <field name="view_type">form</field>
530+ <field name="context">{'search_default_confirm':1}</field>
531+ <field name="search_view_id" ref="view_hr_expense_filter"/>
532+ <field name="view_id" ref="view_expenses_tree"/>
533+ <field name="help" type="html">
534+ <p class="oe_view_nocontent_create">
535+ Click to register new expenses.
536+ </p><p>
537+ OpenERP will ensure the whole process is followed; the expense
538+ sheet is validated by manager(s), the employee is reimbursed
539+ from his expenses, some expenses must be re-invoiced to the
540+ customers.
541+ </p>
542+ </field>
543+ </record>
544
545 <record id="view_product_hr_expense_form" model="ir.ui.view">
546 <field name="name">product.product.expense.form</field>
547@@ -215,6 +248,9 @@
548 <menuitem id="menu_hr_product" name="Expense Categories" parent="hr.menu_hr_configuration" action="hr_expense_product"/>
549 <menuitem id="next_id_49" name="Expenses" sequence="15" parent="hr.menu_hr_root"/>
550 <menuitem action="expense_all" id="menu_expense_all" name="Expenses" parent="next_id_49"/>
551+ <menuitem action="Expense_to_approve" id="menu_expense_to_approve" name="Expense to Approve" parent="next_id_49" groups="base.group_hr_user"/>
552+ <menuitem id="menu_expenses" name="Expenses" parent="account.menu_finance" sequence="3"/>
553+ <menuitem action="expense_approved" id="menu_expense_account_all" name="Approved Expenses" parent="menu_expenses"/>
554
555 </data>
556 </openerp>
557
558=== modified file 'hr_holidays/hr_holidays.py'
559--- hr_holidays/hr_holidays.py 2013-04-16 07:36:41 +0000
560+++ hr_holidays/hr_holidays.py 2013-05-28 06:54:28 +0000
561@@ -149,6 +149,8 @@
562 \nThe status is \'To Approve\', when holiday request is confirmed by user.\
563 \nThe status is \'Refused\', when holiday request is refused by manager.\
564 \nThe status is \'Approved\', when holiday request is approved by manager.'),
565+ 'payslip_status': fields.selection([('toreport','To report in payslip'),('reported','Reported in last payslips')]),
566+ 'report_note': fields.text('Comments from Manager'),
567 'user_id':fields.related('employee_id', 'user_id', type='many2one', relation='res.users', string='User', store=True),
568 'date_from': fields.datetime('Start Date', readonly=True, states={'draft':[('readonly',False)], 'confirm':[('readonly',False)]}, select=True),
569 'date_to': fields.datetime('End Date', readonly=True, states={'draft':[('readonly',False)], 'confirm':[('readonly',False)]}),
570@@ -173,7 +175,8 @@
571 'state': 'draft',
572 'type': 'remove',
573 'user_id': lambda obj, cr, uid, context: uid,
574- 'holiday_type': 'employee'
575+ 'holiday_type': 'employee',
576+ 'payslip_status': 'toreport',
577 }
578 _constraints = [
579 (_check_date, 'You can not have 2 leaves that overlaps on same day!', ['date_from','date_to']),
580@@ -327,8 +330,16 @@
581 if to_unlink:
582 self.unlink(cr, uid, to_unlink, context=context)
583 return True
584-
585+
586 def holidays_first_validate(self, cr, uid, ids, context=None):
587+ #for the departmet followers
588+ holidays = self.browse(cr, uid, ids, context=context)
589+ dept_id = holidays[0].department_id.id or False
590+ record_id = holidays[0].id
591+ subtype_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'hr', 'mt_first_approve_leaves')[1]
592+ if dept_id:
593+ self.subscribe_by_department(cr, uid, [record_id], dept_id, [subtype_id], context=context)
594+
595 self.check_holidays(cr, uid, ids, context=context)
596 obj_emp = self.pool.get('hr.employee')
597 ids2 = obj_emp.search(cr, uid, [('user_id', '=', uid)])
598@@ -337,6 +348,14 @@
599 return self.write(cr, uid, ids, {'state':'validate1', 'manager_id': manager})
600
601 def holidays_validate(self, cr, uid, ids, context=None):
602+ #for the departmet followers
603+ holidays = self.browse(cr, uid, ids, context=context)
604+ dept_id = holidays[0].department_id.id or False
605+ record_id = holidays[0].id
606+ subtype_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'hr', 'mt_second_approve_leaves')[1]
607+ if dept_id:
608+ self.subscribe_by_department(cr, uid, [record_id], dept_id, [subtype_id], context=context)
609+
610 self.check_holidays(cr, uid, ids, context=context)
611 obj_emp = self.pool.get('hr.employee')
612 ids2 = obj_emp.search(cr, uid, [('user_id', '=', uid)])
613@@ -447,6 +466,13 @@
614 for obj in self.browse(cr, uid, ids, context=context):
615 self.message_post(cr, uid, [obj.id],
616 _("Request approved, waiting second validation."), context=context)
617+ def payslip_toreport(self, cr, uid, ids, context=None):
618+ self.write(cr, uid, ids, {'payslip_status': 'reported'})
619+ return True
620+
621+ def payslip_reported(self, cr, uid, ids, context=None):
622+ self.write(cr, uid, ids, {'payslip_status': 'toreport'})
623+ return True
624
625 class resource_calendar_leaves(osv.osv):
626 _inherit = "resource.calendar.leaves"
627
628=== modified file 'hr_holidays/hr_holidays_view.xml'
629--- hr_holidays/hr_holidays_view.xml 2013-02-26 10:55:28 +0000
630+++ hr_holidays/hr_holidays_view.xml 2013-05-28 06:54:28 +0000
631@@ -10,11 +10,8 @@
632 <separator/>
633 <filter icon="terp-check" domain="[('state','=','draft')]" string="To Confirm"/>
634 <filter icon="terp-camera_test" domain="[('state','in',('confirm','validate1'))]" string="To Approve" name="approve"/>
635- <filter icon="terp-camera_test" domain="[('state','=','validate')]" string="Validated" name="validated"/>
636- <separator/>
637- <filter icon="terp-go-year" name="year" string="Year" domain="[('holiday_status_id.active','=',True)]" help="Filters only on allocations and requests that belong to an holiday type that is 'active' (active field is True)"/>
638- <separator/>
639- <filter string="My Leaves" icon="terp-personal" name="my_leaves" domain="[('employee_id.user_id','=', uid)]" help="My Leaves"/>
640+ <filter icon="terp-camera_test" domain="[('payslip_status','=','toreport')]" string="To report in payslip" name="gray"/>
641+ <filter icon="terp-mail-message-new" string="Unread Messages" name="message_unread" domain="[('message_unread','=',True)]"/>
642 <separator/>
643 <filter string="My Department Leaves" icon="terp-personal+" help="My Department Leaves" domain="[('department_id.manager_id','=',uid)]"/>
644 <field name="employee_id"/>
645@@ -30,6 +27,13 @@
646 <filter name="group_type" string="Type" icon="terp-stock_symbol-selection" domain="[]" context="{'group_by':'holiday_status_id'}"/>
647 <filter string="Status" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/>
648 </group>
649+ <filter icon="terp-camera_test" domain="[('state','=','validate')]" string="Validated" name="validated"/>
650+ <separator/>
651+ <filter string="My Leaves" icon="terp-personal" name="my_leaves" domain="[('employee_id.user_id','=', uid)]" help="My Leaves"/>
652+ <separator/>
653+ <filter icon="terp-camera_test" domain="[('state','=','validate')]" string="Approved Leaves" name="doublevalidated"/>
654+ <separator/>
655+ <filter icon="terp-go-year" name="year" string="Year" domain="[('holiday_status_id.active','=',True)]" help="Filters only on allocations and requests that belong to an holiday type that is 'active' (active field is True)"/>
656 </search>
657 </field>
658 </record>
659@@ -152,6 +156,26 @@
660 </field>
661 </record>
662
663+ <record model="ir.ui.view" id="view_holiday_allocation_tree_customize">
664+ <field name="name">hr.holidays.allocation.tree</field>
665+ <field name="model">hr.holidays</field>
666+ <field name="arch" type="xml">
667+ <tree string="Allocation Requests" editable="top">
668+ <field name="employee_id"/>
669+ <field name="holiday_type"/>
670+ <field name="holiday_status_id"/>
671+ <field name="name" readonly="1"/>
672+ <field name="date_from"/>
673+ <field name="date_to"/>
674+ <field name="number_of_days" string="Allocated Days" sum="Remaining Days"/>
675+ <field name="state"/>
676+ <field name="payslip_status" invisible="1"/>
677+ <field name="report_note" groups="base.group_hr_manager"/>
678+ <button name="payslip_toreport" help="To report in payslip" attrs="{'invisible': [('payslip_status', '=', 'reported')]}" type="object" icon="gtk-normal" class="oe_link oe_right" groups="base.group_hr_manager"/>
679+ <button name="payslip_reported" help="Reported in last payslips" attrs="{'invisible': [('payslip_status', '=', 'toreport')]}" type="object" icon="gtk-yes" class="oe_link oe_right" groups="base.group_hr_manager"/>
680+ </tree>
681+ </field>
682+ </record>
683 <!-- Holidays: Leaves Management -->
684 <record model="ir.ui.view" id="allocation_company_new">
685 <field name="name">Leaves Management</field>
686@@ -290,7 +314,7 @@
687 <field name="act_window_id" ref="request_approve_holidays"/>
688 </record>
689
690- <menuitem name="Leave Requests to Approve" parent="menu_open_ask_holidays" id="menu_request_approve_holidays" action="request_approve_holidays" groups="base.group_hr_user"/>
691+ <menuitem name="Leaves to Approve" parent="menu_open_ask_holidays" id="menu_request_approve_holidays" action="request_approve_holidays" groups="base.group_hr_user"/>
692
693 <record model="ir.actions.act_window" id="open_allocation_holidays">
694 <field name="name">Allocation Requests</field>
695@@ -319,7 +343,7 @@
696 <menuitem parent="menu_open_ask_holidays" id="menu_open_allocation_holidays" action="open_allocation_holidays"/>
697
698 <record model="ir.actions.act_window" id="request_approve_allocation">
699- <field name="name">Allocation Requests to Approve</field>
700+ <field name="name">Allocation to Approve</field>
701 <field name="res_model">hr.holidays</field>
702 <field name="view_type">form</field>
703 <field name="context">{'default_type': 'add', 'search_default_approve':1}</field>
704@@ -350,7 +374,7 @@
705 <field name="view_type">form</field>
706 <field name="view_mode">tree,form</field>
707 <field name="view_id" eval="view_holiday_simple"/>
708- <field name="context">{'search_default_group_type': 1, 'search_default_validated': 1}</field>
709+ <field name="context">{'search_default_group_employee': 1, 'search_default_validated': 1, 'search_default_my_leaves': 1, 'search_default_year': 1}</field>
710 <field name="domain">[('holiday_type','=','employee')]</field>
711 <field name="search_view_id" ref="view_hr_holidays_filter"/>
712 </record>
713@@ -471,6 +495,18 @@
714 <field name="domain">[('type','=','remove')]</field>
715 <field name="view_id" eval="view_holiday"/>
716 </record>
717+
718+ <record id="act_hr_employee_holiday_request_approved" model="ir.actions.act_window">
719+ <field name="name">Absence of the month</field>
720+ <field name="type">ir.actions.act_window</field>
721+ <field name="res_model">hr.holidays</field>
722+ <field name="src_model">hr.employee</field>
723+ <field name="view_type">form</field>
724+ <field name="view_mode">tree,form</field>
725+ <field name="context">{'search_default_employee_id': [active_id], 'search_default_doublevalidated': True, 'search_default_gray': True}</field>
726+ <field name="domain">[('date_from','&gt;=', context_today().strftime("%Y-%m-1")), ('date_from','&lt;', datetime.datetime(year=context_today().year, month=context_today().month+1, day=1).strftime("%Y-%m-1"))]</field>
727+ <field name="view_id" eval="view_holiday_allocation_tree_customize"/>
728+ </record>
729
730 <!-- Assing leave -->
731 <record id="hr_holidays_leaves_assign_tree_view" model="ir.ui.view">
732@@ -516,6 +552,7 @@
733 </xpath>
734 <xpath expr="//div[@name='button_box']" position="inside">
735 <button name="%(act_hr_employee_holiday_request)d" string="Leaves" type="action" groups="base.group_hr_user"/>
736+ <button name="%(act_hr_employee_holiday_request_approved)d" string="Absence of the month" type="action" groups="base.group_hr_user"/>
737 </xpath>
738 </field>
739 </record>
740
741=== modified file 'hr_recruitment/hr_recruitment.py'
742--- hr_recruitment/hr_recruitment.py 2013-05-21 13:38:07 +0000
743+++ hr_recruitment/hr_recruitment.py 2013-05-28 06:54:28 +0000
744@@ -405,6 +405,12 @@
745 applicant = self.browse(cr, uid, obj_id, context=context)
746 if applicant.job_id:
747 self.pool.get('hr.job').message_post(cr, uid, [applicant.job_id.id], body=_('Applicant <b>created</b>'), subtype="hr_recruitment.mt_job_new_applicant", context=context)
748+
749+ #for the departmet followers
750+ dept_id = vals.get('department_id', False)
751+ subtype_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'hr', 'mt_applications')[1]
752+ if dept_id:
753+ self.subscribe_by_department(cr, uid, [obj_id], dept_id, [subtype_id], context=context)
754 return obj_id
755
756 def case_open(self, cr, uid, ids, context=None):
757@@ -493,6 +499,9 @@
758 context['empty_list_help_document_name'] = _("job applicants")
759 return super(hr_applicant, self).get_empty_list_help(cr, uid, help, context=context)
760
761+ def _needaction_domain_get(self, cr, uid, context=None):
762+ return [('message_unread', '=', True)]
763+
764
765 class hr_job(osv.osv):
766 _inherit = "hr.job"
767
768=== modified file 'hr_timesheet_sheet/hr_timesheet_sheet.py'
769--- hr_timesheet_sheet/hr_timesheet_sheet.py 2013-05-21 12:23:59 +0000
770+++ hr_timesheet_sheet/hr_timesheet_sheet.py 2013-05-28 06:54:28 +0000
771@@ -28,7 +28,7 @@
772
773 class hr_timesheet_sheet(osv.osv):
774 _name = "hr_timesheet_sheet.sheet"
775- _inherit = "mail.thread"
776+ _inherit = ['mail.thread','ir.needaction_mixin']
777 _table = 'hr_timesheet_sheet_sheet'
778 _order = "id desc"
779 _description="Timesheet"
780@@ -70,7 +70,9 @@
781 raise osv.except_osv(_('Error!'), _('In order to create a timesheet for this employee, you must link the employee to a product, like \'Consultant\'.'))
782 if not self.pool.get('hr.employee').browse(cr, uid, vals['employee_id']).journal_id:
783 raise osv.except_osv(_('Configuration Error!'), _('In order to create a timesheet for this employee, you must assign an analytic journal to the employee, like \'Timesheet Journal\'.'))
784- return super(hr_timesheet_sheet, self).create(cr, uid, vals, *args, **argv)
785+ timesheet_id = super(hr_timesheet_sheet, self).create(cr, uid, vals, *args, **argv)
786+
787+ return timesheet_id
788
789 def write(self, cr, uid, ids, vals, *args, **argv):
790 if 'employee_id' in vals:
791@@ -86,6 +88,14 @@
792 return super(hr_timesheet_sheet, self).write(cr, uid, ids, vals, *args, **argv)
793
794 def button_confirm(self, cr, uid, ids, context=None):
795+ #for the departmet followers
796+ timesheet = self.browse(cr, uid, ids, context=context)
797+ dept_id = timesheet[0].department_id.id or False
798+ record_id = timesheet[0].id
799+ subtype_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'hr', 'mt_approve_timesheet')[1]
800+ if dept_id:
801+ self.subscribe_by_department(cr, uid, [record_id], dept_id, [subtype_id], context=context)
802+
803 for sheet in self.browse(cr, uid, ids, context=context):
804 if sheet.employee_id and sheet.employee_id.parent_id and sheet.employee_id.parent_id.user_id:
805 self.message_subscribe_users(cr, uid, [sheet.id], user_ids=[sheet.employee_id.parent_id.user_id.id], context=context)
806
807=== modified file 'hr_timesheet_sheet/hr_timesheet_sheet_view.xml'
808--- hr_timesheet_sheet/hr_timesheet_sheet_view.xml 2012-12-17 11:14:02 +0000
809+++ hr_timesheet_sheet/hr_timesheet_sheet_view.xml 2013-05-28 06:54:28 +0000
810@@ -177,6 +177,7 @@
811 <field name="date_from"/>
812 <filter name="new" string="In Draft" domain="[('state','in',('draft', 'new'))]" help="Unvalidated Timesheets"/>
813 <filter name="to_approve" string="To Approve" domain="[('state','=','confirm')]" help="Confirmed Timesheets"/>
814+ <filter icon="terp-mail-message-new" string="Unread Messages" name="message_unread" domain="[('message_unread','=',True)]"/>
815 <field name="employee_id"/>
816 <field name="department_id"/>
817 <group expand="0" string="Group By...">
818@@ -188,7 +189,7 @@
819 </record>
820
821 <record id="act_hr_timesheet_sheet_form" model="ir.actions.act_window">
822- <field name="name">Timesheets to Validate</field>
823+ <field name="name">Timesheets to Approve</field>
824 <field name="type">ir.actions.act_window</field>
825 <field name="res_model">hr_timesheet_sheet.sheet</field>
826 <field name="view_type">form</field>
827@@ -210,7 +211,7 @@
828 </record>
829
830 <menuitem action="act_hr_timesheet_sheet_form" id="menu_act_hr_timesheet_sheet_form" parent="hr_attendance.menu_hr_time_tracking"
831- sequence="2" groups="base.group_hr_user"/>
832+ sequence="11" groups="base.group_hr_user"/>
833
834 <!--
835 Company inheritancy

Subscribers

People subscribed via source and target branches

to all changes: