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

Proposed by Bhumi Thakkar (Open ERP)
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
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

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,Applications,Approve Timesheet,Approve Expenses,First approval of leaves/ Allocation,Second approval of leaves,Appraisals
=> 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.

To post a comment you must log in.
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

Revision history for this message
Mustufa Rangwala (Open ERP) (mra-tinyerp) wrote :

Please resolve conflicts.

review: Needs Fixing
8723. By Jignesh Rathod(OpenERP)

Resolve Conflicts.

8724. By Jignesh Rathod(OpenERP)

Merge With Addons.

Revision history for this message
Jignesh Rathod(OpenERP) (jir-openerp) :
review: Needs Resubmitting
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

Revision history for this message
Thibault Delavallée (OpenERP) (tde-openerp) wrote :

Merged into https://code.launchpad.net/~openerp-dev/openobject-addons/trunk-visibility-hr_holidays-bth-tde that holds a more recent implementation of the feature. I therefore reject this branch, because the other one already contains this one !

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

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'hr/__openerp__.py'
2--- hr/__openerp__.py 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">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>
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','&gt;=', context_today().strftime("%Y-%m-1")), ('date_from','&lt;', datetime.datetime(year=context_today().year, month=context_today().month+1, day=1).strftime("%Y-%m-1"))]</field>
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

Subscribers

People subscribed via source and target branches

to all changes: