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