[IMP] Misc useability improvement

bzr revid: fp@fp-laptop-20110818193044-dwv8je39jv65dbta
This commit is contained in:
fp 2011-08-18 21:30:44 +02:00
parent ac9c0e55b0
commit 32624d2857
8 changed files with 122 additions and 46 deletions

View File

@ -126,11 +126,11 @@ class crm_lead(crm_case, osv.osv):
# From crm.case
'id': fields.integer('ID'),
'name': fields.char('Name', size=64),
'name': fields.char('Name', size=64, select=1),
'active': fields.boolean('Active', required=False),
'date_action_last': fields.datetime('Last Action', readonly=1),
'date_action_next': fields.datetime('Next Action', readonly=1),
'email_from': fields.char('Email', size=128, help="E-mail address of the contact"),
'email_from': fields.char('Email', size=128, help="E-mail address of the contact", select=1),
'section_id': fields.many2one('crm.case.section', 'Sales Team', \
select=True, help='Sales team to which this case belongs to. Defines responsible user and e-mail address for the mail gateway.'),
'create_date': fields.datetime('Creation Date' , readonly=True),
@ -145,7 +145,7 @@ class crm_lead(crm_case, osv.osv):
domain="['|',('section_id','=',section_id),('section_id','=',False)]", help="From which campaign (seminar, marketing campaign, mass mailing, ...) did this contact come from?"),
'channel_id': fields.many2one('res.partner.canal', 'Channel', help="From which channel (mail, direct, phone, ...) did this contact reach you?"),
'contact_name': fields.char('Contact Name', size=64),
'partner_name': fields.char("Customer Name", size=64,help='The name of the future partner that will be created while converting the into opportunity'),
'partner_name': fields.char("Customer Name", size=64,help='The name of the future partner that will be created while converting the into opportunity', select=1),
'optin': fields.boolean('Opt-In', help="If opt-in is checked, this contact has accepted to receive emails."),
'optout': fields.boolean('Opt-Out', help="If opt-out is checked, this contact has refused to receive emails or unsubscribed to a campaign."),
'type':fields.selection([
@ -156,7 +156,7 @@ class crm_lead(crm_case, osv.osv):
'priority': fields.selection(crm.AVAILABLE_PRIORITIES, 'Priority'),
'date_closed': fields.datetime('Closed', readonly=True),
'stage_id': fields.many2one('crm.case.stage', 'Stage', domain="[('type','=','lead')]"),
'user_id': fields.many2one('res.users', 'Salesman'),
'user_id': fields.many2one('res.users', 'Salesman', select=1),
'referred': fields.char('Referred By', size=64),
'date_open': fields.datetime('Opened', readonly=True),
'day_open': fields.function(_compute_day, string='Days to Open', \

View File

@ -328,7 +328,7 @@
/>
<separator orientation="vertical"/>
<field name="name" string="Lead / Customer"
domain="['|','|',('partner_name','ilike',self),('email_from','ilike',self),('name','ilike',self)]"/>
filter_domain="['|','|',('partner_name','ilike',self),('email_from','ilike',self),('name','ilike',self)]"/>
<field name="user_id">
<filter icon="terp-personal-"
domain="[('user_id','=', False)]"

View File

@ -292,7 +292,7 @@
domain="[('state','=','pending')]"/>
<separator orientation="vertical"/>
<field name="name" string="Opportunity"/>
<field name="partner_id" string="Customer"/>
<field name="partner_id" string="Customer / Email" filter_domain="['|','|',('partner_id','ilike',self),('partner_name','ilike',self),('email_from','ilike',self)]"/>
<field name="user_id">
<filter icon="terp-personal-"
domain="[('user_id','=', False)]"

View File

@ -39,6 +39,7 @@ AVAILABLE_STATES = [
]
AVAILABLE_PRIORITIES = [
('', ''),
('5', 'Not Good'),
('4', 'On Average'),
('3', 'Good'),
@ -46,6 +47,16 @@ AVAILABLE_PRIORITIES = [
('1', 'Excellent')
]
class hr_recruitment_source(osv.osv):
""" Sources of HR Recruitment """
_name = "hr.recruitment.source"
_description = "Source of Applicants"
_columns = {
'name': fields.char('Source Name', size=64, required=True, translate=True),
}
hr_recruitment_source()
class hr_recruitment_stage(osv.osv):
""" Stage of HR Recruitment """
_name = "hr.recruitment.stage"
@ -54,7 +65,7 @@ class hr_recruitment_stage(osv.osv):
_columns = {
'name': fields.char('Name', size=64, required=True, translate=True),
'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of stages."),
'department_id':fields.many2one('hr.department', 'Department'),
'department_id':fields.many2one('hr.department', 'Department', help="Stages of the recruitment process may be different per department. If this stage is common to all departments, keep tempy this field."),
'requirements': fields.text('Requirements')
}
_defaults = {
@ -144,6 +155,8 @@ class hr_applicant(crm.crm_case, osv.osv):
'title_action': fields.char('Next Action', size=64),
'priority': fields.selection(AVAILABLE_PRIORITIES, 'Appreciation'),
'job_id': fields.many2one('hr.job', 'Applied Job'),
'salary_proposed_extra': fields.char('Proposed Salary Extra', size=100, help="Salary Proposed by the Organisation, 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_expected': fields.float('Expected Salary', help="Salary Expected by Applicant"),
'availability': fields.integer('Availability (Days)'),
@ -155,7 +168,8 @@ class hr_applicant(crm.crm_case, osv.osv):
'state': fields.selection(AVAILABLE_STATES, 'State', size=16, readonly=True),
'survey': fields.related('job_id', 'survey_id', type='many2one', relation='survey', string='Survey'),
'response': fields.integer("Response"),
'reference': fields.char('Reference', size=128),
'reference': fields.char('Refered By', size=128),
'source_id': fields.many2one('hr.recruitment.source', 'Source'),
'day_open': fields.function(_compute_day, string='Days to Open', \
multi='day_open', type="float", store=True),
'day_close': fields.function(_compute_day, string='Days to Close', \
@ -168,10 +182,10 @@ class hr_applicant(crm.crm_case, osv.osv):
_defaults = {
'active': lambda *a: 1,
'stage_id': _get_stage,
'user_id': lambda self, cr, uid, context: uid,
'email_from': crm.crm_case. _get_default_email,
'state': lambda *a: 'draft',
'priority': lambda *a: '',
'company_id': lambda s, cr, uid, c: s.pool.get('res.company')._company_default_get(cr, uid, 'crm.helpdesk', context=c),
'priority': lambda *a: crm.AVAILABLE_PRIORITIES[2][0],
}
@ -208,6 +222,8 @@ class hr_applicant(crm.crm_case, osv.osv):
stage_ids = stage_obj.search(cr, uid, ['|',('department_id','=',department),('department_id','=',False)], context=context)
if st and stage_ids.index(st):
self.write(cr, uid, [case.id], {'stage_id': stage_ids[stage_ids.index(st)-1]}, context=context)
else:
self.write(cr, uid, [case.id], {'stage_id': False}, context=context)
return True
def stage_next(self, cr, uid, ids, context=None):
@ -223,8 +239,14 @@ class hr_applicant(crm.crm_case, osv.osv):
department = (case.department_id.id or False)
st = case.stage_id.id or False
stage_ids = stage_obj.search(cr, uid, ['|',('department_id','=',department),('department_id','=',False)], context=context)
val = False
if st and len(stage_ids) != stage_ids.index(st)+1:
self.write(cr, uid, [case.id], {'stage_id': stage_ids[stage_ids.index(st)+1]}, context=context)
val = stage_ids[stage_ids.index(st)+1]
elif (not st) and stage_ids:
val = stage_ids[0]
else:
val = False
self.write(cr, uid, [case.id], {'stage_id': val}, context=context)
return True
def action_makeMeeting(self, cr, uid, ids, context=None):

View File

@ -3,6 +3,23 @@
<data noupdate="1">
<!-- HR Recruitment Source -->
<record model="hr.recruitment.source" id="source_linkedin">
<field name="name">LinkedIn</field>
</record>
<record model="hr.recruitment.source" id="source_monster">
<field name="name">Monster</field>
</record>
<record model="hr.recruitment.source" id="source_word">
<field name="name">Word of Mouth</field>
</record>
<record model="hr.recruitment.source" id="source_website_company">
<field name="name">Company Website</field>
</record>
<!-- CASE CATEGORY(categ_id) -->
<record model="crm.case.categ" id="categ_job1">
@ -21,17 +38,21 @@
<field name="name">Graduate</field>
<field name="sequence">1</field>
</record>
<record model="hr.recruitment.degree" id="degree_licenced">
<field name="name">Licenced</field>
<record model="hr.recruitment.degree" id="degree_bachelor">
<field name="name">Bachelor Degree</field>
<field name="sequence">2</field>
</record>
<record model="hr.recruitment.degree" id="degree_bac5">
<field name="name"> > Bac +5</field>
<record model="hr.recruitment.degree" id="degree_licenced">
<field name="name">Master Degree</field>
<field name="sequence">3</field>
</record>
<record model="hr.recruitment.degree" id="degree_bac5">
<field name="name">Doctoral Degree</field>
<field name="sequence">4</field>
</record>
<record model="hr.recruitment.stage" id="stage_job1">
<field name="name">Initial Jobs Demand</field>
<field name="name">Initial Qualification</field>
<field name="sequence">1</field>
<field name="object_id" search="[('model','=','hr.applicant')]" model="ir.model"/>
</record>

View File

@ -53,6 +53,7 @@
<button name="stage_next" string="Next" states="open,pending" type="object" icon="gtk-go-forward"/>
<field name="title_action" invisible="context.get('invisible_next_action', True)"/>
<field name="date_action" invisible="context.get('invisible_next_date', True)"/>
<field name="source_id" invisible="1"/>
<field name="survey" invisible="1"/>
<field name="response" invisible="1"/>
<field name="priority"/>
@ -81,7 +82,7 @@
<newline/>
<field name="department_id" widget="selection" on_change="onchange_department_id(department_id)"/>
<group colspan="2" col="4">
<field name="stage_id" domain="[('department_id','=',department_id)]"/>
<field name="stage_id" domain="['|',('department_id','=',department_id),('department_id','=',False)]"/>
<button name="stage_previous" string="" type="object" icon="gtk-go-back"/>
<button icon="gtk-go-forward" string="" name="stage_next" type="object"/>
</group>
@ -97,27 +98,30 @@
<page string="Job Info">
<group col="3" colspan="2">
<separator colspan="3" string="Contact"/>
<field name="partner_id" on_change="onchange_partner_id(partner_id, email_from)" attrs="{'readonly':[('state','not in','done')]}"/>
<field name="partner_id" on_change="onchange_partner_id(partner_id, email_from)"/>
<button string="Create Partner"
name="%(action_hr_recruitment_partner_create)d"
icon="gtk-index" type="action" attrs="{'readonly':['!',('partner_id','!=',False),('state','not in','done')]}" groups="base.group_partner_manager"/>
icon="gtk-index" type="action" attrs="{'readonly':[('partner_id','!=',False)]}" groups="base.group_partner_manager"/>
<newline/>
<field name="partner_address_id" on_change="onchange_partner_address_id(partner_address_id, email_from)" colspan="3" attrs="{'readonly':[('state','not in','done')]}"/>
<field name="email_from" colspan="3" attrs="{'readonly':[('state','not in','done')]}"/>
<field name="partner_phone" colspan="3" attrs="{'readonly':[('state','not in','done')]}"/>
<field name="partner_mobile" colspan="3" attrs="{'readonly':[('state','not in','done')]}"/>
<field name="email_from" colspan="3"/>
<field name="partner_phone" colspan="3"/>
<field name="partner_mobile" colspan="3"/>
</group>
<group col="2" colspan="2">
<separator colspan="2" string="Contract Data"/>
<field name="availability"/>
<group col="3" colspan="2">
<separator colspan="3" string="Contract Data"/>
<field name="availability" colspan="3"/>
<field name="salary_expected"/>
<field name="salary_expected_extra" nolabel="1"/>
<field name="salary_proposed"/>
<field name="salary_proposed_extra" nolabel="1"/>
</group>
<group col="2" colspan="2">
<separator colspan="2" string="Qualification"/>
<!-- <field name="type_id" domain="[('object_id.model', '=', 'hr.applicant')]"/>-->
<field name="type_id" widget="selection"/>
<field name="priority" string="Appreciation"/>
<field name="source_id"/>
<field name="reference"/>
</group>
<group col="2" colspan="2">
@ -222,6 +226,7 @@
help="All new and in progress jobs"
name="current"
/>
<separator orientation="vertical"/>
<filter icon="terp-document-new" string="New"
domain="[('state','=','draft')]"
help="All Initial Jobs"
@ -237,20 +242,14 @@
<separator orientation="vertical"/>
<filter icon="terp-gtk-jump-to-ltr" string="Next Actions"
context="{'invisible_next_action':False, 'invisible_next_date':False}"
domain="[]"
help="View Next Action and Date"/>
domain="[('date_action','&lt;&gt;',False)]"
help="Filter and view on next actions and date"/>
<separator orientation="vertical"/>
<field name="partner_name"/>
<field name="email_from"/>
<field name="partner_name" filter_domain="['|','|',('name','ilike',self),('partner_name','ilike',self),('email_from','ilike',self)]" string="Applicant"/>
<field name="job_id" widget="selection"/>
<field name="user_id">
<filter domain="[('user_id','=',False)]" help="Unassigned Recruitments" icon="terp-personal-" separator="1"/>
</field>
<field name="department_id" widget="selection" string="Department" context="{'invisible_department': False}">
<filter icon="terp-personal+" context="{'invisible_department': False}"
domain="[('department_id','=',context.get('department_id',False))]"
help="My Department"/>
</field>
<newline/>
<group expand="0" string="Group By..." colspan="11" col="20">
<filter string="Responsible" icon="terp-personal" domain="[]" context="{'group_by':'user_id'}"/>
@ -263,6 +262,7 @@
<filter string="Appreciation" icon="terp-face-plain" domain="[]" context="{'group_by':'priority'}"/>
<filter string="Stage" icon="terp-stage" domain="[]" context="{'group_by':'stage_id'}"/>
<filter string="State" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/>
<filter string="Source" icon="terp-face-plain" domain="[]" context="{'group_by':'source_id'}"/>
<separator orientation="vertical"/>
<filter string="Creation Date" icon="terp-go-month" domain="[]" context="{'group_by':'create_date'}"/>
</group>
@ -400,5 +400,40 @@
action="hr_recruitment_degree_action"
sequence="1"/>
<!-- Source Tree View -->
<record model="ir.ui.view" id="hr_recruitment_source_tree">
<field name="name">hr.recruitment.source.tree</field>
<field name="model">hr.recruitment.source</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Sources of Applicants">
<field name="name"/>
</tree>
</field>
</record>
<record model="ir.ui.view" id="hr_recruitment_source_form">
<field name="name">hr.recruitment.source.form</field>
<field name="model">hr.recruitment.source</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Sources of Applicants">
<field name="name"/>
</form>
</field>
</record>
<record id="hr_recruitment_source_action" model="ir.actions.act_window">
<field name="name">Sources of Applicants</field>
<field name="res_model">hr.recruitment.source</field>
<field name="view_type">form</field>
</record>
<menuitem
id="menu_hr_recruitment_source"
parent="menu_hr_recruitment_recruitment"
action="hr_recruitment_source_action"
sequence="1"/>
</data>
</openerp>

View File

@ -190,17 +190,17 @@ class project_issue(crm.crm_case, osv.osv):
select=True, help='Sales team to which Case belongs to.\
Define Responsible user and Email account for mail gateway.'),
'user_id': fields.related('project_id', 'user_id', type='many2one', relation='res.users', store=True, select=1, string='Responsible'),
'partner_id': fields.many2one('res.partner', 'Partner'),
'partner_id': fields.many2one('res.partner', 'Partner', select=1),
'partner_address_id': fields.many2one('res.partner.address', 'Partner Contact', \
domain="[('partner_id','=',partner_id)]"),
'company_id': fields.many2one('res.company', 'Company'),
'description': fields.text('Description'),
'state': fields.selection([('draft', 'Draft'), ('open', 'To Do'), ('cancel', 'Cancelled'), ('done', 'Closed'),('pending', 'Pending'), ], 'State', size=16, readonly=True,
'state': fields.selection([('draft', 'New'), ('open', 'To Do'), ('cancel', 'Cancelled'), ('done', 'Closed'),('pending', 'Pending'), ], 'State', size=16, readonly=True,
help='The state is set to \'Draft\', when a case is created.\
\nIf the case is in progress the state is set to \'Open\'.\
\nWhen the case is over, the state is set to \'Done\'.\
\nIf the case needs to be reviewed then the state is set to \'Pending\'.'),
'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.", select=1),
'email_cc': fields.char('Watchers Emails', size=256, help="These email addresses will be added to the CC field of all inbound and outbound emails for this record before being sent. Separate multiple email addresses with a comma"),
'date_open': fields.datetime('Opened', readonly=True,select=True),
# Project Issue fields
@ -211,7 +211,7 @@ class project_issue(crm.crm_case, osv.osv):
'categ_id': fields.many2one('crm.case.categ', 'Category', domain="[('object_id.model', '=', 'crm.project.bug')]"),
'priority': fields.selection(crm.AVAILABLE_PRIORITIES, 'Priority'),
'version_id': fields.many2one('project.issue.version', 'Version'),
'partner_name': fields.char("Employee's Name", size=64),
'partner_name': fields.char("Partner Name", size=64),
'partner_mobile': fields.char('Mobile', size=32),
'partner_phone': fields.char('Phone', size=32),
'type_id': fields.many2one ('project.task.type', 'Resolution', domain="[('project_ids', '=', project_id)]"),

View File

@ -90,7 +90,7 @@
<button name="case_close" string="Close" states="open,draft,pending" type="object" icon="terp-dialog-close"/>
<button name="case_pending" string="Pending" states="draft,open" type="object" icon="gtk-media-pause"/>
<button name="case_escalate" string="Escalate" states="open,draft,pending" type="object" icon="gtk-go-up"/>
<button name="case_reset" string="Reset to Draft" states="done,cancel" type="object" icon="gtk-convert"/>
<button name="case_reset" string="Reset to New" states="done,cancel" type="object" icon="gtk-convert"/>
</group>
</page>
<page string="Communication &amp; History" groups="base.group_extended">
@ -199,7 +199,7 @@
<button name="case_open" string="Open" states="draft,pending" type="object" icon="gtk-go-forward" help="To Do"/>
<button name="case_pending" string="Pending" states="draft,open" type="object" icon="gtk-media-pause"/>
<button name="case_escalate" string="Escalate" states="open,draft,pending" type="object" icon="gtk-go-up"/>
<button name="case_reset" string="Reset to Draft" states="done,cancel" type="object" icon="gtk-convert"/>
<button name="case_reset" string="Reset to New" states="done,cancel" type="object" icon="gtk-convert"/>
<field name="categ_id" invisible="1"/>
</tree>
</field>
@ -212,19 +212,17 @@
<field name="arch" type="xml">
<search string="Issue Tracker Search">
<group>
<filter string="Current" name="current" domain="[('state','in',('open','draft'))]" help="Draft and To Do" icon="terp-check"/>
<filter string="Current" name="current" domain="[('state','in',('open','draft','pending'))]" help="New, pending and to do" icon="terp-check"/>
<separator orientation="vertical"/>
<filter string="New" icon="terp-document-new" domain="[('state','=','draft')]" help="New Issues" icon="terp-camera_test"/>
<filter string="To Do" domain="[('state','=','open')]" help="To Do Issues" icon="terp-camera_test"/>
<filter string="Pending" domain="[('state','=','pending')]" help="Pending Issues" icon="terp-gtk-media-pause"/>
<separator orientation="vertical"/>
<filter icon="terp-go-today" string="Today" separator="1" domain="[('create_date','&gt;=',time.strftime('%%Y-%%m-%%d')),('create_date','&lt;', (datetime.date.today() + datetime.timedelta (days = 1)).strftime('%%Y-%%m-%%d'))]" help="Today's bugs" />
<separator orientation="vertical"/>
<field name="name"/>
<field name="partner_id" groups="base.group_extended"/>
<field name="name" string="Issue / Partner" filter_domain="['|', '|', ('partner_id','ilike',self), ('email_from','ilike',self), ('name','ilike',self)]"/>
<field name="assigned_to">
<filter domain="[('assigned_to','=',False)]" help="Unassigned Issues" icon="terp-personal-" separator="1"/>
</field>
<field name="project_id"/>
<field name="version_id" widget="selection"/>
<field name="id"/>
</group>
<newline/>
@ -293,7 +291,7 @@
<button name="case_open" string="Open" states="draft,pending" type="object" icon="gtk-go-forward"/>
<button name="case_pending" string="Pending" states="draft,open" type="object" icon="gtk-media-pause"/>
<button name="case_escalate" string="Escalate" states="open,draft,pending" type="object" icon="gtk-go-up"/>
<button name="case_reset" string="Reset to Draft" states="done,cancel" type="object" icon="gtk-convert"/>
<button name="case_reset" string="Reset to New" states="done,cancel" type="object" icon="gtk-convert"/>
</tree>
</field>
</record>