Merge lp:~openerp-dev/openobject-addons/trunk-visibility-hr into lp:openobject-addons
- trunk-visibility-hr
- Merge into trunk
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 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
OpenERP Core Team | Pending | ||
Review via email: mp+164834@code.launchpad.net |
Commit message
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://
Thanks,
tta
- 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
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 | 55 | 'board_hr_view.xml', | 55 | 'board_hr_view.xml', |
6 | 56 | 'hr_view.xml', | 56 | 'hr_view.xml', |
7 | 57 | 'hr_department_view.xml', | 57 | 'hr_department_view.xml', |
8 | 58 | 'hr_department_data.xml', | ||
9 | 58 | 'process/hr_process.xml', | 59 | 'process/hr_process.xml', |
10 | 59 | 'hr_installer.xml', | 60 | 'hr_installer.xml', |
11 | 60 | 'hr_data.xml', | 61 | 'hr_data.xml', |
12 | 61 | 62 | ||
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 | 151 | _name = "hr.employee" | 151 | _name = "hr.employee" |
18 | 152 | _description = "Employee" | 152 | _description = "Employee" |
19 | 153 | _inherits = {'resource.resource': "resource_id"} | 153 | _inherits = {'resource.resource': "resource_id"} |
21 | 154 | _inherit = ['mail.thread'] | 154 | _inherit = ['mail.thread', 'ir.needaction_mixin'] |
22 | 155 | 155 | ||
23 | 156 | def _get_image(self, cr, uid, ids, name, args, context=None): | 156 | def _get_image(self, cr, uid, ids, name, args, context=None): |
24 | 157 | result = dict.fromkeys(ids, False) | 157 | result = dict.fromkeys(ids, False) |
25 | @@ -218,6 +218,13 @@ | |||
26 | 218 | 218 | ||
27 | 219 | def create(self, cr, uid, data, context=None): | 219 | def create(self, cr, uid, data, context=None): |
28 | 220 | employee_id = super(hr_employee, self).create(cr, uid, data, context=context) | 220 | employee_id = super(hr_employee, self).create(cr, uid, data, context=context) |
29 | 221 | |||
30 | 222 | #for the departmet followers | ||
31 | 223 | dept_id = data.get('department_id', False) | ||
32 | 224 | subtype_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'hr', 'mt_employees')[1] | ||
33 | 225 | if dept_id: | ||
34 | 226 | self.subscribe_by_department(cr, uid, [employee_id], dept_id, [subtype_id], context=context) | ||
35 | 227 | |||
36 | 221 | try: | 228 | try: |
37 | 222 | (model, mail_group_id) = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'mail', 'group_all_employees') | 229 | (model, mail_group_id) = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'mail', 'group_all_employees') |
38 | 223 | employee = self.browse(cr, uid, employee_id, context=context) | 230 | employee = self.browse(cr, uid, employee_id, context=context) |
39 | @@ -261,6 +268,9 @@ | |||
40 | 261 | work_email = self.pool.get('res.users').browse(cr, uid, user_id, context=context).email | 268 | work_email = self.pool.get('res.users').browse(cr, uid, user_id, context=context).email |
41 | 262 | return {'value': {'work_email' : work_email}} | 269 | return {'value': {'work_email' : work_email}} |
42 | 263 | 270 | ||
43 | 271 | def _needaction_domain_get(self, cr, uid, context=None): | ||
44 | 272 | return [('message_unread', '=', True)] | ||
45 | 273 | |||
46 | 264 | def _get_default_image(self, cr, uid, context=None): | 274 | def _get_default_image(self, cr, uid, context=None): |
47 | 265 | image_path = get_module_resource('hr', 'static/src/img', 'default_image.png') | 275 | image_path = get_module_resource('hr', 'static/src/img', 'default_image.png') |
48 | 266 | return tools.image_resize_image_big(open(image_path, 'rb').read().encode('base64')) | 276 | return tools.image_resize_image_big(open(image_path, 'rb').read().encode('base64')) |
49 | 267 | 277 | ||
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 | 16 | <record id="employee" model="hr.employee"> | 16 | <record id="employee" model="hr.employee"> |
55 | 17 | <field name="name">Administrator</field> | 17 | <field name="name">Administrator</field> |
56 | 18 | <field name="user_id" ref="base.user_root"/> | 18 | <field name="user_id" ref="base.user_root"/> |
57 | 19 | <field name="address_id" ref="base.partner_root"/> | ||
58 | 20 | <field name="address_home_id" ref="base.partner_root"/> | ||
59 | 19 | <field name="image">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</field> | 21 | <field name="image">iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAIAAABMXPacAABGl0lEQVR4nOW9Z7NlSXIYlplljrnu2X5tpnt6vMHOullgPRbA0ogESSwAGolUUCFSn6TQN/0afRAVIZIgSIWEoESQ2IXb3cE6AOsG2NnZHde+n3/XHVNVmakP597br7sHTprXA1AVHa+vOfecqvSZlZmFzAyPcCgKAKBS9xaVUB+8RkCBAABFlRBUARFVGA2pAqsCYWL2aFXVEIoAGQAAZrUWVYGFiRAAQBVBRYCMUcXVI5avpHv6qW8e9aBH/kS8t/w/8RKUDg0AqoqgCEJEHJkQLKLG6I1BFGsQCRBEWJTVGOweYI0hREJUABUgIhVFVEQQkYcm8/6B/9EjABXxfnpTBKHFX0EQBEVgVRElRENECJoEAQxIrOcoKfPeghii2DazkxNlJkREQJEUOSUBBRVUQRQgNESkyqCKAHgfuHGBlvdv4CMWQe86BwVEgHuiCEFADaCIxLbNsxxVwnxGBDGEpmlv37n15htv3rh1azhae/nll1948cXZfJ7npSsLjoyEiCQKiCDMCApEHKO1lqwRkZUs0u5h8G5y8FGN9x8BiqhLSHSDENsUQSDPHIjEqr5z8/rRwUHm7HQy/va3//D733+1bdusKHxe9Hu9z3z2sx/92Mt52c+KwuelqqQkYAg6WUSkzADQyR9BQKRO8pxCAJwmgEc5HjUCVqTWifZudFJ5JYwRMIZorFFON99+J1TV9Ph4/+7t69feee2P/+jWzZvCbJ3rDQdF2T+ZjAej4RNPPv3SSx987sUX19Y3AamNbVH2yRgi1JSIsD8aAZGmpASoqIgKBECMgKAG4P9HCOikTYcABVAAQhJOCEhEIkIIoIqq195+E5Ps3b3zjVdeOTk4mE/HN65fE2FvTBKtY2hDRALnfF70Ll25srF1bvvcubLsz+sqz8ut7W2X+X5Z9nrFzs7OzrkdcAbIcNuQdWo8AEZRJLSLibwP41EjgBSgI/kOAYghBGuMQVRRa21qWgVJMfzoh6/dvXXr5jvv/Oi1144O9h1SbKvM+5jCbDJNKQWRNsY8y3u9XhKp28giWd4rypJVVHG0NhoMBmvra9bQoF9evfrE5cuXrzz5xGhnR5JwSOgyJbKG9D7T6JGO9xkBDOCQYmwIyVpbT2cc0nw6/v1vfePrX/u9ajbbv3vn+PBgNBgM+z0U8N7u7+97b53PEEwbQt3W1byq28bazDrXtC2ScXmGQEVZ9IfDtbU1VJ7NpmRoY2Pj4sVLn/38z33kE58ShiSAaJCQ3j87yD7qB6rCktsVAEGZU2ca1pMJh7h35+43v/7Kd7/zh3dv36zrJrO2V+bzySTUdVnmMfl5XeX9Lef90cHxbDZrmgYQjSFU1qSIEtvQVDMkrGa2mp6Qxs3NzbV+r67n48P9+WS8v7c7PRn/9N/6O1o16BDBPGognBqP3AqShaiVhQcioIAA3Ib5eLJ3+9ZXv/zVr7/yFUlVXVd1Vdd1nTmXe2+siSkOhqOTyQkz93t9TSqRWbgbIUVVdc4hYIwhCquIKAxGw62tLWcphDY0tXGuGIxcXvy9X/oH/8UX/j5zEkVj3jccPHIOAAJEUEZABQVVUNDEJ4f7P/zj137/a9+4+c617c3NlLKmymOvdc7FEKaTKRAC4LyunHNtCLNqTowGKHFMKQGAM8YYjDEaa8s8q9oGiVyRFb0y994SSGrVmulsFjhZX/7Kv/rftnYufOxTn9b0fhrijxgBCIQhJueMpgjKNnPQttffeuNb3/zmj19//XD/IHEIk4lDuHLxEgvneVZV1Z07t+7e3TOIHEOel/28HJ+cSGAAcJb6ZVEWBUssywKQYkxgjJlal2cbm1torTVGJQ28Z2Glk/2jo7X1bD49+Zf/y/886hXPfOgjKUUkC7i0iAEBEBfOgQKAYmdAv/e64hGLIARE6YI2nBCE6/m3v/F73/n2H968fmM6ncYYRdUAjoqeMTCvq7zIrDNt0zRNE0Os6oZZM+cNUQwJQBHYIaByCkFA8rKsQ0Ljs7JE631eWmuRsK7rGJNIFNW6aWazufPOO/eBn/iJf/7f/w/bV59pQuOsB0UiWrrKHfQFFgg4k6jRo0ZAYnWWOLJFCfPZN1/58u9/4/f29/aOjw6aJoiqMTazrlfk1lBKkQhYmaxBBGUAxX6/t7mxNRgMnTHCaTYZ7+/ePTk6iG0jqL1ePzHUIeb9web2uZ2LjwHi8fHx7u7u4eFBN4ksy0IK0+nMWjvo9z/x2c/+t//j/6SoBJRYrHUiiovgiHbhW4CzQsCj1gHOEUc1hkJdf+Prv/flL//OycFe2zQikueZ97nzngCEOYmUvV7RyzlF66whms+rIi8uXLi4trYOCsq8e/fuyWTsvNva2gxNDYYQEcD0FIDM9sZGZs2d/f3ZbEaE3vumadoQnHOc2Bo7PjnJs+yrr7zy4U9/9uWf/HSMLSxsND0F6xU3nMl4xAhQFeAUbe73du984+tfu3ntHYsAoJubm3leMMt8Pp/M56Fts8z1B73RaEhEzlllGQ6GeZ6XZRFCG0LIvU8pNE0d6opjkBjW1tY2t7ecL8bj6bxpbr7zztF0mpA2NzbKomibpm0aUJ1MJswcYyyLcn9/3/f7r3z5yx/60MtEiEQqTGR0CfAudqtnFq17H/wAn7tYz7//7T/c372TZ5lBWF8bDAeD2aza3zs4PDoCpPPnd3bOba+vr+XeivCg11sfjebzeVVVx4cH08mUOSESJ84yz6Gu501u/WQyyfPi0mNr9byaxdjMKxQdDntF5onIO5PlWYxpPD4Zra1NZ7OBc957Avjed779o9f+6MUPvSwchQUF0BDc071wdtHSR4sABY2R8uyN137wW7/5penxkYTWGcwsxLZJSZyhi+cvGO+2tjctmZOjQ9CU+wwTT4+O2tB6nwFzNZ8dHx0xS5JkCSwiAsyrWZ7lTVMd7h8gQOF9PZultp7NAFGHg+HaYMQxtU07HI5ExFl7cHCwfW7b++zOzVv/6dd//dlnnjNZjqhI2G3EPQKQnC0CVO+jHBW1mZ/u7f2bX/nX77zx40Gv8AiG6PjoCACyLHfer62PYkrWGEPoiqLwRhM3s+nR0f7J8XFi7vfKouzn3qSohSua+Xw8mykzCAvH0WgwPj5R0DzLjUEVbmZTb0zjHCeJIXAInMQ4453r9XrVbG6sGxTlb33pi5/6xCc/8bM/RwCAqkCPZp/yke6IIQEov/KV3/nud/6w3y85RmOons9RJbMu894aK5Fj006ODyHFzKCGcHywt3/7hjTNxqCXgc5Pjtv5VEMbqllqa2+o9N4gCvNsXs3ncwFmSW2sM283N9acNaFpSbVpqqZqRHg8PprPZgBARCHGalaVeaEhfemLX9TQIpGwPCRy6Ix2Lh+pCCLCNJu/8pWvbG2uV+MxSKqr5C3lWWat6xVllheJ1RggkPl0EgkLbwtr+qOBRWrbxvSKkymH2RSJUgwAao0lBEOg1o3HJ8cnxwpqjVF1AGqMJ0QA6ff7w+Hgptytm8oShbZlZhap64ZZrXNro9Ebr//4rR+/8eRPvJQkWuq26c4eJo/gGd1QVURz587t6WRcOl/kWZFnqFLmea/s9Xs9Ea7nVdM0vX5/a2N9fdQHTUf7u/X0pHTGokhoJYW1frHWK7mZD8rSEsW2Dk3V1PV8PnfOSZLjo8PZbMocvXeGsMiL0WjIKYY2sgQFHQ1HeZEbYxAJEefz2Z3bt1JoTo4Pf+s3fwsB6BFGRx8hByCCQp77zY31t9/4kSUse2W5NpTEnMJoOGTVlJgTZ9567wZl2c/cQQzTo8PDFJ0xRZ4V2SCEhAYJNuaR20kT2yAA1lhxICJJmBAUoQntvJobXxRZP8+LEEPbtKiY57kCorVV0yCZPM9TTOvr6846Bf72t//w9jtvXrz6VGLG/wyUMCKqKgKKCgKCajWfTyfHeZ5risN+L3OuqecxxePJceayzfUNZS0R4tH+wW7wxm4W2XBrwxljrAWVze3txDKZzzY37LRqvPN1VTnv0RBzksSGEACcc8zcpBRjE2MiiUWvn1sDZU7WhCgQQkyRRcuyIIJBv1dkHi0f7N79+u997ZevPg2qIF2+xMoR+0uvA1DvbfN2kSsUwC7jIYmxBkBe+crv7O/ftYCDLHdIqtpbXwOSycl4Nj0eOdNDh5P5AOvQtkXZK23h1we9wcj4LIn21tayogwxIXk0OJ/N6tkUNBlEBAlVpSmgQgxxOplNrDmYjo/m4/nsWNs1m/cFSDhNZ/NZXQ3XRnVdkzFlb61X9Kw1wyL3ia+9/VY1PiqHo5QSIpK1wgyqaKyegTdwVhyACAqQJHnrYojWWWUB0b29PQTsl6WEGGOUIA5FIDmEPPP1+MQYt9Vzpct6m+uD4Zpz3mZ5ORxmZY8BTVa4vFA0CuCcB1WJbdvMU2iQGTgCM4fQ1u3J0clx5r03Sno8nXFbKeA8pKNZNW8575UGMfOZtcY5hwDOWySzs7GZZ1k1n5ejdUsGDHFKRF3yVxcgeo/H2YogaywAEKKIGGN279yu63pjfYNEnPUbGxvz2bSez5GkcNYakqpWJ5nvFYXJi9JnucvyotfvD9eyXl+QkqB1mc9zVokxOWvJO+dNar1yghRRmGPMs4ho0BBYotyvjepZEyd1y83cqIzKIu+XrKqJk2hsIxp0PkdDRGZvb286nW4CphBsnhEREnFKCoJo3/Og0FkhYLHpqJpYjDGSEjh7+/bt+bQaDkYS257zvaIgSBYiocZ6Vk3GJdmN9dHGaFiWzvus6A+Kfj/vDbKsROfJGI4MAEhEitahgCCi994RcQqaSGIkQFR0uc+yLM/9SH2RuVGUsmpT4qaZNO0YQRRtXuRl2VOgqCnP82IwGAyHuwdHP3799SeeexGNUWaydiGL0JxFSO7MOEABEIhIQZEW296hrqaTSeHIESROBweHDtkSkogKM3PPuVHP93q5z3xRlL3BsOwPbV4AWSQraIwlRGRhADSWVECYEQGQAFEUBUBVjTF5UXAIhKmXu6oNLJgXcT6bHR0dpaZVQcxzsqRcZmV2cefSeDKdTCc+K5Dw1e+/+snP/PRgYzOGBpbh+s6geM/hdLY6QEARIIbgrK2ns6quydBkPAZNm6OhVXGezm9saGzn3M6tcaj9wm+sDdTYPO85n5NxxnhwhhURyVmjqCJCaEABEIkMAioBGQdeVQSIEcFZ6zMn0RrMMu+aNsYYhrk/tzYwxraCIcWTg6PJyQy9u7N3VxDbmBDtxta58fHJ63/82sc+/SntHoHInBDPZN/4zESQAiCgAnNCRBERkbZp8yw/2r1tCEIMTVunRgcOS4T1Xn+A0M/caNj3zpIvyFkig4bQEBmHaJJwl9uMAGC0CxSLqqioMGjHbEat4xA4JQAgYzw60FDkWdM2o15eN70sL2aBp00CilWI83GNTWWtz3rldDLtDUab2ztb21sK4KxNzEhExiroA57Be8ITZyaCEAAAEY0xyxxMrObzu3fuGjK9ftGEkBH1B6WKrG+sbRSFJ0HlwaBnnVNjkEgJgBCIlIwxRpOKiAorAKmqMYpdtjMuE44QAEUUVVABmAkQyRImAM0yN+yXTWh9giypTqomMYMnnwVUQMrzHBHH47HLiv39/avPP88hEBEZE1NEIEPvPROcrRUkIoZIRQExyzIWXh+N+qXfO9h1FgNH7/3jly9tZdl66TOLbV05b12WARohQkRRFVWjgmgBUVVEEgKwKqAHNLhwkQhUCA1rkMQkgAqQhCOr0SSqoM66fpE3/Z6Nim2a1oEIDQE5JykVw6Goqoglc+vmrd/+zd+8dPHShatXpOMsY1DOxBE741gQggIwM4Aa7/uDwbmdc7P5zBhq2sYV+drGxmDQz/LcGEdoAFEQAYHIECIqaOIUYgghxqjCoIKKhIrAmhKqdIUYq1ILUgRVYe1GEmEFMMZYl/ksz7Myy7wzzFGEDSEhOOfKfl8B1kajtbU1AEghvvbaD7/xjW+kFBdZR8pnFCA6WwQQLu6vzKCyvrbehrbs5Vnpszzb3NiMMU6m86qqUmJEdFmGxkVm4YjKqiyqwinFmGJSUEI0Fr01lpBAUYFgES5QRVlm/ApLilFFWDgJCBAgGmucs9YSInCMqmKJjDGqoKob6+tlWbahJcSmbYb9gc8yTkxEhAYB5Wy2hc9QBHWJV6hgjAEVINzY2nTeZ3YIBgFgVs37FmfT6WDQZ07M6JwTQyyCygREFgwhIAqCCHvM1ACSGMQkrIzd6Bw9UAXpQh8EqqpJu7ok6nJv0Vibg1jvZFYBAaCKJlUkBGvN+Z3zgPiDP37duqyq5s7bl19+2XlP1qSUrHX68B7BezHeWwQQLKJAq1QOAFEgTKoOsVa1WdF3vaQwm82V1RoTY5OSBcgjA5Mh48nYJODIIxpQMKC2K6oQVgAWiqBMmaAKgaLSQlZF5IgcE7chzZlbgUhOwYNGddYSqBpnrA3CASCBgjFtUxPAoBiFRou1nu/3j/aOOMSTg4Oqmhvn2pQIyAjKQ+G498QteI9FUDcjWb5CIkBQ1S77qOiVw7V1IhcTd5nLdd20TYMgoEkkcVJEMi4DskAGkFSVOXFsNYaUooiIQBIUwCgcOKUUJSVOCTgppxRbjk2KbYohpFaAicBb4wyBamfH1m0IMbKqoiICx5SbjKMcn0zL3mBza3M4GDhrv/u9757MxopojYOW8S8/B6xCoStCkZSwM8adE4BLFy5cvHRp78b1olcqiCIIABlDRKLKiR2pQXTGOEBAQBUAlKQMyYAYULJeQQAQVBygUUVUlaghaBtQVWNKbeSYEjMqGrDeOFIlxRgTJ9YksYncBCOAiTO0J/OKU+z1yzdvXw8xDvLywsZWG9PB/n5K7IwVFmMICP8KhCJwGThf4AA7H0AQIcW2l2fOWkRc39gKoZ3OxjnXm2t943yXDYiEi1pGg4k5hdi96RSKglpQBVRFUPXGEiCgpBihDRIjKrd13dZNjImZCY0xFoFYWGJqm5i4C78Jp0RqLFBuEURjjEVZAGiR5yrp8GD/sStXXnzxhSLLAKCNsfQZ6JkUcbz3Svh0vRtZo8IpBSJjjAHAzFoWNYYMGWOst0Wv18+zEoBVBQBUVJitM6TIAsyMFolMTElRRRUAkEUBIxCRVVUOIYTAKQqnto0siMaqCIMwK7esIUDSGFLLqWliiomjKFHuvIAd9llAfGZ7vYKQpAnq5Mpjl158/rk8cyyMFlVV9C99OFpRlglMC9XSmeNIxhABQjsZN/MZIZRlaa2dxThp5mZnu+gN0uSImTNFBRSWRELGWiRNKKoJVEQhKnECUVVBBXSFiqhqCE1VVSmlbkvSeE8mawDbpuGYiBQ5eaSIGBSqFBIhAyRWn1kWGvYHbtAHAFTJvC9cNsgKaZqjw8PNy48nidY6EEQi+CsRjEMFVBBasgEhCnJKyPzGq3/8+h/90Xw+e/qF54osuzGZmFhbb40hMRYUmNWINrElQWO1TSmkRNY6YxMHBUvMKUQE8c4rKJAJTX08njRt07Zt5FSHhshkZbl3eBBCKwD9vMys7Rc5uGwyndasmGXkQ6wDKdjMW9K6aQ4P9jPnY1PPTqZcDG/fuLHz5OPPfPhl5oRgRTuf8r0fZxYNFQCCqIqgFgFRVfXg9q2B9/1s5BGq6TS17cWd7Y31DQAw1iVRJarbJgkrwNHxSVIl54CMsU5StIS5947AgmpZ2qxEgiRShXo+nx+Px7uH++P5vA7Buvx4Mm5CQEODvPCI66Ph+tpoNpu2nCpm8B5YGKHwPmqMTVPNZ8eTo+nhUc+4Ksrd3d2Tu7sACzdvGXF679XAe4sAWSnghcWAqArabQyEqh4fa6i2Nte9sNO0vT7aWBtl3iMRgybhKoTj6WQyns7m1cHxYRBlwMCsCs187i1e2jl39dKlnnfW2L41YCgZCMrX796+duPWwdHhtG5PptOqjeSzwGk4GPSLObcxu3NnWBZACMZEAMo8OUdkgdB5z/Omms3m4zEIFz4/3t8LVRWqCiBZpDOtX33PEPCwDQoAgMigpGwAECAzZna4f2l9MMzdILPHMebW9Pt9CLUiJcCTo6M7u7uzuqmrJrDMmmZSVSFx3TShbSzwdDJt66a05hnVtQuPWe9tlieWO3t7N27drtp23rbTqqkiEwMrZKV6xp1z54rMg3BVV00IQdgDeJ8TGYtEziIiczq3sTE7Pp4cHZnAGaFRBlAiEgVRpbPJ03qP/QDUZXo9Lf5XBRaxiOjdzvraY9tbEOq7N97uebc+7E+PT2LT9rydM8/q+uD4eB7a0cbGhccG06p56/q1O9euV01omoYQcksS2RKMsuLqE085n+V5KaJo7GQym83mDCCKedEbbg/nTTgezw4Oxnfq25PNjQs7W9tbm5tb55q2mdZzILJkDAKoEoA3blAWMTUcAqaUk7WOcusAUFUIARDhTNyA9xQBsrJ+usIe0zWbQSCEyCDaL3ulo9LibN4AUajn87Y9GR/3tjat9ynFvCzODfpFOXjnrRtf/cY3Zk07rivrMyYzHI2GhYemZsYkQmSKonDWEgIixBjbpikHw96grBI88cxzTOad67fq+RRinVl7eHBcz2dPPP542S/RIACpAAdRZOOdJUCA2IYyL0hAZ41zWZYXAFZTi851bYvOYryXCKDFLgwAqSKCKioTIoFRQixzv729vb1dSDg+HtehHRVlQIptYE5Znq9vbpQhJpW337n52muvXb548cKli/vHJ1U1B8CtjQ3k1M6n59ZGzuD65gYay4KgVLi8l2Ubo+HG1lZelgz0/NVLg9Hak9vr1XTaL4qyzO/u3n3zrTfqamaMIELmXBRmVVbMfG59qCbz+fFJ3xpHRorMZkVvcx0AlFWdsogh/EudF4S6KCaRRR8SRQCPJKIIhgGIbL5zYbS9DQd3hmW/OjnZ7I9q4zFpNa+8t1ubWweHe0e39zXFz//sTz926bHNzc3QtE1dNXVzcny8e/d2trP1zDNPpRSGo6EoWmMIjbe2n/udjcEHPvC0scaQXRva9aF/Zv2pWDd1007q2mysnRz2EkePmpeZd34ya9Dnapwr+r6R2dHB/OCYHK6PBuCtHfXOXXkcAMgYUBQRa+xfpU35bqgoIRKRMLNIf2O9NxzNj/b6ZTms20lT5XkmqCHFMvcGsczLrZ1zmzsX1kdrbYipbbwhNWbeNoe7dwprd85tr48GAGoIOAZLhtsWOa2PRsox964oi6pux+NjSFz6UkQYIEkS5YvndzbW1/Mia0OdGETGs0aFPBnb6xV3rk1j2yawAGS9z8veY1eugDISIZECMMtZqOEzzw3tXpAhYXFF0dtYq265zfVMWKu9GixF1MASmlC6bG20trZzThRj3VTz+cH+rorOJtPJ+DjL3Pmdne3tLVDJcp8XRayqDI20dTObOYBBWcYQh6PRVm/QtsGQj8JV2xjvXJad759/PH98fTSo6+ro8HBW14YIMKHBKJGFVcUYo4guzxIiOb9x4bxyUkQAMWeTkwKPAAEioqrG2K5pWH9z87jfH2JmlWZtNYUUJLF6SZqRz8tS+1mboifqlcX4ZDyZTBEHW1uba6NB7rN+vzAEBnE6nUFCzHNMaT4dx6ayCLl3ZV74orDWZ74os5JJ0dsYozMu955DqGIqvauqWoUV1HjDKipalHmakagKYGDubWxAVoIIEomIM1b+8oejHx6qiojMbIwBBBBxa+vJmBSSJRr1e9P6JEoi653xniwKBhEwxmW5sPTXNtY2tiSJCHtryzyzxqQUQtOAIohKaCElaRuN0ThLAiCaeZ/nPQRCwLzMXL+MTbDGWgEWLZyLDWhiSUkEjKHEEZGtIXI2c65NHACeevoZEAUFFUBCYQE4k5KNs8+KMEZVRQQUgAh6vWDd9HhiYpt756MNBn3urVhJqkmQyFhLANahUiAy6MQDlHlOCJqiCLaRWdABxLaNbatJDCCqxqZp62q4vt7v90GJ0LAFAHTek0CKDSR2SBIThxhjTIzAqQ0iSdq2LotifTgMLAL0xDPPwsL+J0JUkTOqFjjbTflOBBERdLlyKmiz4dbONLQhpRTaLLMGwRgDaGMUa61B4sRIFo03vgDrs7z0RZ98AeQSUxskRohRjDPWuJQiCgzKfmYyjqysEgUVnXPD0WjQ7ztrLRmJSRPHpg1NqzHFtuGYnLEcU0xsCEPTDoaD/nCAzmb9wWOPXwVFIKeCqkBn5Ac/4iI9BQTy/a0dU5auzIteaQE1RGVJwkElJYaUkBWUyHjvMu9yMhmQVUDjMwGo6zqlZI11LkdjEK31WZblzrkU0vRk2tS1xOTQkIK2ySSGEFPbhqZt26ppmqZuQgggoszCrMKEMBoNfObBGDT2satX+ls7YCyLKioRarfpfwbjkRbpiSoZlw3Wg3G+n233NsdvVZPpnJIm4SCpja0LCmgA2DjpGip2/AMiKcX5ZDqfTjMiKgq0VomYCMiI4mxaVaE5HI+zotja3JbEqQkptUqSmhibNtZNaNoQ2iY0IQTmlDBxiqAYWu5SKdoQosoHP/pR3++rKAt0pI+Lnbr3fjzydjVgst7IDobzdtxX3RgM5uOZJkmIQdjExjRCzhFFTUa7QDAagwjM0/FJPTnBEMha5JgYgCxSRtaJ4mw2YwAOMp1MVVRCrEJUSQDCMUkbOUVOzJwSxxADq3JKCZNxGQEjgLEmplT0ei9+8MNgTEpCCwXGizakZzAeKQIQiVlcf7h19cqd730T2pNBVvSyQhMngpYjNtFTzLQUrRMzGTLWglBSiVU9PtiDEEpHhhNGZgVjLHnvstLnBZAZloXrFW0TZseTfCsDUU0JlJFZU+IYQ9s2bdM0dRtD1y5KY0LjWBJ2xj7h5SuPD9c3QAGXuafKCqCAZ1Im9qhbF4uiWjvauWh8DjaPISGQxMgcmUOIbQpJ2jbU81jPObQaW66rZnyyf+f25HCfOOXOWgJP5J13zjnbJbx5a1yWl1ub203d3L17FzvdrgoCwIsUx6Zt5nUza2IUJbKEBMIqbI0tB4O831/bOffihz86HA5VREQTLyxpIDwjWJ25FfTgUJCgw9HmaOdKLZnpr/sij6kyEhwwN60malqJrISoKUkI3Lb1ZDo5OOImFVmJaAUMGlt6yi0aEFAQogA0qdt53RLZ23du7x/uMQQlSKACgsCc2tC2VRvnAVrwCZ0ao5pSqF2R1wKHTVuhba2DcqCABtAhECBQ12L6TJTwI2/ebTGmgHnv4tVnW3DBZJoXCZSBOaU8z2OIHb1FZlUFhaZuJicTQhwMB3XbHh6ftKJ1ivV8Pjs5rkPTcjiazRLRPMTxdFY1zeHx4e3bt+qqspkja9GAKosmVhVFBooCXQ6YJbQGXZ43woPNreHmOfI5c+g2ABAAUfSsQtEAj1oJoyZVsAYQe5cuXXrm2fHuTSx6yeez1CpArywlpm4TkIUREVTr0FZt2x8MLly48PoPf/id73zn0qWLzz3/vM7n4+lsNp9Pm+poOr5zsD+djJ0xztLm2lqMqZrXed5zzjITdxUDoAIqqiLMqARESIIkQE8/98JnP/f5crSxsb2jXb+gewL/DDclH3W7GiIEZ2KorTWXP/yhrb0dI+HbX3vl+O4NNlS3dWmQU7A+N+RUoQ4xCZSj0Wh9nfL8wtWrP3z7rdfefiuSyXuDwDyZTG7duXPz9q3JZBLqBlE3h8PB+qgsezGm0Aafe+2SqgyhRSBAQgEVUU0iygo2qvnJj/7k8y99kHzh8lKEyC5Ty864o/GjbtiUJCGAcQ6JVKHYOo+ZHey8effuLZfYceyVmSh3qcgi0qZE1vSK3GQ+qJg8/+jHP35wcHD92o3dk+n+4cHB4WEd27ptWk6+V6wNBjsb64P+CAQNGQVoUwIEJEDT6SAFREQSAEgMgIomH4wef/qFwdomGIc+B+z2k7qEPAEAQFm0+H6vxyMWQUCiZIwyxyQWjaAzrBevPvX2D3+Y2jEQ1nU9MJ5ZMCVFWNR9edfEpCEiYjkc7niPzh0eHO3u75G1G2ujWT1vqrrfKzeGo7VBLytyAZjNZzbPMlcQAhpEQgFYWLfGImuSZAnJ+qeff2Fz57zJcwDDKssw+qp5nHR4OwuQPGIRpNYQqAggAoExRFZTu3bxymB9o747R4RQN1wACosggxCRgM6b2rlMRbz3mjRF3tzYFtadc+fO7ezYIt873K+ruiiKMvPrw5FRbWMk1cOjo3W74S0qYhQOMWoX1yfiELz39Xy2fWH4/Ade2jh3nlWIFs2yTgkePdXz/a9aNPThgQKAYLuCr465jSOAi1ee+OMb1wKQNVlKTMqaBAzFyIpgMi+cOKTYBm9svyhBANc26/MXBTDrl6Ne/2Q8FhUSQVVCZOHISujrtmkaziySMUmFrBFIhOi9T8JF2WMWNMY6y8zLcsJHB5BHjoBOnC6LWBUBlADpylPPvvVH35seHVhvW1aKAQwZsDEFFskJYssq6o13hgxgCmGUly8+/SwZmte1jYxNQEOWqA112zSTthr0++c3RlVTSQp22EciBemkkBJm1oeqKovs6PjIOgureO1pDCictaX+6GNBeu/QHOyCbIyg+cbGsy99+Du/+5sminFgY/DGxxg4prqu7t66dXIyHvSGg6zMbUYAMQRj7Gg0AoW9vd3d3d2qqpMk42hWzWbVrE3tpcuX1nkDLDqDrCIAqhJiTIvtXen1+5OT43Ebe70SAEQikSVaJmEDLLtWAuhKK7zH49E37wZQWiWxKwBYAklA5rHnn7/2+usnu7supMyBU5diYuaqqu7cvr2/u785XD8CA0kzctaamFIMYTafcUzdqT3zejYN1bSe29wONkdJuYlxY7jmUBE0SUrMzKnLF0YiRDw4ONCiRwAAXZV9l9wkCHS/1j2btKxHj4BlWePq7aKIA5H82vpzH335u1/7WjXZ60f2yRhrBcQ5u721/ezVJ3t5meZNPamsAgHWbTubzTKiIisNUUypTu081hHVD7Ltx85vnt+23oKCpmiMhtDWdQNIIkHE5nm2u7t7cjLe6A+ragYg1hCIgEoXMUFYnDOji5jcmQDk0euArjmwLA7Lg26bxmlq0NLOU0/R976XZtQ0VZ77PPOENiuLc1mxMRwYxejccDgsfJH5vGvcgYCSeHwynkzHk/n0eHLccJv1ssIZrmvEgpwForpupuOqjdyyMihYFEO37u4COBRzcjAGIGAEQtUuqwwBCWB5zNh/Jo1bl/miuDDslnnUIoQWmE1R9jc3b958o49pXs3BGEFjrM1KlxUu1iFoVDBtaDLEHI2zDgCqZnY0P55Wkzo081BFaQvKSBglcjRBklU8OZpMp40qRY5grc2y3f292XQ2yPoS4PDgCACFuyJxowL0qI4Wez90wP0DEWJKWZFxHY2jK08+8fo3f1dyqaqKrLNZ7o3JvWcRY8h637ZxOj1Jx8cxNgZQBGJoQlsn5qZpWDnPc1Wp6wodGmuaNqU6TiaTJrQKiGQQEESvvfO2M8YToMRb164rCxoAFJEuFXdVD3O25/s8chG0KNpbHmYFoArWO13WdG/tnC8Hw2a63y/z0LaEZHo9AEa0QkCWIFKbQtOEFGNsQ4oJURA0pWg9Fq7IC2+dAQQVTaFt6raZt3XVJFY1TpIi0cHBYWqaQd7LDKqma9feObh9e/vSRQUxop299PDczwIg74MZushe7zxMBFZ1xqQUhEhV837/0pUnbn7rWq8sYgjOGmXPQTRDAHBF7rICCFISFaqqOobWGkDQtqmNUWsREZVAQUUlhRibNrRtAgXjAG3Xknj39q4n6xGc0YhcN82bb7+9sbMNAGQNdKVtp/YglzbQX31PGAAAaNF6p6tjQmBQASUyomp8ceHKlRu/b+q29c6CMIdGqWhDAKKiyL3PwKAqtnXKyxJUiIRTSrEGYZYYU4ocU0yizAqcUmJmASDDYABkd/duPasK7wnBWVOnVPZ64+ns5vWbV65e0SWo9cwsn9PjkZuheC+wAtB1yYbU5Q51RId2ffNcb7hRzcf5yGtKsYU8y1UF0SMZ44zPPCplRQ/BqMQU2xjalFA4qjqpqvmsFtAOA8LatCkKChkAnFf17u273mWEkOc5g0TmvCyR6NqNm1sXzmeZIzJJmAgQELsqK5Uz2pR/9OcJnypmUkBUVDWIrMgAiijA6+fODza2xvNmOptXs3lb19VspoqAFEWrKiCi8ybzmXEWDRlnszLPisJ4h8ZWbZjMqpCkbtPh0XhahTrGNjF5N53Nbt28LQLeOgQSNVXLtigev/pkNW/2Dw5vXL9hjE8LRWxUNaXEnLCzeM9gPGoEKNDpzvCooKqEaIkQSJWYwaxt9rcvgHGT+Xw2mzZ1Xc+rEBIzhiR128QYCUEkCSdWQSQkUIDIcjSejCfTwDqr43jWnsyqw8lU0Ngi3zs4eOvtd2azKbCmkJwvIpoazMuf+dyFy5fbmFTw+o3bk8nEW4doumbXhqw1LsUkLGeBg/eBAx4YXVkZaSeaEBFB8NzFy0V/JCLzeTU5OYkhTiazEFmVFJCZm6bpaJNTDLFt21A19Xw+P5lMZ01okx5Nq/3jSZ0QXBYU9g4P33jrzZOTQ1AB5SzLldy0TU/8xIc++/m/2TTJGOfz4ujw+Eevv3l8MhVW7NoEsaaYrLFIf6W6Jv45Rwf9rrsNAZGSqMb55NzOY64omxPIjZmMJ6JmjXJbN6xogBVTi0o+IaJwYomJU93Ws6qeN+28DSHwbN6mBDbLjHN3D/bffOcNYbGOuKl75TCEVpXWdi7+/C//o2hycgypaZo2y/LrN2+PJ5PzFy6c297a3FwzllISFex6HL3n431QwnB6oxW12wFRVeo2ohJXdTsYDNe3to9vvknOEOLR0RFTgVk/sQJHT5FAhBrrHACE2IbQhNjO67pp2zakEESQbOaNL+7s7167eZMVFDS2rUcT29bn/XJz6x/80/9mtHPxaN6g8UVOTVMjWUlp3jSTyaSuqpPjk+3tzeGgD0BndKbJ++4Ja2cKade6CkFEWCQRnrt8+eYPvx/mJ4NyEMcn77zzJni/tr0DohUHUiErzitrquvZvKljiG2KdUiCxmQ+cyACJ9PJeDKXBCgoSQhJ0Ziy8MO1X/zH/+Ty08/tTauiHFTzWoSMNcKcZU5FjbFFkbdte+2d671eb2trsz/oUXfCPXQEA9C5zMsCStXu7V9MUj1yBJxqga2qi4Q/ROw69om2KbYgaPjc5StKOYrTwIX1vTxeu/Hj5GBtfaeq1aEjUeIQUjubVVVdJejqwo0aQiKJqWrq8XSSYuQ6FN4zYCsJe0XqDz7/j/7hYx/84DRoXoxUNc+9AisYEWRORISqzvoQAiA1bRhP5kfHx3mRjUajLHPWOiLoNtC0a6Sj2uFm0dl0kdK7wNYDMEC8p3ofeSjitHvZpcp1Jh8AIKTEMaWozIl3Ll/ZOH9xOpkgkTdZge20mR/t7ylZVddw5BS603Db0MbETIpISVWVFaitm+l0mmJo6mrQ69XTGZJxWYnF4PM//3df/sSnZ61EoF6et3VjjLHWqFpmRkQiMsZYa4moK25QFWZp2/bg4AARi6Ioy8J775yDriGDYkoMoMYQEXV80FWmdHc4PU6j5H2zglaTILMgk5SkDW0IwdhMTFZH+Nm/+4VsfasFW/ZGDl2fcgoJ2pZQ2lQ1bTWfz+bzWdM2McUUQgpRU5KUUtuEpm2bhkOwhGQRnAsA6rKPfeLTf/Nv/Z2qiaxY5JmkkOfOWuO9995ba621XVWPMaYoiqIoiCiEQGScc0RGVefz+dHR8d7e/v7+wXxeMSsROmetNQAgIiktmvz+CQflrhoK6PuDgFWkRbWrflYWTim0bSsMrKjkGzDDS5c/84Vfov7wpA6D4cYw71Ob2ulUufGevHfWGbLGOZdlLvfeGTSgqMopxtBITCm0Ze6nsxk5K8a98OGP/t1f/octG+OLLCsIyXvLkojQLAcRWWsBwHXHvBGpKiKllGJga2yR9/KsJLQq2NTt4cHx3Tt7B/snbRNVobuJtWbJOn+GPnjkVpAqIhKhaldAyQAg0rUkBk6iqgZtXXO/X7aQLnzgpU821W/9H/97NTkWFoPkRA0nstjGJrGKJGYGFVUlMiCS2hSaNoUAokQkEgeDwe7x5MnnX/qlf/JPh1vn9yezVqHILSogonc2iBizkBgA4JzL83wF/Y4tOrejbUOekzHWGEtEAF3ee5xOZ5PJ1Dnb6+cd5qy1yxNBHzae7mHlfUAALKU/AMryPGxrPKFBIJHkwQAaEIK814bq0sc/9fEYfuvf/SqkiBxtiK5prUe/6KilkmKKQVRAKLG0bYghSGJnDBvDSNPpbOfylf/6n/93W5cuH1WtuswiigIRrPzbjvC77o5EVJYlEYkIInaCnojqmmNMzom12BG4iDrnjDEppQ5/k/EUUBFNlvkOi0WRL9e+AsK9WPejKNTuyKobRAYRRTSl2NGUCDjrETGmKCwAACx9U7RtqAy5LBcNz3z6067Mv/irv1of7EEbfdU6dFnuldmbLNY1qhoAFpYYVMUaK6JtTEhmXteu7P/if/lfPfXiB05aFutZgJBAGVXJEKgaQyCgqt77GOPm5uZkMsnzHABSSp0ct9Y7pzEGVUxJjOlOijYdbry3HUM7Z5hFhNsmNnUAgCzLyrIsy6Jr2tu1xO/AoqqP4hSl02+X0E8xdm2ZpTsAAACYu+I8MgDIyREqABvLqqzy5Cc/9Zm6/g//6l86SfN5zLKEbC2gtbi5PmrquqqqOgQVIQTjrAIoErNrZs3f+sVf+MRP/8ycOQKpLhoqL5LgQBQVBL33VVU554bDYYxxPB6vra1lWaaqTdOoqrWJiIwhAPXehRCZk/e+WxdRZ7tiSuqc6QArogCaYprNZnVde++Losgy1/V0NgZFzhgBfOr4CVhUrXKMHEJYMDtaawyZhS1ARJ1ZLZDImC6fHZxjB/MUPvDTn5tOJ7/xK//mYlnEiL5H1pnYNo5M7Lp5h1DmuZCd1Y11lgFPxuOXP/m5v/bzvyAuQ3ApNYFT5jwteiIvstBRkZnLsjTGOOfG43FngBpjvPfd4QdNU1nrjDFd6XCW2ZQSgHbStJMqiOic7dwCACBSAHDOpZRSSlU1b9vWWleWhfO2Oy/zzCvlV0Yxd5zJmlIMISKQc951pzRgd7B3t02vCRmMWgISg4mIjJJvlK2lj3zu5473j7735d/1PZOh8WQCa13XdVVxCIN+n4wNonmeN5zGx+PLV5/5e//wH5frW3PmJqU2hl6vpyFZAkRQIu5Es4ghUxSFiMQYq6ra2NggopQ6qjdE1M2/ezGbzfI8d853n6w6MsA9QY+rt50RZa0TEeYUQqiqqhNfxtDZIqATkSLSkQBzAjDMncWCRIRIi0bzC88eAYBJAyYAypRdIkQUQ0JZ0JiP1n/2C19AgO+98mXrxJkyszY1TdfH3iAISFH24nx+tHd44eKFv/5Lv3z1mZ+YcWRtp80k7/WE2RtLAIjIAEjU5UAM+/2mbTuAishgMLDWxhgXvphqURTMjAgiUlVVCKFzERAXim2lljuXeFWU1fXT7BZpjBGWEGNnO6XEZ84BKcUY09KcyLrq6OVOU7fd0YkpXOlqJUhGkVMmhsAZkKRovUmgDadiY/OzP/+3y9z96FuvDFkz7yvVMi+8dUkUnWPQJsZzFy7+7V/+Bx/87M8eV0msmTWtdS7zPrWtUSTRRQgEgMj0ykxERcRa2zRN2Ss7N9haS4Y4CCGqinMWAJi5LIuU0mw29d53bVYAwFhjiBRABBWWERcFMoS6qpADTomsQwARiTHhSkz/6ZB8+O1SumBnfql2W+33gg2I0LatdH1Wuz7zZFUkdd1hVrzaCVEEFWWRrniIUUDUo82tt9YCqRhkYRR2pMpJ5/Mff+vr3//675nU5pLq8QFKFCQ2dpK0ssXf+MLff+FjP6XF2sm4blNqYouE1OXdRu5OV2RV4533HkVD06pqnud7e3sKevny5S5ioyJ1XS/mbxaKwZCpm7qua2ttpzmYeVn5gd3NU+r6sxsypApm6ZeRMXAvDPMXUMIP4ACXUeTTdv2yZdxS4qt2FoLtPhRhUmMIVdKifQd21sgiFkSI2p2CAVYgMUIiARMRERQsoQIxgJKBwj7/sc+Wg41Xv/m1u2+8tpYVFJAlMZDt9f7aX/87L33qcxMGSELWQIqOzCo0xl1HayRH5KxDhdC0K0XFzHmeO+u6uFDsKEjEe9+dIYOKqmqNtcYaMtZYIlLRjupVugO5kYAUFqSJiAIgIl3jGGMMIv5/0QGr0407BBiiRVS2k3XMi1SEToCuPB1VRUHVhfeFiN2SHjRVQQGFFEwXqRbFjmi6vGVFQCQDVPaefOElBG3r6ujWNaOehTArPvm5v/GhT/90IGuNb2NaPbr7C0u/xFrrnBORGKICOGs7XdU0zfb29n2kp5pS6hwuVWVhAjLGZFkGS45fLbPzyBDReddZ2ysgGGNW6rD7hOgvhoDTLrUuLZyOs6CTocysy9MCuul25LPwyFSUdel/aWddwKnQ0OLv0lDXjm0UURZlo50bYZCIHBNqVjz1U5/qDde++ptfrGez8+e3X/rJj1944SfaJgnlUXTBZogLcbk8VJEQuzYEzMzCXU/3LMuOj49ns1lZliua6GxQAOh4eiE6dLV8XBoR94XZOzLvMHePsJbTWF0sIv+vEdA9aXEXZhER7crLF9EeWloF3dDu+ATkzuxZSS24B3fEDm3ctYhB7OSWKgESAnaVe0QEgDFxnmfGFD/6wWvjo+lHfuave2tTjNcOT3T3ZOexi2xsO55n1scUVyZKB9bOBDxNjIQLuBwdHa2ioR3Quxed0BAR59zpr5ahugcd/m451trOru1A0BHcPZuvu+bPDfrT0O9kfUfywqlrySfGGMSOvFBVhRURhSElWa2k6+ndhRtP08I9fCCQkAIDLoxoEEAlha5qghAIBLI8P56c/Pqv/8dXvvzlD7zw4ode+sBsMj04OLpx8+bOm9cvPX71+Q9+4NKl85PjOdKC9zuLEBG99918OlLtIJu7vGmaO3fuPPfcc6fpuoPyQvcuWbab7WpRS3K873X3w86X7izR1XpVumb4AO8aCzqNHwDo2hXBfbEkRUBQiJFTWuRrGCJrzMrY6nCyWid2kybqUl1Pk//q7fK3qiD3Llv4z2KtAcAUuSydMn33e9/7t//7v3vrnXc2NzfL0Wj3eLy2tv70zqWdx5/Y29977fXXf/jGj3/qpz7+4Q++lKLWse6gv9w/wU4yrNyUDrKdyL5w4UJn1azQsFSYC+h3fzsaWnpbC3DD0vlfdspb7Ct0y1xJMCQgWCztXcxQvT8tcpnKeXrPEyRJTNwRfrcSOkU1K6GjoqftHNV7ccD7gK56GiWimoS7nXvChapARFB0xqjCr/3a//XFL/3m2sbo8uOXt8/tIBjnXFH2Mp8ZQyq6v3v3jTd+NJvNP/nJT3zsYx/t9wd1XTNzJ0CYOYTQ3bNbfuY8AFy7dg0AXnzxxU6RdnZEJ0C89x2vdChcse9qpSsptxJNq1Bdd4fTFqOCwFJvvwsHrIB16hNYlHcpgIIqJJaUUrd5BwDMklRkSe+rH65U373boj5o0C6xvkIDriqYALpjWFUUQBDJ+eyVr37zN37ji9vb2+ubG5CwmsyKsmeyTGKYh3bQ7/fK8vwHPvDYxYt/8Ad/8B9//dd/9KPXf+EXfmFzc9MY07atcy7G2AXrO2B1klpE6rp+4YUX4H5pvlKeK2NmRfWwVO8dfB8IfK1en8b0Aj6nyPvddcAD0F/sKwCKqCxIQ4hM9+DuLYBaosWsAMgsTNWOaZavkegeAh4QRPc4DwlxxSmLq53z1rpvffM7//pXfmVzY/Pllz82m1f7+4cpTYksAA4G/S5HuqnruqpAzZNPPnN0fPSlL31pd3f3n/2zf3b58mUAaJqm44OVbEFEBJzNZuvr6x18u/j+ikG7a1ZmxQo+pxX7aQKC+4m400Cw9ANEBFBXiHx3DrinLlQRIUVJSVd+b5dIwpy624kIQHfw4EKuwcKpQtWuMwCdvvkKA6fnCqeEEsDKZpcOBUQIaF77wev/4l/8r6+++uqHXvrQtbevDde2zp+/uIg4WgfandqGKcq1a7du375rjDHWP/HEE8fHx//+3//7Z5555jOf+UyWZR3hd2EfIooxDnr98XhclmVRFDHGDrirDfrVlSvoPwz0FcTxlK25guH9vwXAVWjgT/YDcOkZJk4cu+J27DSPKIhwN1FVXSR2AignQ4RLLxmWPffxlFKRU/x7mppWFyy+QsWF1kEVRaTjw8Nf+7X/8/r1d/pF7/o77xwdjc+dv/zs88+fO7flPQ2HPedM0zSIWLfV0fHJW9eu797dHfSKn/r4h5Hgd377d1555ZXj4+Of+7mf6yyTBWiQOtE0Ho9Ho5ExZoWAlftyGrgrPbd6fZqYTlPSaeY4jRUA4FMiziKCqIIq4kJoLA0mjJFDaJmZwHRhy5QSAoqoihLSvSN2O+WwECD3itp0iYNFMvpCgyw+WFwj2gn65ZWr78EZm1Jymauq5t/+6r/91je/tbW+0ev127Y9mc5v3rx+PD555pmnnn7qybXRqNcbbG5sz6r5/sHxbDprq/ro8OD8uWct0nQ8kcSk+B/+/f+NgJ/7mc/1e72YEiEmSc66vd3d+Xy+ubXZxZkBoTtFciWvRZXud9dX5PIA6LslLKgQl2rzFNMjod5TB2qlaxC7aE4EItgdHR1Dauo2xdjFBTugL7QTgjHGO7c4aHRp2SAuon4CoCKwcpeX5w8R0aI26fSkzUJVKCh2XyuQkggjAgnmNvsPX/r1r/zOlwdlb319/bnnn+v1+2+8+eb167fHk4O33xKVFEJ75fEr29vn1tY2n3hcf/z6j6fT4+eeeWJjOHj129+7cPGiQ7e+sV6U2e1bt7777e98+CMfHgwHbduQdWTp7u6uz7O8KNq2FQQVUVxUE3ZTjZwQ0RLBKb3VqYf7mUA6711x6Yd2wO4IDpUMqoAxXY9fJUS7itiAwKI9smLbxrquhcUYqwoxpfvMG108+4G9iJWqgfuHruLMqssDceDeJw+NpUMGVVVvbq7/4e9/+0tf/KJ37tzOzgsvvPDsc8+ur2888eSTf/AH3/nh6z8+Ph5fv34NCRNzSjwY9K0xFy6cf/75Z2PbvvPW286aN954I/N+59y55154drQ2UsRr168//vjj3jtDOJvNjo6OnnzyyUWf31MeE6y8xWWEEZbm5mnyv8cQQA+f90b356cYMkq6gpi11nXRMQLqdGldNaGNLGzIIGIIoQP3aUbr4I6nXHy9X7g/8NRT3z6ogR/EAYKwIJCAlmV5cHj0n37jN0aj0UsvvbSxufnY5cfOnTs3GA7XNzcGg9Ha+sZ3v/v9u3fvHh4cjEZrJycnTdMcHuz3er3Hr1z9gz/4ZpJEgtPp9Omnn776xNWnnnqqPxwYa8fTyZ07d86f3yn75dGtWycnJ9vb2ysC6hb7gHjpfBg8tajV5O8ZPwD8Z+WFYheGYpalFYQLe4xMSlzXVWiTsKhq0tTpKF0G1E6rl9VuXGcwwFJxndY8DyxDRP/MQ8GXB0aBMRYQf/u3fns4HPzsz/zMaDSyzpb9nvWZd05F19b0Ex//+NbW1iuv/N7u7t5sNosx5nmmqu+88/be3t6VK1eG/f4ffe/Vzc3Np5995ulnnil7ZVGWAHDu3Ll5Nd/d3TXOHh0dFUXR6/VOu8orsK5sws4kOC0JTpsPy8vgtKI+jbwHyG5FuzalFaXHtm3bNiAaReXECNidONjZmg8od1y6gt29Vo982Is59XaRKPDwV6vRBbyatu0V5Ws/+EHbtp///F977NKllJICGGdjSolT0wZOMcvciz/xQl3Xr732wzY0TVNvbKz1er3XXvvh22+/9TOf++n19c08z69cvfrYY4+tb2yMNkbeOWddmwIRDfr9WzdvzaezJ554oqMeWUb/T8//NNTgfnZfgfLeNUsBu6K8d7WmVrFxa8gSQdumaj7vXEQVFRYkdMYZMqvY8rvCa3XfleH88LcP2GQA78Icp6+PKVprp9Pp7du3P/KRjzzz9NN1U5Mh7vYZYhLQTmkTwWAweOKJJ46PT6z3a+ujk/H4q1/+yu7u7tbW1ptvvrWzvf3k00+99NIHHn/iam/QL4sixsicnHOISIRXLl8eDYdl2YNl0Ok0yN51saeF7QMOAQA83NWju9tKhj/gOmBkEda2DbENnVWzgjXCAp+n9f5pBlyJoNXDOhB10unefU4ZbdrVZj8UBD391xgbUzo6ODTGbKytdWEyRGzbNsRonUPCNgRC8FnmfdbU8T/+py9a57a3t2/cuHG0f3jr9o1+v7e/t7+3t/uLX/jCRz76kX6/XxQFKBtrkzARLVvndPr2vs1UWIYQAKBbTrfyFTRWvHKP9gm7MiaRBwMSK2JfrVFOSScb2ljXtTG2C5LcN49T9sppHLwr8Z7mxC7WeB9d3EP+wtF6ADGn33axsNH6GiEqIi8jWZ3wEhFrrHPOWeOzjFkGg/IjH/7QN3//9+/cSVtbWztb5y4//tj1a2/PpjNVVYRzO+dUwXufUlC4bxN0OUl4YDmrKZ2SrvfJzNMKDxFVVElBVnGze8H2B3TGaRgCAM1mVYxpBawVupa36RjhPqV0mnJhKfRXd+git6efdxpJsBCa+AD0dRlZXI1uhXXTpBi7UGt3mE5MiVWcc7QK9Rkznpx85Su/+/3vf79t2q3trUF/oIpvv/12iOGPX/tB3TTGmhBDlmdkCB+i9Aeo5LR4WbHyaR49HWSEZfC5C8Cfpq0HLntgLMJ7dV1lWY5IIURjzNIffuBn7+LvnUZjN5Yb8frANXhqPDyP0zbD6gUuVKKazkfBhatMiKLCzKKiqtPppChzUHj77bfrugGAsleur68Ly507uymlfr9/4/q127dvD4fD7umdonpgnJ7Mw0RDp655gIpXH8piN/A+3fDAZe+OhpQWMktEVmHXJYeuZNGfxgGrh52G/sPgXn7yLst+4G4sklIS1S5RUJcyDYmMXRwMnTjFEKy1bdM4hy+++GKXNLi2tlZV1byqxicno+HIOUfGvvnmm3XdFGW5Mp1Xj/uTKANPRdNw4XI+CLv72GLhAXc6XB++7PSDTqOZEKiu684lk2X8jwiRCJeSYRkpuu+OD9u5D/AyLp3k1XaELvfhTvPHu66q2+HpavZwCQ5CNGZRwoKKaNBY0zQhJbHW5nk+Gq3Vdb2/v9+27ZXHH19bXwPAixcfu3N396233+rstGXa/j24nDYiVss57eRj51fqPWZdrfe+vSZV0E4g38fTq8tW4/R9SJUIbZeVHFMyhoyhDh+JOcZoyIiqaOo2ZwEVCbp/ZLD72/0DAlYWEDRIhgSEDAKIKC+OecZ3UUeryd0T6YQGwRoy1HXvF1ZhkJiiKhtCQ2gMkSFFJEMscPPmra3NcxvrW3du3z08PCJr+oO+9W5zc3ttuFHPmh/80Q+soaWU4GWADFUXyYSIoCrdP8RuY0uIUFVEulwkMtaQ7SIGoKiK2q0UDaJB7aYqKqJdfK37x/e/Fb0naQGAdHHIlxpj+v0eC4smXDZ2W2j/VZDyzxr32GJlQb2bsPpz3qo7sZyFWVhEeFnNISIs0llHXaLZ9Rs3e71+WZZ37+62IfR6/fWNjXM7O08+9bT3/ujo6KtffeX69ZvD4TDGdplKs9Q3715Y+tAnCw/9IcbF08p2mRhyilEeHqfvQJPJpKN35gQABIs8CxHpFGCHgtUdV4L+3W99yoB7QLz+BaG/KBhe7fnc22dWZWbttj9BjTG7u3dvXL8xGo2Ojo66FgYIMBj0X3zxxXPntmKMd+7u3rp169VXXxUR5zye2s5dBMZX4v7+CT+w2NOMu5I893Yr4Z4sOj3nh1d3enuHmqaZTCZdzDmEQIa6bd5TsTZd4v7dfdf7AXdK+z9kXfwpRPHQfRbKg5fj9LfYKWQyhsgYevXVV2OKRVEcHBwaY4+PjwHx8uXL29vbRHR0eOS9HY1GP/7Rj46Ojr13qzkseUz1TzVaHpjzA6pu9UOkBZz+/MsEgP8HoDXZ+TnY5IMAAAAASUVORK5CYII=</field> |
60 | 20 | </record> | 22 | </record> |
61 | 21 | 23 | ||
62 | 22 | 24 | ||
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 | 21 | 21 | ||
68 | 22 | from openerp.osv import fields, osv | 22 | from openerp.osv import fields, osv |
69 | 23 | from openerp import tools | 23 | from openerp import tools |
70 | 24 | from openerp import SUPERUSER_ID | ||
71 | 25 | |||
72 | 26 | class mail_thread(osv.osv): | ||
73 | 27 | _inherit = ['mail.thread'] | ||
74 | 28 | _name = 'mail.thread' | ||
75 | 29 | |||
76 | 30 | def subscribe_by_department(self, cr, uid, ids, dept_id, subtype_ids,context=None): | ||
77 | 31 | new_follower_ids = [] | ||
78 | 32 | followers = self.pool.get('mail.followers') | ||
79 | 33 | followers_objs = self.pool.get('hr.department').browse(cr, uid, dept_id,context=context).message_follower_ids | ||
80 | 34 | for partner in followers_objs: | ||
81 | 35 | fids = followers.search(cr, SUPERUSER_ID, [('res_model','=','hr.department'),('partner_id','=',partner.id),('res_id','=',dept_id)], context=context) | ||
82 | 36 | if fids: | ||
83 | 37 | follower = followers.browse(cr, uid, fids[0], context=context) | ||
84 | 38 | list_subtype_ids = set([subtype.id for subtype in follower.subtype_ids]) | ||
85 | 39 | has_subtype = [ subtype for subtype in list_subtype_ids if subtype in subtype_ids] or False | ||
86 | 40 | if has_subtype and partner.user_ids: | ||
87 | 41 | new_follower_ids.append(partner.user_ids[0].id) | ||
88 | 42 | if new_follower_ids: | ||
89 | 43 | self.message_subscribe_users(cr, uid, ids, user_ids=new_follower_ids) | ||
90 | 44 | return True | ||
91 | 24 | 45 | ||
92 | 25 | class hr_department(osv.osv): | 46 | class hr_department(osv.osv): |
93 | 26 | def name_get(self, cr, uid, ids, context=None): | 47 | def name_get(self, cr, uid, ids, context=None): |
94 | @@ -42,6 +63,7 @@ | |||
95 | 42 | return dict(res) | 63 | return dict(res) |
96 | 43 | 64 | ||
97 | 44 | _name = "hr.department" | 65 | _name = "hr.department" |
98 | 66 | _inherit = ['mail.thread'] | ||
99 | 45 | _columns = { | 67 | _columns = { |
100 | 46 | 'name': fields.char('Department Name', size=64, required=True), | 68 | 'name': fields.char('Department Name', size=64, required=True), |
101 | 47 | 'complete_name': fields.function(_dept_name_get_fnc, type="char", string='Name'), | 69 | 'complete_name': fields.function(_dept_name_get_fnc, type="char", string='Name'), |
102 | 48 | 70 | ||
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 | 1 | <?xml version="1.0" encoding="utf-8"?> | ||
108 | 2 | <openerp> | ||
109 | 3 | <data noupdate="1"> | ||
110 | 4 | <record id="mt_employees" model="mail.message.subtype"> | ||
111 | 5 | <field name="name">Employees</field> | ||
112 | 6 | <field name="res_model">hr.department</field> | ||
113 | 7 | <field name="default" eval="False"/> | ||
114 | 8 | </record> | ||
115 | 9 | <record id="mt_end_of_contracts" model="mail.message.subtype"> | ||
116 | 10 | <field name="name">End of Contracts</field> | ||
117 | 11 | <field name="res_model">hr.department</field> | ||
118 | 12 | <field name="default" eval="False"/> | ||
119 | 13 | </record> | ||
120 | 14 | <record id="mt_applications" model="mail.message.subtype"> | ||
121 | 15 | <field name="name">Applications</field> | ||
122 | 16 | <field name="res_model">hr.department</field> | ||
123 | 17 | <field name="default" eval="False"/> | ||
124 | 18 | </record> | ||
125 | 19 | <record id="mt_approve_timesheet" model="mail.message.subtype"> | ||
126 | 20 | <field name="name">Approve Timesheet</field> | ||
127 | 21 | <field name="res_model">hr.department</field> | ||
128 | 22 | <field name="default" eval="False"/> | ||
129 | 23 | </record> | ||
130 | 24 | <record id="mt_approve_expenses" model="mail.message.subtype"> | ||
131 | 25 | <field name="name">Approve Expenses</field> | ||
132 | 26 | <field name="res_model">hr.department</field> | ||
133 | 27 | <field name="default" eval="False"/> | ||
134 | 28 | </record> | ||
135 | 29 | <record id="mt_first_approve_leaves" model="mail.message.subtype"> | ||
136 | 30 | <field name="name">First approval of leaves/ Allocation</field> | ||
137 | 31 | <field name="res_model">hr.department</field> | ||
138 | 32 | <field name="default" eval="False"/> | ||
139 | 33 | </record> | ||
140 | 34 | <record id="mt_second_approve_leaves" model="mail.message.subtype"> | ||
141 | 35 | <field name="name">Second approval of leaves</field> | ||
142 | 36 | <field name="res_model">hr.department</field> | ||
143 | 37 | <field name="default" eval="False"/> | ||
144 | 38 | </record> | ||
145 | 39 | <record id="mt_Appraisals" model="mail.message.subtype"> | ||
146 | 40 | <field name="name">Appraisals</field> | ||
147 | 41 | <field name="res_model">hr.department</field> | ||
148 | 42 | <field name="default" eval="False"/> | ||
149 | 43 | </record> | ||
150 | 44 | </data> | ||
151 | 45 | </openerp> | ||
152 | 0 | \ No newline at end of file | 46 | \ No newline at end of file |
153 | 1 | 47 | ||
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 | 16 | <field name="company_id" widget="selection" groups="base.group_multi_company"/> | 16 | <field name="company_id" widget="selection" groups="base.group_multi_company"/> |
159 | 17 | </group> | 17 | </group> |
160 | 18 | </sheet> | 18 | </sheet> |
161 | 19 | <div class="oe_chatter"> | ||
162 | 20 | <field name="message_follower_ids" widget="mail_followers"/> | ||
163 | 21 | <field name="message_ids" widget="mail_thread"/> | ||
164 | 22 | </div> | ||
165 | 19 | </form> | 23 | </form> |
166 | 20 | </field> | 24 | </field> |
167 | 21 | </record> | 25 | </record> |
168 | 22 | 26 | ||
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 | 124 | <filter string="Department" icon="terp-personal+" domain="[]" context="{'group_by':'department_id'}"/> | 124 | <filter string="Department" icon="terp-personal+" domain="[]" context="{'group_by':'department_id'}"/> |
174 | 125 | <filter string="Job" icon="terp-gtk-select-all" domain="[]" context="{'group_by':'job_id'}"/> | 125 | <filter string="Job" icon="terp-gtk-select-all" domain="[]" context="{'group_by':'job_id'}"/> |
175 | 126 | <filter string="Company" icon="terp-go-home" domain="[]" context="{'group_by':'company_id'}" groups="base.group_multi_company"/> | 126 | <filter string="Company" icon="terp-go-home" domain="[]" context="{'group_by':'company_id'}" groups="base.group_multi_company"/> |
176 | 127 | <filter icon="terp-mail-message-new" string="Unread Messages" name="message_unread" domain="[('message_unread','=',True)]"/> | ||
177 | 127 | </group> | 128 | </group> |
178 | 128 | </search> | 129 | </search> |
179 | 129 | </field> | 130 | </field> |
180 | 130 | 131 | ||
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 | 60 | class hr_contract(osv.osv): | 60 | class hr_contract(osv.osv): |
186 | 61 | _name = 'hr.contract' | 61 | _name = 'hr.contract' |
187 | 62 | _description = 'Contract' | 62 | _description = 'Contract' |
188 | 63 | _inherit = 'mail.thread' | ||
189 | 63 | _columns = { | 64 | _columns = { |
190 | 64 | 'name': fields.char('Contract Reference', size=64, required=True), | 65 | 'name': fields.char('Contract Reference', size=64, required=True), |
191 | 65 | 'employee_id': fields.many2one('hr.employee', "Employee", required=True), | 66 | 'employee_id': fields.many2one('hr.employee', "Employee", required=True), |
192 | @@ -79,6 +80,16 @@ | |||
193 | 79 | 'visa_expire': fields.date('Visa Expire Date'), | 80 | 'visa_expire': fields.date('Visa Expire Date'), |
194 | 80 | } | 81 | } |
195 | 81 | 82 | ||
196 | 83 | def create(self, cr, uid, vals, context=None): | ||
197 | 84 | obj_id = super(hr_contract, self).create(cr, uid, vals, context=context) | ||
198 | 85 | emp_id = vals.get('employee_id', False) | ||
199 | 86 | if emp_id: | ||
200 | 87 | dept_id = self.pool.get('hr.employee').browse(cr, uid, emp_id, context=context).department_id.id or False | ||
201 | 88 | subtype_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'hr', 'mt_end_of_contracts')[1] | ||
202 | 89 | if dept_id: | ||
203 | 90 | self.subscribe_by_department(cr, uid, [obj_id], dept_id, [subtype_id], context=context) | ||
204 | 91 | return obj_id | ||
205 | 92 | |||
206 | 82 | def _get_type(self, cr, uid, context=None): | 93 | def _get_type(self, cr, uid, context=None): |
207 | 83 | type_ids = self.pool.get('hr.contract.type').search(cr, uid, [('name', '=', 'Employee')]) | 94 | type_ids = self.pool.get('hr.contract.type').search(cr, uid, [('name', '=', 'Employee')]) |
208 | 84 | return type_ids and type_ids[0] or False | 95 | return type_ids and type_ids[0] or False |
209 | 85 | 96 | ||
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 | 14 | <record id="hr_contract_type_sub" model="hr.contract.type"> | 14 | <record id="hr_contract_type_sub" model="hr.contract.type"> |
215 | 15 | <field name="name">Subcontractor</field> | 15 | <field name="name">Subcontractor</field> |
216 | 16 | </record> | 16 | </record> |
217 | 17 | |||
218 | 18 | <record id="timesheet_group2" model="resource.calendar"> | ||
219 | 19 | <field name="name">40 Hours/Week</field> | ||
220 | 20 | </record> | ||
221 | 17 | 21 | ||
222 | 18 | </data> | 22 | </data> |
223 | 19 | </openerp> | 23 | </openerp> |
224 | 20 | 24 | ||
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 | 117 | </page> | 117 | </page> |
230 | 118 | </notebook> | 118 | </notebook> |
231 | 119 | </sheet> | 119 | </sheet> |
232 | 120 | <div class="oe_chatter"> | ||
233 | 121 | <field name="message_follower_ids" widget="mail_followers"/> | ||
234 | 122 | <field name="message_ids" widget="mail_thread"/> | ||
235 | 123 | </div> | ||
236 | 120 | </form> | 124 | </form> |
237 | 121 | </field> | 125 | </field> |
238 | 122 | </record> | 126 | </record> |
239 | 123 | 127 | ||
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 | 125 | 125 | ||
245 | 126 | class hr_evaluation(osv.osv): | 126 | class hr_evaluation(osv.osv): |
246 | 127 | _name = "hr_evaluation.evaluation" | 127 | _name = "hr_evaluation.evaluation" |
248 | 128 | _inherit = "mail.thread" | 128 | _inherit = ['mail.thread','ir.needaction_mixin'] |
249 | 129 | _description = "Employee Appraisal" | 129 | _description = "Employee Appraisal" |
250 | 130 | _rec_name = 'employee_id' | 130 | _rec_name = 'employee_id' |
251 | 131 | _columns = { | 131 | _columns = { |
252 | @@ -158,6 +158,16 @@ | |||
253 | 158 | 'state': lambda *a: 'draft', | 158 | 'state': lambda *a: 'draft', |
254 | 159 | } | 159 | } |
255 | 160 | 160 | ||
256 | 161 | def create(self, cr, uid, vals, context=None): | ||
257 | 162 | obj_id = super(hr_evaluation, self).create(cr, uid, vals, context=context) | ||
258 | 163 | emp_id = vals.get('employee_id', False) | ||
259 | 164 | if emp_id: | ||
260 | 165 | dept_id = self.pool.get('hr.employee').read(cr, uid, emp_id,['department_id'], context=context).get('department_id')[0] | ||
261 | 166 | subtype_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'hr', 'mt_Appraisals')[1] | ||
262 | 167 | if dept_id: | ||
263 | 168 | self.subscribe_by_department(cr, uid, [obj_id], dept_id, [subtype_id], context=context) | ||
264 | 169 | return obj_id | ||
265 | 170 | |||
266 | 161 | def name_get(self, cr, uid, ids, context=None): | 171 | def name_get(self, cr, uid, ids, context=None): |
267 | 162 | if not ids: | 172 | if not ids: |
268 | 163 | return [] | 173 | return [] |
269 | @@ -269,6 +279,9 @@ | |||
270 | 269 | for survey_req in evalutation.survey_request_ids: | 279 | for survey_req in evalutation.survey_request_ids: |
271 | 270 | obj_hr_eval_iterview.write(cr, uid, [survey_req.id], new_vals, context=context) | 280 | obj_hr_eval_iterview.write(cr, uid, [survey_req.id], new_vals, context=context) |
272 | 271 | return super(hr_evaluation, self).write(cr, uid, ids, vals, context=context) | 281 | return super(hr_evaluation, self).write(cr, uid, ids, vals, context=context) |
273 | 282 | |||
274 | 283 | def _needaction_domain_get(self, cr, uid, context=None): | ||
275 | 284 | return [('message_unread', '=', True)] | ||
276 | 272 | 285 | ||
277 | 273 | 286 | ||
278 | 274 | class survey_request(osv.osv): | 287 | class survey_request(osv.osv): |
279 | @@ -281,7 +294,7 @@ | |||
280 | 281 | class hr_evaluation_interview(osv.osv): | 294 | class hr_evaluation_interview(osv.osv): |
281 | 282 | _name = 'hr.evaluation.interview' | 295 | _name = 'hr.evaluation.interview' |
282 | 283 | _inherits = {'survey.request': 'request_id'} | 296 | _inherits = {'survey.request': 'request_id'} |
284 | 284 | _inherit = 'mail.thread' | 297 | _inherit = ['mail.thread', 'ir.needaction_mixin'] |
285 | 285 | _rec_name = 'request_id' | 298 | _rec_name = 'request_id' |
286 | 286 | _description = 'Appraisal Interview' | 299 | _description = 'Appraisal Interview' |
287 | 287 | _columns = { | 300 | _columns = { |
288 | @@ -353,5 +366,8 @@ | |||
289 | 353 | value = self.pool.get("survey").action_print_survey(cr, uid, ids, context=context) | 366 | value = self.pool.get("survey").action_print_survey(cr, uid, ids, context=context) |
290 | 354 | return value | 367 | return value |
291 | 355 | 368 | ||
292 | 369 | def _needaction_domain_get(self, cr, uid, context=None): | ||
293 | 370 | return [('message_unread', '=', True)] | ||
294 | 371 | |||
295 | 356 | 372 | ||
296 | 357 | # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:1 | 373 | # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:1 |
297 | 358 | 374 | ||
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 | 240 | <field name="date"/> | 240 | <field name="date"/> |
303 | 241 | <filter icon="terp-check" string="Pending" domain="[('state','=','wait')]" help="Appraisal that are in Plan In Progress state"/> | 241 | <filter icon="terp-check" string="Pending" domain="[('state','=','wait')]" help="Appraisal that are in Plan In Progress state"/> |
304 | 242 | <filter icon="terp-camera_test" string="In progress" domain="[('state','=','progress')]" help="Appraisal that are in waiting appreciation state"/> | 242 | <filter icon="terp-camera_test" string="In progress" domain="[('state','=','progress')]" help="Appraisal that are in waiting appreciation state"/> |
305 | 243 | <filter icon="terp-mail-message-new" string="Unread Messages" name="message_unread" domain="[('message_unread','=',True)]"/> | ||
306 | 243 | <field name="employee_id" /> | 244 | <field name="employee_id" /> |
307 | 244 | <field name="plan_id"/> | 245 | <field name="plan_id"/> |
308 | 245 | <group expand='0' string='Group by...'> | 246 | <group expand='0' string='Group by...'> |
309 | @@ -317,6 +318,10 @@ | |||
310 | 317 | </group> | 318 | </group> |
311 | 318 | </group> | 319 | </group> |
312 | 319 | </sheet> | 320 | </sheet> |
313 | 321 | <div class="oe_chatter"> | ||
314 | 322 | <field name="message_follower_ids" widget="mail_followers"/> | ||
315 | 323 | <field name="message_ids" widget="mail_thread"/> | ||
316 | 324 | </div> | ||
317 | 320 | </form> | 325 | </form> |
318 | 321 | </field> | 326 | </field> |
319 | 322 | </record> | 327 | </record> |
320 | @@ -348,6 +353,7 @@ | |||
321 | 348 | <search string="Search Appraisal"> | 353 | <search string="Search Appraisal"> |
322 | 349 | <field name="date_deadline"/> | 354 | <field name="date_deadline"/> |
323 | 350 | <filter icon="terp-gtk-go-back-rtl" string="To Do" name="todo" domain="[('state','=','waiting_answer')]"/> | 355 | <filter icon="terp-gtk-go-back-rtl" string="To Do" name="todo" domain="[('state','=','waiting_answer')]"/> |
324 | 356 | <filter icon="terp-mail-message-new" string="Unread Messages" name="message_unread" domain="[('message_unread','=',True)]"/> | ||
325 | 351 | <field name="user_to_review_id"/> | 357 | <field name="user_to_review_id"/> |
326 | 352 | <field name="user_id" string="Interviewer"/> | 358 | <field name="user_id" string="Interviewer"/> |
327 | 353 | <group expand="0" string="Group By..."> | 359 | <group expand="0" string="Group By..."> |
328 | 354 | 360 | ||
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 | 40 | if context is None: | 40 | if context is None: |
334 | 41 | context = {} | 41 | context = {} |
335 | 42 | if not default: default = {} | 42 | if not default: default = {} |
337 | 43 | default.update({'date_confirm': False, 'date_valid': False, 'user_valid': False}) | 43 | default.update({'date_confirm': False, 'date_valid': False, 'user_valid': False, 'account_move_id': []}) |
338 | 44 | return super(hr_expense_expense, self).copy(cr, uid, id, default, context=context) | 44 | return super(hr_expense_expense, self).copy(cr, uid, id, default, context=context) |
339 | 45 | 45 | ||
340 | 46 | def _amount(self, cr, uid, ids, field_name, arg, context=None): | 46 | def _amount(self, cr, uid, ids, field_name, arg, context=None): |
341 | @@ -63,7 +63,7 @@ | |||
342 | 63 | return self.pool.get('res.currency').search(cr, uid, [('rate','=',1.0)], context=context)[0] | 63 | return self.pool.get('res.currency').search(cr, uid, [('rate','=',1.0)], context=context)[0] |
343 | 64 | 64 | ||
344 | 65 | _name = "hr.expense.expense" | 65 | _name = "hr.expense.expense" |
346 | 66 | _inherit = ['mail.thread'] | 66 | _inherit = ['mail.thread', 'ir.needaction_mixin'] |
347 | 67 | _description = "Expense" | 67 | _description = "Expense" |
348 | 68 | _order = "id desc" | 68 | _order = "id desc" |
349 | 69 | _track = { | 69 | _track = { |
350 | @@ -84,7 +84,7 @@ | |||
351 | 84 | '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."), | 84 | '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 | 85 | '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."), | 85 | '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 | 86 | 'user_valid': fields.many2one('res.users', 'Validation By', readonly=True, states={'draft':[('readonly',False)], 'confirm':[('readonly',False)]}), | 86 | 'user_valid': fields.many2one('res.users', 'Validation By', readonly=True, states={'draft':[('readonly',False)], 'confirm':[('readonly',False)]}), |
355 | 87 | 'account_move_id': fields.many2one('account.move', 'Ledger Posting'), | 87 | 'account_move_id': fields.many2one('account.move', 'Ledger Posting', track_visibility="onchange"), |
356 | 88 | 'line_ids': fields.one2many('hr.expense.line', 'expense_id', 'Expense Lines', readonly=True, states={'draft':[('readonly',False)]} ), | 88 | 'line_ids': fields.one2many('hr.expense.line', 'expense_id', 'Expense Lines', readonly=True, states={'draft':[('readonly',False)]} ), |
357 | 89 | 'note': fields.text('Note'), | 89 | 'note': fields.text('Note'), |
358 | 90 | 'amount': fields.function(_amount, string='Total Amount', digits_compute=dp.get_precision('Account'), | 90 | 'amount': fields.function(_amount, string='Total Amount', digits_compute=dp.get_precision('Account'), |
359 | @@ -113,7 +113,7 @@ | |||
360 | 113 | 'user_id': lambda cr, uid, id, c={}: id, | 113 | 'user_id': lambda cr, uid, id, c={}: id, |
361 | 114 | 'currency_id': _get_currency, | 114 | 'currency_id': _get_currency, |
362 | 115 | } | 115 | } |
364 | 116 | 116 | ||
365 | 117 | def unlink(self, cr, uid, ids, context=None): | 117 | def unlink(self, cr, uid, ids, context=None): |
366 | 118 | for rec in self.browse(cr, uid, ids, context=context): | 118 | for rec in self.browse(cr, uid, ids, context=context): |
367 | 119 | if rec.state != 'draft': | 119 | if rec.state != 'draft': |
368 | @@ -138,6 +138,14 @@ | |||
369 | 138 | return {'value': {'department_id': department_id, 'company_id': company_id}} | 138 | return {'value': {'department_id': department_id, 'company_id': company_id}} |
370 | 139 | 139 | ||
371 | 140 | def expense_confirm(self, cr, uid, ids, context=None): | 140 | def expense_confirm(self, cr, uid, ids, context=None): |
372 | 141 | #for the departmet followers | ||
373 | 142 | expense = self.browse(cr, uid, ids, context=context) | ||
374 | 143 | dept_id = expense[0].department_id.id or False | ||
375 | 144 | record_id = expense[0].id | ||
376 | 145 | subtype_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'hr', 'mt_approve_expenses')[1] | ||
377 | 146 | if dept_id: | ||
378 | 147 | self.subscribe_by_department(cr, uid, [record_id], dept_id, [subtype_id], context=context) | ||
379 | 148 | |||
380 | 141 | for expense in self.browse(cr, uid, ids): | 149 | for expense in self.browse(cr, uid, ids): |
381 | 142 | if expense.employee_id and expense.employee_id.parent_id.user_id: | 150 | if expense.employee_id and expense.employee_id.parent_id.user_id: |
382 | 143 | self.message_subscribe_users(cr, uid, [expense.id], user_ids=[expense.employee_id.parent_id.user_id.id]) | 151 | self.message_subscribe_users(cr, uid, [expense.id], user_ids=[expense.employee_id.parent_id.user_id.id]) |
383 | @@ -383,6 +391,9 @@ | |||
384 | 383 | } | 391 | } |
385 | 384 | return result | 392 | return result |
386 | 385 | 393 | ||
387 | 394 | def _needaction_domain_get(self, cr, uid, context=None): | ||
388 | 395 | return [('message_unread', '=', True)] | ||
389 | 396 | |||
390 | 386 | 397 | ||
391 | 387 | class product_product(osv.osv): | 398 | class product_product(osv.osv): |
392 | 388 | _inherit = "product.product" | 399 | _inherit = "product.product" |
393 | @@ -447,6 +458,21 @@ | |||
394 | 447 | res['warning'] = {'title': _('Warning'), 'message': _('Selected Unit of Measure does not belong to the same category as the product Unit of Measure')} | 458 | res['warning'] = {'title': _('Warning'), 'message': _('Selected Unit of Measure does not belong to the same category as the product Unit of Measure')} |
395 | 448 | res['value'].update({'uom_id': product.uom_id.id}) | 459 | res['value'].update({'uom_id': product.uom_id.id}) |
396 | 449 | return res | 460 | return res |
397 | 461 | |||
398 | 462 | class account_move(osv.osv): | ||
399 | 463 | |||
400 | 464 | _inherit = ["account.move"] | ||
401 | 465 | _name = 'account.move' | ||
402 | 466 | |||
403 | 467 | def post(self, cr, uid, ids, context=None): | ||
404 | 468 | hr_expense_obj = self.pool.get('hr.expense.expense') | ||
405 | 469 | res = super(account_move, self).post(cr, uid, ids, context=context) | ||
406 | 470 | if ids: | ||
407 | 471 | name = self.browse(cr, uid, ids[0], context=context).name | ||
408 | 472 | expense_id = hr_expense_obj.search(cr, uid, [('account_move_id', '=', ids[0])], context=context) | ||
409 | 473 | if expense_id: | ||
410 | 474 | hr_expense_obj.message_post(cr, uid, [expense_id[0]], body=_('Journal Entry <b> %s </b> posted.') % (name,), context=context) | ||
411 | 475 | return res | ||
412 | 450 | 476 | ||
413 | 451 | 477 | ||
414 | 452 | # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: | 478 | # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: |
415 | 453 | 479 | ||
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 | 30 | <field name="department_id" invisible="1"/> | 30 | <field name="department_id" invisible="1"/> |
421 | 31 | <field name="date"/> | 31 | <field name="date"/> |
422 | 32 | <field name="user_id" invisible="1"/> | 32 | <field name="user_id" invisible="1"/> |
424 | 33 | <field name="name"/> | 33 | <field name="name" string="Expense Sheet"/> |
425 | 34 | <field name="currency_id" groups="base.group_multi_currency"/> | 34 | <field name="currency_id" groups="base.group_multi_currency"/> |
426 | 35 | <field name="amount" sum="Total Amount"/> | 35 | <field name="amount" sum="Total Amount"/> |
427 | 36 | <field name="state"/> | 36 | <field name="state"/> |
428 | @@ -46,7 +46,7 @@ | |||
429 | 46 | <field name="employee_id"/> | 46 | <field name="employee_id"/> |
430 | 47 | <field name="date"/> | 47 | <field name="date"/> |
431 | 48 | <field name="department_id"/> | 48 | <field name="department_id"/> |
433 | 49 | <field name="name"/> | 49 | <field name="name" string="Expense Sheet"/> |
434 | 50 | <field name="amount"/> | 50 | <field name="amount"/> |
435 | 51 | <field name="state"/> | 51 | <field name="state"/> |
436 | 52 | <button name="confirm" states="draft" string="Confirm" type="workflow" icon="gtk-apply"/> | 52 | <button name="confirm" states="draft" string="Confirm" type="workflow" icon="gtk-apply"/> |
437 | @@ -79,13 +79,16 @@ | |||
438 | 79 | <field name="company_id" groups="base.group_multi_company"/> | 79 | <field name="company_id" groups="base.group_multi_company"/> |
439 | 80 | </group> | 80 | </group> |
440 | 81 | <group> | 81 | <group> |
442 | 82 | <field name="name"/> | 82 | <field name="name" string="Expense Sheet" placeholder="e.g. Business travel at Chicago"/> |
443 | 83 | <field name="user_valid" attrs="{'invisible': [('state','=','draft')]}"/> | 83 | <field name="user_valid" attrs="{'invisible': [('state','=','draft')]}"/> |
444 | 84 | <field name="currency_id" groups="base.group_multi_currency" on_change="onchange_currency_id(currency_id, company_id)"/> | 84 | <field name="currency_id" groups="base.group_multi_currency" on_change="onchange_currency_id(currency_id, company_id)"/> |
445 | 85 | </group> | 85 | </group> |
446 | 86 | </group> | 86 | </group> |
447 | 87 | <notebook> | 87 | <notebook> |
449 | 88 | <page string="Description"> | 88 | <page string="Expense Lines"> |
450 | 89 | <group groups="account.group_account_user"> | ||
451 | 90 | <field name="journal_id" widget="selection" domain="[('type', '=', 'purchase')]" string="Journal" help="If Empty, entries will be generated in the Purchase Journal"/> | ||
452 | 91 | </group> | ||
453 | 89 | <field name="line_ids" context="{'currency_id': currency_id, 'default_analytic_account': context.get('analytic_account')}"> | 92 | <field name="line_ids" context="{'currency_id': currency_id, 'default_analytic_account': context.get('analytic_account')}"> |
454 | 90 | <form string="Expense Lines" version="7.0"> | 93 | <form string="Expense Lines" version="7.0"> |
455 | 91 | <group> | 94 | <group> |
456 | @@ -110,7 +113,7 @@ | |||
457 | 110 | <field name="sequence" invisible="1"/> | 113 | <field name="sequence" invisible="1"/> |
458 | 111 | <field name="product_id" on_change="onchange_product_id(product_id, context)" context="{'default_hr_expense_ok':1}"/> | 114 | <field name="product_id" on_change="onchange_product_id(product_id, context)" context="{'default_hr_expense_ok':1}"/> |
459 | 112 | <field name="date_value" string="Expense Date"/> | 115 | <field name="date_value" string="Expense Date"/> |
461 | 113 | <field name="name"/> | 116 | <field name="name" string="Description"/> |
462 | 114 | <field name="ref"/> | 117 | <field name="ref"/> |
463 | 115 | <field domain="[('type','in',['normal','contract'])]" name="analytic_account" groups="analytic.group_analytic_accounting"/> | 118 | <field domain="[('type','in',['normal','contract'])]" name="analytic_account" groups="analytic.group_analytic_accounting"/> |
464 | 116 | <field name="uom_id" on_change="onchange_uom(product_id, uom_id, context)"/> | 119 | <field name="uom_id" on_change="onchange_uom(product_id, uom_id, context)"/> |
465 | @@ -121,7 +124,7 @@ | |||
466 | 121 | </field> | 124 | </field> |
467 | 122 | <group> | 125 | <group> |
468 | 123 | <div> | 126 | <div> |
470 | 124 | <separator string="Notes"/> | 127 | <separator string="Description"/> |
471 | 125 | <field name="note" placeholder="Free Notes"/> | 128 | <field name="note" placeholder="Free Notes"/> |
472 | 126 | </div> | 129 | </div> |
473 | 127 | <group class="oe_subtotal_footer oe_right"> | 130 | <group class="oe_subtotal_footer oe_right"> |
474 | @@ -129,14 +132,6 @@ | |||
475 | 129 | </group> | 132 | </group> |
476 | 130 | </group> | 133 | </group> |
477 | 131 | </page> | 134 | </page> |
478 | 132 | <page string="Accounting" groups="account.group_account_user"> | ||
479 | 133 | <group> | ||
480 | 134 | <group string="Accounting Data"> | ||
481 | 135 | <field name="journal_id" widget="selection" domain="[('type', '=', 'purchase')]"/> | ||
482 | 136 | <field name="account_move_id"/> | ||
483 | 137 | </group> | ||
484 | 138 | </group> | ||
485 | 139 | </page> | ||
486 | 140 | </notebook> | 135 | </notebook> |
487 | 141 | </sheet> | 136 | </sheet> |
488 | 142 | <div class="oe_chatter"> | 137 | <div class="oe_chatter"> |
489 | @@ -156,8 +151,9 @@ | |||
490 | 156 | <field name="name" string="Expenses"/> | 151 | <field name="name" string="Expenses"/> |
491 | 157 | <field name="date"/> | 152 | <field name="date"/> |
492 | 158 | <filter icon="terp-document-new" domain="[('state','=','draft')]" string="New" help="New Expense"/> | 153 | <filter icon="terp-document-new" domain="[('state','=','draft')]" string="New" help="New Expense"/> |
495 | 159 | <filter icon="terp-camera_test" domain="[('state','=','confirm')]" string="To Approve" help="Confirmed Expenses"/> | 154 | <filter icon="terp-camera_test" domain="[('state','=','confirm')]" name="confirm" string="To Approve" help="Confirmed Expenses"/> |
496 | 160 | <filter icon="terp-dolar" domain="[('state','=','accepted')]" string="To Pay" help="Expenses to Invoice"/> | 155 | <filter icon="terp-dolar" domain="[('state','=','accepted')]" string="To Pay" name="approved" help="Expenses to Invoice"/> |
497 | 156 | <filter icon="terp-mail-message-new" string="Unread Messages" name="message_unread" domain="[('message_unread','=',True)]"/> | ||
498 | 161 | <separator/> | 157 | <separator/> |
499 | 162 | <filter domain="[('user_id', '=', uid)]" string="My Expenses"/> | 158 | <filter domain="[('user_id', '=', uid)]" string="My Expenses"/> |
500 | 163 | <field name="employee_id"/> | 159 | <field name="employee_id"/> |
501 | @@ -188,7 +184,44 @@ | |||
502 | 188 | </p> | 184 | </p> |
503 | 189 | </field> | 185 | </field> |
504 | 190 | </record> | 186 | </record> |
506 | 191 | 187 | ||
507 | 188 | <record id="expense_approved" model="ir.actions.act_window"> | ||
508 | 189 | <field name="name">Approved Expenses</field> | ||
509 | 190 | <field name="res_model">hr.expense.expense</field> | ||
510 | 191 | <field name="view_type">form</field> | ||
511 | 192 | <field name="context">{'search_default_approved':1}</field> | ||
512 | 193 | <field name="search_view_id" ref="view_hr_expense_filter"/> | ||
513 | 194 | <field name="view_id" ref="view_expenses_tree"/> | ||
514 | 195 | <field name="help" type="html"> | ||
515 | 196 | <p class="oe_view_nocontent_create"> | ||
516 | 197 | Click to register new expenses. | ||
517 | 198 | </p><p> | ||
518 | 199 | OpenERP will ensure the whole process is followed; the expense | ||
519 | 200 | sheet is validated by manager(s), the employee is reimbursed | ||
520 | 201 | from his expenses, some expenses must be re-invoiced to the | ||
521 | 202 | customers. | ||
522 | 203 | </p> | ||
523 | 204 | </field> | ||
524 | 205 | </record> | ||
525 | 206 | |||
526 | 207 | <record id="Expense_to_approve" model="ir.actions.act_window"> | ||
527 | 208 | <field name="name">Expense to Approve</field> | ||
528 | 209 | <field name="res_model">hr.expense.expense</field> | ||
529 | 210 | <field name="view_type">form</field> | ||
530 | 211 | <field name="context">{'search_default_confirm':1}</field> | ||
531 | 212 | <field name="search_view_id" ref="view_hr_expense_filter"/> | ||
532 | 213 | <field name="view_id" ref="view_expenses_tree"/> | ||
533 | 214 | <field name="help" type="html"> | ||
534 | 215 | <p class="oe_view_nocontent_create"> | ||
535 | 216 | Click to register new expenses. | ||
536 | 217 | </p><p> | ||
537 | 218 | OpenERP will ensure the whole process is followed; the expense | ||
538 | 219 | sheet is validated by manager(s), the employee is reimbursed | ||
539 | 220 | from his expenses, some expenses must be re-invoiced to the | ||
540 | 221 | customers. | ||
541 | 222 | </p> | ||
542 | 223 | </field> | ||
543 | 224 | </record> | ||
544 | 192 | 225 | ||
545 | 193 | <record id="view_product_hr_expense_form" model="ir.ui.view"> | 226 | <record id="view_product_hr_expense_form" model="ir.ui.view"> |
546 | 194 | <field name="name">product.product.expense.form</field> | 227 | <field name="name">product.product.expense.form</field> |
547 | @@ -215,6 +248,9 @@ | |||
548 | 215 | <menuitem id="menu_hr_product" name="Expense Categories" parent="hr.menu_hr_configuration" action="hr_expense_product"/> | 248 | <menuitem id="menu_hr_product" name="Expense Categories" parent="hr.menu_hr_configuration" action="hr_expense_product"/> |
549 | 216 | <menuitem id="next_id_49" name="Expenses" sequence="15" parent="hr.menu_hr_root"/> | 249 | <menuitem id="next_id_49" name="Expenses" sequence="15" parent="hr.menu_hr_root"/> |
550 | 217 | <menuitem action="expense_all" id="menu_expense_all" name="Expenses" parent="next_id_49"/> | 250 | <menuitem action="expense_all" id="menu_expense_all" name="Expenses" parent="next_id_49"/> |
551 | 251 | <menuitem action="Expense_to_approve" id="menu_expense_to_approve" name="Expense to Approve" parent="next_id_49" groups="base.group_hr_user"/> | ||
552 | 252 | <menuitem id="menu_expenses" name="Expenses" parent="account.menu_finance" sequence="3"/> | ||
553 | 253 | <menuitem action="expense_approved" id="menu_expense_account_all" name="Approved Expenses" parent="menu_expenses"/> | ||
554 | 218 | 254 | ||
555 | 219 | </data> | 255 | </data> |
556 | 220 | </openerp> | 256 | </openerp> |
557 | 221 | 257 | ||
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 | 149 | \nThe status is \'To Approve\', when holiday request is confirmed by user.\ | 149 | \nThe status is \'To Approve\', when holiday request is confirmed by user.\ |
563 | 150 | \nThe status is \'Refused\', when holiday request is refused by manager.\ | 150 | \nThe status is \'Refused\', when holiday request is refused by manager.\ |
564 | 151 | \nThe status is \'Approved\', when holiday request is approved by manager.'), | 151 | \nThe status is \'Approved\', when holiday request is approved by manager.'), |
565 | 152 | 'payslip_status': fields.selection([('toreport','To report in payslip'),('reported','Reported in last payslips')]), | ||
566 | 153 | 'report_note': fields.text('Comments from Manager'), | ||
567 | 152 | 'user_id':fields.related('employee_id', 'user_id', type='many2one', relation='res.users', string='User', store=True), | 154 | 'user_id':fields.related('employee_id', 'user_id', type='many2one', relation='res.users', string='User', store=True), |
568 | 153 | 'date_from': fields.datetime('Start Date', readonly=True, states={'draft':[('readonly',False)], 'confirm':[('readonly',False)]}, select=True), | 155 | 'date_from': fields.datetime('Start Date', readonly=True, states={'draft':[('readonly',False)], 'confirm':[('readonly',False)]}, select=True), |
569 | 154 | 'date_to': fields.datetime('End Date', readonly=True, states={'draft':[('readonly',False)], 'confirm':[('readonly',False)]}), | 156 | 'date_to': fields.datetime('End Date', readonly=True, states={'draft':[('readonly',False)], 'confirm':[('readonly',False)]}), |
570 | @@ -173,7 +175,8 @@ | |||
571 | 173 | 'state': 'draft', | 175 | 'state': 'draft', |
572 | 174 | 'type': 'remove', | 176 | 'type': 'remove', |
573 | 175 | 'user_id': lambda obj, cr, uid, context: uid, | 177 | 'user_id': lambda obj, cr, uid, context: uid, |
575 | 176 | 'holiday_type': 'employee' | 178 | 'holiday_type': 'employee', |
576 | 179 | 'payslip_status': 'toreport', | ||
577 | 177 | } | 180 | } |
578 | 178 | _constraints = [ | 181 | _constraints = [ |
579 | 179 | (_check_date, 'You can not have 2 leaves that overlaps on same day!', ['date_from','date_to']), | 182 | (_check_date, 'You can not have 2 leaves that overlaps on same day!', ['date_from','date_to']), |
580 | @@ -327,8 +330,16 @@ | |||
581 | 327 | if to_unlink: | 330 | if to_unlink: |
582 | 328 | self.unlink(cr, uid, to_unlink, context=context) | 331 | self.unlink(cr, uid, to_unlink, context=context) |
583 | 329 | return True | 332 | return True |
585 | 330 | 333 | ||
586 | 331 | def holidays_first_validate(self, cr, uid, ids, context=None): | 334 | def holidays_first_validate(self, cr, uid, ids, context=None): |
587 | 335 | #for the departmet followers | ||
588 | 336 | holidays = self.browse(cr, uid, ids, context=context) | ||
589 | 337 | dept_id = holidays[0].department_id.id or False | ||
590 | 338 | record_id = holidays[0].id | ||
591 | 339 | subtype_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'hr', 'mt_first_approve_leaves')[1] | ||
592 | 340 | if dept_id: | ||
593 | 341 | self.subscribe_by_department(cr, uid, [record_id], dept_id, [subtype_id], context=context) | ||
594 | 342 | |||
595 | 332 | self.check_holidays(cr, uid, ids, context=context) | 343 | self.check_holidays(cr, uid, ids, context=context) |
596 | 333 | obj_emp = self.pool.get('hr.employee') | 344 | obj_emp = self.pool.get('hr.employee') |
597 | 334 | ids2 = obj_emp.search(cr, uid, [('user_id', '=', uid)]) | 345 | ids2 = obj_emp.search(cr, uid, [('user_id', '=', uid)]) |
598 | @@ -337,6 +348,14 @@ | |||
599 | 337 | return self.write(cr, uid, ids, {'state':'validate1', 'manager_id': manager}) | 348 | return self.write(cr, uid, ids, {'state':'validate1', 'manager_id': manager}) |
600 | 338 | 349 | ||
601 | 339 | def holidays_validate(self, cr, uid, ids, context=None): | 350 | def holidays_validate(self, cr, uid, ids, context=None): |
602 | 351 | #for the departmet followers | ||
603 | 352 | holidays = self.browse(cr, uid, ids, context=context) | ||
604 | 353 | dept_id = holidays[0].department_id.id or False | ||
605 | 354 | record_id = holidays[0].id | ||
606 | 355 | subtype_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'hr', 'mt_second_approve_leaves')[1] | ||
607 | 356 | if dept_id: | ||
608 | 357 | self.subscribe_by_department(cr, uid, [record_id], dept_id, [subtype_id], context=context) | ||
609 | 358 | |||
610 | 340 | self.check_holidays(cr, uid, ids, context=context) | 359 | self.check_holidays(cr, uid, ids, context=context) |
611 | 341 | obj_emp = self.pool.get('hr.employee') | 360 | obj_emp = self.pool.get('hr.employee') |
612 | 342 | ids2 = obj_emp.search(cr, uid, [('user_id', '=', uid)]) | 361 | ids2 = obj_emp.search(cr, uid, [('user_id', '=', uid)]) |
613 | @@ -447,6 +466,13 @@ | |||
614 | 447 | for obj in self.browse(cr, uid, ids, context=context): | 466 | for obj in self.browse(cr, uid, ids, context=context): |
615 | 448 | self.message_post(cr, uid, [obj.id], | 467 | self.message_post(cr, uid, [obj.id], |
616 | 449 | _("Request approved, waiting second validation."), context=context) | 468 | _("Request approved, waiting second validation."), context=context) |
617 | 469 | def payslip_toreport(self, cr, uid, ids, context=None): | ||
618 | 470 | self.write(cr, uid, ids, {'payslip_status': 'reported'}) | ||
619 | 471 | return True | ||
620 | 472 | |||
621 | 473 | def payslip_reported(self, cr, uid, ids, context=None): | ||
622 | 474 | self.write(cr, uid, ids, {'payslip_status': 'toreport'}) | ||
623 | 475 | return True | ||
624 | 450 | 476 | ||
625 | 451 | class resource_calendar_leaves(osv.osv): | 477 | class resource_calendar_leaves(osv.osv): |
626 | 452 | _inherit = "resource.calendar.leaves" | 478 | _inherit = "resource.calendar.leaves" |
627 | 453 | 479 | ||
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 | 10 | <separator/> | 10 | <separator/> |
633 | 11 | <filter icon="terp-check" domain="[('state','=','draft')]" string="To Confirm"/> | 11 | <filter icon="terp-check" domain="[('state','=','draft')]" string="To Confirm"/> |
634 | 12 | <filter icon="terp-camera_test" domain="[('state','in',('confirm','validate1'))]" string="To Approve" name="approve"/> | 12 | <filter icon="terp-camera_test" domain="[('state','in',('confirm','validate1'))]" string="To Approve" name="approve"/> |
640 | 13 | <filter icon="terp-camera_test" domain="[('state','=','validate')]" string="Validated" name="validated"/> | 13 | <filter icon="terp-camera_test" domain="[('payslip_status','=','toreport')]" string="To report in payslip" name="gray"/> |
641 | 14 | <separator/> | 14 | <filter icon="terp-mail-message-new" string="Unread Messages" name="message_unread" domain="[('message_unread','=',True)]"/> |
637 | 15 | <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 | 16 | <separator/> | ||
639 | 17 | <filter string="My Leaves" icon="terp-personal" name="my_leaves" domain="[('employee_id.user_id','=', uid)]" help="My Leaves"/> | ||
642 | 18 | <separator/> | 15 | <separator/> |
643 | 19 | <filter string="My Department Leaves" icon="terp-personal+" help="My Department Leaves" domain="[('department_id.manager_id','=',uid)]"/> | 16 | <filter string="My Department Leaves" icon="terp-personal+" help="My Department Leaves" domain="[('department_id.manager_id','=',uid)]"/> |
644 | 20 | <field name="employee_id"/> | 17 | <field name="employee_id"/> |
645 | @@ -30,6 +27,13 @@ | |||
646 | 30 | <filter name="group_type" string="Type" icon="terp-stock_symbol-selection" domain="[]" context="{'group_by':'holiday_status_id'}"/> | 27 | <filter name="group_type" string="Type" icon="terp-stock_symbol-selection" domain="[]" context="{'group_by':'holiday_status_id'}"/> |
647 | 31 | <filter string="Status" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/> | 28 | <filter string="Status" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/> |
648 | 32 | </group> | 29 | </group> |
649 | 30 | <filter icon="terp-camera_test" domain="[('state','=','validate')]" string="Validated" name="validated"/> | ||
650 | 31 | <separator/> | ||
651 | 32 | <filter string="My Leaves" icon="terp-personal" name="my_leaves" domain="[('employee_id.user_id','=', uid)]" help="My Leaves"/> | ||
652 | 33 | <separator/> | ||
653 | 34 | <filter icon="terp-camera_test" domain="[('state','=','validate')]" string="Approved Leaves" name="doublevalidated"/> | ||
654 | 35 | <separator/> | ||
655 | 36 | <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 | 33 | </search> | 37 | </search> |
657 | 34 | </field> | 38 | </field> |
658 | 35 | </record> | 39 | </record> |
659 | @@ -152,6 +156,26 @@ | |||
660 | 152 | </field> | 156 | </field> |
661 | 153 | </record> | 157 | </record> |
662 | 154 | 158 | ||
663 | 159 | <record model="ir.ui.view" id="view_holiday_allocation_tree_customize"> | ||
664 | 160 | <field name="name">hr.holidays.allocation.tree</field> | ||
665 | 161 | <field name="model">hr.holidays</field> | ||
666 | 162 | <field name="arch" type="xml"> | ||
667 | 163 | <tree string="Allocation Requests" editable="top"> | ||
668 | 164 | <field name="employee_id"/> | ||
669 | 165 | <field name="holiday_type"/> | ||
670 | 166 | <field name="holiday_status_id"/> | ||
671 | 167 | <field name="name" readonly="1"/> | ||
672 | 168 | <field name="date_from"/> | ||
673 | 169 | <field name="date_to"/> | ||
674 | 170 | <field name="number_of_days" string="Allocated Days" sum="Remaining Days"/> | ||
675 | 171 | <field name="state"/> | ||
676 | 172 | <field name="payslip_status" invisible="1"/> | ||
677 | 173 | <field name="report_note" groups="base.group_hr_manager"/> | ||
678 | 174 | <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 | 175 | <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 | 176 | </tree> | ||
681 | 177 | </field> | ||
682 | 178 | </record> | ||
683 | 155 | <!-- Holidays: Leaves Management --> | 179 | <!-- Holidays: Leaves Management --> |
684 | 156 | <record model="ir.ui.view" id="allocation_company_new"> | 180 | <record model="ir.ui.view" id="allocation_company_new"> |
685 | 157 | <field name="name">Leaves Management</field> | 181 | <field name="name">Leaves Management</field> |
686 | @@ -290,7 +314,7 @@ | |||
687 | 290 | <field name="act_window_id" ref="request_approve_holidays"/> | 314 | <field name="act_window_id" ref="request_approve_holidays"/> |
688 | 291 | </record> | 315 | </record> |
689 | 292 | 316 | ||
691 | 293 | <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"/> | 317 | <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 | 294 | 318 | ||
693 | 295 | <record model="ir.actions.act_window" id="open_allocation_holidays"> | 319 | <record model="ir.actions.act_window" id="open_allocation_holidays"> |
694 | 296 | <field name="name">Allocation Requests</field> | 320 | <field name="name">Allocation Requests</field> |
695 | @@ -319,7 +343,7 @@ | |||
696 | 319 | <menuitem parent="menu_open_ask_holidays" id="menu_open_allocation_holidays" action="open_allocation_holidays"/> | 343 | <menuitem parent="menu_open_ask_holidays" id="menu_open_allocation_holidays" action="open_allocation_holidays"/> |
697 | 320 | 344 | ||
698 | 321 | <record model="ir.actions.act_window" id="request_approve_allocation"> | 345 | <record model="ir.actions.act_window" id="request_approve_allocation"> |
700 | 322 | <field name="name">Allocation Requests to Approve</field> | 346 | <field name="name">Allocation to Approve</field> |
701 | 323 | <field name="res_model">hr.holidays</field> | 347 | <field name="res_model">hr.holidays</field> |
702 | 324 | <field name="view_type">form</field> | 348 | <field name="view_type">form</field> |
703 | 325 | <field name="context">{'default_type': 'add', 'search_default_approve':1}</field> | 349 | <field name="context">{'default_type': 'add', 'search_default_approve':1}</field> |
704 | @@ -350,7 +374,7 @@ | |||
705 | 350 | <field name="view_type">form</field> | 374 | <field name="view_type">form</field> |
706 | 351 | <field name="view_mode">tree,form</field> | 375 | <field name="view_mode">tree,form</field> |
707 | 352 | <field name="view_id" eval="view_holiday_simple"/> | 376 | <field name="view_id" eval="view_holiday_simple"/> |
709 | 353 | <field name="context">{'search_default_group_type': 1, 'search_default_validated': 1}</field> | 377 | <field name="context">{'search_default_group_employee': 1, 'search_default_validated': 1, 'search_default_my_leaves': 1, 'search_default_year': 1}</field> |
710 | 354 | <field name="domain">[('holiday_type','=','employee')]</field> | 378 | <field name="domain">[('holiday_type','=','employee')]</field> |
711 | 355 | <field name="search_view_id" ref="view_hr_holidays_filter"/> | 379 | <field name="search_view_id" ref="view_hr_holidays_filter"/> |
712 | 356 | </record> | 380 | </record> |
713 | @@ -471,6 +495,18 @@ | |||
714 | 471 | <field name="domain">[('type','=','remove')]</field> | 495 | <field name="domain">[('type','=','remove')]</field> |
715 | 472 | <field name="view_id" eval="view_holiday"/> | 496 | <field name="view_id" eval="view_holiday"/> |
716 | 473 | </record> | 497 | </record> |
717 | 498 | |||
718 | 499 | <record id="act_hr_employee_holiday_request_approved" model="ir.actions.act_window"> | ||
719 | 500 | <field name="name">Absence of the month</field> | ||
720 | 501 | <field name="type">ir.actions.act_window</field> | ||
721 | 502 | <field name="res_model">hr.holidays</field> | ||
722 | 503 | <field name="src_model">hr.employee</field> | ||
723 | 504 | <field name="view_type">form</field> | ||
724 | 505 | <field name="view_mode">tree,form</field> | ||
725 | 506 | <field name="context">{'search_default_employee_id': [active_id], 'search_default_doublevalidated': True, 'search_default_gray': True}</field> | ||
726 | 507 | <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> | ||
727 | 508 | <field name="view_id" eval="view_holiday_allocation_tree_customize"/> | ||
728 | 509 | </record> | ||
729 | 474 | 510 | ||
730 | 475 | <!-- Assing leave --> | 511 | <!-- Assing leave --> |
731 | 476 | <record id="hr_holidays_leaves_assign_tree_view" model="ir.ui.view"> | 512 | <record id="hr_holidays_leaves_assign_tree_view" model="ir.ui.view"> |
732 | @@ -516,6 +552,7 @@ | |||
733 | 516 | </xpath> | 552 | </xpath> |
734 | 517 | <xpath expr="//div[@name='button_box']" position="inside"> | 553 | <xpath expr="//div[@name='button_box']" position="inside"> |
735 | 518 | <button name="%(act_hr_employee_holiday_request)d" string="Leaves" type="action" groups="base.group_hr_user"/> | 554 | <button name="%(act_hr_employee_holiday_request)d" string="Leaves" type="action" groups="base.group_hr_user"/> |
736 | 555 | <button name="%(act_hr_employee_holiday_request_approved)d" string="Absence of the month" type="action" groups="base.group_hr_user"/> | ||
737 | 519 | </xpath> | 556 | </xpath> |
738 | 520 | </field> | 557 | </field> |
739 | 521 | </record> | 558 | </record> |
740 | 522 | 559 | ||
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 | 405 | applicant = self.browse(cr, uid, obj_id, context=context) | 405 | applicant = self.browse(cr, uid, obj_id, context=context) |
746 | 406 | if applicant.job_id: | 406 | if applicant.job_id: |
747 | 407 | 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) | 407 | 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 | 408 | |||
749 | 409 | #for the departmet followers | ||
750 | 410 | dept_id = vals.get('department_id', False) | ||
751 | 411 | subtype_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'hr', 'mt_applications')[1] | ||
752 | 412 | if dept_id: | ||
753 | 413 | self.subscribe_by_department(cr, uid, [obj_id], dept_id, [subtype_id], context=context) | ||
754 | 408 | return obj_id | 414 | return obj_id |
755 | 409 | 415 | ||
756 | 410 | def case_open(self, cr, uid, ids, context=None): | 416 | def case_open(self, cr, uid, ids, context=None): |
757 | @@ -493,6 +499,9 @@ | |||
758 | 493 | context['empty_list_help_document_name'] = _("job applicants") | 499 | context['empty_list_help_document_name'] = _("job applicants") |
759 | 494 | return super(hr_applicant, self).get_empty_list_help(cr, uid, help, context=context) | 500 | return super(hr_applicant, self).get_empty_list_help(cr, uid, help, context=context) |
760 | 495 | 501 | ||
761 | 502 | def _needaction_domain_get(self, cr, uid, context=None): | ||
762 | 503 | return [('message_unread', '=', True)] | ||
763 | 504 | |||
764 | 496 | 505 | ||
765 | 497 | class hr_job(osv.osv): | 506 | class hr_job(osv.osv): |
766 | 498 | _inherit = "hr.job" | 507 | _inherit = "hr.job" |
767 | 499 | 508 | ||
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 | 28 | 28 | ||
773 | 29 | class hr_timesheet_sheet(osv.osv): | 29 | class hr_timesheet_sheet(osv.osv): |
774 | 30 | _name = "hr_timesheet_sheet.sheet" | 30 | _name = "hr_timesheet_sheet.sheet" |
776 | 31 | _inherit = "mail.thread" | 31 | _inherit = ['mail.thread','ir.needaction_mixin'] |
777 | 32 | _table = 'hr_timesheet_sheet_sheet' | 32 | _table = 'hr_timesheet_sheet_sheet' |
778 | 33 | _order = "id desc" | 33 | _order = "id desc" |
779 | 34 | _description="Timesheet" | 34 | _description="Timesheet" |
780 | @@ -70,7 +70,9 @@ | |||
781 | 70 | raise osv.except_osv(_('Error!'), _('In order to create a timesheet for this employee, you must link the employee to a product, like \'Consultant\'.')) | 70 | 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 | 71 | if not self.pool.get('hr.employee').browse(cr, uid, vals['employee_id']).journal_id: | 71 | if not self.pool.get('hr.employee').browse(cr, uid, vals['employee_id']).journal_id: |
783 | 72 | 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\'.')) | 72 | 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\'.')) |
785 | 73 | return super(hr_timesheet_sheet, self).create(cr, uid, vals, *args, **argv) | 73 | timesheet_id = super(hr_timesheet_sheet, self).create(cr, uid, vals, *args, **argv) |
786 | 74 | |||
787 | 75 | return timesheet_id | ||
788 | 74 | 76 | ||
789 | 75 | def write(self, cr, uid, ids, vals, *args, **argv): | 77 | def write(self, cr, uid, ids, vals, *args, **argv): |
790 | 76 | if 'employee_id' in vals: | 78 | if 'employee_id' in vals: |
791 | @@ -86,6 +88,14 @@ | |||
792 | 86 | return super(hr_timesheet_sheet, self).write(cr, uid, ids, vals, *args, **argv) | 88 | return super(hr_timesheet_sheet, self).write(cr, uid, ids, vals, *args, **argv) |
793 | 87 | 89 | ||
794 | 88 | def button_confirm(self, cr, uid, ids, context=None): | 90 | def button_confirm(self, cr, uid, ids, context=None): |
795 | 91 | #for the departmet followers | ||
796 | 92 | timesheet = self.browse(cr, uid, ids, context=context) | ||
797 | 93 | dept_id = timesheet[0].department_id.id or False | ||
798 | 94 | record_id = timesheet[0].id | ||
799 | 95 | subtype_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'hr', 'mt_approve_timesheet')[1] | ||
800 | 96 | if dept_id: | ||
801 | 97 | self.subscribe_by_department(cr, uid, [record_id], dept_id, [subtype_id], context=context) | ||
802 | 98 | |||
803 | 89 | for sheet in self.browse(cr, uid, ids, context=context): | 99 | for sheet in self.browse(cr, uid, ids, context=context): |
804 | 90 | if sheet.employee_id and sheet.employee_id.parent_id and sheet.employee_id.parent_id.user_id: | 100 | if sheet.employee_id and sheet.employee_id.parent_id and sheet.employee_id.parent_id.user_id: |
805 | 91 | self.message_subscribe_users(cr, uid, [sheet.id], user_ids=[sheet.employee_id.parent_id.user_id.id], context=context) | 101 | self.message_subscribe_users(cr, uid, [sheet.id], user_ids=[sheet.employee_id.parent_id.user_id.id], context=context) |
806 | 92 | 102 | ||
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 | 177 | <field name="date_from"/> | 177 | <field name="date_from"/> |
812 | 178 | <filter name="new" string="In Draft" domain="[('state','in',('draft', 'new'))]" help="Unvalidated Timesheets"/> | 178 | <filter name="new" string="In Draft" domain="[('state','in',('draft', 'new'))]" help="Unvalidated Timesheets"/> |
813 | 179 | <filter name="to_approve" string="To Approve" domain="[('state','=','confirm')]" help="Confirmed Timesheets"/> | 179 | <filter name="to_approve" string="To Approve" domain="[('state','=','confirm')]" help="Confirmed Timesheets"/> |
814 | 180 | <filter icon="terp-mail-message-new" string="Unread Messages" name="message_unread" domain="[('message_unread','=',True)]"/> | ||
815 | 180 | <field name="employee_id"/> | 181 | <field name="employee_id"/> |
816 | 181 | <field name="department_id"/> | 182 | <field name="department_id"/> |
817 | 182 | <group expand="0" string="Group By..."> | 183 | <group expand="0" string="Group By..."> |
818 | @@ -188,7 +189,7 @@ | |||
819 | 188 | </record> | 189 | </record> |
820 | 189 | 190 | ||
821 | 190 | <record id="act_hr_timesheet_sheet_form" model="ir.actions.act_window"> | 191 | <record id="act_hr_timesheet_sheet_form" model="ir.actions.act_window"> |
823 | 191 | <field name="name">Timesheets to Validate</field> | 192 | <field name="name">Timesheets to Approve</field> |
824 | 192 | <field name="type">ir.actions.act_window</field> | 193 | <field name="type">ir.actions.act_window</field> |
825 | 193 | <field name="res_model">hr_timesheet_sheet.sheet</field> | 194 | <field name="res_model">hr_timesheet_sheet.sheet</field> |
826 | 194 | <field name="view_type">form</field> | 195 | <field name="view_type">form</field> |
827 | @@ -210,7 +211,7 @@ | |||
828 | 210 | </record> | 211 | </record> |
829 | 211 | 212 | ||
830 | 212 | <menuitem action="act_hr_timesheet_sheet_form" id="menu_act_hr_timesheet_sheet_form" parent="hr_attendance.menu_hr_time_tracking" | 213 | <menuitem action="act_hr_timesheet_sheet_form" id="menu_act_hr_timesheet_sheet_form" parent="hr_attendance.menu_hr_time_tracking" |
832 | 213 | sequence="2" groups="base.group_hr_user"/> | 214 | sequence="11" groups="base.group_hr_user"/> |
833 | 214 | 215 | ||
834 | 215 | <!-- | 216 | <!-- |
835 | 216 | Company inheritancy | 217 | Company inheritancy |