[MRG] merge with lp:openobject-addons
bzr revid: tpa@tinyerp.com-20131224053704-43mqjcl7j0pwx85t
This commit is contained in:
commit
aae1585eb8
|
@ -3,9 +3,15 @@
|
||||||
<data noupdate="1">
|
<data noupdate="1">
|
||||||
|
|
||||||
<record id="analytic_journal_sale" model="account.analytic.journal">
|
<record id="analytic_journal_sale" model="account.analytic.journal">
|
||||||
|
<field name="code">SAL</field>
|
||||||
<field name="name">Sales</field>
|
<field name="name">Sales</field>
|
||||||
<field name="type">sale</field>
|
<field name="type">sale</field>
|
||||||
</record>
|
</record>
|
||||||
|
<record id="exp" model="account.analytic.journal">
|
||||||
|
<field name="code">PUR</field>
|
||||||
|
<field name="name">Purchases</field>
|
||||||
|
<field name="type">purchase</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Payment term
|
Payment term
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -7,14 +7,14 @@ msgstr ""
|
||||||
"Project-Id-Version: OpenERP Server 6.0dev\n"
|
"Project-Id-Version: OpenERP Server 6.0dev\n"
|
||||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||||
"POT-Creation-Date: 2012-12-21 17:04+0000\n"
|
"POT-Creation-Date: 2012-12-21 17:04+0000\n"
|
||||||
"PO-Revision-Date: 2013-07-02 06:32+0000\n"
|
"PO-Revision-Date: 2013-12-19 08:06+0000\n"
|
||||||
"Last-Translator: Chertykov Denis <chertykov@gmail.com>\n"
|
"Last-Translator: Chertykov Denis <chertykov@gmail.com>\n"
|
||||||
"Language-Team: \n"
|
"Language-Team: \n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Launchpad-Export-Date: 2013-09-12 05:32+0000\n"
|
"X-Launchpad-Export-Date: 2013-12-20 05:11+0000\n"
|
||||||
"X-Generator: Launchpad (build 16761)\n"
|
"X-Generator: Launchpad (build 16872)\n"
|
||||||
|
|
||||||
#. module: account
|
#. module: account
|
||||||
#: model:process.transition,name:account.process_transition_supplierreconcilepaid0
|
#: model:process.transition,name:account.process_transition_supplierreconcilepaid0
|
||||||
|
@ -184,6 +184,13 @@ msgid ""
|
||||||
" </p>\n"
|
" </p>\n"
|
||||||
" "
|
" "
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"<p class=\"oe_view_nocontent_create\">\n"
|
||||||
|
" Щелкните, чтобы добавить отчетный период.\n"
|
||||||
|
" </p><p>\n"
|
||||||
|
" Отчетный период как правило - месяц или квартал .\n"
|
||||||
|
" Обычно он соответствует периодам налоговой декларации.\n"
|
||||||
|
" </p>\n"
|
||||||
|
" "
|
||||||
|
|
||||||
#. module: account
|
#. module: account
|
||||||
#: model:ir.actions.act_window,name:account.action_view_created_invoice_dashboard
|
#: model:ir.actions.act_window,name:account.action_view_created_invoice_dashboard
|
||||||
|
|
|
@ -6,11 +6,6 @@
|
||||||
<field name="name">Sales</field>
|
<field name="name">Sales</field>
|
||||||
<field name="type">sale</field>
|
<field name="type">sale</field>
|
||||||
</record>
|
</record>
|
||||||
<record id="exp" model="account.analytic.journal">
|
|
||||||
<field name="code">PUR</field>
|
|
||||||
<field name="name">Purchases</field>
|
|
||||||
<field name="type">purchase</field>
|
|
||||||
</record>
|
|
||||||
<record id="sit" model="account.analytic.journal">
|
<record id="sit" model="account.analytic.journal">
|
||||||
<field name="code">START</field>
|
<field name="code">START</field>
|
||||||
<field name="name">Miscellaneous Operation</field>
|
<field name="name">Miscellaneous Operation</field>
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
# Spanish (Peru) translation for openobject-addons
|
||||||
|
# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
|
||||||
|
# This file is distributed under the same license as the openobject-addons package.
|
||||||
|
# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: openobject-addons\n"
|
||||||
|
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
|
"POT-Creation-Date: 2012-12-21 17:04+0000\n"
|
||||||
|
"PO-Revision-Date: 2013-12-11 21:56+0000\n"
|
||||||
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
|
"Language-Team: Spanish (Peru) <es_PE@li.org>\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"X-Launchpad-Export-Date: 2013-12-12 05:15+0000\n"
|
||||||
|
"X-Generator: Launchpad (build 16869)\n"
|
||||||
|
|
||||||
|
#. module: account_accountant
|
||||||
|
#: model:ir.actions.client,name:account_accountant.action_client_account_menu
|
||||||
|
msgid "Open Accounting Menu"
|
||||||
|
msgstr ""
|
|
@ -450,6 +450,7 @@ class account_analytic_account(osv.osv):
|
||||||
'is_overdue_quantity' : fields.function(_is_overdue_quantity, method=True, type='boolean', string='Overdue Quantity',
|
'is_overdue_quantity' : fields.function(_is_overdue_quantity, method=True, type='boolean', string='Overdue Quantity',
|
||||||
store={
|
store={
|
||||||
'account.analytic.line' : (_get_analytic_account, None, 20),
|
'account.analytic.line' : (_get_analytic_account, None, 20),
|
||||||
|
'account.analytic.account': (lambda self, cr, uid, ids, c=None: ids, ['quantity_max'], 10),
|
||||||
}),
|
}),
|
||||||
'ca_invoiced': fields.function(_ca_invoiced_calc, type='float', string='Invoiced Amount',
|
'ca_invoiced': fields.function(_ca_invoiced_calc, type='float', string='Invoiced Amount',
|
||||||
help="Total customer invoiced amount for this account.",
|
help="Total customer invoiced amount for this account.",
|
||||||
|
|
|
@ -41,7 +41,7 @@
|
||||||
<field name="journal"/>
|
<field name="journal"/>
|
||||||
<field name="bank_id" domain="[('partner_id','=',partner_id)]" />
|
<field name="bank_id" domain="[('partner_id','=',partner_id)]" />
|
||||||
<field name="company_id" widget='selection' groups="base.group_multi_company" on_change="onchange_company_id(company_id)"/>
|
<field name="company_id" widget='selection' groups="base.group_multi_company" on_change="onchange_company_id(company_id)"/>
|
||||||
<field name="partner_id" widget='selection' invisible="1"/>
|
<field name="partner_id" invisible="1"/>
|
||||||
</group>
|
</group>
|
||||||
</form>
|
</form>
|
||||||
</field>
|
</field>
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -23,6 +23,7 @@ from datetime import datetime, timedelta
|
||||||
import time
|
import time
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
import openerp
|
||||||
from openerp import SUPERUSER_ID
|
from openerp import SUPERUSER_ID
|
||||||
from openerp.osv import fields, osv
|
from openerp.osv import fields, osv
|
||||||
from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT
|
from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT
|
||||||
|
@ -222,6 +223,7 @@ class base_action_rule(osv.osv):
|
||||||
def create(self, cr, uid, vals, context=None):
|
def create(self, cr, uid, vals, context=None):
|
||||||
res_id = super(base_action_rule, self).create(cr, uid, vals, context=context)
|
res_id = super(base_action_rule, self).create(cr, uid, vals, context=context)
|
||||||
self._register_hook(cr, [res_id])
|
self._register_hook(cr, [res_id])
|
||||||
|
openerp.modules.registry.RegistryManager.signal_registry_change(cr.dbname)
|
||||||
return res_id
|
return res_id
|
||||||
|
|
||||||
def write(self, cr, uid, ids, vals, context=None):
|
def write(self, cr, uid, ids, vals, context=None):
|
||||||
|
@ -229,6 +231,7 @@ class base_action_rule(osv.osv):
|
||||||
ids = [ids]
|
ids = [ids]
|
||||||
super(base_action_rule, self).write(cr, uid, ids, vals, context=context)
|
super(base_action_rule, self).write(cr, uid, ids, vals, context=context)
|
||||||
self._register_hook(cr, ids)
|
self._register_hook(cr, ids)
|
||||||
|
openerp.modules.registry.RegistryManager.signal_registry_change(cr.dbname)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def onchange_model_id(self, cr, uid, ids, model_id, context=None):
|
def onchange_model_id(self, cr, uid, ids, model_id, context=None):
|
||||||
|
|
|
@ -411,7 +411,7 @@
|
||||||
on_change="on_change_partner_id(partner_id)"
|
on_change="on_change_partner_id(partner_id)"
|
||||||
string="Customer"
|
string="Customer"
|
||||||
context="{'default_name': partner_name, 'default_email': email_from, 'default_phone': phone}"/>
|
context="{'default_name': partner_name, 'default_email': email_from, 'default_phone': phone}"/>
|
||||||
<field name="email_from" string="Email"/>
|
<field name="email_from" string="Email" widget="email"/>
|
||||||
<field name="phone"/>
|
<field name="phone"/>
|
||||||
</group>
|
</group>
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,7 @@ import psycopg2
|
||||||
|
|
||||||
import openerp
|
import openerp
|
||||||
from openerp import tools
|
from openerp import tools
|
||||||
|
from openerp import SUPERUSER_ID
|
||||||
from openerp.osv import fields, osv
|
from openerp.osv import fields, osv
|
||||||
from openerp.osv.orm import except_orm
|
from openerp.osv.orm import except_orm
|
||||||
import openerp.report.interface
|
import openerp.report.interface
|
||||||
|
@ -322,7 +323,7 @@ class document_directory(osv.osv):
|
||||||
ressource_parent_type_id=vals.get('ressource_parent_type_id',False)
|
ressource_parent_type_id=vals.get('ressource_parent_type_id',False)
|
||||||
ressource_id=vals.get('ressource_id',0)
|
ressource_id=vals.get('ressource_id',0)
|
||||||
if op=='write':
|
if op=='write':
|
||||||
for directory in self.browse(cr, uid, ids):
|
for directory in self.browse(cr, SUPERUSER_ID, ids):
|
||||||
if not name:
|
if not name:
|
||||||
name=directory.name
|
name=directory.name
|
||||||
if not parent_id:
|
if not parent_id:
|
||||||
|
@ -336,7 +337,7 @@ class document_directory(osv.osv):
|
||||||
if len(res):
|
if len(res):
|
||||||
return False
|
return False
|
||||||
if op=='create':
|
if op=='create':
|
||||||
res=self.search(cr,uid,[('name','=',name),('parent_id','=',parent_id),('ressource_parent_type_id','=',ressource_parent_type_id),('ressource_id','=',ressource_id)])
|
res = self.search(cr, SUPERUSER_ID, [('name','=',name),('parent_id','=',parent_id),('ressource_parent_type_id','=',ressource_parent_type_id),('ressource_id','=',ressource_id)])
|
||||||
if len(res):
|
if len(res):
|
||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
|
@ -31,7 +31,7 @@ class report_document_user(osv.osv):
|
||||||
'name': fields.char('Year', size=64,readonly=True),
|
'name': fields.char('Year', size=64,readonly=True),
|
||||||
'month':fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'), ('05','May'), ('06','June'),
|
'month':fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'), ('05','May'), ('06','June'),
|
||||||
('07','July'), ('08','August'), ('09','September'), ('10','October'), ('11','November'), ('12','December')],'Month',readonly=True),
|
('07','July'), ('08','August'), ('09','September'), ('10','October'), ('11','November'), ('12','December')],'Month',readonly=True),
|
||||||
'user_id':fields.integer('Owner', readonly=True),
|
'user_id': fields.many2one('res.users', 'Owner', readonly=True),
|
||||||
'user': fields.related('user_id', 'name', type='char', size=64, readonly=True),
|
'user': fields.related('user_id', 'name', type='char', size=64, readonly=True),
|
||||||
'directory': fields.char('Directory',size=64,readonly=True),
|
'directory': fields.char('Directory',size=64,readonly=True),
|
||||||
'datas_fname': fields.char('File Name',size=64,readonly=True),
|
'datas_fname': fields.char('File Name',size=64,readonly=True),
|
||||||
|
|
|
@ -58,6 +58,23 @@
|
||||||
!python {model: ir.attachment}: |
|
!python {model: ir.attachment}: |
|
||||||
ids = self.search(cr, uid, [('res_model', '=', 'res.country'), ('res_id', '=', ref("base.za"))])
|
ids = self.search(cr, uid, [('res_model', '=', 'res.country'), ('res_id', '=', ref("base.za"))])
|
||||||
assert ids == [ ref("attach_3rd")], ids
|
assert ids == [ ref("attach_3rd")], ids
|
||||||
|
-
|
||||||
|
I test that I can't create duplicate directories (even when duplicates are hidden by a record rule)
|
||||||
|
-
|
||||||
|
!python {model: document.directory}: |
|
||||||
|
duplicate_detected = False
|
||||||
|
from openerp.osv.osv import except_osv
|
||||||
|
try:
|
||||||
|
demo_uid = ref('base.user_demo')
|
||||||
|
dir_vals = {
|
||||||
|
'name': 'Testing (will be deleted!)',
|
||||||
|
'parent_id': ref('document.dir_root')
|
||||||
|
}
|
||||||
|
new_dir_id = self.create(cr, demo_uid, dir_vals, context=None)
|
||||||
|
self.unlink(cr, uid, [new_dir_id], context=None)
|
||||||
|
except except_osv, e:
|
||||||
|
duplicate_detected = e.value == u'Directory name must be unique!'
|
||||||
|
assert duplicate_detected is True, 'Failed to detect duplicate directory'
|
||||||
-
|
-
|
||||||
I delete the attachments
|
I delete the attachments
|
||||||
-
|
-
|
||||||
|
|
|
@ -411,7 +411,17 @@ class email_template(osv.osv):
|
||||||
# create a mail_mail based on values, without attachments
|
# create a mail_mail based on values, without attachments
|
||||||
values = self.generate_email(cr, uid, template_id, res_id, context=context)
|
values = self.generate_email(cr, uid, template_id, res_id, context=context)
|
||||||
assert values.get('email_from'), 'email_from is missing or empty after template rendering, send_mail() cannot proceed'
|
assert values.get('email_from'), 'email_from is missing or empty after template rendering, send_mail() cannot proceed'
|
||||||
del values['partner_to'] # TODO Properly use them.
|
|
||||||
|
# process partner_to field that is a comma separated list of partner_ids -> recipient_ids
|
||||||
|
# NOTE: only usable if force_send is True, because otherwise the value is
|
||||||
|
# not stored on the mail_mail, and therefore lost -> fixed in v8
|
||||||
|
values['recipient_ids'] = []
|
||||||
|
partner_to = values.pop('partner_to', '')
|
||||||
|
if partner_to:
|
||||||
|
# placeholders could generate '', 3, 2 due to some empty field values
|
||||||
|
tpl_partner_ids = [pid for pid in partner_to.split(',') if pid]
|
||||||
|
values['recipient_ids'] += [(4, pid) for pid in self.pool['res.partner'].exists(cr, SUPERUSER_ID, tpl_partner_ids, context=context)]
|
||||||
|
|
||||||
attachment_ids = values.pop('attachment_ids', [])
|
attachment_ids = values.pop('attachment_ids', [])
|
||||||
attachments = values.pop('attachments', [])
|
attachments = values.pop('attachments', [])
|
||||||
msg_id = mail_mail.create(cr, uid, values, context=context)
|
msg_id = mail_mail.create(cr, uid, values, context=context)
|
||||||
|
|
|
@ -33,7 +33,7 @@ class TestServerActionsEmail(TestServerActionsBase):
|
||||||
'name': 'TestTemplate',
|
'name': 'TestTemplate',
|
||||||
'email_from': 'myself@example.com',
|
'email_from': 'myself@example.com',
|
||||||
'email_to': 'brigitte@example.com',
|
'email_to': 'brigitte@example.com',
|
||||||
'partner_to': '[%s]' % self.test_partner_id,
|
'partner_to': '%s' % self.test_partner_id,
|
||||||
'model_id': self.res_partner_model_id,
|
'model_id': self.res_partner_model_id,
|
||||||
'subject': 'About ${object.name}',
|
'subject': 'About ${object.name}',
|
||||||
'body_html': '<p>Dear ${object.name}, your parent is ${object.parent_id and object.parent_id.name or "False"}</p>',
|
'body_html': '<p>Dear ${object.name}, your parent is ${object.parent_id and object.parent_id.name or "False"}</p>',
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
|
|
||||||
import base64
|
import base64
|
||||||
from openerp.addons.mail.tests.common import TestMail
|
from openerp.addons.mail.tests.common import TestMail
|
||||||
|
from openerp.tools import mute_logger
|
||||||
|
|
||||||
|
|
||||||
class test_message_compose(TestMail):
|
class test_message_compose(TestMail):
|
||||||
|
@ -200,3 +201,44 @@ class test_message_compose(TestMail):
|
||||||
# Generate messsage with default email and partner on template
|
# Generate messsage with default email and partner on template
|
||||||
mail_value = mail_compose.generate_email_for_composer(cr, uid, email_template_id, uid)
|
mail_value = mail_compose.generate_email_for_composer(cr, uid, email_template_id, uid)
|
||||||
self.assertEqual(set(mail_value['partner_ids']), set(send_to), 'mail.message partner_ids list created by template is incorrect')
|
self.assertEqual(set(mail_value['partner_ids']), set(send_to), 'mail.message partner_ids list created by template is incorrect')
|
||||||
|
|
||||||
|
@mute_logger('openerp.osv.orm', 'openerp.osv.orm')
|
||||||
|
def test_10_email_templating(self):
|
||||||
|
""" Tests designed for the mail.compose.message wizard updated by email_template. """
|
||||||
|
cr, uid, context = self.cr, self.uid, {}
|
||||||
|
|
||||||
|
# create the email.template on mail.group model
|
||||||
|
group_model_id = self.registry('ir.model').search(cr, uid, [('model', '=', 'mail.group')])[0]
|
||||||
|
email_template = self.registry('email.template')
|
||||||
|
email_template_id = email_template.create(cr, uid, {
|
||||||
|
'model_id': group_model_id,
|
||||||
|
'name': 'Pigs Template',
|
||||||
|
'email_from': 'Raoul Grosbedon <raoul@example.com>',
|
||||||
|
'subject': '${object.name}',
|
||||||
|
'body_html': '${object.description}',
|
||||||
|
'user_signature': True,
|
||||||
|
'email_to': 'b@b.b c@c.c',
|
||||||
|
'email_cc': 'd@d.d',
|
||||||
|
'partner_to': '${user.partner_id.id},%s,%s,-1' % (self.user_raoul.partner_id.id, self.user_bert.partner_id.id)
|
||||||
|
})
|
||||||
|
|
||||||
|
# not force send: email_recipients is not taken into account
|
||||||
|
msg_id = email_template.send_mail(cr, uid, email_template_id, self.group_pigs_id, context=context)
|
||||||
|
mail = self.mail_mail.browse(cr, uid, msg_id, context=context)
|
||||||
|
self.assertEqual(mail.subject, 'Pigs', 'email_template: send_mail: wrong subject')
|
||||||
|
self.assertEqual(mail.email_to, 'b@b.b c@c.c', 'email_template: send_mail: wrong email_to')
|
||||||
|
self.assertEqual(mail.email_cc, 'd@d.d', 'email_template: send_mail: wrong email_cc')
|
||||||
|
self.assertEqual(
|
||||||
|
set([partner.id for partner in mail.recipient_ids]),
|
||||||
|
set((self.partner_admin_id, self.user_raoul.partner_id.id, self.user_bert.partner_id.id)),
|
||||||
|
'email_template: send_mail: wrong management of partner_to')
|
||||||
|
|
||||||
|
# force send: take email_recipients into account
|
||||||
|
email_template.send_mail(cr, uid, email_template_id, self.group_pigs_id, force_send=True, context=context)
|
||||||
|
sent_emails = self._build_email_kwargs_list
|
||||||
|
email_to_lst = [
|
||||||
|
['b@b.b', 'c@c.c'], ['"Followers of Pigs" <admin@example.com>'],
|
||||||
|
['"Followers of Pigs" <raoul@raoul.fr>'], ['"Followers of Pigs" <bert@bert.fr>']]
|
||||||
|
self.assertEqual(len(sent_emails), 4, 'email_template: send_mail: 3 valid email recipients + email_to -> should send 4 emails')
|
||||||
|
for email in sent_emails:
|
||||||
|
self.assertIn(email['email_to'], email_to_lst, 'email_template: send_mail: wrong email_recipients')
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
#
|
#
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
from openerp import tools
|
from openerp import tools, SUPERUSER_ID
|
||||||
from openerp.osv import osv, fields
|
from openerp.osv import osv, fields
|
||||||
|
|
||||||
|
|
||||||
|
@ -143,9 +143,9 @@ class mail_compose_message(osv.TransientModel):
|
||||||
partner_ids.append(partner_id)
|
partner_ids.append(partner_id)
|
||||||
partner_to = rendered_values.pop('partner_to', '')
|
partner_to = rendered_values.pop('partner_to', '')
|
||||||
if partner_to:
|
if partner_to:
|
||||||
for partner_id in partner_to.split(','):
|
# placeholders could generate '', 3, 2 due to some empty field values
|
||||||
if partner_id: # placeholders could generate '', 3, 2 due to some empty field values
|
tpl_partner_ids = [pid for pid in partner_to.split(',') if pid]
|
||||||
partner_ids.append(int(partner_id))
|
partner_ids += self.pool['res.partner'].exists(cr, SUPERUSER_ID, tpl_partner_ids, context=context)
|
||||||
return partner_ids
|
return partner_ids
|
||||||
|
|
||||||
def generate_email_for_composer_batch(self, cr, uid, template_id, res_ids, context=None):
|
def generate_email_for_composer_batch(self, cr, uid, template_id, res_ids, context=None):
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -57,9 +57,10 @@ class res_users(osv.Model):
|
||||||
various mailboxes, we do not have access to the current partner_id. """
|
various mailboxes, we do not have access to the current partner_id. """
|
||||||
if kwargs.get('type') == 'email':
|
if kwargs.get('type') == 'email':
|
||||||
return super(res_users, self).message_post(cr, uid, thread_id, context=context, **kwargs)
|
return super(res_users, self).message_post(cr, uid, thread_id, context=context, **kwargs)
|
||||||
|
res = None
|
||||||
employee_ids = self._message_post_get_eid(cr, uid, thread_id, context=context)
|
employee_ids = self._message_post_get_eid(cr, uid, thread_id, context=context)
|
||||||
if not employee_ids:
|
if not employee_ids: # no employee: fall back on previous behavior
|
||||||
pass # dpo something
|
return super(res_users, self).message_post(cr, uid, thread_id, context=context, **kwargs)
|
||||||
for employee_id in employee_ids:
|
for employee_id in employee_ids:
|
||||||
res = self.pool.get('hr.employee').message_post(cr, uid, employee_id, context=context, **kwargs)
|
res = self.pool.get('hr.employee').message_post(cr, uid, employee_id, context=context, **kwargs)
|
||||||
return res
|
return res
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
##############################################################################
|
||||||
|
#
|
||||||
|
# OpenERP, Open Source Management Solution
|
||||||
|
# Copyright (C) 2010-today OpenERP SA (<http://www.openerp.com>)
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Affero General Public License as
|
||||||
|
# published by the Free Software Foundation, either version 3 of the
|
||||||
|
# License, or (at your option) any later version
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Affero General Public License for more details
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
#
|
||||||
|
##############################################################################
|
||||||
|
|
||||||
|
import models
|
|
@ -0,0 +1,28 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
{
|
||||||
|
'name': 'Applicant Resumes and Letters',
|
||||||
|
'version': '1.0',
|
||||||
|
'category': 'Human Resources',
|
||||||
|
'sequence': 25,
|
||||||
|
'summary': 'Search job applications by Index content.',
|
||||||
|
'description': """This module allows you to search job applications by content
|
||||||
|
of resumes and letters.""",
|
||||||
|
'author': 'OpenERP SA',
|
||||||
|
'website': 'http://www.openerp.com',
|
||||||
|
'depends': [
|
||||||
|
'hr_recruitment',
|
||||||
|
'document'
|
||||||
|
],
|
||||||
|
'data': [
|
||||||
|
'views/hr_applicant.xml'
|
||||||
|
],
|
||||||
|
'demo': [
|
||||||
|
'demo/hr_applicant.xml'
|
||||||
|
],
|
||||||
|
'installable': True,
|
||||||
|
'auto_install': True,
|
||||||
|
'application': True,
|
||||||
|
}
|
||||||
|
|
||||||
|
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
|
@ -0,0 +1,257 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<openerp>
|
||||||
|
<data noupdate="1">
|
||||||
|
|
||||||
|
<record id="applicant_attach1" model="ir.attachment">
|
||||||
|
<field name="datas">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
|
||||||
|
muLIZjPZRMlGSjZQsr7RLK2npNFM/pOSdZQ8as6QHi0haylpWE7WPLJaWkPJI6vJ6ijyH5Ss8iMr
|
||||||
|
KVlGyVJK6j1Gqd6f1HdgZHtP9BiJ54TothC3Tayj5GFKailx1ZRIrlZSUz1Kqikh1aNIFSVLkslD
|
||||||
|
lFQmk4rbZPExUk6JkxIHJWWLoqQyShYhk7QoitgpWUjJAkoevN9HetCPzHeQH7xGHoCbBwLJ/T4E
|
||||||
|
PHpuIJlDyWxKZkWESbOSSSklJZQUU3LfalJESWEgKaAkH4+V8inJO0ZmjiIzckOlGRNJbqZFyg0l
|
||||||
|
07NDpemUTIO7aQ6SA3c5x0h2KMmCiayJJDPDLGVaSGaHYLPpxYx0fynDTDI6BAR36TY/Kd2fpHfg
|
||||||
|
E3BnSzNKNj9i68ANcJdm1EtpRpLWgW02h3gvJfeACPfcJlMpuXsUmULJZAB4soNMGhcuTZpJJlIy
|
||||||
|
YWygNIGS1JlkfFK4NH4mSYGvFEqSYWEyJePg8bhwkhROEmGUGEoS9MFSwjEyNj5AGhtIxnYIjG28
|
||||||
|
ySzFB5B4Jm6rOOauOGkMJXfByrviyGhhijSaklGUjKRkhD+JC86Q4rLJcH8SS4nV31+yUhIjj5Vi
|
||||||
|
VhN5LImeSaKAcxQlkZQMA2yHURIBVokII+GUhFESSkkIUAjJIcFBY6XgDBIUaJKCxpJAEwmAdQGB
|
||||||
|
xAL7LZSYQXNzBjEBB5OZmBTs/P2Mkr8/8Vew8/M1SH5G4qdg5wvY+RqIL2B3WDTqiZH51kTRhxID
|
||||||
|
aGKgRB9MdCaipUQDpDWUSIGEgHLkNhFgQphCMAiAxxJkIrgDOxq34DH/d37Q/7YA/+ZPJPpvgO3r
|
||||||
|
dQplbmRzdHJlYW0KZW5kb2JqCgo2IDAgb2JqCjEwNDEzCmVuZG9iagoKNyAwIG9iago8PC9UeXBl
|
||||||
|
L0ZvbnREZXNjcmlwdG9yL0ZvbnROYW1lL0JBQUFBQStEZWphVnVTYW5zTW9ubwovRmxhZ3MgNQov
|
||||||
|
Rm9udEJCb3hbLTU1NyAtMzc0IDcxNiAxMDQxXS9JdGFsaWNBbmdsZSAwCi9Bc2NlbnQgOTI4Ci9E
|
||||||
|
ZXNjZW50IC0yMzUKL0NhcEhlaWdodCAxMDQxCi9TdGVtViA4MAovRm9udEZpbGUyIDUgMCBSCj4+
|
||||||
|
CmVuZG9iagoKOCAwIG9iago8PC9MZW5ndGggNDE2L0ZpbHRlci9GbGF0ZURlY29kZT4+CnN0cmVh
|
||||||
|
bQp4nF2TzW7iMBSF93kKLzuLKvEPCZVQJAaKxKIz1dA+QEgME2lwIhMWvH197klbaRagz/G9l8/m
|
||||||
|
JN/st/vQT/lrHNqDn9SpD1301+EWW6+O/tyHTBvV9e00r+S7vTRjlqfew/06+cs+nIbVKsv/pL3r
|
||||||
|
FO/qYd0NR/8jy3/Hzsc+nNXD++aQ1ofbOP7zFx8mVWR1rTp/SnNemvFXc/G5dD3uu7TdT/fH1PJd
|
||||||
|
8HYfvTKy1lRph85fx6b1sQlnn62Kolar3a7OfOj+23OWLcdT+7eJqVSn0qJYFHViI1wZsBUud2BH
|
||||||
|
LsEL8hO4JG/AFXkBXgq7Z/ATn2vwmrwF/xQ28rsbYbsGb9krc55ZL3N2dMMcXZBRo+nv0Ktnfwum
|
||||||
|
v5P62d+B6W/lOf0tzqtnf2H6V1JPf4Mzavo7mU//cgmmf4Wz6NkfZ9T0txWY/hYzDf0t6s3sj7s1
|
||||||
|
9C8x39B/AU9Dfwc3Q38nvfQ3uB9Df4v/xdDfykz6W5lJf4t7M/S3SwnJnAbEBXn+jKFqbzGmCEro
|
||||||
|
JXtIXR/813sxDiO65PMBZrbPkAplbmRzdHJlYW0KZW5kb2JqCgo5IDAgb2JqCjw8L1R5cGUvRm9u
|
||||||
|
dC9TdWJ0eXBlL1RydWVUeXBlL0Jhc2VGb250L0JBQUFBQStEZWphVnVTYW5zTW9ubwovRmlyc3RD
|
||||||
|
aGFyIDAKL0xhc3RDaGFyIDQzCi9XaWR0aHNbNjAyIDYwMiA2MDIgNjAyIDYwMiA2MDIgNjAyIDYw
|
||||||
|
MiA2MDIgNjAyIDYwMiA2MDIgNjAyIDYwMiA2MDIgNjAyCjYwMiA2MDIgNjAyIDYwMiA2MDIgNjAy
|
||||||
|
IDYwMiA2MDIgNjAyIDYwMiA2MDIgNjAyIDYwMiA2MDIgNjAyIDYwMgo2MDIgNjAyIDYwMiA2MDIg
|
||||||
|
NjAyIDYwMiA2MDIgNjAyIDYwMiA2MDIgNjAyIDYwMiBdCi9Gb250RGVzY3JpcHRvciA3IDAgUgov
|
||||||
|
VG9Vbmljb2RlIDggMCBSCj4+CmVuZG9iagoKMTAgMCBvYmoKPDwvRjEgOSAwIFIKPj4KZW5kb2Jq
|
||||||
|
CgoxMSAwIG9iago8PC9Gb250IDEwIDAgUgovUHJvY1NldFsvUERGL1RleHRdCj4+CmVuZG9iagoK
|
||||||
|
MSAwIG9iago8PC9UeXBlL1BhZ2UvUGFyZW50IDQgMCBSL1Jlc291cmNlcyAxMSAwIFIvTWVkaWFC
|
||||||
|
b3hbMCAwIDU5NSA4NDJdL0dyb3VwPDwvUy9UcmFuc3BhcmVuY3kvQ1MvRGV2aWNlUkdCL0kgdHJ1
|
||||||
|
ZT4+L0NvbnRlbnRzIDIgMCBSPj4KZW5kb2JqCgo0IDAgb2JqCjw8L1R5cGUvUGFnZXMKL1Jlc291
|
||||||
|
cmNlcyAxMSAwIFIKL01lZGlhQm94WyAwIDAgNTk1IDg0MiBdCi9LaWRzWyAxIDAgUiBdCi9Db3Vu
|
||||||
|
dCAxPj4KZW5kb2JqCgoxMiAwIG9iago8PC9UeXBlL0NhdGFsb2cvUGFnZXMgNCAwIFIKL09wZW5B
|
||||||
|
Y3Rpb25bMSAwIFIgL1hZWiBudWxsIG51bGwgMF0KL0xhbmcoZW4tSU4pCj4+CmVuZG9iagoKMTMg
|
||||||
|
MCBvYmoKPDwvQ3JlYXRvcjxGRUZGMDA1NzAwNzIwMDY5MDA3NDAwNjUwMDcyPgovUHJvZHVjZXI8
|
||||||
|
RkVGRjAwNEMwMDY5MDA2MjAwNzIwMDY1MDA0RjAwNjYwMDY2MDA2OTAwNjMwMDY1MDAyMDAwMzMw
|
||||||
|
MDJFMDAzNj4KL0NyZWF0aW9uRGF0ZShEOjIwMTMwOTE3MTA1MjE5KzA1JzMwJyk+PgplbmRvYmoK
|
||||||
|
CnhyZWYKMCAxNAowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMTIxNDEgMDAwMDAgbiAKMDAwMDAw
|
||||||
|
MDAxOSAwMDAwMCBuIAowMDAwMDAwNTAzIDAwMDAwIG4gCjAwMDAwMTIyODQgMDAwMDAgbiAKMDAw
|
||||||
|
MDAwMDUyMyAwMDAwMCBuIAowMDAwMDExMDIxIDAwMDAwIG4gCjAwMDAwMTEwNDMgMDAwMDAgbiAK
|
||||||
|
MDAwMDAxMTIzOCAwMDAwMCBuIAowMDAwMDExNzIzIDAwMDAwIG4gCjAwMDAwMTIwNTQgMDAwMDAg
|
||||||
|
biAKMDAwMDAxMjA4NiAwMDAwMCBuIAowMDAwMDEyMzgzIDAwMDAwIG4gCjAwMDAwMTI0ODAgMDAw
|
||||||
|
MDAgbiAKdHJhaWxlcgo8PC9TaXplIDE0L1Jvb3QgMTIgMCBSCi9JbmZvIDEzIDAgUgovSUQgWyA8
|
||||||
|
MUQ3RURGOENDMTExODZGOUQwNERCQTNCNTIxRUIwRUQ+CjwxRDdFREY4Q0MxMTE4NkY5RDA0REJB
|
||||||
|
M0I1MjFFQjBFRD4gXQovRG9jQ2hlY2tzdW0gL0FGQTcyQ0IwMzY4QzE1RjAyN0YxODgxNDAxQkM3
|
||||||
|
QkQ0Cj4+CnN0YXJ0eHJlZgoxMjY1NQolJUVPRgo=</field>
|
||||||
|
<field name="datas_fname">Jones_CV.pdf</field>
|
||||||
|
<field name="name">Jones_CV.pdf</field>
|
||||||
|
<field name="res_id" ref="hr_recruitment.hr_case_salesman0"/>
|
||||||
|
<field name="res_model">hr.applicant</field>
|
||||||
|
</record>
|
||||||
|
<record id="applicant_attach2" model="ir.attachment">
|
||||||
|
<field name="datas">UFJPRklMRSANCg0KTmFtZSAgICAgICAgICAgIDogU2hhbmUgV2lsbGlhbXMgIA0KQWRkcmVzcyAgICAgICAgIDogODEgQWNhZGVteSBBdmVudWUsIA0KICAgICAgICAgICAgICAgICAgICAgOkJpcm1pbmdoYW1CNDYgM0FHLCANCiAgICAgICAgICAgICAgICAgICAgIDpVbml0ZWQgS2luZ2RvbSwgDQpRdWFsaWZpY2F0aW9uICAgOiBNQ0EgDQpFbWFpbCAgICAgICAgICAgICA6IFNoYW5lV2lsbGlhbXNAaW5mby5jb20gDQpNb2JpbGUgICAgICAgICAgIDogOTk2MzIxNDU4NyA=</field>
|
||||||
|
<field name="datas_fname">Williams_CV.doc</field>
|
||||||
|
<field name="name">Williams_CV.doc</field>
|
||||||
|
<field name="res_id" ref="hr_recruitment.hr_case_programmer"/>
|
||||||
|
<field name="res_model">hr.applicant</field>
|
||||||
|
</record>
|
||||||
|
<record id="applicant_attach3" model="ir.attachment">
|
||||||
|
<field name="datas">UHJvZmlsZQ0KDQpOYW1lICAgICAgICAgIDpKb3NlDQpBZGRyZXNzICAgICAgIDo5MywgUHJlc3MgQXZlbnVlDQogICAgICAgICAgICAgICAgICAgOkxlIEJvdXJnZXQgZHUgTGFjLCA3MzM3NywNCiAgICAgICAgICAgICAgICAgICA6IEZyYW5jZSANClF1YWxpZmljYXRpb24gOk1DQQ0KRW1haWwgICAgICAgICAgIDpKb3NlQGdtYWlsLmNvbQ0KTW9iaWxlICAgICAgICAgIDo5OTY4NTEzNTg3</field>
|
||||||
|
<field name="datas_fname">Jose_CV.txt</field>
|
||||||
|
<field name="name">Jose_CV.txt</field>
|
||||||
|
<field name="res_id" ref="hr_recruitment.hr_case_fresher0"/>
|
||||||
|
<field name="res_model">hr.applicant</field>
|
||||||
|
</record>
|
||||||
|
</data>
|
||||||
|
</openerp>
|
|
@ -0,0 +1,3 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import hr_applicant
|
|
@ -0,0 +1,29 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from openerp.osv import fields, osv
|
||||||
|
|
||||||
|
|
||||||
|
class hr_applicant(osv.Model):
|
||||||
|
_inherit = 'hr.applicant'
|
||||||
|
|
||||||
|
def _get_index_content(self, cr, uid, ids, fields, args, context=None):
|
||||||
|
res = dict.fromkeys(ids, '')
|
||||||
|
Attachment = self.pool.get('ir.attachment')
|
||||||
|
attachment_ids = Attachment.search(cr, uid, [('res_model', '=', 'hr.applicant'), ('res_id', 'in', ids)], context=context)
|
||||||
|
for attachment in Attachment.browse(cr, uid, attachment_ids, context=context):
|
||||||
|
res[attachment.res_id] += attachment.index_content or ''
|
||||||
|
return res
|
||||||
|
|
||||||
|
def _content_search(self, cr, user, obj, name, args, context=None):
|
||||||
|
record_ids = set()
|
||||||
|
Attachment = self.pool.get('ir.attachment')
|
||||||
|
args = ['&'] + args + [('res_model', '=', 'hr.applicant')]
|
||||||
|
att_ids = Attachment.search(cr, user, args, context=context)
|
||||||
|
record_ids = set(att.res_id for att in Attachment.browse(cr, user, att_ids, context=context))
|
||||||
|
return [('id', 'in', list(record_ids))]
|
||||||
|
|
||||||
|
_columns = {
|
||||||
|
'index_content': fields.function(
|
||||||
|
_get_index_content, fnct_search=_content_search,
|
||||||
|
string='Index Content', type="text"),
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<openerp>
|
||||||
|
<data>
|
||||||
|
|
||||||
|
<record id="view_crm_case_jobs_filter_inherit" model="ir.ui.view">
|
||||||
|
<field name="name">Jobs - Recruitment Search</field>
|
||||||
|
<field name="model">hr.applicant</field>
|
||||||
|
<field name="inherit_id" ref="hr_recruitment.view_crm_case_jobs_filter" />
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<field name="job_id" position="before">
|
||||||
|
<field name="index_content" string="Resume Content"/>
|
||||||
|
</field>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record model="ir.actions.act_window" id="hr_applicant_resumes">
|
||||||
|
<field name="name">Resumes and Letters</field>
|
||||||
|
<field name="res_model">ir.attachment</field>
|
||||||
|
<field name="view_mode">tree,form</field>
|
||||||
|
<field name="view_id" ref="document.view_document_file_tree"/>
|
||||||
|
<field name="domain">[('res_model','=','hr.applicant')]</field>
|
||||||
|
<field name="help" type="html">
|
||||||
|
<p>
|
||||||
|
Search through resumes and motivation letters.
|
||||||
|
</p>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<menuitem
|
||||||
|
name="Resumes and Letters"
|
||||||
|
parent="base.menu_crm_case_job_req_main"
|
||||||
|
id="menu_crm_case_categ0_act_job02" action="hr_applicant_resumes" sequence="3"/>
|
||||||
|
|
||||||
|
</data>
|
||||||
|
</openerp>
|
||||||
|
|
||||||
|
|
|
@ -242,6 +242,10 @@ class hr_holidays(osv.osv):
|
||||||
result['value'] = {
|
result['value'] = {
|
||||||
'employee_id': ids_employee[0]
|
'employee_id': ids_employee[0]
|
||||||
}
|
}
|
||||||
|
elif holiday_type != 'employee':
|
||||||
|
result['value'] = {
|
||||||
|
'employee_id': False
|
||||||
|
}
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def onchange_employee(self, cr, uid, ids, employee_id):
|
def onchange_employee(self, cr, uid, ids, employee_id):
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
<separator/>
|
<separator/>
|
||||||
<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)"/>
|
<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)"/>
|
||||||
<separator/>
|
<separator/>
|
||||||
<filter string="My Leaves" icon="terp-personal" name="my_leaves" domain="[('employee_id.user_id','=', uid)]" help="My Leaves"/>
|
<filter string="My Requests" icon="terp-personal" name="my_leaves" domain="[('employee_id.user_id','=', uid)]" help="My Leave Requests"/>
|
||||||
<separator/>
|
<separator/>
|
||||||
<filter string="My Department Leaves" icon="terp-personal+" help="My Department Leaves" domain="[('department_id.manager_id','=',uid)]"/>
|
<filter string="My Department Leaves" icon="terp-personal+" help="My Department Leaves" domain="[('department_id.manager_id','=',uid)]"/>
|
||||||
<field name="employee_id"/>
|
<field name="employee_id"/>
|
||||||
|
@ -47,61 +47,14 @@
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="edit_holiday_new" model="ir.ui.view">
|
<!-- Holidays: Allocation Request -->
|
||||||
|
<record model="ir.ui.view" id="edit_holiday_new">
|
||||||
<field name="name">Leave Request</field>
|
<field name="name">Leave Request</field>
|
||||||
<field name="model">hr.holidays</field>
|
<field name="model">hr.holidays</field>
|
||||||
<field name="priority">1</field>
|
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<form string="Leave Request" version="7.0">
|
<form string="Leave Request" version="7.0">
|
||||||
<field name="can_reset" invisible="1"/>
|
<field name="can_reset" invisible="1"/>
|
||||||
<header>
|
<field name="type" invisible="1"/>
|
||||||
<button string="Confirm" name="confirm" states="draft" type="workflow" class="oe_highlight"/>
|
|
||||||
<button string="Approve" name="validate" states="confirm" type="workflow" groups="base.group_hr_user" class="oe_highlight"/>
|
|
||||||
<button string="Validate" name="second_validate" states="validate1" type="workflow" groups="base.group_hr_user" class="oe_highlight"/>
|
|
||||||
<button string="Refuse" name="refuse" states="confirm,validate1,validate" type="workflow" groups="base.group_hr_user"/>
|
|
||||||
<button string="Reset to Draft" name="reset" type="workflow"
|
|
||||||
attrs="{'invisible': ['|', ('can_reset', '=', False), ('state', 'not in', ['confirm', 'refuse'])]}"/>
|
|
||||||
<field name="state" widget="statusbar" statusbar_visible="draft,confirm,validate" statusbar_colors='{"confirm":"blue","validate1":"blue","refuse":"red"}'/>
|
|
||||||
</header>
|
|
||||||
<sheet string="Leave Request">
|
|
||||||
<group>
|
|
||||||
<group>
|
|
||||||
<field name="name" attrs="{'readonly':[('state','!=','draft'),('state','!=','confirm')]}"/>
|
|
||||||
<field name="holiday_status_id" context="{'employee_id':employee_id}"/>
|
|
||||||
<label for="number_of_days_temp" string="Duration" help="The default duration interval between the start date and the end date is 8 hours. Feel free to adapt it to your needs."/>
|
|
||||||
<div>
|
|
||||||
<group col="3">
|
|
||||||
<field name="date_from" nolabel="1" on_change="onchange_date_from(date_to, date_from)" required="1" class="oe_inline"/><label string="-" class="oe_inline"/>
|
|
||||||
<field name="date_to" nolabel="1" on_change="onchange_date_to(date_to, date_from)" required="1" class="oe_inline"/>
|
|
||||||
</group>
|
|
||||||
<div>
|
|
||||||
<field name="number_of_days_temp" class="oe_inline"/> days
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<field name="category_id" attrs="{'required':[('holiday_type','=','category')], 'invisible':[('holiday_type','=','employee')], 'readonly':[('state','!=','draft'), ('state','!=','confirm')]}"/>
|
|
||||||
</group>
|
|
||||||
<group>
|
|
||||||
<field name="holiday_type" on_change="onchange_type(holiday_type, employee_id)" attrs="{'readonly':[('state','!=','draft')]}" width="130" string="Mode" groups="base.group_hr_user"/>
|
|
||||||
<field name="employee_id" attrs="{'required':[('holiday_type','=','employee')],'invisible':[('holiday_type','=','category')]}" on_change="onchange_employee(employee_id)" groups="base.group_hr_user"/>
|
|
||||||
<field name="department_id" attrs="{'readonly':[('holiday_type','=','category')]}" groups="base.group_hr_user"/>
|
|
||||||
</group>
|
|
||||||
</group>
|
|
||||||
</sheet>
|
|
||||||
<div class="oe_chatter">
|
|
||||||
<field name="message_follower_ids" widget="mail_followers"/>
|
|
||||||
<field name="message_ids" widget="mail_thread"/>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<!-- Holidays: Allocation Request -->
|
|
||||||
<record model="ir.ui.view" id="allocation_leave_new">
|
|
||||||
<field name="name">Allocation Request</field>
|
|
||||||
<field name="model">hr.holidays</field>
|
|
||||||
<field name="arch" type="xml">
|
|
||||||
<form string="Allocation Request" version="7.0">
|
|
||||||
<field name="can_reset" invisible="1"/>
|
|
||||||
<header>
|
<header>
|
||||||
<button string="Confirm" name="confirm" states="draft" type="workflow" class="oe_highlight"/>
|
<button string="Confirm" name="confirm" states="draft" type="workflow" class="oe_highlight"/>
|
||||||
<button string="Approve" name="validate" states="confirm" type="workflow" groups="base.group_hr_user" class="oe_highlight"/>
|
<button string="Approve" name="validate" states="confirm" type="workflow" groups="base.group_hr_user" class="oe_highlight"/>
|
||||||
|
@ -114,21 +67,27 @@
|
||||||
<sheet>
|
<sheet>
|
||||||
<group>
|
<group>
|
||||||
<group>
|
<group>
|
||||||
<field name="name" required="1" attrs="{'readonly':[('state','!=','draft'),('state','!=','confirm')]}"/>
|
<field name="name" attrs="{'readonly':[('state','!=','draft'),('state','!=','confirm')], 'required': [('type', '=', 'add')]}"/>
|
||||||
<field name="holiday_status_id" context="{'employee_id':employee_id}"/>
|
<field name="holiday_status_id" context="{'employee_id':employee_id}"/>
|
||||||
<label for="number_of_days_temp"/>
|
<label for="number_of_days_temp" string="Duration"/>
|
||||||
|
<div>
|
||||||
|
<group col="3" attrs="{'invisible': [('type', '=', 'add')]}">
|
||||||
|
<field name="date_from" nolabel="1" on_change="onchange_date_from(date_to, date_from)" required="1" class="oe_inline"/><label string="-" class="oe_inline"/>
|
||||||
|
<field name="date_to" nolabel="1" on_change="onchange_date_to(date_to, date_from)" required="1" class="oe_inline"/>
|
||||||
|
</group>
|
||||||
<div>
|
<div>
|
||||||
<field name="number_of_days_temp" class="oe_inline"/> days
|
<field name="number_of_days_temp" class="oe_inline"/> days
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
</group>
|
</group>
|
||||||
<group>
|
<group>
|
||||||
<field name="holiday_type" on_change="onchange_type(holiday_type)"/>
|
<field name="holiday_type" on_change="onchange_type(holiday_type)" attrs="{'readonly':[('type', '=', 'remove'),('state','!=','draft')]}" string="Mode" groups="base.group_hr_user"/>
|
||||||
<field name="employee_id" attrs="{'required':[('holiday_type','=','employee')], 'invisible':[('holiday_type','=','category')]}"/>
|
<field name="employee_id" attrs="{'required':[('holiday_type','=','employee')],'invisible':[('holiday_type','=','category')]}" on_change="onchange_employee(employee_id)" groups="base.group_hr_user"/>
|
||||||
<field name="category_id" attrs="{'required':[('holiday_type','=','category')], 'invisible':[('holiday_type','=','employee')]}"/>
|
<field name="category_id" attrs="{'required':[('holiday_type','=','category')], 'readonly': [('type', '=', 'remove'),('state','!=','draft'), ('state','!=','confirm')], 'invisible':[('holiday_type','=','employee')]}"/>
|
||||||
<field name="department_id" attrs="{'invisible':[('holiday_type','=','category')]}"/>
|
<field name="department_id" attrs="{'readonly':['|', ('type','=','add'),('holiday_type','=','category')],'invisible':[('holiday_type','=','category')]}" groups="base.group_hr_user"/>
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
<field name="notes" nolabel="1" colspan="4" placeholder="Add a reason..."/>
|
<field name="notes" nolabel="1" colspan="4" placeholder="Add a reason..." attrs="{'invisible': [('type', '=', 'remove')]}"/>
|
||||||
</sheet>
|
</sheet>
|
||||||
<div class="oe_chatter">
|
<div class="oe_chatter">
|
||||||
<field name="message_follower_ids" widget="mail_followers"/>
|
<field name="message_follower_ids" widget="mail_followers"/>
|
||||||
|
@ -231,7 +190,7 @@
|
||||||
<menuitem name="Leaves" parent="hr.menu_hr_root" id="menu_open_ask_holidays" sequence="20"/>
|
<menuitem name="Leaves" parent="hr.menu_hr_root" id="menu_open_ask_holidays" sequence="20"/>
|
||||||
|
|
||||||
<record model="ir.actions.act_window" id="open_ask_holidays">
|
<record model="ir.actions.act_window" id="open_ask_holidays">
|
||||||
<field name="name">Leave Requests</field>
|
<field name="name">Leave Request</field>
|
||||||
<field name="res_model">hr.holidays</field>
|
<field name="res_model">hr.holidays</field>
|
||||||
<field name="view_type">form</field>
|
<field name="view_type">form</field>
|
||||||
<field name="view_id" ref="edit_holiday_new"/>
|
<field name="view_id" ref="edit_holiday_new"/>
|
||||||
|
@ -305,7 +264,7 @@
|
||||||
<field name="view_type">form</field>
|
<field name="view_type">form</field>
|
||||||
<field name="context">{'default_type':'add', 'search_default_my_leaves':1}</field>
|
<field name="context">{'default_type':'add', 'search_default_my_leaves':1}</field>
|
||||||
<field name="domain">[('type','=','add')]</field>
|
<field name="domain">[('type','=','add')]</field>
|
||||||
<field name="view_id" ref="allocation_leave_new"/>
|
<field name="view_id" ref="edit_holiday_new"/>
|
||||||
<field name="search_view_id" ref="view_hr_holidays_filter"/>
|
<field name="search_view_id" ref="view_hr_holidays_filter"/>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
@ -319,7 +278,7 @@
|
||||||
<record model="ir.actions.act_window.view" id="action_open_allocation_holidays_form">
|
<record model="ir.actions.act_window.view" id="action_open_allocation_holidays_form">
|
||||||
<field name="sequence" eval="2"/>
|
<field name="sequence" eval="2"/>
|
||||||
<field name="view_mode">form</field>
|
<field name="view_mode">form</field>
|
||||||
<field name="view_id" ref="allocation_leave_new"/>
|
<field name="view_id" ref="edit_holiday_new"/>
|
||||||
<field name="act_window_id" ref="open_allocation_holidays"/>
|
<field name="act_window_id" ref="open_allocation_holidays"/>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
@ -331,7 +290,7 @@
|
||||||
<field name="view_type">form</field>
|
<field name="view_type">form</field>
|
||||||
<field name="context">{'default_type': 'add', 'search_default_approve':1}</field>
|
<field name="context">{'default_type': 'add', 'search_default_approve':1}</field>
|
||||||
<field name="domain">[('type','=','add')]</field>
|
<field name="domain">[('type','=','add')]</field>
|
||||||
<field name="view_id" ref="allocation_leave_new"/>
|
<field name="view_id" ref="edit_holiday_new"/>
|
||||||
<field name="search_view_id" ref="view_hr_holidays_filter"/>
|
<field name="search_view_id" ref="view_hr_holidays_filter"/>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
@ -345,7 +304,7 @@
|
||||||
<record model="ir.actions.act_window.view" id="action_request_approve_allocation_form">
|
<record model="ir.actions.act_window.view" id="action_request_approve_allocation_form">
|
||||||
<field name="sequence" eval="2"/>
|
<field name="sequence" eval="2"/>
|
||||||
<field name="view_mode">form</field>
|
<field name="view_mode">form</field>
|
||||||
<field name="view_id" ref="allocation_leave_new"/>
|
<field name="view_id" ref="edit_holiday_new"/>
|
||||||
<field name="act_window_id" ref="request_approve_allocation"/>
|
<field name="act_window_id" ref="request_approve_allocation"/>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
|
|
@ -96,7 +96,7 @@ class report_custom(report_rml):
|
||||||
res=cr.fetchone()[0]
|
res=cr.fetchone()[0]
|
||||||
date_xml=[]
|
date_xml=[]
|
||||||
date_today=time.strftime('%Y-%m-%d %H:%M:%S')
|
date_today=time.strftime('%Y-%m-%d %H:%M:%S')
|
||||||
date_xml +=['<res name="%s" today="%s" />' % (res,date_today)]
|
date_xml +=['<res name="%s" today="%s" />' % (to_xml(res),date_today)]
|
||||||
|
|
||||||
cr.execute("SELECT id, name, color_name FROM hr_holidays_status ORDER BY id")
|
cr.execute("SELECT id, name, color_name FROM hr_holidays_status ORDER BY id")
|
||||||
legend=cr.fetchall()
|
legend=cr.fetchall()
|
||||||
|
@ -128,7 +128,7 @@ class report_custom(report_rml):
|
||||||
# date_xml=[]
|
# date_xml=[]
|
||||||
for l in range(0,len(legend)):
|
for l in range(0,len(legend)):
|
||||||
date_xml += ['<legend row="%d" id="%d" name="%s" color="%s" />' % (l+1,legend[l][0],_(legend[l][1]),legend[l][2])]
|
date_xml += ['<legend row="%d" id="%d" name="%s" color="%s" />' % (l+1,legend[l][0],_(legend[l][1]),legend[l][2])]
|
||||||
date_xml += ['<date month="%s" year="%d" />' % (som.strftime('%B'), som.year),'<days>']
|
date_xml += ['<date month="%s" year="%d" />' % (ustr(som.strftime('%B')), som.year),'<days>']
|
||||||
|
|
||||||
cell=1
|
cell=1
|
||||||
if day_diff.days>=30:
|
if day_diff.days>=30:
|
||||||
|
|
|
@ -3,6 +3,13 @@
|
||||||
Changelog
|
Changelog
|
||||||
=========
|
=========
|
||||||
|
|
||||||
|
`trunk (saas-3)`
|
||||||
|
----------------
|
||||||
|
|
||||||
|
- ``hr.recruitment.stage``: added template_id field. If an email template is linked
|
||||||
|
to the stage, it is used to render and post a message on the applicant. This
|
||||||
|
allows for example to have template for accepted or refused applicants.
|
||||||
|
|
||||||
`trunk (saas-2)`
|
`trunk (saas-2)`
|
||||||
----------------
|
----------------
|
||||||
|
|
||||||
|
|
|
@ -53,6 +53,7 @@ class hr_recruitment_stage(osv.osv):
|
||||||
'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of stages."),
|
'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of stages."),
|
||||||
'department_id':fields.many2one('hr.department', 'Specific to a Department', help="Stages of the recruitment process may be different per department. If this stage is common to all departments, keep this field empty."),
|
'department_id':fields.many2one('hr.department', 'Specific to a Department', help="Stages of the recruitment process may be different per department. If this stage is common to all departments, keep this field empty."),
|
||||||
'requirements': fields.text('Requirements'),
|
'requirements': fields.text('Requirements'),
|
||||||
|
'template_id': fields.many2one('email.template', 'Use template', help="If set, a message is posted on the applicant using the template when the applicant is set to the stage."),
|
||||||
'fold': fields.boolean('Folded in Kanban View',
|
'fold': fields.boolean('Folded in Kanban View',
|
||||||
help='This stage is folded in the kanban view when'
|
help='This stage is folded in the kanban view when'
|
||||||
'there are no records in that stage to display.'),
|
'there are no records in that stage to display.'),
|
||||||
|
@ -171,8 +172,14 @@ class hr_applicant(osv.Model):
|
||||||
res[issue.id][field] = abs(float(duration))
|
res[issue.id][field] = abs(float(duration))
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
def _get_attachment_number(self, cr, uid, ids, fields, args, context=None):
|
||||||
|
res = dict.fromkeys(ids, 0)
|
||||||
|
for app_id in ids:
|
||||||
|
res[app_id] = self.pool['ir.attachment'].search_count(cr, uid, [('res_model', '=', 'hr.applicant'), ('res_id', '=', app_id)], context=context)
|
||||||
|
return res
|
||||||
|
|
||||||
_columns = {
|
_columns = {
|
||||||
'name': fields.char('Subject', size=128, required=True),
|
'name': fields.char('Subject / Application Name', size=128, required=True),
|
||||||
'active': fields.boolean('Active', help="If the active field is set to false, it will allow you to hide the case without removing it."),
|
'active': fields.boolean('Active', help="If the active field is set to false, it will allow you to hide the case without removing it."),
|
||||||
'description': fields.text('Description'),
|
'description': fields.text('Description'),
|
||||||
'email_from': fields.char('Email', size=128, help="These people will receive email."),
|
'email_from': fields.char('Email', size=128, help="These people will receive email."),
|
||||||
|
@ -199,7 +206,7 @@ class hr_applicant(osv.Model):
|
||||||
'salary_expected_extra': fields.char('Expected Salary Extra', size=100, help="Salary Expected by Applicant, extra advantages"),
|
'salary_expected_extra': fields.char('Expected Salary Extra', size=100, help="Salary Expected by Applicant, extra advantages"),
|
||||||
'salary_proposed': fields.float('Proposed Salary', help="Salary Proposed by the Organisation"),
|
'salary_proposed': fields.float('Proposed Salary', help="Salary Proposed by the Organisation"),
|
||||||
'salary_expected': fields.float('Expected Salary', help="Salary Expected by Applicant"),
|
'salary_expected': fields.float('Expected Salary', help="Salary Expected by Applicant"),
|
||||||
'availability': fields.integer('Availability'),
|
'availability': fields.integer('Availability', help="The number of days in which the applicant will be available to start working"),
|
||||||
'partner_name': fields.char("Applicant's Name", size=64),
|
'partner_name': fields.char("Applicant's Name", size=64),
|
||||||
'partner_phone': fields.char('Phone', size=32),
|
'partner_phone': fields.char('Phone', size=32),
|
||||||
'partner_mobile': fields.char('Mobile', size=32),
|
'partner_mobile': fields.char('Mobile', size=32),
|
||||||
|
@ -214,9 +221,9 @@ class hr_applicant(osv.Model):
|
||||||
'day_close': fields.function(_compute_day, string='Days to Close', \
|
'day_close': fields.function(_compute_day, string='Days to Close', \
|
||||||
multi='day_close', type="float", store=True),
|
multi='day_close', type="float", store=True),
|
||||||
'color': fields.integer('Color Index'),
|
'color': fields.integer('Color Index'),
|
||||||
'emp_id': fields.many2one('hr.employee', string='Employee',
|
'emp_id': fields.many2one('hr.employee', string='Employee', help='Employee linked to the applicant.'),
|
||||||
help='Employee linked to the applicant.'),
|
|
||||||
'user_email': fields.related('user_id', 'email', type='char', string='User Email', readonly=True),
|
'user_email': fields.related('user_id', 'email', type='char', string='User Email', readonly=True),
|
||||||
|
'attachment_number': fields.function(_get_attachment_number, string='Number of Attachments', type="integer"),
|
||||||
}
|
}
|
||||||
|
|
||||||
_defaults = {
|
_defaults = {
|
||||||
|
@ -243,11 +250,11 @@ class hr_applicant(osv.Model):
|
||||||
return res
|
return res
|
||||||
|
|
||||||
def onchange_job(self, cr, uid, ids, job_id=False, context=None):
|
def onchange_job(self, cr, uid, ids, job_id=False, context=None):
|
||||||
|
department_id = False
|
||||||
if job_id:
|
if job_id:
|
||||||
job_record = self.pool.get('hr.job').browse(cr, uid, job_id, context=context)
|
job_record = self.pool.get('hr.job').browse(cr, uid, job_id, context=context)
|
||||||
if job_record and job_record.department_id:
|
department_id = job_record and job_record.department_id and job_record.department_id.id or False
|
||||||
return {'value': {'department_id': job_record.department_id.id}}
|
return {'value': {'department_id': department_id}}
|
||||||
return {}
|
|
||||||
|
|
||||||
def onchange_department_id(self, cr, uid, ids, department_id=False, stage_id=False, context=None):
|
def onchange_department_id(self, cr, uid, ids, department_id=False, stage_id=False, context=None):
|
||||||
if not stage_id:
|
if not stage_id:
|
||||||
|
@ -298,10 +305,15 @@ class hr_applicant(osv.Model):
|
||||||
@return: Dictionary value for created Meeting view
|
@return: Dictionary value for created Meeting view
|
||||||
"""
|
"""
|
||||||
applicant = self.browse(cr, uid, ids[0], context)
|
applicant = self.browse(cr, uid, ids[0], context)
|
||||||
|
applicant_ids = []
|
||||||
|
if applicant.partner_id:
|
||||||
|
applicant_ids.append(applicant.partner_id.id)
|
||||||
|
if applicant.department_id and applicant.department_id.manager_id and applicant.department_id.manager_id.user_id and applicant.department_id.manager_id.user_id.partner_id:
|
||||||
|
applicant_ids.append(applicant.department_id.manager_id.user_id.partner_id.id)
|
||||||
category = self.pool.get('ir.model.data').get_object(cr, uid, 'hr_recruitment', 'categ_meet_interview', context)
|
category = self.pool.get('ir.model.data').get_object(cr, uid, 'hr_recruitment', 'categ_meet_interview', context)
|
||||||
res = self.pool.get('ir.actions.act_window').for_xml_id(cr, uid, 'base_calendar', 'action_crm_meeting', context)
|
res = self.pool.get('ir.actions.act_window').for_xml_id(cr, uid, 'base_calendar', 'action_crm_meeting', context)
|
||||||
res['context'] = {
|
res['context'] = {
|
||||||
'default_partner_ids': applicant.partner_id and [applicant.partner_id.id] or False,
|
'default_partner_ids': applicant_ids,
|
||||||
'default_user_id': uid,
|
'default_user_id': uid,
|
||||||
'default_name': applicant.name,
|
'default_name': applicant.name,
|
||||||
'default_categ_ids': category and [category.id] or False,
|
'default_categ_ids': category and [category.id] or False,
|
||||||
|
@ -327,6 +339,20 @@ class hr_applicant(osv.Model):
|
||||||
value = self.pool.get("survey").action_print_survey(cr, uid, ids, context=context)
|
value = self.pool.get("survey").action_print_survey(cr, uid, ids, context=context)
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
def action_get_attachment_tree_view(self, cr, uid, ids, context):
|
||||||
|
domain = ['&', ('res_model', '=', 'hr.applicant'), ('res_id', 'in', ids)]
|
||||||
|
return {
|
||||||
|
'name': _('Attachments'),
|
||||||
|
'domain': domain,
|
||||||
|
'res_model': 'ir.attachment',
|
||||||
|
'type': 'ir.actions.act_window',
|
||||||
|
'view_id': False,
|
||||||
|
'view_mode': 'tree,form',
|
||||||
|
'view_type': 'form',
|
||||||
|
'limit': 80,
|
||||||
|
'context': "{'default_res_model': '%s'}" % (self._name)
|
||||||
|
}
|
||||||
|
|
||||||
def message_get_suggested_recipients(self, cr, uid, ids, context=None):
|
def message_get_suggested_recipients(self, cr, uid, ids, context=None):
|
||||||
recipients = super(hr_applicant, self).message_get_suggested_recipients(cr, uid, ids, context=context)
|
recipients = super(hr_applicant, self).message_get_suggested_recipients(cr, uid, ids, context=context)
|
||||||
for applicant in self.browse(cr, uid, ids, context=context):
|
for applicant in self.browse(cr, uid, ids, context=context):
|
||||||
|
@ -371,6 +397,8 @@ class hr_applicant(osv.Model):
|
||||||
def write(self, cr, uid, ids, vals, context=None):
|
def write(self, cr, uid, ids, vals, context=None):
|
||||||
if isinstance(ids, (int, long)):
|
if isinstance(ids, (int, long)):
|
||||||
ids = [ids]
|
ids = [ids]
|
||||||
|
res = True
|
||||||
|
|
||||||
# user_id change: update date_start
|
# user_id change: update date_start
|
||||||
if vals.get('user_id'):
|
if vals.get('user_id'):
|
||||||
vals['date_start'] = fields.datetime.now()
|
vals['date_start'] = fields.datetime.now()
|
||||||
|
@ -380,12 +408,38 @@ class hr_applicant(osv.Model):
|
||||||
for applicant in self.browse(cr, uid, ids, context=None):
|
for applicant in self.browse(cr, uid, ids, context=None):
|
||||||
vals['last_stage_id'] = applicant.stage_id.id
|
vals['last_stage_id'] = applicant.stage_id.id
|
||||||
res = super(hr_applicant, self).write(cr, uid, [applicant.id], vals, context=context)
|
res = super(hr_applicant, self).write(cr, uid, [applicant.id], vals, context=context)
|
||||||
return res
|
else:
|
||||||
|
res = super(hr_applicant, self).write(cr, uid, ids, vals, context=context)
|
||||||
|
|
||||||
if vals.get('job_id'):
|
if vals.get('job_id'):
|
||||||
for applicant in self.browse(cr, uid, ids, context=None):
|
for applicant in self.browse(cr, uid, ids, context=None):
|
||||||
name = applicant.partner_name if applicant.partner_name != False else applicant.name
|
name = applicant.partner_name if applicant.partner_name != False else applicant.name
|
||||||
self.pool['hr.job'].message_post(cr, uid, [vals['job_id']], body=_('New Applicant %s Created') % name, subtype="hr_recruitment.mt_applicant_new", context=context)
|
self.pool['hr.job'].message_post(cr, uid, [vals['job_id']], body=_('New Applicant %s Created') % name, subtype="hr_recruitment.mt_applicant_new", context=context)
|
||||||
return super(hr_applicant, self).write(cr, uid, ids, vals, context=context)
|
# post processing: if stage changed, post a message in the chatter
|
||||||
|
if vals.get('stage_id'):
|
||||||
|
stage = self.pool['hr.recruitment.stage'].browse(cr, uid, vals['stage_id'], context=context)
|
||||||
|
if stage.template_id:
|
||||||
|
# TDENOTE: probably factorize me in a message_post_with_template generic method FIXME
|
||||||
|
compose_ctx = dict(context,
|
||||||
|
active_ids=ids)
|
||||||
|
compose_id = self.pool['mail.compose.message'].create(
|
||||||
|
cr, uid, {
|
||||||
|
'model': self._name,
|
||||||
|
'composition_mode': 'mass_mail',
|
||||||
|
'template_id': stage.template_id.id,
|
||||||
|
'same_thread': True,
|
||||||
|
'post': True,
|
||||||
|
'notify': True,
|
||||||
|
}, context=compose_ctx)
|
||||||
|
self.pool['mail.compose.message'].write(
|
||||||
|
cr, uid, [compose_id],
|
||||||
|
self.pool['mail.compose.message'].onchange_template_id(
|
||||||
|
cr, uid, [compose_id],
|
||||||
|
stage.template_id.id, 'mass_mail', self._name, False,
|
||||||
|
context=compose_ctx)['value'],
|
||||||
|
context=compose_ctx)
|
||||||
|
self.pool['mail.compose.message'].send_mail(cr, uid, [compose_id], context=compose_ctx)
|
||||||
|
return res
|
||||||
|
|
||||||
def create_employee_from_applicant(self, cr, uid, ids, context=None):
|
def create_employee_from_applicant(self, cr, uid, ids, context=None):
|
||||||
""" Create an hr.employee from the hr.applicants """
|
""" Create an hr.employee from the hr.applicants """
|
||||||
|
@ -405,7 +459,10 @@ class hr_applicant(osv.Model):
|
||||||
emp_id = hr_employee.create(cr,uid,{'name': applicant.partner_name or contact_name,
|
emp_id = hr_employee.create(cr,uid,{'name': applicant.partner_name or contact_name,
|
||||||
'job_id': applicant.job_id.id,
|
'job_id': applicant.job_id.id,
|
||||||
'address_home_id': address_id,
|
'address_home_id': address_id,
|
||||||
'department_id': applicant.department_id.id
|
'department_id': applicant.department_id.id or False,
|
||||||
|
'address_id': applicant.company_id and applicant.company_id.partner_id and applicant.company_id.partner_id.id or False,
|
||||||
|
'work_email': applicant.department_id and applicant.department_id.company_id and applicant.department_id.company_id.email or False,
|
||||||
|
'work_phone': applicant.department_id and applicant.department_id.company_id and applicant.department_id.company_id.phone or False,
|
||||||
})
|
})
|
||||||
self.write(cr, uid, [applicant.id], {'emp_id': emp_id}, context=context)
|
self.write(cr, uid, [applicant.id], {'emp_id': emp_id}, context=context)
|
||||||
self.pool['hr.job'].message_post(cr, uid, [applicant.job_id.id], body=_('New Employee %s Hired') % applicant.partner_name, subtype="hr_recruitment.mt_applicant_employee", context=context)
|
self.pool['hr.job'].message_post(cr, uid, [applicant.job_id.id], body=_('New Employee %s Hired') % applicant.partner_name, subtype="hr_recruitment.mt_applicant_employee", context=context)
|
||||||
|
|
|
@ -17,6 +17,43 @@
|
||||||
<field name="name">Interview</field>
|
<field name="name">Interview</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
<!-- Templates for interest / refusing applicants -->
|
||||||
|
<record id="applicant_refuse" model="email.template">
|
||||||
|
<field name="name">Application refused</field>
|
||||||
|
<field name="subject">Application refused</field>
|
||||||
|
<field name="email_to">${object.email_from}</field>
|
||||||
|
<field name="partner_to">${object.partner_id and object.partner_id.id or ''}</field>
|
||||||
|
<field name="lang">${object.partner_id and object.partner_id.lang or ''}</field>
|
||||||
|
<field name="model_id" ref="hr_recruitment.model_hr_applicant"/>
|
||||||
|
<field name="user_signature" eval="0"/>
|
||||||
|
<field name="body_html"><![CDATA[<p>Dear ${object.partner_name or 'applicant'},</p>
|
||||||
|
<p>We thank you for your interest in our company and for your application.
|
||||||
|
Unfortunately, your profile does not match with our needs or our recruitment
|
||||||
|
campaign has reached its term.</p>
|
||||||
|
<p>If you want more details, feel free to contact us by phone.</p>
|
||||||
|
<p>Kind regards,</p>
|
||||||
|
<br/>
|
||||||
|
${object.user_id and object.user_id.signature or ''}]]></field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="applicant_interest" model="email.template">
|
||||||
|
<field name="name">Application approved</field>
|
||||||
|
<field name="subject">Application approved</field>
|
||||||
|
<field name="email_to">${object.email_from}</field>
|
||||||
|
<field name="partner_to">${object.partner_id and object.partner_id.id or ''}</field>
|
||||||
|
<field name="lang">${object.partner_id and object.partner_id.lang or ''}</field>
|
||||||
|
<field name="model_id" ref="hr_recruitment.model_hr_applicant"/>
|
||||||
|
<field name="user_signature" eval="0"/>
|
||||||
|
<field name="body_html"><![CDATA[<p>Dear ${object.partner_name or 'applicant'},</p>
|
||||||
|
<p>Congrats! Your resume's got our interest!
|
||||||
|
I will call you as soon as possible to make a 10 minutes phone interview and plan a first meeting.</p>
|
||||||
|
<p>If we can’t reach you or if you miss our call, feel free to reach me back on the number 001 312 349 3030
|
||||||
|
If I do not answer, please let me a message with some schedules to call you back.</p>
|
||||||
|
<p>Kind regards,</p>
|
||||||
|
<br/>
|
||||||
|
${object.user_id.signature}]]></field>
|
||||||
|
</record>
|
||||||
|
|
||||||
<!-- HR Recruitment Source -->
|
<!-- HR Recruitment Source -->
|
||||||
|
|
||||||
<record model="hr.recruitment.source" id="source_linkedin">
|
<record model="hr.recruitment.source" id="source_linkedin">
|
||||||
|
@ -58,6 +95,7 @@
|
||||||
</record>
|
</record>
|
||||||
<record model="hr.recruitment.stage" id="stage_job2">
|
<record model="hr.recruitment.stage" id="stage_job2">
|
||||||
<field name="name">First Interview</field>
|
<field name="name">First Interview</field>
|
||||||
|
<field name="template_id" ref="applicant_interest"/>
|
||||||
<field name="sequence">2</field>
|
<field name="sequence">2</field>
|
||||||
</record>
|
</record>
|
||||||
<record model="hr.recruitment.stage" id="stage_job3">
|
<record model="hr.recruitment.stage" id="stage_job3">
|
||||||
|
@ -76,6 +114,7 @@
|
||||||
<record model="hr.recruitment.stage" id="stage_job6">
|
<record model="hr.recruitment.stage" id="stage_job6">
|
||||||
<field name="name">Refused</field>
|
<field name="name">Refused</field>
|
||||||
<field name="sequence">6</field>
|
<field name="sequence">6</field>
|
||||||
|
<field name="template_id" ref="applicant_refuse"/>
|
||||||
<field name="fold" eval="True"/>
|
<field name="fold" eval="True"/>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
|
|
@ -2,10 +2,12 @@
|
||||||
<openerp>
|
<openerp>
|
||||||
<data noupdate="1">
|
<data noupdate="1">
|
||||||
<record id="hr_case_salesman0" model="hr.applicant">
|
<record id="hr_case_salesman0" model="hr.applicant">
|
||||||
<field name="name">Salesperson</field>
|
<field name="name">Sales Manager</field>
|
||||||
<field name="job_id" ref="hr.job_developer"/>
|
<field name="job_id" ref="hr.job_marketing"/>
|
||||||
|
<field name="department_id" ref="hr.dep_sales"/>
|
||||||
<field name="type_id" ref="degree_graduate"/>
|
<field name="type_id" ref="degree_graduate"/>
|
||||||
<field name="categ_ids" eval="[(6,0,[ref('tag_applicant_sales')])]"/>
|
<field name="categ_ids" eval="[(6,0,[ref('tag_applicant_sales')])]"/>
|
||||||
|
<field name="user_id" ref="base.user_demo"/>
|
||||||
<field name="priority">2</field>
|
<field name="priority">2</field>
|
||||||
<field name="partner_name">Enrique Jones</field>
|
<field name="partner_name">Enrique Jones</field>
|
||||||
<field name="partner_mobile">9963214587</field>
|
<field name="partner_mobile">9963214587</field>
|
||||||
|
@ -16,7 +18,8 @@
|
||||||
<record id="hr_case_traineemca0" model="hr.applicant">
|
<record id="hr_case_traineemca0" model="hr.applicant">
|
||||||
<field name="name">Trainee - MCA</field>
|
<field name="name">Trainee - MCA</field>
|
||||||
<field name="job_id" ref="hr.job_trainee"/>
|
<field name="job_id" ref="hr.job_trainee"/>
|
||||||
<field name="type_id" ref="degree_bac5"/>
|
<field name="department_id" ref="hr.dep_rd"/>
|
||||||
|
<field name="type_id" ref="degree_licenced"/>
|
||||||
<field name="categ_ids" eval="[(6,0,[ref('tag_applicant_manager')])]"/>
|
<field name="categ_ids" eval="[(6,0,[ref('tag_applicant_manager')])]"/>
|
||||||
<field name="user_id" ref="base.user_demo"/>
|
<field name="user_id" ref="base.user_demo"/>
|
||||||
<field name="priority">3</field>
|
<field name="priority">3</field>
|
||||||
|
@ -29,10 +32,11 @@
|
||||||
</record>
|
</record>
|
||||||
<record id="hr_case_fresher0" model="hr.applicant">
|
<record id="hr_case_fresher0" model="hr.applicant">
|
||||||
<field name="name">Fresher</field>
|
<field name="name">Fresher</field>
|
||||||
<field name="job_id" ref="hr.job_developer"/>
|
<field name="job_id" ref="hr.job_trainee"/>
|
||||||
<field name="type_id" ref="degree_licenced"/>
|
<field name="department_id" ref="hr.dep_administration"/>
|
||||||
|
<field name="type_id" ref="degree_bachelor"/>
|
||||||
<field name="categ_ids" eval="[(6,0,[ref('tag_applicant_it')])]"/>
|
<field name="categ_ids" eval="[(6,0,[ref('tag_applicant_it')])]"/>
|
||||||
<field name="user_id" ref="base.user_root"/>
|
<field name="user_id" ref="base.user_demo"/>
|
||||||
<field name="priority">1</field>
|
<field name="priority">1</field>
|
||||||
<field name="partner_name">Jose</field>
|
<field name="partner_name">Jose</field>
|
||||||
<field name="stage_id" ref="stage_job3"/>
|
<field name="stage_id" ref="stage_job3"/>
|
||||||
|
@ -42,8 +46,9 @@
|
||||||
</record>
|
</record>
|
||||||
<record id="hr_case_yrsexperienceinphp0" model="hr.applicant">
|
<record id="hr_case_yrsexperienceinphp0" model="hr.applicant">
|
||||||
<field name="name">Marketing Job</field>
|
<field name="name">Marketing Job</field>
|
||||||
<field name="job_id" ref="hr.job_trainee"/>
|
<field name="job_id" ref="hr.job_marketing"/>
|
||||||
<field name="type_id" ref="degree_bac5"/>
|
<field name="department_id" ref="hr.dep_sales"/>
|
||||||
|
<field name="type_id" ref="degree_graduate"/>
|
||||||
<field name="categ_ids" eval="[(6,0,[ref('tag_applicant_manager')])]"/>
|
<field name="categ_ids" eval="[(6,0,[ref('tag_applicant_manager')])]"/>
|
||||||
<field name="user_id" ref="base.user_root"/>
|
<field name="user_id" ref="base.user_root"/>
|
||||||
<field name="partner_name">John Bruno</field>
|
<field name="partner_name">John Bruno</field>
|
||||||
|
@ -54,6 +59,7 @@
|
||||||
<record id="hr_case_marketingjob0" model="hr.applicant">
|
<record id="hr_case_marketingjob0" model="hr.applicant">
|
||||||
<field name="name">More than 5 yrs Experience in PHP</field>
|
<field name="name">More than 5 yrs Experience in PHP</field>
|
||||||
<field name="job_id" ref="hr.job_developer"/>
|
<field name="job_id" ref="hr.job_developer"/>
|
||||||
|
<field name="department_id" ref="hr.dep_rd"/>
|
||||||
<field name="type_id" ref="degree_licenced"/>
|
<field name="type_id" ref="degree_licenced"/>
|
||||||
<field name="categ_ids" eval="[(6,0,[ref('tag_applicant_reserve')])]"/>
|
<field name="categ_ids" eval="[(6,0,[ref('tag_applicant_reserve')])]"/>
|
||||||
<field name="user_id" ref="base.user_demo"/>
|
<field name="user_id" ref="base.user_demo"/>
|
||||||
|
@ -63,8 +69,9 @@
|
||||||
<field name="title_action">Send mail regarding our interview</field>
|
<field name="title_action">Send mail regarding our interview</field>
|
||||||
</record>
|
</record>
|
||||||
<record id="hr_case_financejob0" model="hr.applicant">
|
<record id="hr_case_financejob0" model="hr.applicant">
|
||||||
<field name="name">Finance Job</field>
|
<field name="name">Finance Manager</field>
|
||||||
<field name="job_id" ref="hr.job_trainee"/>
|
<field name="job_id" ref="hr.job_hrm"/>
|
||||||
|
<field name="department_id" ref="hr.dep_administration"/>
|
||||||
<field name="type_id" ref="degree_licenced"/>
|
<field name="type_id" ref="degree_licenced"/>
|
||||||
<field name="categ_ids" eval="[(6,0,[ref('tag_applicant_reserve')])]"/>
|
<field name="categ_ids" eval="[(6,0,[ref('tag_applicant_reserve')])]"/>
|
||||||
<field name="user_id" ref="base.user_root"/>
|
<field name="user_id" ref="base.user_root"/>
|
||||||
|
@ -78,7 +85,8 @@
|
||||||
<record id="hr_case_traineemca1" model="hr.applicant">
|
<record id="hr_case_traineemca1" model="hr.applicant">
|
||||||
<field name="name">Trainee - MCA</field>
|
<field name="name">Trainee - MCA</field>
|
||||||
<field name="job_id" ref="hr.job_trainee"/>
|
<field name="job_id" ref="hr.job_trainee"/>
|
||||||
<field name="type_id" ref="degree_bac5"/>
|
<field name="department_id" ref="hr.dep_rd"/>
|
||||||
|
<field name="type_id" ref="degree_licenced"/>
|
||||||
<field name="categ_ids" eval="[(6,0,[ref('tag_applicant_sales')])]"/>
|
<field name="categ_ids" eval="[(6,0,[ref('tag_applicant_sales')])]"/>
|
||||||
<field name="partner_name">Tina Augustie</field>
|
<field name="partner_name">Tina Augustie</field>
|
||||||
<field name="partner_mobile">9898745745</field>
|
<field name="partner_mobile">9898745745</field>
|
||||||
|
@ -90,7 +98,8 @@
|
||||||
<record id="hr_case_programmer" model="hr.applicant">
|
<record id="hr_case_programmer" model="hr.applicant">
|
||||||
<field name="name">Programmer</field>
|
<field name="name">Programmer</field>
|
||||||
<field name="job_id" ref="hr.job_developer"/>
|
<field name="job_id" ref="hr.job_developer"/>
|
||||||
<field name="type_id" ref="degree_bac5"/>
|
<field name="department_id" ref="hr.dep_rd"/>
|
||||||
|
<field name="type_id" ref="degree_licenced"/>
|
||||||
<field name="categ_ids" eval="[(6,0,[ref('tag_applicant_it')])]"/>
|
<field name="categ_ids" eval="[(6,0,[ref('tag_applicant_it')])]"/>
|
||||||
<field name="partner_name">Shane Williams</field>
|
<field name="partner_name">Shane Williams</field>
|
||||||
<field name="partner_mobile">9812398524</field>
|
<field name="partner_mobile">9812398524</field>
|
||||||
|
@ -102,7 +111,8 @@
|
||||||
</record>
|
</record>
|
||||||
<record id="hr_case_advertisement" model="hr.applicant">
|
<record id="hr_case_advertisement" model="hr.applicant">
|
||||||
<field name="name">Advertisement</field>
|
<field name="name">Advertisement</field>
|
||||||
<field name="job_id" ref="hr.job_developer"/>
|
<field name="job_id" ref="hr.job_consultant"/>
|
||||||
|
<field name="department_id" ref="hr.dep_ps"/>
|
||||||
<field name="type_id" ref="degree_licenced"/>
|
<field name="type_id" ref="degree_licenced"/>
|
||||||
<field name="categ_ids" eval="[(6,0,[ref('tag_applicant_it')])]"/>
|
<field name="categ_ids" eval="[(6,0,[ref('tag_applicant_it')])]"/>
|
||||||
<field name="partner_name">David Armstrong</field>
|
<field name="partner_name">David Armstrong</field>
|
||||||
|
@ -114,15 +124,79 @@
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="hr.job_developer" model="hr.job">
|
<record id="hr.job_developer" model="hr.job">
|
||||||
<field name="survey_id" ref="survey_job_0"/>
|
|
||||||
<field name="state">recruit</field>
|
<field name="state">recruit</field>
|
||||||
<field name="no_of_recruitment">7</field>
|
<field name="no_of_recruitment">4</field>
|
||||||
<field name="no_of_hired_employee">2</field>
|
<field name="survey_id" ref="survey_job_0"/>
|
||||||
|
</record>
|
||||||
|
<record id="hr.job_ceo" model="hr.job">
|
||||||
|
<field name="survey_id" ref="survey_job_0"/>
|
||||||
|
</record>
|
||||||
|
<record id="hr.job_cto" model="hr.job">
|
||||||
|
<field name="survey_id" ref="survey_job_0"/>
|
||||||
|
</record>
|
||||||
|
<record id="hr.job_consultant" model="hr.job">
|
||||||
|
<field name="state">recruit</field>
|
||||||
|
<field name="no_of_recruitment">1</field>
|
||||||
|
<field name="survey_id" ref="survey_job_0"/>
|
||||||
|
</record>
|
||||||
|
<record id="hr.job_hrm" model="hr.job">
|
||||||
|
<field name="no_of_recruitment">1</field>
|
||||||
|
<field name="state">recruit</field>
|
||||||
|
<field name="survey_id" ref="survey_job_0"/>
|
||||||
|
</record>
|
||||||
|
<record id="hr.job_marketing" model="hr.job">
|
||||||
|
<field name="state">recruit</field>
|
||||||
|
<field name="no_of_recruitment">3</field>
|
||||||
|
<field name="survey_id" ref="survey_job_0"/>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="hr.job_trainee" model="hr.job">
|
<record id="hr.job_trainee" model="hr.job">
|
||||||
<field name="state">recruit</field>
|
<field name="state">recruit</field>
|
||||||
<field name="no_of_recruitment">5</field>
|
<field name="no_of_recruitment">6</field>
|
||||||
|
<field name="survey_id" ref="survey_job_0"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="message_application_demo" model="mail.message">
|
||||||
|
<field name="model">hr.applicant</field>
|
||||||
|
<field name="res_id" ref="hr_case_advertisement"/>
|
||||||
|
<field name="body">Please do refer to this application for sure.</field>
|
||||||
|
<field name="type">comment</field>
|
||||||
|
<field name="author_id" ref="base.res_partner_2"/>
|
||||||
|
</record>
|
||||||
|
<record id="msg_case18_aplicant" model="mail.message">
|
||||||
|
<field name="subject">Regarding reference</field>
|
||||||
|
<field name="model">hr.applicant</field>
|
||||||
|
<field name="res_id" ref="hr_case_advertisement"/>
|
||||||
|
<field name="body"><![CDATA[<p>Hello!<br />
|
||||||
|
I will surely refer to this application as it is by your reference and <br />
|
||||||
|
will try to conduct an interview within a very short time<br />
|
||||||
|
Thanks,</p>]]></field>
|
||||||
|
<field name="type">comment</field>
|
||||||
|
<field name="subtype_id" ref="mail.mt_comment"/>
|
||||||
|
<field name="author_id" ref="base.partner_demo"/>
|
||||||
|
</record>
|
||||||
|
<function model="mail.message" name="set_message_starred"
|
||||||
|
eval="[ ref('msg_case18_aplicant')], True, {}"
|
||||||
|
/>
|
||||||
|
<record id="msg_case_salesman0_aplicant" model="mail.message">
|
||||||
|
<field name="subject">Refuse Application</field>
|
||||||
|
<field name="model">hr.applicant</field>
|
||||||
|
<field name="res_id" ref="hr_case_salesman0"/>
|
||||||
|
<field name="body"><![CDATA[<p>Hello,</p>
|
||||||
|
<p>I have checked this application but It's not match with our requirement. so no need to process further and we should refuse this application.</p>
|
||||||
|
<p>Kind regards,</p>]]></field>
|
||||||
|
<field name="type">comment</field>
|
||||||
|
<field name="subtype_id" ref="mail.mt_comment"/>
|
||||||
|
<field name="author_id" ref="base.partner_demo"/>
|
||||||
|
</record>
|
||||||
|
<record id="msg_case_fresher0_aplicant" model="mail.message">
|
||||||
|
<field name="model">hr.applicant</field>
|
||||||
|
<field name="res_id" ref="hr_case_fresher0"/>
|
||||||
|
<field name="body"><![CDATA[<p>Hello,</p>
|
||||||
|
<p>We should move further for this application as early as possible..</p>
|
||||||
|
<p>Kind regards,</p>]]></field>
|
||||||
|
<field name="type">comment</field>
|
||||||
|
<field name="subtype_id" ref="mail.mt_comment"/>
|
||||||
|
<field name="author_id" ref="base.partner_demo"/>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
</data>
|
</data>
|
||||||
|
|
|
@ -9,13 +9,15 @@
|
||||||
<field name="view_id" eval="False"/>
|
<field name="view_id" eval="False"/>
|
||||||
<field name="search_view_id" ref="view_crm_case_jobs_filter"/>
|
<field name="search_view_id" ref="view_crm_case_jobs_filter"/>
|
||||||
<field name="help" type="html">
|
<field name="help" type="html">
|
||||||
<p>
|
<p class="oe_view_nocontent_create">
|
||||||
OpenERP helps you track applicants in the recruitment
|
Click to add a new job applicant.
|
||||||
process and follow up all operations: meetings, interviews, etc.
|
|
||||||
</p><p>
|
</p><p>
|
||||||
Applicants and their attached CV are created automatically when an email is sent.
|
OpenERP helps you track applicants in the recruitment process
|
||||||
If you install the document management modules, all resumes are indexed automatically,
|
and follow up all operations: meetings, interviews, etc.
|
||||||
so that you can easily search through their content.
|
Candidates and their cv's are automatically created when they
|
||||||
|
apply for a job. If you install the document management modules,
|
||||||
|
all resumes are indexed automatically, so that you can easily
|
||||||
|
search through their content in the recruitment menu.
|
||||||
</p>
|
</p>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
|
@ -44,7 +44,7 @@
|
||||||
<field name="last_stage_id" invisible="1"/>
|
<field name="last_stage_id" invisible="1"/>
|
||||||
<field name="create_date"/>
|
<field name="create_date"/>
|
||||||
<field name="date_last_stage_update" invisible="1"/>
|
<field name="date_last_stage_update" invisible="1"/>
|
||||||
<field name="name" string="Subject"/>
|
<field name="name"/>
|
||||||
<field name="partner_name"/>
|
<field name="partner_name"/>
|
||||||
<field name="email_from"/>
|
<field name="email_from"/>
|
||||||
<field name="partner_phone"/>
|
<field name="partner_phone"/>
|
||||||
|
@ -83,6 +83,7 @@
|
||||||
<button name="action_print_survey" type="object"
|
<button name="action_print_survey" type="object"
|
||||||
string="Print Interview" help="Print interview report"
|
string="Print Interview" help="Print interview report"
|
||||||
attrs="{'invisible':[('survey','=',False)]}"/>
|
attrs="{'invisible':[('survey','=',False)]}"/>
|
||||||
|
<button name="action_get_attachment_tree_view" string="Documents" type="object"/>
|
||||||
</div>
|
</div>
|
||||||
<div class="oe_title">
|
<div class="oe_title">
|
||||||
<label for="name" class="oe_edit_only"/>
|
<label for="name" class="oe_edit_only"/>
|
||||||
|
@ -121,6 +122,7 @@
|
||||||
<field name="response" invisible="1"/>
|
<field name="response" invisible="1"/>
|
||||||
<field name="job_id" on_change="onchange_job(job_id)"/>
|
<field name="job_id" on_change="onchange_job(job_id)"/>
|
||||||
<field name="department_id" on_change="onchange_department_id(department_id, stage_id)"/>
|
<field name="department_id" on_change="onchange_department_id(department_id, stage_id)"/>
|
||||||
|
<field name="company_id" />
|
||||||
<label for="availability"/>
|
<label for="availability"/>
|
||||||
<div>
|
<div>
|
||||||
<field name="availability" class="oe_inline"/> <label string="Day(s)" class="oe_inline"/>
|
<field name="availability" class="oe_inline"/> <label string="Day(s)" class="oe_inline"/>
|
||||||
|
@ -181,6 +183,7 @@
|
||||||
<separator/>
|
<separator/>
|
||||||
<filter string="Next Actions" context="{'invisible_next_action':False, 'invisible_next_date':False}"
|
<filter string="Next Actions" context="{'invisible_next_action':False, 'invisible_next_date':False}"
|
||||||
domain="[('date_action','<>',False)]" help="Filter and view on next actions and date"/>
|
domain="[('date_action','<>',False)]" help="Filter and view on next actions and date"/>
|
||||||
|
|
||||||
<field name="job_id"/>
|
<field name="job_id"/>
|
||||||
<field name="department_id"/>
|
<field name="department_id"/>
|
||||||
<field name="user_id"/>
|
<field name="user_id"/>
|
||||||
|
@ -239,6 +242,7 @@
|
||||||
<field name="department_id"/>
|
<field name="department_id"/>
|
||||||
<field name="categ_ids"/>
|
<field name="categ_ids"/>
|
||||||
<field name="message_summary"/>
|
<field name="message_summary"/>
|
||||||
|
<field name="attachment_number"/>
|
||||||
<templates>
|
<templates>
|
||||||
<t t-name="kanban-tooltip">
|
<t t-name="kanban-tooltip">
|
||||||
<ul class="oe_kanban_tooltip">
|
<ul class="oe_kanban_tooltip">
|
||||||
|
@ -256,6 +260,7 @@
|
||||||
<li><a name="action_makeMeeting" type="object">Schedule Interview</a></li>
|
<li><a name="action_makeMeeting" type="object">Schedule Interview</a></li>
|
||||||
<li><ul class="oe_kanban_colorpicker" data-field="color"/></li>
|
<li><ul class="oe_kanban_colorpicker" data-field="color"/></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="oe_kanban_content" tooltip="kanban-tooltip">
|
<div class="oe_kanban_content" tooltip="kanban-tooltip">
|
||||||
<div>
|
<div>
|
||||||
|
@ -290,7 +295,9 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="oe_kanban_footer_left" style="margin-top:5px;">
|
<div class="oe_kanban_footer_left" style="margin-top:5px;">
|
||||||
<t t-raw="record.message_summary.raw_value"/>
|
<t t-raw="record.message_summary.raw_value"/>
|
||||||
|
<a t-if="record.attachment_number" name="action_get_attachment_tree_view" type="object" style="margin-right: 10px"> <field name="attachment_number"/> Documents</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="oe_clear"></div>
|
<div class="oe_clear"></div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -498,6 +505,7 @@
|
||||||
<group>
|
<group>
|
||||||
<field name="sequence"/>
|
<field name="sequence"/>
|
||||||
<field name="fold"/>
|
<field name="fold"/>
|
||||||
|
<field name="template_id" domain= "[('model_id.model', '=', 'hr.applicant')]"/>
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
<separator string="Requirements"/>
|
<separator string="Requirements"/>
|
||||||
|
|
|
@ -26,7 +26,7 @@ class hr_applicant_settings(osv.osv_memory):
|
||||||
_inherit = ['hr.config.settings', 'fetchmail.config.settings']
|
_inherit = ['hr.config.settings', 'fetchmail.config.settings']
|
||||||
|
|
||||||
_columns = {
|
_columns = {
|
||||||
'module_document_ftp': fields.boolean('Allow the automatic indexation of resumes',
|
'module_document': fields.boolean('Allow the automatic indexation of resumes',
|
||||||
help='Manage your CV\'s and motivation letter related to all applicants.\n'
|
help='Manage your CV\'s and motivation letter related to all applicants.\n'
|
||||||
'-This installs the module document_ftp. This will install the knowledge management module in order to allow you to search using specific keywords through the content of all documents (PDF, .DOCx...)'),
|
'-This installs the module document_ftp. This will install the knowledge management module in order to allow you to search using specific keywords through the content of all documents (PDF, .DOCx...)'),
|
||||||
'fetchmail_applicants': fields.boolean('Create applicants from an incoming email account',
|
'fetchmail_applicants': fields.boolean('Create applicants from an incoming email account',
|
||||||
|
|
|
@ -15,14 +15,8 @@
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<div name="recruitment" position="inside">
|
<div name="recruitment" position="inside">
|
||||||
<div>
|
<div>
|
||||||
<field name="fetchmail_applicants" class="oe_inline"/>
|
<field name="module_document" class="oe_inline"/>
|
||||||
<label for="fetchmail_applicants"/>
|
<label for="module_document"/>
|
||||||
<button name="configure_fetchmail_applicants" type="object" string="Configure" icon="gtk-go-forward"
|
|
||||||
attrs="{'invisible': [('fetchmail_applicants','=',False)]}" class="oe_link"/>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<field name="module_document_ftp" class="oe_inline"/>
|
|
||||||
<label for="module_document_ftp"/>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<xpath expr="//div[@name='hr_recruitment']" position="after">
|
<xpath expr="//div[@name='hr_recruitment']" position="after">
|
||||||
|
|
|
@ -106,7 +106,7 @@ class report_custom(report_rml):
|
||||||
<date>%s</date>
|
<date>%s</date>
|
||||||
<company>%s</company>
|
<company>%s</company>
|
||||||
</header>
|
</header>
|
||||||
''' % (str(rml_obj.formatLang(time.strftime("%Y-%m-%d"),date=True))+' ' + str(time.strftime("%H:%M")),registry['res.users'].browse(cr,uid,uid).company_id.name)
|
''' % (str(rml_obj.formatLang(time.strftime("%Y-%m-%d"),date=True))+' ' + str(time.strftime("%H:%M")),toxml(registry['res.users'].browse(cr,uid,uid).company_id.name))
|
||||||
|
|
||||||
xml='''<?xml version="1.0" encoding="UTF-8" ?>
|
xml='''<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<report>
|
<report>
|
||||||
|
|
|
@ -745,6 +745,8 @@
|
||||||
<field name="property_account_receivable" ref="pcg_3488"/>
|
<field name="property_account_receivable" ref="pcg_3488"/>
|
||||||
<field name="property_account_payable" ref="pcg_4488"/>
|
<field name="property_account_payable" ref="pcg_4488"/>
|
||||||
<field name="currency_id" ref="base.MAD"/>
|
<field name="currency_id" ref="base.MAD"/>
|
||||||
|
<field name="property_account_income_categ" ref="pcg_7111"/>
|
||||||
|
<field name="property_account_expense_categ" ref="pcg_1486"/>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record model="account.tax.template" id="tva_exo">
|
<record model="account.tax.template" id="tva_exo">
|
||||||
|
|
|
@ -119,3 +119,5 @@
|
||||||
"51100_general_product",51100,"Freight and Shipping Costs","other","l10n_us.user_type_cogs","cost_of_goods_sold","False","l10n_us.account_chart_template_general_product"
|
"51100_general_product",51100,"Freight and Shipping Costs","other","l10n_us.user_type_cogs","cost_of_goods_sold","False","l10n_us.account_chart_template_general_product"
|
||||||
"52500_general_product",52500,"Purchase Discounts","other","l10n_us.user_type_cogs","cost_of_goods_sold","False","l10n_us.account_chart_template_general_product"
|
"52500_general_product",52500,"Purchase Discounts","other","l10n_us.user_type_cogs","cost_of_goods_sold","False","l10n_us.account_chart_template_general_product"
|
||||||
"52900_general_product",52900,"Purchases - Resale Items","other","l10n_us.user_type_cogs","cost_of_goods_sold","False","l10n_us.account_chart_template_general_product"
|
"52900_general_product",52900,"Purchases - Resale Items","other","l10n_us.user_type_cogs","cost_of_goods_sold","False","l10n_us.account_chart_template_general_product"
|
||||||
|
"base_miscincome","49000","Miscellaneous Income","other","l10n_us.user_type_income","income","False","l10n_us.account_chart_template_basic"
|
||||||
|
"base_miscexpense","69000","Miscellaneous Expense","other","l10n_us.user_type_expense","expense","False","l10n_us.account_chart_template_basic"
|
|
|
@ -9,6 +9,8 @@
|
||||||
<field name="property_account_receivable" ref="account_receivable"/>
|
<field name="property_account_receivable" ref="account_receivable"/>
|
||||||
<field name="property_account_payable" ref="account_payable"/>
|
<field name="property_account_payable" ref="account_payable"/>
|
||||||
<field name="currency_id" ref="base.USD"/>
|
<field name="currency_id" ref="base.USD"/>
|
||||||
|
<field name="property_account_income_categ" ref="base_miscincome"/>
|
||||||
|
<field name="property_account_expense_categ" ref="base_miscexpense"/>
|
||||||
</record>
|
</record>
|
||||||
<record id="account_chart_template_advertising" model="account.chart.template">
|
<record id="account_chart_template_advertising" model="account.chart.template">
|
||||||
<field name="bank_account_view_id" ref="cash_expenditure"/>
|
<field name="bank_account_view_id" ref="cash_expenditure"/>
|
||||||
|
|
|
@ -81,16 +81,19 @@ Main Features
|
||||||
'css': [
|
'css': [
|
||||||
'static/src/css/mail.css',
|
'static/src/css/mail.css',
|
||||||
'static/src/css/mail_group.css',
|
'static/src/css/mail_group.css',
|
||||||
|
'static/src/css/announcement.css',
|
||||||
],
|
],
|
||||||
'js': [
|
'js': [
|
||||||
'static/src/js/mail.js',
|
'static/src/js/mail.js',
|
||||||
'static/src/js/mail_followers.js',
|
'static/src/js/mail_followers.js',
|
||||||
'static/src/js/many2many_tags_email.js',
|
'static/src/js/many2many_tags_email.js',
|
||||||
|
'static/src/js/announcement.js',
|
||||||
'static/src/js/suggestions.js',
|
'static/src/js/suggestions.js',
|
||||||
],
|
],
|
||||||
'qweb': [
|
'qweb': [
|
||||||
'static/src/xml/mail.xml',
|
'static/src/xml/mail.xml',
|
||||||
'static/src/xml/mail_followers.xml',
|
'static/src/xml/mail_followers.xml',
|
||||||
|
'static/src/xml/announcement.xml',
|
||||||
'static/src/xml/suggestions.xml',
|
'static/src/xml/suggestions.xml',
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
|
|
|
@ -201,7 +201,7 @@ class mail_message(osv.Model):
|
||||||
|
|
||||||
def _get_default_from(self, cr, uid, context=None):
|
def _get_default_from(self, cr, uid, context=None):
|
||||||
this = self.pool.get('res.users').browse(cr, SUPERUSER_ID, uid, context=context)
|
this = self.pool.get('res.users').browse(cr, SUPERUSER_ID, uid, context=context)
|
||||||
if this.alias_domain:
|
if this.alias_name and this.alias_domain:
|
||||||
return '%s <%s@%s>' % (this.name, this.alias_name, this.alias_domain)
|
return '%s <%s@%s>' % (this.name, this.alias_name, this.alias_domain)
|
||||||
elif this.email:
|
elif this.email:
|
||||||
return '%s <%s>' % (this.name, this.email)
|
return '%s <%s>' % (this.name, this.email)
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
.openerp .annoucement_bar {
|
||||||
|
display: none;
|
||||||
|
}
|
|
@ -90,7 +90,9 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.openerp .oe_group_button {
|
.openerp .oe_group_button {
|
||||||
padding-top: 7px;
|
position: absolute;
|
||||||
|
padding-bottom: 50px;
|
||||||
|
bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.openerp .oe_group_button .oe_group_join {
|
.openerp .oe_group_button .oe_group_join {
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
openerp_announcement = function(instance) {
|
||||||
|
instance.web.WebClient.include({
|
||||||
|
show_application: function() {
|
||||||
|
return $.when(this._super.apply(this, arguments)).then(this.proxy('show_annoucement_bar'));
|
||||||
|
},
|
||||||
|
_ab_location: function(dbuuid) {
|
||||||
|
return _.str.sprintf('https://services.openerp.com/openerp-enterprise/ab/css/%s.css', dbuuid);
|
||||||
|
},
|
||||||
|
show_annoucement_bar: function() {
|
||||||
|
if (this.session.get_cookie('ab') === 'c') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var self = this;
|
||||||
|
var config_parameter = new instance.web.Model('ir.config_parameter');
|
||||||
|
var $bar = this.$el.find('.announcement_bar');
|
||||||
|
return config_parameter.call('get_param', ['database.uuid', false]).then(function(dbuuid) {
|
||||||
|
if (!dbuuid) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var $link = $bar.find('.url a');
|
||||||
|
$link.attr('href', _.str.sprintf('%s/%s', $link.attr('href'), dbuuid));
|
||||||
|
var $css = $('<link />').attr({
|
||||||
|
rel : 'stylesheet',
|
||||||
|
type: 'text/css',
|
||||||
|
media: 'screen',
|
||||||
|
href: self._ab_location(dbuuid)
|
||||||
|
});
|
||||||
|
$css.on('load', function() {
|
||||||
|
var close = function() {
|
||||||
|
var ttl = 7*24*60*60;
|
||||||
|
self.session.set_cookie('ab', 'c', ttl);
|
||||||
|
$bar.slideUp('slow');
|
||||||
|
};
|
||||||
|
$bar.find('.close').on('click', close);
|
||||||
|
self.trigger('ab_loaded', $bar);
|
||||||
|
});
|
||||||
|
|
||||||
|
$('head').append($css);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
|
@ -6,6 +6,7 @@ openerp.mail = function (session) {
|
||||||
|
|
||||||
openerp_mail_followers(session, mail); // import mail_followers.js
|
openerp_mail_followers(session, mail); // import mail_followers.js
|
||||||
openerp_FieldMany2ManyTagsEmail(session); // import manyy2many_tags_email.js
|
openerp_FieldMany2ManyTagsEmail(session); // import manyy2many_tags_email.js
|
||||||
|
openerp_announcement(session);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ------------------------------------------------------------
|
* ------------------------------------------------------------
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<templates id="template" xml:space="preserve">
|
||||||
|
<t t-extend="WebClient">
|
||||||
|
<t t-jquery="table.oe_webclient" t-operation="prepend">
|
||||||
|
<td colspan="2" class="announcement_bar">
|
||||||
|
<span class="message"></span>
|
||||||
|
<span class="url"><a href="https://services.openerp.com/openerp-enterprise/ab/register" target="_blank"></a></span>
|
||||||
|
<span class="close"></span>
|
||||||
|
</td>
|
||||||
|
</t>
|
||||||
|
</t>
|
||||||
|
</templates>
|
|
@ -38,9 +38,9 @@ professional emails and reuse templates in a few clicks.
|
||||||
],
|
],
|
||||||
'data': [
|
'data': [
|
||||||
'mail_data.xml',
|
'mail_data.xml',
|
||||||
'mass_mailing_view.xml',
|
|
||||||
'wizard/mail_compose_message_view.xml',
|
'wizard/mail_compose_message_view.xml',
|
||||||
'wizard/mail_mass_mailing_create_segment.xml',
|
'wizard/mail_mass_mailing_create_segment.xml',
|
||||||
|
'mass_mailing_view.xml',
|
||||||
'security/ir.model.access.csv',
|
'security/ir.model.access.csv',
|
||||||
],
|
],
|
||||||
'js': [
|
'js': [
|
||||||
|
|
|
@ -252,6 +252,9 @@
|
||||||
<t t-if="widget.view.is_action_enabled('edit')">
|
<t t-if="widget.view.is_action_enabled('edit')">
|
||||||
<li><a type="edit">Settings</a></li>
|
<li><a type="edit">Settings</a></li>
|
||||||
</t>
|
</t>
|
||||||
|
<t t-if="widget.view.is_action_enabled('edit')">
|
||||||
|
<li><a name="%(action_mail_mass_mailing_create)d" type="action">New Wave</a></li>
|
||||||
|
</t>
|
||||||
<t t-if="widget.view.is_action_enabled('delete')">
|
<t t-if="widget.view.is_action_enabled('delete')">
|
||||||
<li><a type="delete">Delete</a></li>
|
<li><a type="delete">Delete</a></li>
|
||||||
</t>
|
</t>
|
||||||
|
|
|
@ -36,7 +36,7 @@ class MailMassMailingCreate(osv.TransientModel):
|
||||||
required=True,
|
required=True,
|
||||||
),
|
),
|
||||||
'model_id': fields.many2one(
|
'model_id': fields.many2one(
|
||||||
'ir.model', 'Document',
|
'ir.model', 'Document Type',
|
||||||
required=True,
|
required=True,
|
||||||
help='Document on which the mass mailing will run. This must be a '
|
help='Document on which the mass mailing will run. This must be a '
|
||||||
'valid OpenERP model.',
|
'valid OpenERP model.',
|
||||||
|
@ -116,6 +116,8 @@ class MailMassMailingCreate(osv.TransientModel):
|
||||||
'default_template_id': wizard.template_id.id,
|
'default_template_id': wizard.template_id.id,
|
||||||
'default_use_mass_mailing_campaign': True,
|
'default_use_mass_mailing_campaign': True,
|
||||||
'default_use_active_domain': True,
|
'default_use_active_domain': True,
|
||||||
|
'default_model': wizard.model_id.model,
|
||||||
|
'default_res_id': False,
|
||||||
'default_active_domain': wizard.domain,
|
'default_active_domain': wizard.domain,
|
||||||
'default_mass_mailing_campaign_id': wizard.mass_mailing_campaign_id.id,
|
'default_mass_mailing_campaign_id': wizard.mass_mailing_campaign_id.id,
|
||||||
'default_mass_mailing_id': wizard.mass_mailing_id.id,
|
'default_mass_mailing_id': wizard.mass_mailing_id.id,
|
||||||
|
|
|
@ -42,7 +42,7 @@
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<label for="model_id"/>
|
<label for="template_id"/>
|
||||||
<div>
|
<div>
|
||||||
<field name="template_id"/>
|
<field name="template_id"/>
|
||||||
<p class="oe_grey"
|
<p class="oe_grey"
|
||||||
|
@ -55,8 +55,7 @@
|
||||||
<label for="name"/>
|
<label for="name"/>
|
||||||
<div>
|
<div>
|
||||||
<field name="name"/>
|
<field name="name"/>
|
||||||
<p class="oe_grey"
|
<p class="oe_grey">
|
||||||
attrs="{'invisible': [('name', '!=', False)]}">
|
|
||||||
Please choose the name of the mailing.
|
Please choose the name of the mailing.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
@ -76,6 +75,7 @@
|
||||||
<field name="view_type">form</field>
|
<field name="view_type">form</field>
|
||||||
<field name="view_mode">form</field>
|
<field name="view_mode">form</field>
|
||||||
<field name="target">new</field>
|
<field name="target">new</field>
|
||||||
|
<field name="context">{'default_mass_mailing_campaign_id': active_id}</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
</data>
|
</data>
|
||||||
|
|
|
@ -70,6 +70,8 @@ class report_custom(report_rml):
|
||||||
main_strd_price = str(std_price) + '\r\n'
|
main_strd_price = str(std_price) + '\r\n'
|
||||||
sum_strd = prod_qtty*std_price
|
sum_strd = prod_qtty*std_price
|
||||||
for seller_id in prod.seller_ids:
|
for seller_id in prod.seller_ids:
|
||||||
|
if seller_id.name.id == prod.seller_id.id:
|
||||||
|
continue
|
||||||
sellers += '- <i>'+ to_xml(seller_id.name.name) +'</i>\r\n'
|
sellers += '- <i>'+ to_xml(seller_id.name.name) +'</i>\r\n'
|
||||||
pricelist = seller_id.name.property_product_pricelist_purchase
|
pricelist = seller_id.name.property_product_pricelist_purchase
|
||||||
price = pricelist_pool.price_get(cr,uid,[pricelist.id],
|
price = pricelist_pool.price_get(cr,uid,[pricelist.id],
|
||||||
|
|
|
@ -84,9 +84,10 @@ class note_note(osv.osv):
|
||||||
return ids and ids[0] or False
|
return ids and ids[0] or False
|
||||||
|
|
||||||
def _set_stage_per_user(self, cr, uid, id, name, value, args=None, context=None):
|
def _set_stage_per_user(self, cr, uid, id, name, value, args=None, context=None):
|
||||||
note = self.browse(cr, uid, id, context=context)
|
if not value:
|
||||||
if not value: return False
|
return False
|
||||||
stage_ids = [value] + [stage.id for stage in note.stage_ids if stage.user_id.id != uid ]
|
note = self.browse(cr, SUPERUSER_ID, id, context=context) # do it as SUPERUSER because when creating, followers are not necessariliry set (another function field)
|
||||||
|
stage_ids = [value] + [stage.id for stage in note.stage_ids if stage.user_id.id != uid]
|
||||||
return self.write(cr, uid, [id], {'stage_ids': [(6, 0, set(stage_ids))]}, context=context)
|
return self.write(cr, uid, [id], {'stage_ids': [(6, 0, set(stage_ids))]}, context=context)
|
||||||
|
|
||||||
def _get_stage_per_user(self, cr, uid, ids, name, args, context=None):
|
def _get_stage_per_user(self, cr, uid, ids, name, args, context=None):
|
||||||
|
|
|
@ -714,13 +714,14 @@ class pos_order(osv.osv):
|
||||||
}, context=context)
|
}, context=context)
|
||||||
self.write(cr, uid, [order.id], {'picking_id': picking_id}, context=context)
|
self.write(cr, uid, [order.id], {'picking_id': picking_id}, context=context)
|
||||||
location_id = order.warehouse_id.lot_stock_id.id
|
location_id = order.warehouse_id.lot_stock_id.id
|
||||||
output_id = order.warehouse_id.lot_output_id.id
|
if order.partner_id:
|
||||||
|
destination_id = order.partner_id.property_stock_customer.id
|
||||||
|
else:
|
||||||
|
destination_id = partner_obj.default_get(cr, uid, ['property_stock_customer'], context=context)['property_stock_customer']
|
||||||
|
|
||||||
for line in order.lines:
|
for line in order.lines:
|
||||||
if line.product_id and line.product_id.type == 'service':
|
if line.product_id and line.product_id.type == 'service':
|
||||||
continue
|
continue
|
||||||
if line.qty < 0:
|
|
||||||
location_id, output_id = output_id, location_id
|
|
||||||
|
|
||||||
move_obj.create(cr, uid, {
|
move_obj.create(cr, uid, {
|
||||||
'name': line.name,
|
'name': line.name,
|
||||||
|
@ -732,11 +733,9 @@ class pos_order(osv.osv):
|
||||||
'product_qty': abs(line.qty),
|
'product_qty': abs(line.qty),
|
||||||
'tracking_id': False,
|
'tracking_id': False,
|
||||||
'state': 'draft',
|
'state': 'draft',
|
||||||
'location_id': location_id,
|
'location_id': location_id if line.qty >= 0 else destination_id,
|
||||||
'location_dest_id': output_id,
|
'location_dest_id': destination_id if line.qty >= 0 else location_id,
|
||||||
}, context=context)
|
}, context=context)
|
||||||
if line.qty < 0:
|
|
||||||
location_id, output_id = output_id, location_id
|
|
||||||
|
|
||||||
picking_obj.signal_button_confirm(cr, uid, [picking_id])
|
picking_obj.signal_button_confirm(cr, uid, [picking_id])
|
||||||
picking_obj.force_assign(cr, uid, [picking_id], context)
|
picking_obj.force_assign(cr, uid, [picking_id], context)
|
||||||
|
|
|
@ -560,6 +560,7 @@ function openerp_pos_devices(instance,module){ //module is instance.point_of_sal
|
||||||
this.handler = function(e){
|
this.handler = function(e){
|
||||||
|
|
||||||
if(e.which === 13){ //ignore returns
|
if(e.which === 13){ //ignore returns
|
||||||
|
e.preventDefault();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -479,7 +479,7 @@ def Project():
|
||||||
""" % (
|
""" % (
|
||||||
project.id,
|
project.id,
|
||||||
project.date_start or time.strftime('%Y-%m-%d'), working_days,
|
project.date_start or time.strftime('%Y-%m-%d'), working_days,
|
||||||
'|'.join(['User_'+str(x) for x in puids])
|
'|'.join(['User_'+str(x) for x in puids]) or 'None'
|
||||||
)
|
)
|
||||||
vacation = calendar_id and tuple(resource_pool.compute_vacation(cr, uid, calendar_id, context=context)) or False
|
vacation = calendar_id and tuple(resource_pool.compute_vacation(cr, uid, calendar_id, context=context)) or False
|
||||||
if vacation:
|
if vacation:
|
||||||
|
@ -789,7 +789,7 @@ class task(osv.osv):
|
||||||
}),
|
}),
|
||||||
'progress': fields.function(_hours_get, string='Working Time Progress (%)', multi='hours', group_operator="avg", help="If the task has a progress of 99.99% you should close the task if it's finished or reevaluate the time",
|
'progress': fields.function(_hours_get, string='Working Time Progress (%)', multi='hours', group_operator="avg", help="If the task has a progress of 99.99% you should close the task if it's finished or reevaluate the time",
|
||||||
store = {
|
store = {
|
||||||
'project.task': (lambda self, cr, uid, ids, c={}: ids, ['work_ids', 'remaining_hours', 'planned_hours','state'], 10),
|
'project.task': (lambda self, cr, uid, ids, c={}: ids, ['work_ids', 'remaining_hours', 'planned_hours', 'state', 'stage_id'], 10),
|
||||||
'project.task.work': (_get_task, ['hours'], 10),
|
'project.task.work': (_get_task, ['hours'], 10),
|
||||||
}),
|
}),
|
||||||
'delay_hours': fields.function(_hours_get, string='Delay Hours', multi='hours', help="Computed as difference between planned hours by the project manager and the total hours of the task.",
|
'delay_hours': fields.function(_hours_get, string='Delay Hours', multi='hours', help="Computed as difference between planned hours by the project manager and the total hours of the task.",
|
||||||
|
|
|
@ -32,12 +32,6 @@ openerp.project = function(openerp) {
|
||||||
if (self.dataset.model === 'project.project') {
|
if (self.dataset.model === 'project.project') {
|
||||||
self.project_display_members_names();
|
self.project_display_members_names();
|
||||||
}
|
}
|
||||||
},
|
|
||||||
on_record_moved: function(record, old_group, old_index, new_group, new_index){
|
|
||||||
var self = this;
|
|
||||||
this._super.apply(this, arguments);
|
|
||||||
if(new_group.state.folded)
|
|
||||||
new_group.do_action_toggle_fold();
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
</field>
|
</field>
|
||||||
<xpath expr="//notebook/page[@string='Extra Info']" position="before">
|
<xpath expr="//notebook/page[@string='Extra Info']" position="before">
|
||||||
<page string="Worklogs">
|
<page string="Worklogs">
|
||||||
<field name="timesheet_ids" colspan="4" nolabel="1" context="{'default_user_id' : user_id, 'default_account_id' : analytic_account_id}"
|
<field name="timesheet_ids" colspan="4" nolabel="1" context="{'default_user_id' : uid, 'default_account_id' : analytic_account_id}"
|
||||||
groups="base.group_user">
|
groups="base.group_user">
|
||||||
<tree editable="top" string="Timesheets">
|
<tree editable="top" string="Timesheets">
|
||||||
<field name="name"/>
|
<field name="name"/>
|
||||||
|
|
|
@ -46,12 +46,15 @@
|
||||||
Process Transition
|
Process Transition
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<!-- This "foreign" process node is duplicated here from the corresponding sale_stock node because
|
<!-- This process node is duplicated here from the corresponding sale_stock node because
|
||||||
`project_mrp` implements a basic procurement system for services without actually using the
|
`project_mrp` implements a basic procurement system for services without actually using the
|
||||||
full-fledged procurement process from sale_stock, and without the dependency. So it stil
|
full-fledged procurement process from sale_stock, and without the dependency. So it still
|
||||||
represents a "procurement system".
|
represents a "procurement system". Sharing the external ID causes other problems, so
|
||||||
|
we duplicate it instead.
|
||||||
|
TODO: To cleanup this duplicate node, it should probably be moved to the
|
||||||
|
`sale` module directly, and removed from both `sale_stock` and `project_mrp`.
|
||||||
-->
|
-->
|
||||||
<record id="procurement.process_node_saleprocurement0" model="process.node">
|
<record id="process_node_saleprocurement0" model="process.node">
|
||||||
<field name="menu_id" ref="procurement.menu_stock_procurement_action"/>
|
<field name="menu_id" ref="procurement.menu_stock_procurement_action"/>
|
||||||
<field name="model_id" ref="procurement.model_procurement_order"/>
|
<field name="model_id" ref="procurement.model_procurement_order"/>
|
||||||
<field name="kind">subflow</field>
|
<field name="kind">subflow</field>
|
||||||
|
@ -66,7 +69,7 @@
|
||||||
<field eval=""""Procurement Task"""" name="name"/>
|
<field eval=""""Procurement Task"""" name="name"/>
|
||||||
<field eval=""""if product type is 'service' then it creates the task."""" name="note"/>
|
<field eval=""""if product type is 'service' then it creates the task."""" name="note"/>
|
||||||
<field name="target_node_id" ref="process_node_procuretasktask0"/>
|
<field name="target_node_id" ref="process_node_procuretasktask0"/>
|
||||||
<field name="source_node_id" ref="procurement.process_node_saleprocurement0"/>
|
<field name="source_node_id" ref="process_node_saleprocurement0"/>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="process_transition_createtask0" model="process.transition">
|
<record id="process_transition_createtask0" model="process.transition">
|
||||||
|
|
|
@ -71,10 +71,8 @@
|
||||||
<filter string="Validated by" icon="terp-personal" context="{'group_by':'validator'}"/>
|
<filter string="Validated by" icon="terp-personal" context="{'group_by':'validator'}"/>
|
||||||
<filter string="Product" name="group_product_id" icon="terp-accessories-archiver" context="{'group_by':'product_id'}"/>
|
<filter string="Product" name="group_product_id" icon="terp-accessories-archiver" context="{'group_by':'product_id'}"/>
|
||||||
<filter string="Category" name="group_category_id" icon="terp-stock_symbol-selection" context="{'group_by':'category_id'}"/>
|
<filter string="Category" name="group_category_id" icon="terp-stock_symbol-selection" context="{'group_by':'category_id'}"/>
|
||||||
<filter string="Reference Unit of Measure" name="group_product_uom" icon="terp-mrp" context="{'group_by':'product_uom'}"/>
|
|
||||||
<filter string="Warehouse" icon="terp-go-home" context="{'group_by':'warehouse_id'}"/>
|
<filter string="Warehouse" icon="terp-go-home" context="{'group_by':'warehouse_id'}"/>
|
||||||
<filter string="Reference UOM" name="group_product_uom" icon="terp-mrp" context="{'group_by':'product_uom'}"/>
|
<filter string="Reference UOM" name="group_product_uom" icon="terp-mrp" context="{'group_by':'product_uom'}"/>
|
||||||
<filter string="Warehouse" icon="terp-go-home" context="{'group_by':'warehouse_id'}"/>
|
|
||||||
<filter string="Destination" icon="terp-gtk-jump-to-ltr" context="{'group_by':'location_id'}"/>
|
<filter string="Destination" icon="terp-gtk-jump-to-ltr" context="{'group_by':'location_id'}"/>
|
||||||
<filter string="Status" icon="terp-stock_effects-object-colorize" context="{'group_by':'state'}"/>
|
<filter string="Status" icon="terp-stock_effects-object-colorize" context="{'group_by':'state'}"/>
|
||||||
<filter string="Company" icon="terp-go-home" context="{'group_by':'company_id'}" groups="base.group_multi_company"/>
|
<filter string="Company" icon="terp-go-home" context="{'group_by':'company_id'}" groups="base.group_multi_company"/>
|
||||||
|
|
|
@ -140,6 +140,6 @@ class stock_picking_in(osv.osv):
|
||||||
_columns = {
|
_columns = {
|
||||||
'purchase_id': fields.many2one('purchase.order', 'Purchase Order',
|
'purchase_id': fields.many2one('purchase.order', 'Purchase Order',
|
||||||
ondelete='set null', select=True),
|
ondelete='set null', select=True),
|
||||||
'warehouse_id': fields.related('purchase_id', 'warehouse_id', type='many2one', relation='stock.warehouse', string='Destination Warehouse'),
|
'warehouse_id': fields.related('purchase_id', 'warehouse_id', type='many2one', relation='stock.warehouse', string='Destination Warehouse', readonly=True),
|
||||||
}
|
}
|
||||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||||
|
|
|
@ -997,9 +997,9 @@ class mail_compose_message(osv.Model):
|
||||||
|
|
||||||
def send_mail(self, cr, uid, ids, context=None):
|
def send_mail(self, cr, uid, ids, context=None):
|
||||||
context = context or {}
|
context = context or {}
|
||||||
if context.get('active_model') == 'sale.order' and context.get('active_ids') and context.get('mark_so_as_sent'):
|
if context.get('default_model') == 'sale.order' and context.get('default_res_id') and context.get('mark_so_as_sent'):
|
||||||
context = dict(context, mail_post_autofollow=True)
|
context = dict(context, mail_post_autofollow=True)
|
||||||
self.pool.get('sale.order').signal_quotation_sent(cr, uid, context['active_ids'])
|
self.pool.get('sale.order').signal_quotation_sent(cr, uid, [context['default_res_id']])
|
||||||
return super(mail_compose_message, self).send_mail(cr, uid, ids, context=context)
|
return super(mail_compose_message, self).send_mail(cr, uid, ids, context=context)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,18 @@ from dateutil import relativedelta
|
||||||
from openerp import tools
|
from openerp import tools
|
||||||
from openerp.osv import osv, fields
|
from openerp.osv import osv, fields
|
||||||
|
|
||||||
|
class res_users(osv.Model):
|
||||||
|
_inherit = 'res.users'
|
||||||
|
_columns = {
|
||||||
|
'default_section_id': fields.many2one('crm.case.section', 'Default Sales Team'),
|
||||||
|
}
|
||||||
|
|
||||||
|
def __init__(self, pool, cr):
|
||||||
|
init_res = super(res_users, self).__init__(pool, cr)
|
||||||
|
# duplicate list to avoid modifying the original reference
|
||||||
|
self.SELF_WRITEABLE_FIELDS = list(self.SELF_WRITEABLE_FIELDS)
|
||||||
|
self.SELF_WRITEABLE_FIELDS.extend(['default_section_id'])
|
||||||
|
return init_res
|
||||||
|
|
||||||
class sale_order(osv.osv):
|
class sale_order(osv.osv):
|
||||||
_inherit = 'sale.order'
|
_inherit = 'sale.order'
|
||||||
|
@ -35,6 +47,17 @@ class sale_order(osv.osv):
|
||||||
domain="['|',('section_id','=',section_id),('section_id','=',False), ('object_id.model', '=', 'crm.lead')]", context="{'object_name': 'crm.lead'}")
|
domain="['|',('section_id','=',section_id),('section_id','=',False), ('object_id.model', '=', 'crm.lead')]", context="{'object_name': 'crm.lead'}")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def _get_default_section_id(self, cr, uid, context=None):
|
||||||
|
""" Gives default section by checking if present in the context """
|
||||||
|
section_id = self.pool.get('crm.lead')._resolve_section_id_from_context(cr, uid, context=context) or False
|
||||||
|
if not section_id:
|
||||||
|
section_id = self.pool.get('res.users').browse(cr, uid, uid, context).default_section_id.id or False
|
||||||
|
return section_id
|
||||||
|
|
||||||
|
_defaults = {
|
||||||
|
'section_id': lambda s, cr, uid, c: s._get_default_section_id(cr, uid, c),
|
||||||
|
}
|
||||||
|
|
||||||
def _prepare_invoice(self, cr, uid, order, lines, context=None):
|
def _prepare_invoice(self, cr, uid, order, lines, context=None):
|
||||||
invoice_vals = super(sale_order, self)._prepare_invoice(cr, uid, order, lines, context=context)
|
invoice_vals = super(sale_order, self)._prepare_invoice(cr, uid, order, lines, context=context)
|
||||||
if order.section_id and order.section_id.id:
|
if order.section_id and order.section_id.id:
|
||||||
|
@ -92,21 +115,6 @@ class crm_case_section(osv.osv):
|
||||||
def action_forecast(self, cr, uid, id, value, context=None):
|
def action_forecast(self, cr, uid, id, value, context=None):
|
||||||
return self.write(cr, uid, [id], {'invoiced_forecast': round(float(value))}, context=context)
|
return self.write(cr, uid, [id], {'invoiced_forecast': round(float(value))}, context=context)
|
||||||
|
|
||||||
|
|
||||||
class res_users(osv.Model):
|
|
||||||
_inherit = 'res.users'
|
|
||||||
_columns = {
|
|
||||||
'default_section_id': fields.many2one('crm.case.section', 'Default Sales Team'),
|
|
||||||
}
|
|
||||||
|
|
||||||
def __init__(self, pool, cr):
|
|
||||||
init_res = super(res_users, self).__init__(pool, cr)
|
|
||||||
# duplicate list to avoid modifying the original reference
|
|
||||||
self.SELF_WRITEABLE_FIELDS = list(self.SELF_WRITEABLE_FIELDS)
|
|
||||||
self.SELF_WRITEABLE_FIELDS.extend(['default_section_id'])
|
|
||||||
return init_res
|
|
||||||
|
|
||||||
|
|
||||||
class sale_crm_lead(osv.Model):
|
class sale_crm_lead(osv.Model):
|
||||||
_inherit = 'crm.lead'
|
_inherit = 'crm.lead'
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
# Thai translation for openobject-addons
|
||||||
|
# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
|
||||||
|
# This file is distributed under the same license as the openobject-addons package.
|
||||||
|
# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: openobject-addons\n"
|
||||||
|
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
|
"POT-Creation-Date: 2012-12-21 17:06+0000\n"
|
||||||
|
"PO-Revision-Date: 2013-12-12 11:19+0000\n"
|
||||||
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
|
"Language-Team: Thai <th@li.org>\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"X-Launchpad-Export-Date: 2013-12-13 05:52+0000\n"
|
||||||
|
"X-Generator: Launchpad (build 16869)\n"
|
||||||
|
|
||||||
|
#. module: sale_mrp
|
||||||
|
#: model:ir.model,name:sale_mrp.model_mrp_production
|
||||||
|
msgid "Manufacturing Order"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: sale_mrp
|
||||||
|
#: help:mrp.production,sale_name:0
|
||||||
|
msgid "Indicate the name of sales order."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: sale_mrp
|
||||||
|
#: help:mrp.production,sale_ref:0
|
||||||
|
msgid "Indicate the Customer Reference from sales order."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: sale_mrp
|
||||||
|
#: field:mrp.production,sale_ref:0
|
||||||
|
msgid "Sale Reference"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. module: sale_mrp
|
||||||
|
#: field:mrp.production,sale_name:0
|
||||||
|
msgid "Sale Name"
|
||||||
|
msgstr ""
|
|
@ -10,7 +10,7 @@
|
||||||
<record id="group_stock_manager" model="res.groups">
|
<record id="group_stock_manager" model="res.groups">
|
||||||
<field name="name">Manager</field>
|
<field name="name">Manager</field>
|
||||||
<field name="category_id" ref="base.module_category_warehouse_management"/>
|
<field name="category_id" ref="base.module_category_warehouse_management"/>
|
||||||
<field name="implied_ids" eval="[(4, ref('group_stock_user')), (4, ref('account.group_account_user'))]"/>
|
<field name="implied_ids" eval="[(4, ref('group_stock_user')), (4, ref('account.group_account_invoice'))]"/>
|
||||||
<field name="users" eval="[(4, ref('base.user_root'))]"/>
|
<field name="users" eval="[(4, ref('base.user_root'))]"/>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
|
|
@ -2106,7 +2106,7 @@ class stock_move(osv.osv):
|
||||||
})
|
})
|
||||||
new_moves.append(self.browse(cr, uid, [new_id])[0])
|
new_moves.append(self.browse(cr, uid, [new_id])[0])
|
||||||
if pickid:
|
if pickid:
|
||||||
self.signal_button_confirm(cr, uid, [pickid])
|
self.pool.get('stock.picking').signal_button_confirm(cr, uid, [pickid])
|
||||||
if new_moves:
|
if new_moves:
|
||||||
new_moves += self.create_chained_picking(cr, uid, new_moves, context)
|
new_moves += self.create_chained_picking(cr, uid, new_moves, context)
|
||||||
return new_moves
|
return new_moves
|
||||||
|
|
|
@ -1044,7 +1044,7 @@
|
||||||
<button name="action_process" states="assigned" string="Receive" type="object" class="oe_highlight"/>
|
<button name="action_process" states="assigned" string="Receive" type="object" class="oe_highlight"/>
|
||||||
</xpath>
|
</xpath>
|
||||||
<xpath expr="//field[@name='partner_id']" position="replace">
|
<xpath expr="//field[@name='partner_id']" position="replace">
|
||||||
<field name="partner_id" on_change="onchange_partner_in(partner_id)" string="Supplier" domain="[('supplier','=',True)]" />
|
<field name="partner_id" on_change="onchange_partner_in(partner_id)" string="Supplier" domain="[('supplier','=',True)]" context="{'default_supplier':1,'default_customer':0}"/>
|
||||||
</xpath>
|
</xpath>
|
||||||
<xpath expr="//field[@name='move_lines']" position="replace">
|
<xpath expr="//field[@name='move_lines']" position="replace">
|
||||||
<field name="move_lines" context="{'address_in_id': partner_id, 'picking_type': 'in', 'form_view_ref':'view_move_picking_form', 'tree_view_ref':'view_move_picking_tree'}" options='{"reload_on_button": true}'/>
|
<field name="move_lines" context="{'address_in_id': partner_id, 'picking_type': 'in', 'form_view_ref':'view_move_picking_form', 'tree_view_ref':'view_move_picking_tree'}" options='{"reload_on_button": true}'/>
|
||||||
|
|
|
@ -10,7 +10,7 @@ OpenERP Web LinkedIn module.
|
||||||
This module provides the Integration of the LinkedIn with OpenERP.
|
This module provides the Integration of the LinkedIn with OpenERP.
|
||||||
""",
|
""",
|
||||||
'data': ['web_linkedin_view.xml'],
|
'data': ['web_linkedin_view.xml'],
|
||||||
'depends' : ['crm'],
|
'depends' : ['web','crm'],
|
||||||
'js': ['static/src/js/*.js'],
|
'js': ['static/src/js/*.js'],
|
||||||
'css': ['static/src/css/*.css'],
|
'css': ['static/src/css/*.css'],
|
||||||
'qweb': ['static/src/xml/*.xml'],
|
'qweb': ['static/src/xml/*.xml'],
|
||||||
|
|
|
@ -24,6 +24,7 @@ import urllib2
|
||||||
from urlparse import urlparse, urlunparse
|
from urlparse import urlparse, urlunparse
|
||||||
|
|
||||||
import openerp
|
import openerp
|
||||||
|
import openerp.addons.web
|
||||||
from openerp.osv import fields, osv
|
from openerp.osv import fields, osv
|
||||||
|
|
||||||
class Binary(openerp.http.Controller):
|
class Binary(openerp.http.Controller):
|
||||||
|
|
Loading…
Reference in New Issue