[IMP] crm, sale_crm, crm_project : Major Improvement on CRM base on https://bugs.launchpad.net/openobject-addons/+bug/499366

lp bug: https://launchpad.net/bugs/499366 fixed

bzr revid: hmo@tinyerp.com-20091231125720-ywnu9pf4f90dfvth
This commit is contained in:
Harry (Open ERP) 2009-12-31 18:27:20 +05:30
parent 4fa0c4955d
commit 77820727d3
61 changed files with 2334 additions and 1328 deletions

View File

@ -60,23 +60,26 @@ between mails and Open ERP.""",
'crm_phonecall_data.xml',
],
'update_xml': [
'crm_wizard.xml',
'crm_configuration_wizard.xml',
'crm_wizard.xml',
'crm_view.xml',
'crm_config_view.xml',
'crm_job_wizard.xml',
'crm_jobs_view.xml',
'crm_jobs_menu.xml',
'crm_lead_wizard.xml',
'crm_lead_view.xml',
'crm_lead_menu.xml',
'crm_meeting_wizard.xml',
'crm_meeting_view.xml',
'crm_meeting_menu.xml',
'crm_opportunity_wizard.xml',
'crm_opportunity_view.xml',
'crm_opportunity_menu.xml',
'crm_fund_view.xml',
'crm_fund_menu.xml',
'crm_claims_view.xml',
'crm_claims_menu.xml',
'crm_phonecall_wizard.xml',
'crm_phonecall_view.xml',
'crm_phonecall_menu.xml',
'crm_report_view.xml',

View File

@ -45,6 +45,8 @@ class crm_claim(osv.osv):
def onchange_case_id(self, cr, uid, ids, *args, **argv):
return self._map_ids('onchange_case_id',cr,uid,ids,*args,**argv)
def stage_next(self, cr, uid, ids, *args, **argv):
return self._map_ids('stage_next',cr,uid,ids,*args,**argv)
def onchange_partner_id(self, cr, uid, ids, *args, **argv):
return self._map_ids('onchange_partner_id',cr,uid,ids,*args,**argv)
def onchange_partner_address_id(self, cr, uid, ids, *args, **argv):
@ -64,3 +66,57 @@ class crm_claim(osv.osv):
def case_pending(self,cr, uid, ids, *args, **argv):
return self._map_ids('case_pending',cr,uid,ids,*args,**argv)
crm_claim()
class crm_claim_assign_wizard(osv.osv_memory):
_name = 'crm.claim.assign_wizard'
_columns = {
'section_id': fields.many2one('crm.case.section', 'Section', required=True),
'user_id': fields.many2one('res.users', 'Responsible'),
}
def _get_default_section(self, cr, uid, context):
case_id = context.get('active_id',False)
if not case_id:
return False
case_obj = self.pool.get('crm.claim')
case = case_obj.read(cr, uid, case_id, ['state','section_id'])
if case['state'] in ('done'):
raise osv.except_osv(_('Error !'), _('You can not assign Closed Case.'))
return case['section_id']
_defaults = {
'section_id': _get_default_section
}
def action_create(self, cr, uid, ids, context=None):
case_obj = self.pool.get('crm.claim')
case_id = context.get('active_id',[])
res = self.read(cr, uid, ids)[0]
case = case_obj.browse(cr, uid, case_id)
if case.state in ('done'):
raise osv.except_osv(_('Error !'), _('You can not assign Closed Case.'))
new_case_id = case_obj.copy(cr, uid, case_id, default=
{
'section_id':res.get('section_id',False),
'user_id':res.get('user_id',False),
'case_id' : case.inherit_case_id.id
}, context=context)
case_obj.case_close(cr, uid, [case_id])
data_obj = self.pool.get('ir.model.data')
result = data_obj._get_id(cr, uid, 'crm', 'view_crm_case_claims_filter')
search_view = data_obj.read(cr, uid, result, ['res_id'])
value = {
'name': _('Claims'),
'view_type': 'form',
'view_mode': 'form,tree',
'res_model': 'crm.claim',
'res_id': int(new_case_id),
'type': 'ir.actions.act_window',
'search_view_id': search_view['res_id']
}
return value
crm_claim_assign_wizard()

View File

@ -4,7 +4,7 @@
<!--
((((((((((( Demo Cases )))))))))))
-->
<record id="crm_case_claim01" model="crm.case">
<record id="crm_case_claim01" model="crm.claim">
<field name="partner_address_id" ref="base.res_partner_address_15"/>
<field eval="time.strftime('%Y-%m-04 10:45:36')" name="date"/>
<field name="category2_id" ref="crm.category_claim1"/>
@ -20,7 +20,7 @@
<field name="stage_id" ref="crm.stage_claim1"/>
<field eval="&quot;(769) 703-274&quot;" name="partner_phone"/>
</record>
<record id="crm_case_claim02" model="crm.case">
<record id="crm_case_claim02" model="crm.claim">
<field name="partner_address_id" ref="base.res_partner_address_6"/>
<field eval="time.strftime('%Y-%m-11 11:19:25')" name="date"/>
<field name="category2_id" ref="crm.category_claim2"/>
@ -36,7 +36,7 @@
<field name="stage_id" ref="crm.stage_claim5"/>
<field eval="&quot;(956) 293-2595&quot;" name="partner_phone"/>
</record>
<record id="crm_case_claim03" model="crm.case">
<record id="crm_case_claim03" model="crm.claim">
<field name="partner_address_id" ref="base.res_partner_address_2"/>
<field eval="time.strftime('%Y-%m-15 17:44:12')" name="date"/>
<field name="category2_id" ref="crm.category_claim1"/>
@ -53,7 +53,7 @@
<field eval="&quot;(079) 681-2139&quot;" name="partner_phone"/>
<field eval="&quot;contact@tecsas.fr&quot;" name="email_from"/>
</record>
<record id="crm_case_claim04" model="crm.case">
<record id="crm_case_claim04" model="crm.claim">
<field eval="time.strftime('%Y-%m-21 14:10:23')" name="date"/>
<field name="category2_id" ref="crm.category_claim2"/>
<field name="partner_id" ref="base.res_partner_tinyatwork"/>
@ -68,7 +68,7 @@
<field name="stage_id" ref="crm.stage_claim5"/>
<field eval="&quot;(514) 698-4118&quot;" name="partner_phone"/>
</record>
<record id="crm_case_claim05" model="crm.case">
<record id="crm_case_claim05" model="crm.claim">
<field name="partner_address_id" ref="base.res_partner_address_10"/>
<field eval="time.strftime('%Y-%m-28 16:20:43')" name="date"/>
<field name="category2_id" ref="crm.category_claim1"/>
@ -84,7 +84,7 @@
<field name="stage_id" ref="crm.stage_claim3"/>
<field eval="&quot;(855) 924-4364&quot;" name="partner_phone"/>
</record>
<record id="crm_case_claim06" model="crm.case">
<record id="crm_case_claim06" model="crm.claim">
<field name="partner_address_id" ref="base.res_partner_address_1"/>
<field eval="1" name="active"/>
<field name="category2_id" ref="crm.category_claim2"/>
@ -101,7 +101,7 @@
<field eval="&quot;(373) 907-1009&quot;" name="partner_phone"/>
<field eval="&quot;info@opensides.be&quot;" name="email_from"/>
</record>
<record id="crm_case_claims07" model="crm.case">
<record id="crm_case_claims07" model="crm.claim">
<field eval="1" name="active"/>
<field name="category2_id" ref="crm.category_claim1"/>
<field name="partner_id" ref="base.res_partner_seagate"/>
@ -117,4 +117,4 @@
<field eval="&quot;(282) 603-7489&quot;" name="partner_phone"/>
</record>
</data>
</openerp>
</openerp>

View File

@ -6,11 +6,10 @@
######################## CLAIMS (menu) ###########################
<record model="ir.actions.act_window" id="crm_case_categ_claim0">
<field name="name">All Claims</field>
<field name="res_model">crm.case</field>
<field name="res_model">crm.claim</field>
<field name="view_type">form</field>
<field name="view_mode">tree,calendar</field>
<field name="view_id" ref="crm_case_claims_tree_view"/>
<field name="domain" eval="'[(\'section_id\',\'=\','+str(ref('section_support_claims'))+')]'"/>
<field name="view_id" ref="crm_case_claims_tree_view"/>
<field name="context" eval="{'default_state':'open'}"/>
<field name="search_view_id" ref="crm.view_crm_case_claims_filter"/>
</record>

View File

@ -5,9 +5,37 @@
# Claims
# ------------------------------------------------------
<record model="ir.ui.view" id="crm_claim_assign_wizard_form">
<field name="name">crm.claim.assign_wizard.form</field>
<field name="model">crm.claim.assign_wizard</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="To Assign">
<group col="2">
<field name="section_id" select="1" widget="selection"/>
<field name="user_id"/>
</group>
<newline/>
<separator colspan="4"/>
<group col="2" colspan="2">
<button icon="gtk-cancel" special="cancel" string="Cancel"/>
<button icon="gtk-execute" name="action_create" string="Assign" type="object"/>
</group>
</form>
</field>
</record>
<record id="action_crm_claim_assign_wizard" model="ir.actions.act_window">
<field name="name">To Assign</field>
<field name="res_model">crm.claim.assign_wizard</field>
<field name="view_type">form</field>
<field name="view_id" ref="crm_claim_assign_wizard_form"/>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
<record model="ir.ui.view" id="crm_case_claims_tree_view">
<field name="name">CRM - Claims Tree</field>
<field name="model">crm.case</field>
<field name="model">crm.claim</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Claims" colors="red:state=='open';black:state in ('draft', 'cancel','done','pending')">
@ -24,7 +52,7 @@
<record model="ir.ui.view" id="crm_case_claims_form_view">
<field name="name">CRM - Claims Form</field>
<field name="model">crm.case</field>
<field name="model">crm.claim</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Claims">
@ -43,7 +71,7 @@
</group>
<group colspan="2">
<field name="case_id" select="1"/>
<button string="Assign" name="%(crm_generic_wizard_act)d" type="action" />
<button string="Assign" name="%(action_crm_claim_assign_wizard)d" type="action" />
</group>
</group>
<notebook>
@ -139,7 +167,7 @@
<record model="ir.ui.view" id="crm_case_claims_calendar_view">
<field name="name">CRM - Claims Calendar</field>
<field name="model">crm.case</field>
<field name="model">crm.claim</field>
<field name="type">calendar</field>
<field name="priority" eval="2"/>
<field name="arch" type="xml">
@ -152,8 +180,8 @@
</record>
<record id="view_crm_case_claims_filter" model="ir.ui.view">
<field name="name">crm.case.claims.select</field>
<field name="model">crm.case</field>
<field name="name">CRM - Claims Search</field>
<field name="model">crm.claim</field>
<field name="type">search</field>
<field name="arch" type="xml">
<search string="Search Claims">

View File

@ -186,46 +186,5 @@ class crm_menu_config_wizard(osv.osv_memory):
}
crm_menu_config_wizard()
class crm_generic_wizard(osv.osv_memory):
_name = 'crm.generic_wizard'
_columns = {
'section_id': fields.many2one('crm.case.section', 'Section', required=True),
'user_id': fields.many2one('res.users', 'Responsible'),
}
def _get_default_section(self, cr, uid, context):
case_id = context.get('active_id',False)
if not case_id:
return False
case_obj = self.pool.get('crm.case')
case = case_obj.read(cr, uid, case_id, ['state','section_id'])
if case['state'] in ('done'):
raise osv.except_osv(_('Error !'), _('You can not assign Closed Case.'))
return case['section_id']
_defaults = {
'section_id': _get_default_section
}
def action_create(self, cr, uid, ids, context=None):
case_obj = self.pool.get('crm.case')
case_id = context.get('active_id',[])
res = self.read(cr, uid, ids)[0]
case = case_obj.read(cr, uid, case_id, ['state'])
if case['state'] in ('done'):
raise osv.except_osv(_('Error !'), _('You can not assign Closed Case.'))
new_case_id = case_obj.copy(cr, uid, case_id, default=
{
'section_id':res.get('section_id',False),
'user_id':res.get('user_id',False)
}, context=context)
case_obj.write(cr, uid, case_id, {'case_id':new_case_id}, context=context)
case_obj.case_close(cr, uid, [case_id])
return {}
crm_generic_wizard()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -62,36 +62,8 @@
<field name="view_type">form</field>
<field name="view_id" ref="crm_case_stage_tree"/>
</record>
<menuitem action="crm_case_stage_act" id="menu_crm_case_stage_act" parent="crm.next_id_51"/>
<record model="ir.ui.view" id="crm_generic_wizard">
<field name="name">crm.generic_wizard.form</field>
<field name="model">crm.generic_wizard</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Generic Wizard">
<group col="2">
<field name="section_id" select="1" widget="selection"/>
<field name="user_id"/>
</group>
<newline/>
<separator colspan="4"/>
<group col="2" colspan="2">
<button icon="gtk-cancel" special="cancel" string="Cancel"/>
<button icon="gtk-execute" name="action_create" string="Assign" type="object"/>
</group>
</form>
</field>
</record>
<record id="crm_generic_wizard_act" model="ir.actions.act_window">
<field name="name">Generic Wizard</field>
<field name="res_model">crm.generic_wizard</field>
<field name="view_type">form</field>
<field name="view_id" ref="crm_generic_wizard"/>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
<menuitem action="crm_case_stage_act" id="menu_crm_case_stage_act" parent="crm.next_id_51"/>
</data>

View File

@ -1,63 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<wizard
string="History of Events"
name="crm.case.history.events"
model="crm.case"
id="wizard_case_history_event"
keyword="client_action_relate"
/>
<wizard
id="wizard_crm_partner_create"
keyword="client_action_multi"
model="crm.case"
name="crm.case.partner_create"
multi="True"
string="Create Partner"/>
<wizard
id="wizard_crm_meeting"
keyword="client_action_multi"
model="crm.case"
name="crm.case.meeting"
multi="True"
string="Schedule Meeting"/>
<wizard
id="wizard_crm_opportunity_set"
keyword="client_action_multi"
model="crm.case"
name="crm.case.opportunity_set"
multi="True"
string="Convert To Opportunity"/>
<wizard
id="wizard_partner_create_opportunity"
keyword="client_action_multi"
model="res.partner"
name="crm.case.partner.opportunity_create"
menu="False"
string="Create Opportunity"/>
<wizard
id="wizard_crm_reschedule_phone_call"
keyword="client_action_multi"
model="crm.case"
name="crm.case.reschedule_phone_call"
multi="True"
string="Schedule Phone Call" />
<wizard
id="wizard_partner_create_opportunity1"
keyword="client_action_relate"
model="res.partner"
name="crm.case.partner.opportunity_create"
string="Create Opportunity"/>
</data>
</openerp>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" ?>
<openerp>
<data noupdate="1">
<record id="crm_case_helpingstreetchildren0" model="crm.case">
<record id="crm_case_helpingstreetchildren0" model="crm.fundraising">
<field eval="50" name="probability"/>
<field name="partner_address_id" ref="base.res_partner_address_1"/>
<field eval="1" name="active"/>
@ -20,7 +20,7 @@
</record>
</data>
<data noupdate="1">
<record id="crm_case_helpingearthquakevictims0" model="crm.case">
<record id="crm_case_helpingearthquakevictims0" model="crm.fundraising">
<field eval="80" name="probability"/>
<field name="partner_address_id" ref="base.main_address"/>
<field eval="1" name="active"/>
@ -38,7 +38,7 @@
</record>
</data>
<data noupdate="1">
<record id="crm_case_donatingbookstoschoollibraries0" model="crm.case">
<record id="crm_case_donatingbookstoschoollibraries0" model="crm.fundraising">
<field name="partner_address_id" ref="base.res_partner_address_zen"/>
<field eval="1" name="active"/>
<field name="category2_id" ref="categ2_fund1"/>
@ -55,7 +55,7 @@
</record>
</data>
<data noupdate="1">
<record id="crm_case_renovatinggovernmentschools0" model="crm.case">
<record id="crm_case_renovatinggovernmentschools0" model="crm.fundraising">
<field name="partner_address_id" ref="base.res_partner_address_7"/>
<field eval="1" name="active"/>
<field name="category2_id" ref="categ2_fund2"/>
@ -73,7 +73,7 @@
</record>
</data>
<data noupdate="1">
<record id="crm_case_donatingambulancestohospitals0" model="crm.case">
<record id="crm_case_donatingambulancestohospitals0" model="crm.fundraising">
<field name="partner_address_id" ref="base.res_partner_address_13"/>
<field eval="1" name="active"/>
<field name="category2_id" ref="categ2_fund4"/>
@ -90,7 +90,7 @@
</record>
</data>
<data noupdate="1">
<record id="crm_case_donatinghospitalequipments0" model="crm.case">
<record id="crm_case_donatinghospitalequipments0" model="crm.fundraising">
<field name="partner_address_id" ref="base.res_partner_address_2"/>
<field eval="1" name="active"/>
<field name="category2_id" ref="categ2_fund3"/>
@ -108,7 +108,7 @@
</record>
</data>
<data noupdate="1">
<record id="crm_case_encouragingarts0" model="crm.case">
<record id="crm_case_encouragingarts0" model="crm.fundraising">
<field name="partner_address_id" ref="base.res_partner_address_14"/>
<field eval="1" name="active"/>
<field name="category2_id" ref="categ2_fund2"/>
@ -125,7 +125,7 @@
</record>
</data>
<data noupdate="1">
<record id="crm_case_promotingculturalprogramsandpreservingdyingartforms0" model="crm.case">
<record id="crm_case_promotingculturalprogramsandpreservingdyingartforms0" model="crm.fundraising">
<field eval="10" name="probability"/>
<field name="partner_address_id" ref="base.res_partner_address_1"/>
<field eval="1" name="active"/>

View File

@ -4,10 +4,9 @@
<!-- MENU -->
<record model="ir.actions.act_window" id="crm_case_category_act_fund_all1">
<field name="name">All Funds</field>
<field name="res_model">crm.case</field>
<field name="res_model">crm.fundraising</field>
<field name="view_mode">tree,form,graph</field>
<field name="view_id" ref="crm.crm_case_tree_view_fund"/>
<field name="domain" eval="'[(\'section_id\',\'=\','+str(section_support4)+')]'"/>
<field name="view_id" ref="crm.crm_case_tree_view_fund"/>
<field name="context" eval="{'default_state':'open'}"/>
<field name="search_view_id" ref="crm.view_crm_case_fund_filter"/>
</record>

View File

@ -7,7 +7,7 @@
# ------------------------------------------------------
<record model="ir.ui.view" id="crm_case_tree_view_fund">
<field name="name">CRM - Funds Tree</field>
<field name="model">crm.case</field>
<field name="model">crm.fundraising</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Funds Tree" colors="red:state=='open';black:state in ('draft', 'cancel','done','pending')">
@ -30,7 +30,7 @@
</record>
<record model="ir.ui.view" id="crm_case_form_view_fund">
<field name="name">CRM - Funds Form</field>
<field name="model">crm.case</field>
<field name="model">crm.fundraising</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Funds Form">
@ -127,7 +127,7 @@
</record>
<record model="ir.ui.view" id="crm_case_calendar_view_fund">
<field name="name">CRM - Funds Calendar</field>
<field name="model">crm.case</field>
<field name="model">crm.fundraising</field>
<field name="type">calendar</field>
<field name="priority" eval="2"/>
<field name="arch" type="xml">
@ -139,7 +139,7 @@
</record>
<record model="ir.ui.view" id="crm_case_graph_view_fund">
<field name="name">CRM - Funds Graph</field>
<field name="model">crm.case</field>
<field name="model">crm.fundraising</field>
<field name="type">graph</field>
<field name="arch" type="xml">
<graph string="Funds by Categories" type="bar" orientation="horizontal">
@ -151,8 +151,8 @@
</record>
<record id="view_crm_case_fund_filter" model="ir.ui.view">
<field name="name">crm.case.fund.select</field>
<field name="model">crm.case</field>
<field name="name">CRM - Funds Search</field>
<field name="model">crm.fundraising</field>
<field name="type">search</field>
<field name="arch" type="xml">
<search string="Search Funds">

View File

@ -71,3 +71,43 @@ class crm_helpdesk(osv.osv):
crm_helpdesk()
class crm_helpdesk_assign_wizard(osv.osv_memory):
_name = 'crm.helpdesk.assign_wizard'
_columns = {
'section_id': fields.many2one('crm.case.section', 'Section', required=True),
'user_id': fields.many2one('res.users', 'Responsible'),
}
def _get_default_section(self, cr, uid, context):
case_id = context.get('active_id',False)
if not case_id:
return False
case_obj = self.pool.get('crm.helpdesk')
case = case_obj.read(cr, uid, case_id, ['state','section_id'])
if case['state'] in ('done'):
raise osv.except_osv(_('Error !'), _('You can not assign Closed Case.'))
return case['section_id']
_defaults = {
'section_id': _get_default_section
}
def action_create(self, cr, uid, ids, context=None):
case_obj = self.pool.get('crm.helpdesk')
case_id = context.get('active_id',[])
res = self.read(cr, uid, ids)[0]
case = case_obj.read(cr, uid, case_id, ['state'])
if case['state'] in ('done'):
raise osv.except_osv(_('Error !'), _('You can not assign Closed Case.'))
new_case_id = case_obj.copy(cr, uid, case_id, default=
{
'section_id':res.get('section_id',False),
'user_id':res.get('user_id',False)
}, context=context)
case_obj.write(cr, uid, case_id, {'case_id':new_case_id}, context=context)
case_obj.case_close(cr, uid, [case_id])
return {}
crm_helpdesk_assign_wizard()

View File

@ -6,6 +6,34 @@
# Helpdesk Support
# ------------------------------------------------------
<record model="ir.ui.view" id="crm_helpdesk_assign_wizard_form">
<field name="name">crm.helpdesk.assign_wizard.form</field>
<field name="model">crm.helpdesk.assign_wizard</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="To Assign">
<group col="2">
<field name="section_id" select="1" widget="selection"/>
<field name="user_id"/>
</group>
<newline/>
<separator colspan="4"/>
<group col="2" colspan="2">
<button icon="gtk-cancel" special="cancel" string="Cancel"/>
<button icon="gtk-execute" name="action_create" string="Assign" type="object"/>
</group>
</form>
</field>
</record>
<record id="action_crm_helpdesk_assign_wizard" model="ir.actions.act_window">
<field name="name">To Assign</field>
<field name="res_model">crm.opportunity.assign_wizard</field>
<field name="view_type">form</field>
<field name="view_id" ref="crm_helpdesk_assign_wizard_form"/>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
<record model="ir.ui.view" id="crm_case_form_view_helpdesk">
<field name="name">CRM - Helpdesk Support Form</field>
<field name="model">crm.case</field>
@ -20,7 +48,7 @@
<field name="priority"/>
<group colspan="2">
<field name="case_id" select="1"/>
<button string="Assign" name="%(crm_generic_wizard_act)d" type="action" />
<button string="Assign" name="%(action_crm_helpdesk_assign_wizard)d" type="action" />
</group>
</group>
<notebook colspan="4">

View File

@ -50,6 +50,8 @@ class crm_job(osv.osv):
def onchange_case_id(self, cr, uid, ids, *args, **argv):
return self._map_ids('onchange_case_id',cr,uid,ids,*args,**argv)
def stage_next(self, cr, uid, ids, *args, **argv):
return self._map_ids('stage_next',cr,uid,ids,*args,**argv)
def onchange_partner_id(self, cr, uid, ids, *args, **argv):
return self._map_ids('onchange_partner_id',cr,uid,ids,*args,**argv)
def onchange_partner_address_id(self, cr, uid, ids, *args, **argv):
@ -64,4 +66,4 @@ class crm_job(osv.osv):
return self._map_ids('case_cancel',cr,uid,ids,*args,**argv)
def case_reset(self,cr, uid, ids, *args, **argv):
return self._map_ids('case_reset',cr,uid,ids,*args,**argv)
crm_job()
crm_job()

View File

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<wizard
id="wizard_crm_job_reschedule_phone_call"
keyword="client_action_multi"
model="crm.job"
name="crm.job.reschedule_phone_call"
multi="True"
string="Schedule Phone Call" />
<wizard
id="wizard_crm_job_meeting_set"
keyword="client_action_multi"
model="crm.job"
name="crm.job.meeting_set"
multi="True"
string="Schedule Meeting"/>
<wizard
id="wizard_crm_job_partner_create"
keyword="client_action_multi"
model="crm.job"
name="crm.job.partner_create"
multi="True"
string="Create Partner"/>
</data>
</openerp>

View File

@ -6,7 +6,7 @@
-->
<!--For Jobs Requests-->
<record id="crm_case_salesman0" model="crm.case">
<record id="crm_case_salesman0" model="crm.job">
<field eval="time.strftime('%Y-%m-01 10:35:50')" name="date"/>
<field eval="time.strftime('%Y-%m-03')" name="date_deadline"/>
<field name="category2_id" ref="crm.category_job1"/>
@ -25,7 +25,7 @@
<field eval="&quot;Salesman&quot;" name="name"/>
<field eval="&quot;1236547890&quot;" name="partner_phone"/>
</record>
<record id="crm_case_traineemca0" model="crm.case">
<record id="crm_case_traineemca0" model="crm.job">
<field model="res.partner.canal" name="canal_id" search="[('name','=','E-mail')]"/>
<field name="partner_address_id" ref="base.res_partner_address_14"/>
<field name="som" ref="base.som_fury"/>
@ -47,7 +47,7 @@
<field eval="time.strftime('%Y-%m-15')" name="date_deadline"/>
<field eval="&quot;6633225&quot;" name="partner_phone"/>
</record>
<record id="crm_case_fresher0" model="crm.case">
<record id="crm_case_fresher0" model="crm.job">
<field model="res.partner.canal" name="canal_id" search="[('name','=','direct')]"/>
<field name="som" ref="base.som_happy"/>
<field eval="time.strftime('%Y-%m-15 16:10:00')" name="date"/>
@ -67,7 +67,7 @@
<field eval="&quot;Fresher&quot;" name="name"/>
<field eval="&quot;999666735&quot;" name="partner_phone"/>
</record>
<record id="crm_case_yrsexperienceinphp0" model="crm.case">
<record id="crm_case_yrsexperienceinphp0" model="crm.job">
<field eval="time.strftime('%Y-%m-25 16:25:52')" name="date"/>
<field eval="time.strftime('%Y-%m-28')" name="date_deadline"/>
<field name="categ_id" ref="crm.categ_job2"/>
@ -84,7 +84,7 @@
<field name="stage_id" ref="crm.stage_job6"/>
<field eval="&quot;More than 5 yrs Experience in PHP&quot;" name="name"/>
</record>
<record id="crm_case_marketingjob0" model="crm.case">
<record id="crm_case_marketingjob0" model="crm.job">
<field eval="time.strftime('%Y-%m-26 17:15:32')" name="date"/>
<field eval="time.strftime('%Y-%m-28')" name="date_deadline"/>
<field name="category2_id" ref="crm.category_job2"/>
@ -103,7 +103,7 @@
<field eval="&quot;Marketing Job&quot;" name="name"/>
<field eval="&quot;33968745&quot;" name="partner_phone"/>
</record>
<record id="crm_case_financejob0" model="crm.case">
<record id="crm_case_financejob0" model="crm.job">
<field eval="time.strftime('%Y-%m-26 17:39:42')" name="date"/>
<field eval="time.strftime('%Y-%m-28')" name="date_deadline"/>
<field name="category2_id" ref="crm.category_job2"/>
@ -122,7 +122,7 @@
<field eval="&quot;Finance Job&quot;" name="name"/>
<field eval="&quot;33968745&quot;" name="partner_phone"/>
</record>
<record id="crm_case_traineemca1" model="crm.case">
<record id="crm_case_traineemca1" model="crm.job">
<field model="res.partner.canal" name="canal_id" search="[('name','=','E-mail')]"/>
<field name="partner_address_id" ref="base.res_partner_address_14"/>
<field name="som" ref="base.som_fury"/>

View File

@ -6,10 +6,9 @@
######################## JOB OPPORTUNITIES (menu) ###########################
<record model="ir.actions.act_window" id="crm_case_categ0_act_job">
<field name="name">All Jobs Requests</field>
<field name="res_model">crm.case</field>
<field name="res_model">crm.job</field>
<field name="view_mode">tree,calendar,form,graph</field>
<field name="view_id" ref="crm_case_tree_view_job"/>
<field name="domain" eval="'[(\'section_id\',\'=\','+str(section_support0)+')]'"/>
<field name="view_id" ref="crm_case_tree_view_job"/>
<field name="context" eval="{'default_state':'open'}"/>
<field name="search_view_id" ref="crm.view_crm_case_jobs_filter"/>
</record>

View File

@ -7,7 +7,7 @@
<record model="ir.ui.view" id="crm_case_tree_view_job">
<field name="name">CRM - Jobs Requests Tree</field>
<field name="model">crm.case</field>
<field name="model">crm.job</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Jobs - Recruitment Tree" colors="red:state=='open';black:state in ('draft', 'cancel','done','pending')">
@ -32,7 +32,7 @@
<record model="ir.ui.view" id="crm_case_form_view_job">
<field name="name">CRM - Jobs Requests Form</field>
<field name="model">crm.case</field>
<field name="model">crm.job</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Jobs - Recruitment Form">
@ -41,7 +41,7 @@
<field name="section_id" colspan="1" widget="selection"/>
<field name="user_id" string="Responsible" select="2"/>
<button string="Schedule a Phone Call"
name="%(wizard_crm_reschedule_phone_call)d" icon="gtk-redo" type="action" />
name="%(wizard_crm_job_reschedule_phone_call)d" icon="gtk-redo" type="action" />
<newline/>
<label string="Stage: " align="1.0"/>
<group colspan="1" col="2">
@ -50,7 +50,7 @@
</group>
<field name="date" string="Next Interview"/>
<field name="duration" widget="float_time"/>
<button name="set_meeting" string="Schedule Meeting" icon="terp-crm"/>
<button name="%(wizard_crm_job_meeting_set)d" string="Schedule Meeting" icon="terp-crm" type="action"/>
</group>
<notebook colspan="4">
<page string="Job Info">
@ -61,11 +61,15 @@
<field name="partner_mobile"/>
<field name="email_from" string="Candidate Email"/>
<newline/>
<group col="6" colspan="4">
<field name="partner_id" on_change="onchange_partner_id(partner_id, email_from)" colspan="2"/>
<button name="set_partner" string="Convert to Partner" icon="terp-partner"/>
<field name="partner_address_id" string="Contact" on_change="onchange_partner_address_id(partner_address_id, email_from)" colspan="1"/>
<group colspan="2" col="3">
<field name="partner_id" on_change="onchange_partner_id(partner_id, email_from)" />
<button string="Convert to Partner"
icon="terp-partner" name="%(wizard_crm_job_partner_create)d"
type="action" attrs="{'invisible':[('partner_id','!=',False)]}"
/>
</group>
<field name="partner_address_id" string="Contact" on_change="onchange_partner_address_id(partner_address_id, email_from)" colspan="1"/>
<newline/>
<separator colspan="4" string="Contract Data"/>
<field name="probability" string="Availability (weeks)"/>
<newline/>
@ -147,7 +151,7 @@
<record model="ir.ui.view" id="crm_case_calendar_view_job">
<field name="name">CRM - Jobs Requests Calendar</field>
<field name="model">crm.case</field>
<field name="model">crm.job</field>
<field name="type">calendar</field>
<field name="priority" eval="2"/>
<field name="arch" type="xml">
@ -160,33 +164,33 @@
</record>
<record id="view_crm_case_jobs_filter" model="ir.ui.view">
<field name="name">crm.case.jobs.select</field>
<field name="model">crm.case</field>
<field name="name">CRM - Jobs Requests Search</field>
<field name="model">crm.job</field>
<field name="type">search</field>
<field name="arch" type="xml">
<search string="Search Jobs">
<group col="7" colspan="1">
<filter icon="gtk-home" string=" Today "
separator="1"
domain="[('date::date','=',time.strftime('%%Y-%%m-%%d'))]"
domain="[('date','=',time.strftime('%%Y-%%m-%%d'))]"
help="Todays's Jobs"
/>
<filter icon="gtk-media-rewind"
string=" 7 Days " separator="1"
domain="[('date::date','&lt;', time.strftime('%%Y-%%m-%%d')), ('date::date','&gt;=',(datetime.date.today()-datetime.timedelta(days=7)).strftime('%%Y-%%m-%%d'))]"
domain="[('date','&lt;', time.strftime('%%Y-%%m-%%d')), ('date','&gt;=',(datetime.date.today()-datetime.timedelta(days=7)).strftime('%%Y-%%m-%%d'))]"
help="Jobs during last 7 days"
/>
<separator orientation="vertical"/>
<filter icon="gtk-new" string="New Jobs"
domain="[('section_id.name','=','Jobs'),('stage_id.name','=','Initial Jobs Demand')]"
domain="[('stage_id.name','=','Initial Jobs Demand')]"
separator="1" help="All Initial Jobs"
/>
<filter icon="gtk-yes" string="Open Jobs"
domain="[('section_id.name','=','Jobs'),('state','=','open')]"
domain="[('state','=','open')]"
separator="1" help="Open Jobs"
/>
<filter icon="gtk-media-pause" string="Pending Jobs"
domain="[('section_id.name','=','Jobs'),('state','=','pending')]"
domain="[('state','=','pending')]"
separator="1" help="Pending Jobs"
/>
</group>

View File

@ -52,6 +52,8 @@ class crm_lead(osv.osv):
def onchange_case_id(self, cr, uid, ids, *args, **argv):
return self._map_ids('onchange_case_id',cr,uid,ids,*args,**argv)
def stage_next(self, cr, uid, ids, *args, **argv):
return self._map_ids('stage_next',cr,uid,ids,*args,**argv)
def onchange_partner_id(self, cr, uid, ids, *args, **argv):
return self._map_ids('onchange_partner_id',cr,uid,ids,*args,**argv)
def onchange_partner_address_id(self, cr, uid, ids, *args, **argv):
@ -66,8 +68,9 @@ class crm_lead(osv.osv):
return self._map_ids('case_cancel',cr,uid,ids,*args,**argv)
def case_reset(self,cr, uid, ids, *args, **argv):
return self._map_ids('case_reset',cr,uid,ids,*args,**argv)
def case_escalate(self,cr, uid, ids, *args, **argv):
return self._map_ids('case_escalate',cr,uid,ids,*args,**argv)
crm_lead()

View File

@ -6,7 +6,7 @@
-->
<!--For Leads-->
<record id="crm_case_itisatelesalescampaign0" model="crm.case">
<record id="crm_case_itisatelesalescampaign0" model="crm.lead">
<field name="category2_id" ref="crm.category_lead1"/>
<field eval="&quot;3&quot;" name="priority"/>
<field name="user_id" ref="base.user_root"/>
@ -21,7 +21,7 @@
<field eval="&quot;The Oil Company&quot;" name="partner_name"/>
<field eval="&quot;(769) 703-274&quot;" name="partner_phone"/>
</record>
<record id="crm_case_electonicgoodsdealer0" model="crm.case">
<record id="crm_case_electonicgoodsdealer0" model="crm.lead">
<field name="category2_id" ref="crm.category_lead7"/>
<field eval="&quot;4&quot;" name="priority"/>
<field name="user_id" ref="base.user_root"/>
@ -36,7 +36,7 @@
<field eval="&quot;Le Club SARL&quot;" name="partner_name"/>
<field eval="&quot;(956) 293-2595&quot;" name="partner_phone"/>
</record>
<record id="crm_case_developingwebapplications0" model="crm.case">
<record id="crm_case_developingwebapplications0" model="crm.lead">
<field name="category2_id" ref="crm.category_lead5"/>
<field eval="&quot;2&quot;" name="priority"/>
<field name="user_id" ref="base.user_demo"/>
@ -52,7 +52,7 @@
<field eval="&quot;(079) 681-2139&quot;" name="partner_phone"/>
<field eval="&quot;contact@tecsas.fr&quot;" name="email_from"/>
</record>
<record id="crm_case_qrecorp0" model="crm.case">
<record id="crm_case_qrecorp0" model="crm.lead">
<field name="category2_id" ref="crm.category_lead8"/>
<field eval="&quot;3&quot;" name="priority"/>
<field name="user_id" ref="base.user_root"/>
@ -66,7 +66,7 @@
<field eval="&quot;The Gas Company&quot;" name="partner_name"/>
<field eval="&quot;(514) 698-4118&quot;" name="partner_phone"/>
</record>
<record id="crm_case_itdeveloper0" model="crm.case">
<record id="crm_case_itdeveloper0" model="crm.lead">
<field name="category2_id" ref="crm.category_lead4"/>
<field eval="&quot;3&quot;" name="priority"/>
<field name="user_id" ref="base.user_root"/>
@ -81,7 +81,7 @@
<field eval="&quot;Stonage IT&quot;" name="partner_name"/>
<field eval="&quot;(855) 924-4364&quot;" name="partner_phone"/>
</record>
<record id="crm_case_mgroperations0" model="crm.case">
<record id="crm_case_mgroperations0" model="crm.lead">
<field name="partner_address_id" ref="base.res_partner_address_1"/>
<field eval="1" name="active"/>
<field name="category2_id" ref="crm.category_lead3"/>
@ -99,7 +99,7 @@
<field eval="&quot;(373) 907-1009&quot;" name="partner_phone"/>
<field eval="&quot;info@opensides.be&quot;" name="email_from"/>
</record>
<record id="crm_case_vpoperations0" model="crm.case">
<record id="crm_case_vpoperations0" model="crm.lead">
<field eval="1" name="active"/>
<field name="category2_id" ref="crm.category_lead8"/>
<field eval="&quot;3&quot;" name="priority"/>

View File

@ -7,10 +7,9 @@
<record model="ir.actions.act_window" id="crm_case_category_act_leads_all">
<field name="name">All Leads</field>
<field name="res_model">crm.case</field>
<field name="res_model">crm.lead</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="crm_case_tree_view_leads"/>
<field name="domain" eval="'[(\'section_id\',\'=\','+str(section_support2)+')]'"/>
<field name="view_id" ref="crm_case_tree_view_leads"/>
<field name="context" eval="{'default_state':'open'}"/>
<field name="search_view_id" ref="crm.view_crm_case_leads_filter"/>
</record>
@ -48,8 +47,7 @@
<record model="ir.actions.act_window" id="action_report_crm_case_lead_categ">
<field name="res_model">report.crm.case.section.categ2</field>
<field name="view_type">form</field>
<field name="view_mode">graph,tree</field>
<field name="domain" eval="'[(\'section_id\',\'=\','+str(section_support2)+')]'"/>
<field name="view_mode">graph,tree</field>
<field name="context" eval="{'default_state':'open'}"/>
</record>
<menuitem parent="menu_action_report_crm_case_lead" name="Cases by Leads and Type" action="action_report_crm_case_lead_categ" id="menu_action_report_crm_case_lead_categ"/>
@ -57,8 +55,7 @@
<record model="ir.actions.act_window" id="action_report_crm_case_lead_stage">
<field name="res_model">report.crm.case.section.stage</field>
<field name="view_type">form</field>
<field name="view_mode">graph,tree</field>
<field name="domain" eval="'[(\'section_id\',\'=\','+str(section_support2)+')]'"/>
<field name="view_mode">graph,tree</field>
<field name="context" eval="{'default_state':'open'}"/>
</record>
<menuitem name="Cases by Leads and Stage" parent="menu_action_report_crm_case_lead" action="action_report_crm_case_lead_stage" id="menu_action_report_crm_case_lead_stage"/>
@ -66,8 +63,7 @@
<record model="ir.actions.act_window" id="action_report_crm_case_lead_categ_stage">
<field name="res_model">report.crm.case.section.categ.stage</field>
<field name="view_type">form</field>
<field name="view_mode">tree</field>
<field name="domain" eval="'[(\'section_id\',\'=\','+str(section_support2)+')]'"/>
<field name="view_mode">tree</field>
<field name="context" eval="{'default_state':'open'}"/>
</record>
<menuitem name="Cases by Section, Category and Stage" parent="menu_action_report_crm_case_lead" action="action_report_crm_case_lead_categ_stage" id="menu_action_report_crm_case_lead_categ_stage"/>
@ -75,8 +71,7 @@
<record model="ir.actions.act_window" id="action_report_crm_case_lead_categ_categ2">
<field name="res_model">report.crm.case.section.categ.categ2</field>
<field name="view_type">form</field>
<field name="view_mode">tree</field>
<field name="domain" eval="'[(\'section_id\',\'=\','+str(section_support2)+')]'"/>
<field name="view_mode">tree</field>
<field name="context" eval="{'default_state':'open'}"/>
</record>
<menuitem name="Cases by Section, Category and Type" parent="menu_action_report_crm_case_lead" action="action_report_crm_case_lead_categ_categ2" id="menu_action_report_crm_case_lead_categ_categ2"/>

View File

@ -4,11 +4,11 @@
# ------------------------------------------------------
# Leads
# ------------------------------------------------------
# ------------------------------------------------------
<record model="ir.ui.view" id="crm_case_form_view_leads">
<field name="name">CRM - Leads Form</field>
<field name="model">crm.case</field>
<field name="model">crm.lead</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Leads Form">
@ -24,7 +24,7 @@
</group>
<field name="categ_id" select="1" on_change="onchange_categ_id(categ_id)" string="Lead Source"/>
<field name="category2_id" string="Campaign Type" select="1"/>
<button string="Convert to Opportunity" name="%(wizard_crm_opportunity_set)d" icon="gtk-index" type="action"/>
<button string="Convert to Opportunity" name="%(wizard_crm_lead_opportunity_set)d" icon="gtk-index" type="action"/>
</group>
<notebook colspan="4">
<page string="Leads">
@ -38,7 +38,7 @@
<group colspan="2" col="3">
<field name="partner_id" colspan="1"/>
<button string="Convert to Partner"
icon="terp-partner" name="%(wizard_crm_partner_create)d"
icon="terp-partner" name="%(wizard_crm_lead_partner_create)d"
type="action" attrs="{'invisible':[('partner_id','!=',False)]}"
/>
</group>
@ -137,7 +137,7 @@
</record>
<record model="ir.ui.view" id="crm_case_tree_view_leads">
<field name="name">CRM - Leads Tree</field>
<field name="model">crm.case</field>
<field name="model">crm.lead</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Leads Tree" colors="red:state=='open';black:state in ('draft', 'cancel','done','pending')">
@ -159,7 +159,7 @@
</record>
<record model="ir.ui.view" id="crm_case_calendar_view_leads">
<field name="name">CRM - Leads Calendar</field>
<field name="model">crm.case</field>
<field name="model">crm.lead</field>
<field name="type">calendar</field>
<field name="priority" eval="2"/>
<field name="arch" type="xml">
@ -173,20 +173,20 @@
<record id="view_crm_case_leads_filter" model="ir.ui.view">
<field name="name">crm.case.leads.select</field>
<field name="model">crm.case</field>
<field name="name">CRM - Leads Search</field>
<field name="model">crm.lead</field>
<field name="type">search</field>
<field name="arch" type="xml">
<search string="Search Leads">
<group col="3" colspan="1">
<filter icon="gtk-home" string=" Today "
separator="1"
domain="[('date::date','=',time.strftime('%%Y-%%m-%%d'))]"
domain="[('date','=',time.strftime('%%Y-%%m-%%d'))]"
help="Todays's Leads"
/>
<filter icon="gtk-media-rewind" string=" 7 Days "
separator="1" help="Leads during last 7 days"
domain="[('date::date','&lt;', time.strftime('%%Y-%%m-%%d')), ('date::date','&gt;=',(datetime.date.today()-datetime.timedelta(days=7)).strftime('%%Y-%%m-%%d'))]"
domain="[('date','&lt;', time.strftime('%%Y-%%m-%%d')), ('date','&gt;=',(datetime.date.today()-datetime.timedelta(days=7)).strftime('%%Y-%%m-%%d'))]"
/>
</group>
<separator orientation="vertical"/>

View File

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<wizard
id="wizard_crm_lead_partner_create"
keyword="client_action_multi"
model="crm.lead"
name="crm.lead.partner_create"
multi="True"
string="Create Partner"/>
<wizard
id="wizard_crm_lead_opportunity_set"
keyword="client_action_multi"
model="crm.lead"
name="crm.lead.opportunity_set"
multi="True"
string="Convert To Opportunity"/>
</data>
</openerp>

View File

@ -27,6 +27,7 @@ import base64
import re
import time
import tools
from tools.translate import _
class crm_meeting(osv.osv):
_name = 'crm.meeting'
@ -344,17 +345,29 @@ class crm_meeting_generic_wizard(osv.osv_memory):
case_obj = self.pool.get('crm.meeting')
case_id = context.get('active_id',[])
res = self.read(cr, uid, ids)[0]
case = case_obj.read(cr, uid, case_id, ['state'])
if case['state'] in ('done'):
case = case_obj.browse(cr, uid, case_id)
if case.state in ('done'):
raise osv.except_osv(_('Error !'), _('You can not assign Closed Case.'))
new_case_id = case_obj.copy(cr, uid, case_id, default=
{
'section_id':res.get('section_id',False),
'user_id':res.get('user_id',False)
}, context=context)
case_obj.write(cr, uid, case_id, {'case_id':new_case_id}, context=context)
'user_id':res.get('user_id',False),
'case_id' : case.inherit_case_id.id
}, context=context)
case_obj.case_close(cr, uid, [case_id])
return {}
data_obj = self.pool.get('ir.model.data')
result = data_obj._get_id(cr, uid, 'crm', 'view_crm_case_meetings_filter')
search_view = data_obj.read(cr, uid, result, ['res_id'])
new_case = case_obj.read(cr, uid, new_case_id, ['id'])
value = {
'name': _('Meetings'),
'view_type': 'form',
'view_mode': 'calendar, tree, form',
'res_model': 'crm.meeting',
'type': 'ir.actions.act_window',
'search_view_id': search_view['res_id']
}
return value
crm_meeting_generic_wizard()

View File

@ -52,6 +52,8 @@ class crm_opportunity(osv.osv):
def onchange_case_id(self, cr, uid, ids, *args, **argv):
return self._map_ids('onchange_case_id',cr,uid,ids,*args,**argv)
def stage_next(self, cr, uid, ids, *args, **argv):
return self._map_ids('stage_next',cr,uid,ids,*args,**argv)
def onchange_partner_id(self, cr, uid, ids, *args, **argv):
return self._map_ids('onchange_partner_id',cr,uid,ids,*args,**argv)
def onchange_partner_address_id(self, cr, uid, ids, *args, **argv):
@ -70,4 +72,58 @@ class crm_opportunity(osv.osv):
return self._map_ids('case_escalate',cr,uid,ids,*args,**argv)
def case_pending(self,cr, uid, ids, *args, **argv):
return self._map_ids('case_pending',cr,uid,ids,*args,**argv)
crm_opportunity()
crm_opportunity()
class crm_opportunity_assign_wizard(osv.osv_memory):
_name = 'crm.opportunity.assign_wizard'
_columns = {
'section_id': fields.many2one('crm.case.section', 'Section'),
'user_id': fields.many2one('res.users', 'Responsible'),
}
def _get_default_section(self, cr, uid, context):
case_id = context.get('active_id',False)
if not case_id:
return False
case_obj = self.pool.get('crm.opportunity')
case = case_obj.read(cr, uid, case_id, ['state','section_id'])
if case['state'] in ('done'):
raise osv.except_osv(_('Error !'), _('You can not assign Closed Case.'))
return case['section_id']
_defaults = {
'section_id': _get_default_section
}
def action_create(self, cr, uid, ids, context=None):
case_obj = self.pool.get('crm.opportunity')
case_id = context.get('active_id',[])
res = self.read(cr, uid, ids)[0]
case = case_obj.browse(cr, uid, case_id)
if case.state in ('done'):
raise osv.except_osv(_('Error !'), _('You can not assign Closed Case.'))
new_case_id = case_obj.copy(cr, uid, case_id, default=
{
'section_id':res.get('section_id',False),
'user_id':res.get('user_id',False),
'case_id' : case.inherit_case_id.id
}, context=context)
case_obj.case_close(cr, uid, [case_id])
data_obj = self.pool.get('ir.model.data')
result = data_obj._get_id(cr, uid, 'crm', 'view_crm_case_opportunities_filter')
search_view = data_obj.read(cr, uid, result, ['res_id'])
value = {
'name': _('Opportunity'),
'view_type': 'form',
'view_mode': 'form,tree',
'res_model': 'crm.opportunity',
'res_id': int(new_case_id),
'type': 'ir.actions.act_window',
'search_view_id': search_view['res_id']
}
return value
crm_opportunity_assign_wizard()

View File

@ -7,7 +7,7 @@
<!--For Opportunity-->
<record id="crm_case_construstazunits0" model="crm.case">
<record id="crm_case_construstazunits0" model="crm.opportunity">
<field eval="60" name="probability"/>
<field name="partner_address_id" ref="base.res_partner_address_zen"/>
<field eval="1" name="active"/>
@ -25,7 +25,7 @@
<field name="stage_id" ref="crm.stage_oppor3"/>
<field eval="&quot;CONS TRUST (AZ) 529701 - 1000 units&quot;" name="name"/>
</record>
<record id="crm_case_rdroundfundingunits0" model="crm.case">
<record id="crm_case_rdroundfundingunits0" model="crm.opportunity">
<field name="partner_address_id" ref="base.res_partner_address_15"/>
<field eval="1" name="active"/>
<field name="category2_id" ref="crm.category_oppor2"/>
@ -43,7 +43,7 @@
<field name="stage_id" ref="crm.stage_oppor1"/>
<field eval="&quot;3rd Round Funding - 1000 units &quot;" name="name"/>
</record>
<record id="crm_case_mediapoleunits0" model="crm.case">
<record id="crm_case_mediapoleunits0" model="crm.opportunity">
<field eval="10" name="probability"/>
<field name="partner_address_id" ref="base.res_partner_address_3"/>
<field eval="1" name="active"/>
@ -63,7 +63,7 @@
<field eval="&quot;Mediapole - 5000 units&quot;" name="name"/>
<field eval="&quot;info@mediapole.net&quot;" name="email_from"/>
</record>
<record id="crm_case_abcfuelcounits0" model="crm.case">
<record id="crm_case_abcfuelcounits0" model="crm.opportunity">
<field eval="40" name="probability"/>
<field name="partner_address_id" ref="base.res_partner_address_1"/>
<field eval="1" name="active"/>
@ -82,7 +82,7 @@
<field eval="&quot;ABC FUEL CO 829264 - 1000 units &quot;" name="name"/>
<field eval="&quot;info@opensides.be&quot;" name="email_from"/>
</record>
<record id="crm_case_dirtminingltdunits0" model="crm.case">
<record id="crm_case_dirtminingltdunits0" model="crm.opportunity">
<field eval="80" name="probability"/>
<field name="partner_address_id" ref="base.res_partner_address_wong"/>
<field eval="1" name="active"/>

View File

@ -5,10 +5,9 @@
<record model="ir.actions.act_window" id="crm_case_category_act_oppor11">
<field name="name">All Opportunities</field>
<field name="res_model">crm.case</field>
<field name="res_model">crm.opportunity</field>
<field name="view_mode">tree,form,graph</field>
<field name="view_id" ref="crm_case_tree_view_oppor"/>
<field name="domain" eval="'[(\'section_id\',\'=\','+str(section_support3)+')]'"/>
<field name="view_id" ref="crm_case_tree_view_oppor"/>
<field name="context" eval="{'default_state':'open'}"/>
<field name="search_view_id" ref="crm.view_crm_case_opportunities_filter"/>
</record>
@ -53,8 +52,7 @@
<record model="ir.actions.act_window" id="action_report_crm_case_oppor_categ">
<field name="res_model">report.crm.case.section.categ2</field>
<field name="view_type">form</field>
<field name="view_mode">graph,tree</field>
<field name="domain" eval="'[(\'section_id\',\'=\','+str(section_support3)+')]'"/>
<field name="view_mode">graph,tree</field>
<field name="context" eval="{'default_state':'open'}"/>
</record>
<menuitem name="Cases by Opportunities and Type" parent="menu_action_report_crm_case_oppor" action="action_report_crm_case_oppor_categ" id="menu_action_report_crm_case_oppor_categ"/>
@ -62,8 +60,7 @@
<record model="ir.actions.act_window" id="action_report_crm_case_oppor_stage">
<field name="res_model">report.crm.case.section.stage</field>
<field name="view_type">form</field>
<field name="view_mode">graph,tree</field>
<field name="domain" eval="'[(\'section_id\',\'=\','+str(section_support3)+')]'"/>
<field name="view_mode">graph,tree</field>
<field name="context" eval="{'default_state':'open'}"/>
</record>
<menuitem name="Cases by Opportunities and Stage" parent="menu_action_report_crm_case_oppor" action="action_report_crm_case_oppor_stage" id="menu_action_report_crm_case_oppor_stage"/>
@ -71,8 +68,7 @@
<record model="ir.actions.act_window" id="action_report_crm_case_oppor_categ_stage">
<field name="res_model">report.crm.case.section.categ.stage</field>
<field name="view_type">form</field>
<field name="view_mode">tree</field>
<field name="domain" eval="'[(\'section_id\',\'=\','+str(section_support3)+')]'"/>
<field name="view_mode">tree</field>
<field name="context" eval="{'default_state':'open'}"/>
</record>
<menuitem name="Cases by Opportunities, Category and Stage" parent="menu_action_report_crm_case_oppor" action="action_report_crm_case_oppor_categ_stage" id="menu_action_report_crm_case_oppor_categ_stage"/>
@ -80,8 +76,7 @@
<record model="ir.actions.act_window" id="action_report_crm_case_oppor_categ_categ2">
<field name="res_model">report.crm.case.section.categ.categ2</field>
<field name="view_type">form</field>
<field name="view_mode">tree</field>
<field name="domain" eval="'[(\'section_id\',\'=\','+str(section_support3)+')]'"/>
<field name="view_mode">tree</field>
<field name="context" eval="{'default_state':'open'}"/>
</record>
<menuitem name="Cases by Opportunities, Category and Type" parent="menu_action_report_crm_case_oppor" action="action_report_crm_case_oppor_categ_categ2" id="menu_action_report_crm_case_oppor_categ_categ2"/>

View File

@ -4,13 +4,40 @@
# ------------------------------------------------------
# Opportunities
# ------------------------------------------------------
# ------------------------------------------------------
<record model="ir.ui.view" id="crm_opportunity_assign_wizard_form">
<field name="name">crm.opportunity.assign_wizard.form</field>
<field name="model">crm.opportunity.assign_wizard</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="To Assign">
<group col="2">
<field name="section_id" select="1" widget="selection"/>
<field name="user_id"/>
</group>
<newline/>
<separator colspan="4"/>
<group col="2" colspan="2">
<button icon="gtk-cancel" special="cancel" string="Cancel"/>
<button icon="gtk-execute" name="action_create" string="Assign" type="object"/>
</group>
</form>
</field>
</record>
<record id="action_crm_opportunity_assign_wizard" model="ir.actions.act_window">
<field name="name">To Assign</field>
<field name="res_model">crm.opportunity.assign_wizard</field>
<field name="view_type">form</field>
<field name="view_id" ref="crm_opportunity_assign_wizard_form"/>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
<record model="ir.ui.view" id="crm_case_form_view_oppor">
<field name="name">CRM - Opportunities Form</field>
<field name="model">crm.case</field>
<field name="model">crm.opportunity</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Opportunities">
@ -19,7 +46,7 @@
<field name="section_id" colspan="1" widget="selection"/>
<field name="user_id" select="2" string="Responsible"/>
<button string="Schedule a Phone Call"
name="%(wizard_crm_reschedule_phone_call)d" icon="gtk-redo" type="action" />
name="%(wizard_crm_opportunity_reschedule_phone_call)d" icon="gtk-redo" type="action" />
<newline/>
<label string="Sales Stage: " align="1.0"/>
<group colspan="1" col="2">
@ -29,7 +56,7 @@
<field name="date" string="Deadline"/>
<group colspan="2">
<field name="case_id" select="1"/>
<button string="Assign" name="%(crm_generic_wizard_act)d" type="action" />
<button string="Assign" name="%(action_crm_opportunity_assign_wizard)d" type="action" />
</group>
</group>
<notebook colspan="4">
@ -130,7 +157,7 @@
</record>
<record model="ir.ui.view" id="crm_case_tree_view_oppor">
<field name="name">CRM - Opportunities Tree</field>
<field name="model">crm.case</field>
<field name="model">crm.opportunity</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Opportunities Tree" colors="red:state=='open';black:state in ('draft', 'cancel','done','pending')">
@ -152,20 +179,20 @@
</record>
<record id="view_crm_case_opportunities_filter" model="ir.ui.view">
<field name="name">crm.case.opportunities.select</field>
<field name="model">crm.case</field>
<field name="name">CRM - Opportunities Search</field>
<field name="model">crm.opportunity</field>
<field name="type">search</field>
<field name="arch" type="xml">
<search string="Search Opportunities">
<group col="3" colspan="1">
<filter icon="gtk-home" string=" Today "
separator="1"
domain="[('date::date','=',time.strftime('%%Y-%%m-%%d'))]"
domain="[('date','=',time.strftime('%%Y-%%m-%%d'))]"
help="Todays's Opportunities"
/>
<filter icon="gtk-media-rewind" string=" 7 Days "
separator="1" help="Opportunities during last 7 days"
domain="[('date::date','&lt;', time.strftime('%%Y-%%m-%%d')), ('date::date','&gt;=',(datetime.date.today()-datetime.timedelta(days=7)).strftime('%%Y-%%m-%%d'))]"
domain="[('date','&lt;', time.strftime('%%Y-%%m-%%d')), ('date','&gt;=',(datetime.date.today()-datetime.timedelta(days=7)).strftime('%%Y-%%m-%%d'))]"
/>
</group>
<separator orientation="vertical"/>

View File

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<wizard
id="wizard_crm_opportunity_reschedule_phone_call"
keyword="client_action_multi"
model="crm.opportunity"
name="crm.opportunity.reschedule_phone_call"
multi="True"
string="Schedule Phone Call" />
<wizard
id="wizard_partner_create_opportunity"
keyword="client_action_multi"
model="res.partner"
name="crm.case.opportunity.partner_opportunity"
menu="False"
string="Create Opportunity"/>
<wizard
id="wizard_partner_create_opportunity1"
keyword="client_action_relate"
model="res.partner"
name="crm.case.opportunity.partner_opportunity"
string="Create Opportunity"/>
</data>
</openerp>

View File

@ -28,6 +28,8 @@ import re
import time
import tools
from tools.translate import _
class crm_phonecall(osv.osv):
_name = "crm.phonecall"
_description = "Phonecall Cases"
@ -67,4 +69,57 @@ class crm_phonecall(osv.osv):
def case_pending(self,cr, uid, ids, *args, **argv):
return self._map_ids('case_pending',cr,uid,ids,*args,**argv)
crm_phonecall()
crm_phonecall()
class crm_phonecall_assign_wizard(osv.osv_memory):
_name = 'crm.phonecall.assign_wizard'
_columns = {
'section_id': fields.many2one('crm.case.section', 'Section', required=True),
'user_id': fields.many2one('res.users', 'Responsible'),
}
def _get_default_section(self, cr, uid, context):
case_id = context.get('active_id',False)
if not case_id:
return False
case_obj = self.pool.get('crm.phonecall')
case = case_obj.read(cr, uid, case_id, ['state','section_id'])
if case['state'] in ('done'):
raise osv.except_osv(_('Error !'), _('You can not assign Closed Case.'))
return case['section_id']
_defaults = {
'section_id': _get_default_section
}
def action_create(self, cr, uid, ids, context=None):
case_obj = self.pool.get('crm.phonecall')
case_id = context.get('active_id',[])
res = self.read(cr, uid, ids)[0]
case = case_obj.browse(cr, uid, case_id)
if case.state in ('done'):
raise osv.except_osv(_('Error !'), _('You can not assign Closed Case.'))
new_case_id = case_obj.copy(cr, uid, case_id, default=
{
'section_id':res.get('section_id',False),
'user_id':res.get('user_id',False),
'case_id' : case.inherit_case_id.id
}, context=context)
case_obj.case_close(cr, uid, [case_id])
data_obj = self.pool.get('ir.model.data')
result = data_obj._get_id(cr, uid, 'crm', 'view_crm_case_phonecalls_filter')
search_view = data_obj.read(cr, uid, result, ['res_id'])
value = {
'name': _('Phone Calls'),
'view_type': 'form',
'view_mode': 'form,tree',
'res_model': 'crm.phonecall',
'res_id': int(new_case_id),
'type': 'ir.actions.act_window',
'search_view_id': search_view['res_id']
}
return value
crm_phonecall_assign_wizard()

View File

@ -4,7 +4,7 @@
<!--
((((((((((( Demo Cases )))))))))))
-->
<record id="crm_case_phone01" model="crm.case">
<record id="crm_case_phone01" model="crm.phonecall">
<field name="partner_address_id" ref="base.res_partner_address_15"/>
<field eval="time.strftime('%Y-%m-04 10:45:36')" name="date"/>
<field name="partner_id" ref="base.res_partner_11"/>
@ -19,7 +19,7 @@
<field name="stage_id" ref="crm.stage_phone1"/>
<field eval="&quot;(769) 703-274&quot;" name="partner_phone"/>
</record>
<record id="crm_case_phone02" model="crm.case">
<record id="crm_case_phone02" model="crm.phonecall">
<field name="partner_address_id" ref="base.res_partner_address_6"/>
<field eval="time.strftime('%Y-%m-11 11:19:25')" name="date"/>
<field name="partner_id" ref="base.res_partner_6"/>
@ -34,7 +34,7 @@
<field name="stage_id" ref="crm.stage_phone2"/>
<field eval="&quot;(956) 293-2595&quot;" name="partner_phone"/>
</record>
<record id="crm_case_phone03" model="crm.case">
<record id="crm_case_phone03" model="crm.phonecall">
<field name="partner_address_id" ref="base.res_partner_address_2"/>
<field eval="time.strftime('%Y-%m-15 17:44:12')" name="date"/>
<field name="partner_id" ref="base.res_partner_10"/>
@ -50,7 +50,7 @@
<field eval="&quot;(079) 681-2139&quot;" name="partner_phone"/>
<field eval="&quot;contact@tecsas.fr&quot;" name="email_from"/>
</record>
<record id="crm_case_phone04" model="crm.case">
<record id="crm_case_phone04" model="crm.phonecall">
<field eval="time.strftime('%Y-%m-21 14:10:23')" name="date"/>
<field name="partner_id" ref="base.res_partner_tinyatwork"/>
<field eval="&quot;3&quot;" name="priority"/>
@ -64,7 +64,7 @@
<field name="stage_id" ref="crm.stage_phone1"/>
<field eval="&quot;(514) 698-4118&quot;" name="partner_phone"/>
</record>
<record id="crm_case_phone05" model="crm.case">
<record id="crm_case_phone05" model="crm.phonecall">
<field name="partner_address_id" ref="base.res_partner_address_10"/>
<field eval="time.strftime('%Y-%m-28 16:20:43')" name="date"/>
<field name="partner_id" ref="base.res_partner_5"/>
@ -79,7 +79,7 @@
<field name="stage_id" ref="crm.stage_phone2"/>
<field eval="&quot;(855) 924-4364&quot;" name="partner_phone"/>
</record>
<record id="crm_case_phone06" model="crm.case">
<record id="crm_case_phone06" model="crm.phonecall">
<field name="partner_address_id" ref="base.res_partner_address_1"/>
<field eval="1" name="active"/>
<field name="partner_id" ref="base.res_partner_9"/>

View File

@ -5,23 +5,20 @@
<act_window
id="crm_case_categ_phone_create_partner"
name="Schedule Phone Call"
res_model="crm.case"
res_model="crm.phonecall"
src_model="res.partner"
view_mode="calendar,tree,form"
context="{'default_partner_id': active_id, 'default_duration': 1.0}"
domain="[('section_id','=','Phone Calls')]"/>
/>
<record model="ir.actions.act_window" id="crm_case_categ_phone_create_partner">
<field name="domain" eval="'[(\'section_id\',\'=\','+str(ref('section_support_phone'))+')]'"/>
</record>
######################## PHONE CALLS (menu) ###########################
<record model="ir.actions.act_window" id="crm_case_categ_phone0">
<field name="name">Phone Calls</field>
<field name="res_model">crm.case</field>
<field name="res_model">crm.phonecall</field>
<field name="view_type">form</field>
<field name="view_mode">tree,calendar</field>
<field name="view_id" ref="crm_case_phone_tree_view"/>
<field name="domain" eval="'[(\'section_id\',\'=\','+str(ref('section_support_phone'))+')]'"/>
<field name="view_id" ref="crm_case_phone_tree_view"/>
<field name="search_view_id" ref="crm.view_crm_case_phonecalls_filter"/>
</record>
<record model="ir.actions.act_window.view" id="action_crm_tag_tree_phone0">
@ -47,11 +44,11 @@
<record model="ir.actions.act_window" id="crm_case_categ_phone_incoming0">
<field name="name">Inbound</field>
<field name="res_model">crm.case</field>
<field name="res_model">crm.phonecall</field>
<field name="view_type">form</field>
<field name="view_mode">tree,calendar</field>
<field name="view_id" ref="crm_case_phone_tree_view"/>
<field name="domain" eval="'[(\'section_id\',\'=\','+str(ref('section_support_phone'))+'), (\'categ_id\',\'=\','+str(ref('categ_phone1'))+')]'"/>
<field name="domain" eval="'[(\'categ_id\',\'=\','+str(ref('categ_phone1'))+')]'"/>
<field name="context" eval="{'default_state':'open'}"/>
<field name="search_view_id" ref="crm.view_crm_case_phonecalls_filter"/>
</record>
@ -76,11 +73,11 @@
<menuitem name="Inbound" id="menu_crm_case_phone_inbound" parent="crm.menu_crm_case_phone" action="crm_case_categ_phone_incoming0"/>
<record model="ir.actions.act_window" id="crm_case_categ_phone_outgoing0">
<field name="name">Outbound</field>
<field name="res_model">crm.case</field>
<field name="res_model">crm.phonecall</field>
<field name="view_type">form</field>
<field name="view_mode">tree,calendar</field>
<field name="view_id" ref="crm_case_phone_tree_view"/>
<field name="domain" eval="'[(\'section_id\',\'=\','+str(ref('section_support_phone'))+'), (\'categ_id\',\'=\','+str(ref('categ_phone2'))+')]'"/>
<field name="domain" eval="'[(\'categ_id\',\'=\','+str(ref('categ_phone2'))+')]'"/>
<field name="context" eval="{'default_state':'open'}"/>
<field name="search_view_id" ref="crm.view_crm_case_phonecalls_filter"/>
</record>

View File

@ -5,9 +5,37 @@
# Phone Calls
# ------------------------------------------------------
<record model="ir.ui.view" id="crm_phonecall_assign_wizard_form">
<field name="name">crm.phonecall.assign_wizard.form</field>
<field name="model">crm.phonecall.assign_wizard</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="To Assign">
<group col="2">
<field name="section_id" select="1" widget="selection"/>
<field name="user_id"/>
</group>
<newline/>
<separator colspan="4"/>
<group col="2" colspan="2">
<button icon="gtk-cancel" special="cancel" string="Cancel"/>
<button icon="gtk-execute" name="action_create" string="Assign" type="object"/>
</group>
</form>
</field>
</record>
<record id="action_crm_phonecall_assign_wizard" model="ir.actions.act_window">
<field name="name">To Assign</field>
<field name="res_model">crm.phonecall.assign_wizard</field>
<field name="view_type">form</field>
<field name="view_id" ref="crm_phonecall_assign_wizard_form"/>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
<record model="ir.ui.view" id="crm_case_phone_tree_view">
<field name="name">CRM - Phone Calls Tree</field>
<field name="model">crm.case</field>
<field name="model">crm.phonecall</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Phone Calls" colors="red:state=='open';black:state in ('draft', 'cancel','done','pending')">
@ -16,10 +44,10 @@
<field name="partner_id" string="Partner"/>
<field name="partner_address_id" string="Contact"/>
<field name="case_id"/>
<button string="Opportunity" name="%(wizard_crm_opportunity_set)d" type="action"/>
<button string="Opportunity" name="%(wizard_crm_phonecall_opportunity_set)d" type="action"/>
<button string="Meeting"
name="%(wizard_crm_reschedule_phone_call)d" type="action" />
<button string="Assign" name="%(crm_generic_wizard_act)d" type="action" />
name="%(wizard_crm_phonecall_meeting_set)d" type="action" />
<button string="Assign" name="%(action_crm_phonecall_assign_wizard)d" type="action" />
</tree>
</field>
@ -27,7 +55,7 @@
<record model="ir.ui.view" id="crm_case_phone_incomming_tree_view">
<field name="name">CRM - Phone Calls Tree</field>
<field name="model">crm.case</field>
<field name="model">crm.phonecall</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Phone Calls" editable="bottom" colors="red:state=='open';black:state in ('draft', 'cancel','done','pending')">
@ -36,10 +64,10 @@
<field name="partner_id" string="Partner"/>
<field name="partner_address_id" string="Contact"/>
<field name="case_id"/>
<button string="Opportunity" name="%(wizard_crm_opportunity_set)d" type="action"/>
<button string="Opportunity" name="%(wizard_crm_phonecall_opportunity_set)d" type="action"/>
<button string="Meeting"
name="%(wizard_crm_reschedule_phone_call)d" type="action" />
<button string="Assign" name="%(crm_generic_wizard_act)d" type="action" />
name="%(wizard_crm_phonecall_meeting_set)d" type="action" />
<button string="Assign" name="%(action_crm_phonecall_assign_wizard)d" type="action" />
</tree>
</field>
@ -47,7 +75,7 @@
<record model="ir.ui.view" id="crm_case_phone_form_view">
<field name="name">CRM - Phone Call Form</field>
<field name="model">crm.case</field>
<field name="model">crm.phonecall</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Claims">
@ -55,7 +83,7 @@
<field name="name" string="Subject"/>
<field name="section_id" colspan="1" widget="selection"/>
<field name="user_id" string="Assigned to" select="2"/>
<button string="Convert to Opportunity" name="%(wizard_crm_opportunity_set)d" icon="gtk-index" type="action"/>
<button string="Convert to Opportunity" name="%(wizard_crm_phonecall_opportunity_set)d" icon="gtk-index" type="action"/>
<newline/>
<field name="date" string="Planned Date"/>
<field name="duration"/>
@ -64,10 +92,10 @@
context="{'default_name':name,'default_section_id':section_id,'default_user_id':user_id,'default_duration':duration,
'default_partner_id':partner_id,'default_partner_address_id':partner_address_id,'default_partner_phone':partner_phone,
'default_partner_mobile':partner_mobile,'default_categ_id':categ_id}"/>
<button string="Assign" name="%(crm_generic_wizard_act)d" type="action" />
<button string="Assign" name="%(action_crm_phonecall_assign_wizard)d" type="action" />
</group>
<button string="Schedule a Phone Call"
name="%(wizard_crm_reschedule_phone_call)d" icon="gtk-redo" type="action" />
<button string="Schedule a Meeting"
name="%(wizard_crm_phonecall_meeting_set)d" icon="gtk-redo" type="action" />
</group>
<notebook colspan="4">
<page string="General">
@ -75,7 +103,7 @@
<field name="active" string="Reminder"/>
<group colspan="2" col="3">
<field name="partner_id" string="Partner"/>
<button string="Convert to Partner" icon="terp-crm" name="%(wizard_crm_partner_create)d" type="action" attrs="{'invisible':[('partner_id','!=',False)]}"/>
<button string="Convert to Partner" icon="terp-crm" name="%(wizard_crm_phonecall_partner_create)d" type="action" attrs="{'invisible':[('partner_id','!=',False)]}"/>
</group>
<field name="partner_address_id" string="Contact"/>
<field name="partner_phone"/>
@ -102,7 +130,7 @@
<record model="ir.ui.view" id="crm_case_phone_calendar_view">
<field name="name">CRM - Phone Calls Calendar</field>
<field name="model">crm.case</field>
<field name="model">crm.phonecall</field>
<field name="type">calendar</field>
<field name="priority" eval="2"/>
<field name="arch" type="xml">
@ -115,32 +143,32 @@
</record>
<record id="view_crm_case_phonecalls_filter" model="ir.ui.view">
<field name="name">crm.case.phonecalls.select</field>
<field name="model">crm.case</field>
<field name="name">CRM - Phone Calls Search</field>
<field name="model">crm.phonecall</field>
<field name="type">search</field>
<field name="arch" type="xml">
<search string="Search Phonecalls">
<group col="6" colspan="1">
<filter icon="gtk-jump-to"
string="Inbound"
domain="[('section_id.name','=','Phone Calls'),('categ_id.name','=','Inbound')]"
domain="[('categ_id.name','=','Inbound')]"
separator="1" help="All Inbound Phonecalls"
/>
<filter icon="gtk-redo"
string="Outbound"
domain="[('section_id.name','=','Phone Calls'),('categ_id.name','=','Outbound')]"
domain="[('categ_id.name','=','Outbound')]"
separator="1" help="All Outbound Phonecalls"
/>
<separator orientation="vertical"/>
<filter icon="gtk-home" string=" Today "
separator="1"
domain="[('date::date','=',time.strftime('%%Y-%%m-%%d'))]"
domain="[('date','=',time.strftime('%%Y-%%m-%%d'))]"
help="Todays's Phonecalls"
/>
<filter icon="gtk-media-rewind"
string=" 7 Days " separator="1"
help="Phonecalls during last 7 days"
domain="[('date::date','&lt;', time.strftime('%%Y-%%m-%%d')), ('date::date','&gt;=',(datetime.date.today()-datetime.timedelta(days=7)).strftime('%%Y-%%m-%%d'))]"
domain="[('date','&lt;', time.strftime('%%Y-%%m-%%d')), ('date','&gt;=',(datetime.date.today()-datetime.timedelta(days=7)).strftime('%%Y-%%m-%%d'))]"
/>
</group>
<separator orientation="vertical"/>

View File

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<wizard
id="wizard_crm_phonecall_meeting_set"
keyword="client_action_multi"
model="crm.phonecall"
name="crm.phonecall.meeting_set"
multi="True"
string="Schedule Meeting"/>
<wizard
id="wizard_crm_phonecall_partner_create"
keyword="client_action_multi"
model="crm.phonecall"
name="crm.phonecall.partner_create"
multi="True"
string="Create Partner"/>
<wizard
id="wizard_crm_phonecall_opportunity_set"
keyword="client_action_multi"
model="crm.phonecall"
name="crm.phonecall.opportunity_set"
multi="True"
string="Convert To Opportunity"/>
</data>
</openerp>

View File

@ -1,7 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<wizard id="wizard_case_section_menu" model="crm.case.section" name="crm.case.section.menu" string="Create menus for a case section"/>
<wizard
string="History of Events"
name="crm.case.history.events"
model="crm.case"
id="wizard_case_history_event"
keyword="client_action_relate"
/>
<wizard string="Fetch mail"
model="crm.case.section"

View File

@ -31,5 +31,3 @@
"access_crm_menu_config_wizard system","crm config wizard manager system","model_crm_menu_config_wizard","base.group_system",1,1,1,1
"access_crm_case_category2_user","crm_case_category2 user","model_crm_case_category2","crm.group_crm_user",1,0,0,0
"access_crm_case_category2_manager","crm_case_category2 manager","model_crm_case_category2","crm.group_crm_manager",1,1,1,1
"access_crm_generic_wizard_manager","crm.generic_wizard","model_crm_generic_wizard","crm.group_crm_manager",1,1,1,1
"access_crm_generic_wizard_manager","crm.generic_wizard","model_crm_generic_wizard","crm.group_crm_user",1,0,0,0

1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
31 access_crm_menu_config_wizard system crm config wizard manager system model_crm_menu_config_wizard base.group_system 1 1 1 1
32 access_crm_case_category2_user crm_case_category2 user model_crm_case_category2 crm.group_crm_user 1 0 0 0
33 access_crm_case_category2_manager crm_case_category2 manager model_crm_case_category2 crm.group_crm_manager 1 1 1 1
access_crm_generic_wizard_manager crm.generic_wizard model_crm_generic_wizard crm.group_crm_manager 1 1 1 1
access_crm_generic_wizard_manager crm.generic_wizard model_crm_generic_wizard crm.group_crm_user 1 0 0 0

View File

@ -19,20 +19,20 @@
#
##############################################################################
#import crm_wizard
import crm_opportunity_wizard
import crm_lead_wizard
import crm_job_wizard
import crm_phonecall_wizard
import wizard_crm_send_email
import wizard_crm_new_send_email
import wizard_fetch_mail
import wizard_cal_export
import wizard_cal_import
import wizard_cal_subscribe
import meeting_planify
import wizard_partner_create
import wizard_opportunity_set
import schedule_phone_call
import wizard_history_event
import wizard_partner_opportunity
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -0,0 +1,286 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
# $Id$
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from mx.DateTime import now
import wizard
import netsvc
import ir
import pooler
import time
from tools.translate import _
class job2phonecall(wizard.interface):
case_form = """<?xml version="1.0"?>
<form string="Schedule Phone Call">
<separator string="Phone Call Description" colspan="4" />
<newline />
<field name='user_id' />
<field name='deadline' />
<newline />
<field name='note' colspan="4"/>
<newline />
<field name='section_id' />
<field name='category_id'/>
</form>"""
case_fields = {
'user_id' : {'string' : 'Assign To', 'type' : 'many2one', 'relation' : 'res.users'},
'deadline' : {'string' : 'Planned Date', 'type' : 'datetime'},
'note' : {'string' : 'Goals', 'type' : 'text'},
'category_id' : {'string' : 'Category', 'type' : 'many2one', 'relation' : 'crm.case.categ', 'required' : True},
'section_id' : {'string' : 'Section', 'type' : 'many2one', 'relation' : 'crm.case.section'},
}
def _default_values(self, cr, uid, data, context):
case_obj = pooler.get_pool(cr.dbname).get('crm.job')
categ_id=pooler.get_pool(cr.dbname).get('crm.case.categ').search(cr, uid, [('name','=','Outbound')])
case = case_obj.browse(cr, uid, data['id'])
return {
'user_id' : case.user_id and case.user_id.id,
'category_id' : categ_id and categ_id[0] or case.categ_id and case.categ_id.id,
'note' : case.description
}
def _doIt(self, cr, uid, data, context):
form = data['form']
pool = pooler.get_pool(cr.dbname)
mod_obj = pool.get('ir.model.data')
result = mod_obj._get_id(cr, uid, 'crm', 'view_crm_case_phonecalls_filter')
res = mod_obj.read(cr, uid, result, ['res_id'])
phonecall_case_obj = pool.get('crm.phonecall')
job_case_obj = pool.get('crm.job')
# Select the view
data_obj = pool.get('ir.model.data')
id2 = data_obj._get_id(cr, uid, 'crm', 'crm_case_phone_tree_view')
id3 = data_obj._get_id(cr, uid, 'crm', 'crm_case_phone_form_view')
if id2:
id2 = data_obj.browse(cr, uid, id2, context=context).res_id
if id3:
id3 = data_obj.browse(cr, uid, id3, context=context).res_id
for job in job_case_obj.browse(cr, uid, data['ids']):
#TODO : Take other info from job
new_phonecall_id = phonecall_case_obj.create(cr, uid, {
'name' : job.name,
'case_id' : job.inherit_case_id.id,
'user_id' : form['user_id'],
'categ_id' : form['category_id'],
'description' : form['note'],
'date' : form['deadline'],
'section_id' : form['section_id']
}, context=context)
new_phonecall = phonecall_case_obj.browse(cr, uid, new_phonecall_id)
vals = {}
if not job.case_id:
vals.update({'case_id' : new_phonecall.inherit_case_id.id})
job_case_obj.write(cr, uid, [job.id], vals)
job_case_obj.case_cancel(cr, uid, [job.id])
phonecall_case_obj.case_open(cr, uid, [new_phonecall_id])
value = {
'name': _('Phone Call'),
'view_type': 'form',
'view_mode': 'tree,form',
'res_model': 'crm.phonecall',
'res_id' : new_phonecall_id,
'views': [(id3,'form'),(id2,'tree'),(False,'calendar'),(False,'graph')],
'type': 'ir.actions.act_window',
'search_view_id': res['res_id']
}
return value
states = {
'init': {
'actions': [_default_values],
'result': {'type': 'form', 'arch': case_form, 'fields': case_fields,
'state' : [('end', 'Cancel','gtk-cancel'),('order', 'Schedule Phone Call','gtk-go-forward')]}
},
'order': {
'actions': [],
'result': {'type': 'action', 'action': _doIt, 'state': 'end'}
}
}
job2phonecall('crm.job.reschedule_phone_call')
class job2meeting(wizard.interface):
case_form = """<?xml version="1.0"?>
<form string="Plan Meeting">
<field name="date"/>
<field name="duration" widget="float_time"/>
<label string="Note that you can also use the calendar view to graphically schedule your next meeting." colspan="4"/>
</form>"""
case_fields = {
'date': {'string': 'Meeting date', 'type': 'datetime', 'required': 1},
'duration': {'string': 'Duration (Hours)', 'type': 'float', 'required': 1}
}
def _selectPartner(self, cr, uid, data, context):
case_obj = pooler.get_pool(cr.dbname).get('crm.job')
case = case_obj.browse(cr, uid, data['id'])
return {'date': case.date, 'duration': case.duration or 2.0}
def _makeMeeting(self, cr, uid, data, context):
pool = pooler.get_pool(cr.dbname)
job_case_obj = pool.get('crm.job')
meeting_case_obj = pool.get('crm.meeting')
for job in job_case_obj.browse(cr, uid, data['ids']):
#TODO : Take other info from job
new_meeting_id = meeting_case_obj.create(cr, uid, {
'name': job.name,
'date': data['form']['date'],
'duration': data['form']['duration'],
'case_id': job.inherit_case_id.id,
})
new_meeting = meeting_case_obj.browse(cr, uid, new_meeting_id)
vals = {}
if not job.case_id:
vals.update({'case_id' : new_meeting.inherit_case_id.id})
job_case_obj.write(cr, uid, [job.id], vals)
job_case_obj.case_cancel(cr, uid, [job.id])
meeting_case_obj.case_open(cr, uid, [new_meeting_id])
data_obj = pool.get('ir.model.data')
result = data_obj._get_id(cr, uid, 'crm', 'view_crm_case_meetings_filter')
id = data_obj.read(cr, uid, result, ['res_id'])
id1 = data_obj._get_id(cr, uid, 'crm', 'crm_case_calendar_view_meet')
id2 = data_obj._get_id(cr, uid, 'crm', 'crm_case_form_view_meet')
id3 = data_obj._get_id(cr, uid, 'crm', 'crm_case_tree_view_meet')
if id1:
id1 = data_obj.browse(cr, uid, id1, context=context).res_id
if id2:
id2 = data_obj.browse(cr, uid, id2, context=context).res_id
if id3:
id3 = data_obj.browse(cr, uid, id3, context=context).res_id
return {
'name': _('Meetings'),
'view_type': 'form',
'view_mode': 'calendar,form,tree',
'res_model': 'crm.meeting',
'view_id': False,
'views': [(id1,'calendar'),(id2,'form'),(id3,'tree'),(False,'graph')],
'type': 'ir.actions.act_window',
'search_view_id': id['res_id']
}
states = {
'init': {
'actions': [_selectPartner],
'result': {'type': 'form', 'arch': case_form, 'fields': case_fields,
'state' : [('end', 'Cancel','gtk-cancel'),('order', 'Set Meeting','gtk-go-forward')]}
},
'order': {
'actions': [],
'result': {'type': 'action', 'action': _makeMeeting, 'state': 'end'}
}
}
job2meeting('crm.job.meeting_set')
class partner_create(wizard.interface):
case_form = """<?xml version="1.0"?>
<form string="Convert To Partner">
<label string="Are you sure you want to create a partner based on this job request ?" colspan="4"/>
<label string="You may have to verify that this partner does not exist already." colspan="4"/>
<!--field name="close"/-->
</form>"""
case_fields = {
'close': {'type':'boolean', 'string':'Close job request'}
}
def _selectPartner(self, cr, uid, data, context):
pool = pooler.get_pool(cr.dbname)
case_obj = pool.get('crm.job')
for case in case_obj.browse(cr, uid, data['ids']):
if case.partner_id:
raise wizard.except_wizard(_('Warning !'),
_('A partner is already defined on this job request.'))
return {}
def _makeOrder(self, cr, uid, data, context):
pool = pooler.get_pool(cr.dbname)
mod_obj = pool.get('ir.model.data')
result = mod_obj._get_id(cr, uid, 'base', 'view_res_partner_filter')
res = mod_obj.read(cr, uid, result, ['res_id'])
case_obj = pool.get('crm.job')
partner_obj = pool.get('res.partner')
contact_obj = pool.get('res.partner.address')
for case in case_obj.browse(cr, uid, data['ids']):
partner_id = partner_obj.search(cr, uid, [('name', '=', case.partner_name or case.name)])
if partner_id:
raise wizard.except_wizard(_('Warning !'),_('A partner is already existing with the same name.'))
else:
partner_id = partner_obj.create(cr, uid, {
'name': case.partner_name or case.name,
'user_id': case.user_id.id,
'comment': case.description,
})
contact_id = contact_obj.create(cr, uid, {
'partner_id': partner_id,
'name': case.partner_name2,
'phone': case.partner_phone,
'mobile': case.partner_mobile,
'email': case.email_from
})
case_obj.write(cr, uid, data['ids'], {
'partner_id': partner_id,
'partner_address_id': contact_id
})
if data['form']['close']:
case_obj.case_close(cr, uid, data['ids'])
value = {
'domain': "[]",
'view_type': 'form',
'view_mode': 'form,tree',
'res_model': 'res.partner',
'res_id': int(partner_id),
'view_id': False,
'type': 'ir.actions.act_window',
'search_view_id': res['res_id']
}
return value
states = {
'init': {
'actions': [_selectPartner],
'result': {'type': 'form', 'arch': case_form, 'fields': case_fields,
'state' : [('end', 'Cancel', 'gtk-cancel'),('confirm', 'Create Partner', 'gtk-go-forward')]}
},
'confirm': {
'actions': [],
'result': {'type': 'action', 'action': _makeOrder, 'state': 'end'}
}
}
partner_create('crm.job.partner_create')
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -0,0 +1,277 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
#
# 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/>.
#
##############################################################################
from mx.DateTime import now
import wizard
import netsvc
import ir
import pooler
from tools.translate import _
class lead2opportunity(wizard.interface):
partner_form = """<?xml version="1.0"?>
<form string="Convert To Partner">
<label string="Are you sure you want to create a partner based on this lead ?" colspan="4"/>
<label string="You may have to verify that this partner does not exist already." colspan="4"/>
<newline />
<field name="action"/>
<group attrs="{'invisible':[('action','=','create')]}">
<field name="partner_id" attrs="{'required':[('action','=','exist')]}"/>
</group>
</form>"""
partner_fields = {
'action': {'type':'selection',
'selection':[('exist','Link to an existing partner'),('create','Create a new partner')],
'string':'Action', 'required':True, 'default': lambda *a:'create'},
'partner_id' : {'type':'many2one', 'relation':'res.partner', 'string':'Partner'},
}
case_form = """<?xml version="1.0"?>
<form string="Convert To Opportunity">
<field name="name"/>
<field name="partner_id"/>
<newline/>
<field name="planned_revenue"/>
<field name="probability"/>
</form>"""
case_fields = {
'name': {'type':'char', 'size':64, 'string':'Opportunity Summary', 'required':True},
'planned_revenue': {'type':'float', 'digits':(16,2), 'string': 'Expected Revenue'},
'probability': {'type':'float', 'digits':(16,2), 'string': 'Success Probability'},
'partner_id' : {'type':'many2one', 'relation':'res.partner', 'string':'Partner'},
}
def _selectopportunity(self, cr, uid, data, context):
pool = pooler.get_pool(cr.dbname)
case_obj = pool.get('crm.lead')
for case in case_obj.browse(cr, uid, data['ids']):
if not case.partner_id:
return 'create_partner'
return {'name': case.name, 'probability': case.probability or 20.0,
'planned_revenue':case.planned_revenue, 'partner_id':case.partner_id.id}
def _selectChoice(self, cr, uid, data, context):
pool = pooler.get_pool(cr.dbname)
case_obj = pool.get('crm.lead')
for case in case_obj.browse(cr, uid, data['ids']):
if not case.partner_id:
return 'create_partner'
return 'opportunity'
def _makeOrder(self, cr, uid, data, context):
pool = pooler.get_pool(cr.dbname)
data_obj = pool.get('ir.model.data')
result = data_obj._get_id(cr, uid, 'crm', 'view_crm_case_opportunities_filter')
res = data_obj.read(cr, uid, result, ['res_id'])
id2 = data_obj._get_id(cr, uid, 'crm', 'crm_case_form_view_oppor')
id3 = data_obj._get_id(cr, uid, 'crm', 'crm_case_tree_view_oppor')
if id2:
id2 = data_obj.browse(cr, uid, id2, context=context).res_id
if id3:
id3 = data_obj.browse(cr, uid, id3, context=context).res_id
lead_case_obj = pool.get('crm.lead')
opportunity_case_obj = pool.get('crm.opportunity')
for lead in lead_case_obj.browse(cr, uid, data['ids']):
#TODO : Take other info from lead
new_opportunity_id = opportunity_case_obj.create(cr, uid, {
'name': data['form']['name'],
'planned_revenue': data['form']['planned_revenue'],
'probability': data['form']['probability'],
'partner_id': data['form']['partner_id'],
'case_id':lead.inherit_case_id.id,
})
new_opportunity = opportunity_case_obj.browse(cr, uid, new_opportunity_id)
vals = {
'partner_id': data['form']['partner_id'],
}
if not lead.case_id:
vals.update({'case_id' : new_opportunity.inherit_case_id.id})
lead_case_obj.write(cr, uid, [lead.id], vals)
lead_case_obj.case_cancel(cr, uid, [lead.id])
opportunity_case_obj.case_open(cr, uid, [new_opportunity_id])
value = {
'name': _('Opportunity'),
'view_type': 'form',
'view_mode': 'form,tree',
'res_model': 'crm.opportunity',
'res_id': int(new_opportunity_id),
'view_id': False,
'views': [(id2,'form'),(id3,'tree'),(False,'calendar'),(False,'graph')],
'type': 'ir.actions.act_window',
'search_view_id': res['res_id']
}
return value
def _makePartner(self, cr, uid, data, context):
pool = pooler.get_pool(cr.dbname)
lead_case_obj = pool.get('crm.lead')
partner_obj = pool.get('res.partner')
contact_obj = pool.get('res.partner.address')
if data['form']['action'] == 'create':
for case in lead_case_obj.browse(cr, uid, data['ids']):
partner_id = partner_obj.search(cr, uid, [('name', '=', case.partner_name or case.name)])
if partner_id:
raise wizard.except_wizard(_('Warning !'),_('A partner is already existing with the same name.'))
else:
partner_id = partner_obj.create(cr, uid, {
'name': case.partner_name or case.name,
'user_id': case.user_id.id,
'comment': case.description,
})
contact_id = contact_obj.create(cr, uid, {
'partner_id': partner_id,
'name': case.partner_name2,
'phone': case.partner_phone,
'mobile': case.partner_mobile,
'email': case.email_from
})
else:
partner = partner_obj.browse(cr,uid,data['form']['partner_id'])
partner_id = partner.id
contact_id = partner.address and partner.address[0].id
lead_case_obj.write(cr, uid, data['ids'], {
'partner_id': partner_id,
'partner_address_id': contact_id
})
return {}
states = {
'init': {
'actions': [],
'result': {'type':'choice','next_state':_selectChoice}
},
'create_partner': {
'actions': [],
'result': {'type': 'form', 'arch': partner_form, 'fields': partner_fields,
'state' : [('end', 'Cancel', 'gtk-cancel'),('create', 'Continue', 'gtk-go-forward')]}
},
'create': {
'actions': [],
'result': {'type': 'action', 'action': _makePartner, 'state':'opportunity' }
},
'opportunity': {
'actions': [_selectopportunity],
'result': {'type': 'form', 'arch': case_form, 'fields': case_fields,
'state' : [('end', 'Cancel', 'gtk-cancel'),('confirm', 'Create Opportunity', 'gtk-go-forward')]}
},
'confirm': {
'actions': [],
'result': {'type': 'action', 'action': _makeOrder, 'state': 'end'}
}
}
lead2opportunity('crm.lead.opportunity_set')
class partner_create(wizard.interface):
case_form = """<?xml version="1.0"?>
<form string="Convert To Partner">
<label string="Are you sure you want to create a partner based on this lead ?" colspan="4"/>
<label string="You may have to verify that this partner does not exist already." colspan="4"/>
<!--field name="close"/-->
</form>"""
case_fields = {
'close': {'type':'boolean', 'string':'Close Lead'}
}
def _selectPartner(self, cr, uid, data, context):
pool = pooler.get_pool(cr.dbname)
case_obj = pool.get('crm.lead')
for case in case_obj.browse(cr, uid, data['ids']):
if case.partner_id:
raise wizard.except_wizard(_('Warning !'),
_('A partner is already defined on this lead.'))
return {}
def _makeOrder(self, cr, uid, data, context):
pool = pooler.get_pool(cr.dbname)
mod_obj = pool.get('ir.model.data')
result = mod_obj._get_id(cr, uid, 'base', 'view_res_partner_filter')
res = mod_obj.read(cr, uid, result, ['res_id'])
case_obj = pool.get('crm.lead')
partner_obj = pool.get('res.partner')
contact_obj = pool.get('res.partner.address')
for case in case_obj.browse(cr, uid, data['ids']):
partner_id = partner_obj.search(cr, uid, [('name', '=', case.partner_name or case.name)])
if partner_id:
raise wizard.except_wizard(_('Warning !'),_('A partner is already existing with the same name.'))
else:
partner_id = partner_obj.create(cr, uid, {
'name': case.partner_name or case.name,
'user_id': case.user_id.id,
'comment': case.description,
})
contact_id = contact_obj.create(cr, uid, {
'partner_id': partner_id,
'name': case.partner_name2,
'phone': case.partner_phone,
'mobile': case.partner_mobile,
'email': case.email_from
})
case_obj.write(cr, uid, data['ids'], {
'partner_id': partner_id,
'partner_address_id': contact_id
})
if data['form']['close']:
case_obj.case_close(cr, uid, data['ids'])
value = {
'domain': "[]",
'view_type': 'form',
'view_mode': 'form,tree',
'res_model': 'res.partner',
'res_id': int(partner_id),
'view_id': False,
'type': 'ir.actions.act_window',
'search_view_id': res['res_id']
}
return value
states = {
'init': {
'actions': [_selectPartner],
'result': {'type': 'form', 'arch': case_form, 'fields': case_fields,
'state' : [('end', 'Cancel', 'gtk-cancel'),('confirm', 'Create Partner', 'gtk-go-forward')]}
},
'confirm': {
'actions': [],
'result': {'type': 'action', 'action': _makeOrder, 'state': 'end'}
}
}
partner_create('crm.lead.partner_create')
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -0,0 +1,208 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
# $Id$
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from mx.DateTime import now
import wizard
import netsvc
import ir
import pooler
import time
from tools.translate import _
class opportunity2phonecall(wizard.interface):
case_form = """<?xml version="1.0"?>
<form string="Schedule Phone Call">
<separator string="Phone Call Description" colspan="4" />
<newline />
<field name='user_id' />
<field name='deadline' />
<newline />
<field name='note' colspan="4"/>
<newline />
<field name='section_id' />
<field name='category_id' domain="[('section_id','=',section_id)]"/>
</form>"""
case_fields = {
'user_id' : {'string' : 'Assign To', 'type' : 'many2one', 'relation' : 'res.users'},
'deadline' : {'string' : 'Planned Date', 'type' : 'datetime'},
'note' : {'string' : 'Goals', 'type' : 'text'},
'category_id' : {'string' : 'Category', 'type' : 'many2one', 'relation' : 'crm.case.categ', 'required' :True},
'section_id' : {'string' : 'Section', 'type' : 'many2one', 'relation' : 'crm.case.section'},
}
def _default_values(self, cr, uid, data, context):
case_obj = pooler.get_pool(cr.dbname).get('crm.opportunity')
categ_id = pooler.get_pool(cr.dbname).get('crm.case.categ').search(cr, uid, [('name','=','Outbound')])
case = case_obj.browse(cr, uid, data['id'])
return {
'user_id' : case.user_id and case.user_id.id,
'category_id' : categ_id and categ_id[0] or case.categ_id and case.categ_id.id,
'section_id' : case.section_id and case.section_id or False,
'note' : case.description
}
def _doIt(self, cr, uid, data, context):
form = data['form']
pool = pooler.get_pool(cr.dbname)
mod_obj = pool.get('ir.model.data')
result = mod_obj._get_id(cr, uid, 'crm', 'view_crm_case_phonecalls_filter')
res = mod_obj.read(cr, uid, result, ['res_id'])
phonecall_case_obj = pool.get('crm.phonecall')
opportunity_case_obj = pool.get('crm.opportunity')
# Select the view
data_obj = pool.get('ir.model.data')
id2 = data_obj._get_id(cr, uid, 'crm', 'crm_case_phone_tree_view')
id3 = data_obj._get_id(cr, uid, 'crm', 'crm_case_phone_form_view')
if id2:
id2 = data_obj.browse(cr, uid, id2, context=context).res_id
if id3:
id3 = data_obj.browse(cr, uid, id3, context=context).res_id
opportunites = opportunity_case_obj.browse(cr, uid, data['ids'])
for opportunity in opportunites:
#TODO : Take Other Info from opportunity
new_case = phonecall_case_obj.create(cr, uid, {
'name' : opportunity.name,
'case_id' : opportunity.inherit_case_id.id,
'user_id' : form['user_id'],
'categ_id' : form['category_id'],
'description' : form['note'],
'date' : form['deadline'],
'section_id' : form['section_id']
}, context=context)
opportunity_case_obj.case_cancel(cr, uid, [opportunity.id])
phonecall_case_obj.case_open(cr, uid, [new_case])
value = {
'name': _('Phone Call'),
'view_type': 'form',
'view_mode': 'tree,form',
'res_model': 'crm.phonecall',
'res_id' : new_case,
'views': [(id3,'form'),(id2,'tree'),(False,'calendar'),(False,'graph')],
'type': 'ir.actions.act_window',
'search_view_id': res['res_id']
}
return value
states = {
'init': {
'actions': [_default_values],
'result': {'type': 'form', 'arch': case_form, 'fields': case_fields,
'state' : [('end', 'Cancel','gtk-cancel'),('order', 'Schedule Phone Call','gtk-go-forward')]}
},
'order': {
'actions': [],
'result': {'type': 'action', 'action': _doIt, 'state': 'end'}
}
}
opportunity2phonecall('crm.opportunity.reschedule_phone_call')
class partner_opportunity(wizard.interface):
case_form = """<?xml version="1.0"?>
<form string="Create Opportunity">
<field name="name"/>
<field name="partner_id" readonly="1"/>
<newline/>
<field name="planned_revenue"/>
<field name="probability"/>
</form>"""
case_fields = {
'name' : {'type' :'char', 'size' :64, 'string' :'Opportunity Name', 'required' :True},
'planned_revenue' : {'type' :'float', 'digits' :(16, 2), 'string' : 'Expected Revenue'},
'probability' : {'type' :'float', 'digits' :(16, 2), 'string' : 'Success Probability'},
'partner_id' : {'type' :'many2one', 'relation' :'res.partner', 'string' :'Partner'},
}
def _select_data(self, cr, uid, data, context):
pool = pooler.get_pool(cr.dbname)
part_obj = pool.get('res.partner')
part = part_obj.read(cr, uid, data['id' ], ['name'])
return {'partner_id' : data['id'], 'name' : part['name'] }
def _make_opportunity(self, cr, uid, data, context):
pool = pooler.get_pool(cr.dbname)
data_obj = pool.get('ir.model.data')
result = data_obj._get_id(cr, uid, 'crm', 'view_crm_case_opportunities_filter')
res = data_obj.read(cr, uid, result, ['res_id'])
id2 = data_obj._get_id(cr, uid, 'crm', 'crm_case_form_view_oppor')
id3 = data_obj._get_id(cr, uid, 'crm', 'crm_case_tree_view_oppor')
if id2:
id2 = data_obj.browse(cr, uid, id2, context=context).res_id
if id3:
id3 = data_obj.browse(cr, uid, id3, context=context).res_id
part_obj = pool.get('res.partner')
address = part_obj.address_get(cr, uid, data['ids' ])
categ_obj = pool.get('crm.case.categ')
categ_ids = categ_obj.search(cr, uid, [('name','ilike','Part%')])
case_obj = pool.get('crm.opportunity')
opp_id = case_obj.create(cr, uid, {
'name' : data['form']['name'],
'planned_revenue' : data['form']['planned_revenue'],
'probability' : data['form']['probability'],
'partner_id' : data['form']['partner_id'],
'partner_address_id' : address['default'],
'categ_id' : categ_ids[0],
'state' :'draft',
})
value = {
'name' : _('Opportunity'),
'view_type' : 'form',
'view_mode' : 'form,tree',
'res_model' : 'crm.opportunity',
'res_id' : opp_id,
'view_id' : False,
'views' : [(id2, 'form'), (id3, 'tree'), (False, 'calendar'), (False, 'graph')],
'type' : 'ir.actions.act_window',
'search_view_id' : res['res_id']
}
return value
states = {
'init' : {
'actions' : [_select_data],
'result' : {'type' : 'form', 'arch' : case_form, 'fields' : case_fields,
'state' : [('end', 'Cancel', 'gtk-cancel'), ('confirm', 'Create Opportunity', 'gtk-go-forward')]}
},
'confirm' : {
'actions' : [],
'result' : {'type' : 'action', 'action' : _make_opportunity, 'state' : 'end'}
}
}
partner_opportunity('crm.case.opportunity.partner_opportunity')
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -0,0 +1,349 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
#
# 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/>.
#
##############################################################################
from mx.DateTime import now
import wizard
import netsvc
import ir
import pooler
from tools.translate import _
class phonecall2opportunity(wizard.interface):
partner_form = """<?xml version="1.0"?>
<form string="Convert To Partner">
<label string="Are you sure you want to create a partner based on this phonecall ?" colspan="4"/>
<label string="You may have to verify that this partner does not exist already." colspan="4"/>
<newline />
<field name="action"/>
<group attrs="{'invisible':[('action','=','create')]}">
<field name="partner_id" attrs="{'required':[('action','=','exist')]}"/>
</group>
</form>"""
partner_fields = {
'action': {'type':'selection',
'selection':[('exist','Link to an existing partner'),('create','Create a new partner')],
'string':'Action', 'required':True, 'default': lambda *a:'create'},
'partner_id' : {'type':'many2one', 'relation':'res.partner', 'string':'Partner'},
}
case_form = """<?xml version="1.0"?>
<form string="Convert To Opportunity">
<field name="name"/>
<field name="partner_id"/>
<newline/>
<field name="planned_revenue"/>
<field name="probability"/>
</form>"""
case_fields = {
'name': {'type':'char', 'size':64, 'string':'Opportunity Summary', 'required':True},
'planned_revenue': {'type':'float', 'digits':(16,2), 'string': 'Expected Revenue'},
'probability': {'type':'float', 'digits':(16,2), 'string': 'Success Probability'},
'partner_id' : {'type':'many2one', 'relation':'res.partner', 'string':'Partner'},
}
def _selectopportunity(self, cr, uid, data, context):
pool = pooler.get_pool(cr.dbname)
case_obj = pool.get('crm.phonecall')
for case in case_obj.browse(cr, uid, data['ids']):
if not case.partner_id:
return 'create_partner'
return {'name': case.name, 'probability': case.probability or 20.0,
'planned_revenue':case.planned_revenue, 'partner_id':case.partner_id.id}
def _selectChoice(self, cr, uid, data, context):
pool = pooler.get_pool(cr.dbname)
case_obj = pool.get('crm.phonecall')
for case in case_obj.browse(cr, uid, data['ids']):
if not case.partner_id:
return 'create_partner'
return 'opportunity'
def _makeOrder(self, cr, uid, data, context):
pool = pooler.get_pool(cr.dbname)
data_obj = pool.get('ir.model.data')
result = data_obj._get_id(cr, uid, 'crm', 'view_crm_case_opportunities_filter')
res = data_obj.read(cr, uid, result, ['res_id'])
id2 = data_obj._get_id(cr, uid, 'crm', 'crm_case_form_view_oppor')
id3 = data_obj._get_id(cr, uid, 'crm', 'crm_case_tree_view_oppor')
if id2:
id2 = data_obj.browse(cr, uid, id2, context=context).res_id
if id3:
id3 = data_obj.browse(cr, uid, id3, context=context).res_id
phonecall_case_obj = pool.get('crm.phonecall')
opportunity_case_obj = pool.get('crm.opportunity')
for phonecall in phonecall_case_obj.browse(cr, uid, data['ids']):
#TODO : Take other info from phonecall
new_opportunity_id = opportunity_case_obj.create(cr, uid, {
'name': data['form']['name'],
'planned_revenue': data['form']['planned_revenue'],
'probability': data['form']['probability'],
'partner_id': data['form']['partner_id'],
'case_id':phonecall.inherit_case_id.id,
})
new_opportunity = opportunity_case_obj.browse(cr, uid, new_opportunity_id)
vals = {
'partner_id': data['form']['partner_id'],
}
if not phonecall.case_id:
vals.update({'case_id' : new_opportunity.inherit_case_id.id})
phonecall_case_obj.write(cr, uid, [phonecall.id], vals)
phonecall_case_obj.case_cancel(cr, uid, [phonecall.id])
opportunity_case_obj.case_open(cr, uid, [new_opportunity_id])
value = {
'name': _('Opportunity'),
'view_type': 'form',
'view_mode': 'form,tree',
'res_model': 'crm.opportunity',
'res_id': int(new_opportunity_id),
'view_id': False,
'views': [(id2,'form'),(id3,'tree'),(False,'calendar'),(False,'graph')],
'type': 'ir.actions.act_window',
'search_view_id': res['res_id']
}
return value
def _makePartner(self, cr, uid, data, context):
pool = pooler.get_pool(cr.dbname)
phonecall_case_obj = pool.get('crm.phonecall')
partner_obj = pool.get('res.partner')
contact_obj = pool.get('res.partner.address')
if data['form']['action']=='create':
for case in phonecall_case_obj.browse(cr, uid, data['ids']):
partner_id = partner_obj.search(cr, uid, [('name', '=', case.partner_name or case.name)])
if partner_id:
raise wizard.except_wizard(_('Warning !'),_('A partner is already existing with the same name.'))
else:
partner_id = partner_obj.create(cr, uid, {
'name': case.partner_name or case.name,
'user_id': case.user_id.id,
'comment': case.description,
})
contact_id = contact_obj.create(cr, uid, {
'partner_id': partner_id,
'name': case.partner_name2,
'phone': case.partner_phone,
'mobile': case.partner_mobile,
'email': case.email_from
})
else:
partner = partner_obj.browse(cr,uid,data['form']['partner_id'])
partner_id=partner.id
contact_id=partner.address and partner.address[0].id
phonecall_case_obj.write(cr, uid, data['ids'], {
'partner_id': partner_id,
'partner_address_id': contact_id
})
return {}
states = {
'init': {
'actions': [],
'result': {'type':'choice','next_state':_selectChoice}
},
'create_partner': {
'actions': [],
'result': {'type': 'form', 'arch': partner_form, 'fields': partner_fields,
'state' : [('end', 'Cancel', 'gtk-cancel'),('create', 'Continue', 'gtk-go-forward')]}
},
'create': {
'actions': [],
'result': {'type': 'action', 'action': _makePartner, 'state':'opportunity' }
},
'opportunity': {
'actions': [_selectopportunity],
'result': {'type': 'form', 'arch': case_form, 'fields': case_fields,
'state' : [('end', 'Cancel', 'gtk-cancel'),('confirm', 'Create Opportunity', 'gtk-go-forward')]}
},
'confirm': {
'actions': [],
'result': {'type': 'action', 'action': _makeOrder, 'state': 'end'}
}
}
phonecall2opportunity('crm.phonecall.opportunity_set')
class phonecall2meeting(wizard.interface):
case_form = """<?xml version="1.0"?>
<form string="Plan Meeting">
<field name="date"/>
<field name="duration" widget="float_time"/>
<label string="Note that you can also use the calendar view to graphically schedule your next meeting." colspan="4"/>
</form>"""
case_fields = {
'date': {'string': 'Meeting date', 'type': 'datetime', 'required': 1},
'duration': {'string': 'Duration (Hours)', 'type': 'float', 'required': 1}
}
def _selectPartner(self, cr, uid, data, context):
case_obj = pooler.get_pool(cr.dbname).get('crm.phonecall')
case = case_obj.browse(cr, uid, data['id'])
return {'date': case.date, 'duration': case.duration or 2.0}
def _makeMeeting(self, cr, uid, data, context):
pool = pooler.get_pool(cr.dbname)
phonecall_case_obj = pool.get('crm.phonecall')
meeting_case_obj = pool.get('crm.meeting')
for phonecall in phonecall_case_obj.browse(cr, uid, data['ids']):
#TODO : Take other info from phonecall
new_meeting_id = meeting_case_obj.create(cr, uid, {
'name': phonecall.name,
'date': data['form']['date'],
'duration': data['form']['duration'],
'case_id': phonecall.inherit_case_id.id,
})
new_meeting = meeting_case_obj.browse(cr, uid, new_meeting_id)
vals = {}
if not phonecall.case_id:
vals.update({'case_id' : new_meeting.inherit_case_id.id})
phonecall_case_obj.write(cr, uid, [phonecall.id], vals)
phonecall_case_obj.case_cancel(cr, uid, [phonecall.id])
meeting_case_obj.case_open(cr, uid, [new_meeting_id])
data_obj = pool.get('ir.model.data')
result = data_obj._get_id(cr, uid, 'crm', 'view_crm_case_meetings_filter')
id = data_obj.read(cr, uid, result, ['res_id'])
id1 = data_obj._get_id(cr, uid, 'crm', 'crm_case_calendar_view_meet')
id2 = data_obj._get_id(cr, uid, 'crm', 'crm_case_form_view_meet')
id3 = data_obj._get_id(cr, uid, 'crm', 'crm_case_tree_view_meet')
if id1:
id1 = data_obj.browse(cr, uid, id1, context=context).res_id
if id2:
id2 = data_obj.browse(cr, uid, id2, context=context).res_id
if id3:
id3 = data_obj.browse(cr, uid, id3, context=context).res_id
return {
'name': _('Meetings'),
'view_type': 'form',
'view_mode': 'calendar,form,tree',
'res_model': 'crm.meeting',
'view_id': False,
'views': [(id1,'calendar'),(id2,'form'),(id3,'tree'),(False,'graph')],
'type': 'ir.actions.act_window',
'search_view_id': id['res_id']
}
states = {
'init': {
'actions': [_selectPartner],
'result': {'type': 'form', 'arch': case_form, 'fields': case_fields,
'state' : [('end', 'Cancel','gtk-cancel'),('order', 'Set Meeting','gtk-go-forward')]}
},
'order': {
'actions': [],
'result': {'type': 'action', 'action': _makeMeeting, 'state': 'end'}
}
}
phonecall2meeting('crm.phonecall.meeting_set')
class partner_create(wizard.interface):
case_form = """<?xml version="1.0"?>
<form string="Convert To Partner">
<label string="Are you sure you want to create a partner based on this phonecall ?" colspan="4"/>
<label string="You may have to verify that this partner does not exist already." colspan="4"/>
<!--field name="close"/-->
</form>"""
case_fields = {
'close': {'type':'boolean', 'string':'Close Phonecall'}
}
def _selectPartner(self, cr, uid, data, context):
pool = pooler.get_pool(cr.dbname)
case_obj = pool.get('crm.phonecall')
for case in case_obj.browse(cr, uid, data['ids']):
if case.partner_id:
raise wizard.except_wizard(_('Warning !'),
_('A partner is already defined on this phonecall.'))
return {}
def _makeOrder(self, cr, uid, data, context):
pool = pooler.get_pool(cr.dbname)
mod_obj = pool.get('ir.model.data')
result = mod_obj._get_id(cr, uid, 'base', 'view_res_partner_filter')
res = mod_obj.read(cr, uid, result, ['res_id'])
case_obj = pool.get('crm.phonecall')
partner_obj = pool.get('res.partner')
contact_obj = pool.get('res.partner.address')
for case in case_obj.browse(cr, uid, data['ids']):
partner_id = partner_obj.search(cr, uid, [('name', '=', case.partner_name or case.name)])
if partner_id:
raise wizard.except_wizard(_('Warning !'),_('A partner is already existing with the same name.'))
else:
partner_id = partner_obj.create(cr, uid, {
'name': case.partner_name or case.name,
'user_id': case.user_id.id,
'comment': case.description,
})
contact_id = contact_obj.create(cr, uid, {
'partner_id': partner_id,
'name': case.partner_name2,
'phone': case.partner_phone,
'mobile': case.partner_mobile,
'email': case.email_from
})
case_obj.write(cr, uid, data['ids'], {
'partner_id': partner_id,
'partner_address_id': contact_id
})
if data['form']['close']:
case_obj.case_close(cr, uid, data['ids'])
value = {
'domain': "[]",
'view_type': 'form',
'view_mode': 'form,tree',
'res_model': 'res.partner',
'res_id': int(partner_id),
'view_id': False,
'type': 'ir.actions.act_window',
'search_view_id': res['res_id']
}
return value
states = {
'init': {
'actions': [_selectPartner],
'result': {'type': 'form', 'arch': case_form, 'fields': case_fields,
'state' : [('end', 'Cancel', 'gtk-cancel'),('confirm', 'Create Partner', 'gtk-go-forward')]}
},
'confirm': {
'actions': [],
'result': {'type': 'action', 'action': _makeOrder, 'state': 'end'}
}
}
partner_create('crm.phonecall.partner_create')
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -1,138 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
#
# 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 time
import wizard
import osv
import pooler
section_form = '''<?xml version="1.0"?>
<form string="Create Menus For Cases">
<separator string="Base Information" colspan="4"/>
<field name="menu_name"/>
<field name="menu_parent_id"/>
<field name="section_id"/>
<label string="this wizard will create all sub-menus, within the selected menu." align="0.0" colspan="4"/>
<label string="You may want to create a new parent menu to put all the created menus in." align="0.0" colspan="4"/>
<separator string="Select Views (empty for default)" colspan="4"/>
<field name="view_form"/>
<field name="view_tree"/>
<field name="view_calendar"/>
</form>'''
section_fields = {
'menu_name': {'string':'Base Menu Name', 'type':'char', 'required':True, 'size':64},
'menu_parent_id': {'string':'Parent Menu', 'type':'many2one', 'relation':'ir.ui.menu', 'required':True},
'section_id': {'string':'Case Section', 'type':'many2one', 'relation':'crm.case.section', 'required':True},
'view_form': {'string':'Form View', 'type':'many2one', 'relation':'ir.ui.view', 'domain':[('type','=','form'),('model','=','crm.case')] },
'view_tree': {'string':'Tree View', 'type':'many2one', 'relation':'ir.ui.view', 'domain':[('type','=','tree'),('model','=','crm.case')] },
'view_calendar': {'string':'Calendar View', 'type':'many2one', 'relation':'ir.ui.view', 'domain':[('type','=','calendar'),('model','=','crm.case')] }
}
menu_lst = [
(1,'My ',"[('section_id','=',SECTION_ID),('user_id','=',uid)]", 0, 'tree,form,calendar'),
(2,'My Unclosed ',"[('section_id','=',SECTION_ID),('user_id','=',uid), ('state','<>','cancel'), ('state','<>','done')]", 1, 'tree,form,calendar'),
(5,'My Open ',"[('section_id','=',SECTION_ID),('user_id','=',uid), ('state','=','open')]", 2, 'tree,form,calendar'),
(6,'My Pending ',"[('section_id','=',SECTION_ID),('user_id','=',uid), ('state','=','pending')]", 2, 'tree,form,calendar'),
(7,'My Draft ',"[('section_id','=',SECTION_ID),('user_id','=',uid), ('state','=','draft')]", 2, 'tree,form,calendar'),
(3,'My Late ',"[('section_id','=',SECTION_ID),('user_id','=',uid), ('date_deadline','<=',time.strftime('%Y-%m-%d')), ('state','<>','cancel'), ('state','<>','done')]", 1, 'tree,form,calendar'),
(4,'My Canceled ',"[('section_id','=',SECTION_ID),('user_id','=',uid), ('state','=','cancel')]", 1, 'no'),
(8,'All ',"[('section_id','=',SECTION_ID),]", 0, 'tree,form,calendar'),
(9,'All Unassigned ',"[('section_id','=',SECTION_ID),('user_id','=',False)]", 8, 'no'),
(10,'All Late ',"[('section_id','=',SECTION_ID),('user_id','=',uid), ('date_deadline','<=',time.strftime('%Y-%m-%d')), ('state','<>','cancel'), ('state','<>','done')]", 8, 'no'),
(11,'All Canceled ',"[('section_id','=',SECTION_ID),('state','=','cancel')]", 8, 'no'),
(12,'All Unclosed ',"[('section_id','=',SECTION_ID),('state','<>','cancel'), ('state','<>','done')]", 8, 'tree,form,calendar'),
(13,'All Open ',"[('section_id','=',SECTION_ID),('state','=','open')]", 12, 'tree,form,calendar'),
(14,'All Pending ',"[('section_id','=',SECTION_ID),('state','=','pending')]", 12, 'tree,form,calendar'),
(15,'All Draft ',"[('section_id','=',SECTION_ID),('state','=','draft')]", 12, 'tree,form,calendar'),
(16,'All Unclosed and Unassigned ',"[('section_id','=',SECTION_ID),('user_id','=',False),('state','<>','cancel'),('state','<>','done')]", 12, 'no'),
(17,'New ',"[('section_id','=',SECTION_ID)]", 0, 'form,tree,calendar'),
]
section_menu_form = '''<?xml version="1.0"?>
<form string="Created Menus" width="800">
<separator string="Update The Proposed Menus To Be Created" colspan="4"/>
''' + '\n'.join(map(lambda x: '\t<field name="menu%d" colspan="3"/> <field name="menu%d_option" nolabel="1"/>' % (x[0],x[0]), menu_lst)) + '''\n</form>'''
section_menu_fields = { }
for menu in menu_lst:
section_menu_fields['menu'+str(menu[0])] = {
'string': menu[1],
'type': 'char',
'size': 64,
'required': True
}
section_menu_fields['menu'+str(menu[0])+'_option'] = {
'string': menu[1],
'type': 'selection',
'selection': [
('no',"Don't Create"),
('form,tree','New Form'),
('form,tree,calendar','New With Calendar'),
('tree,form,calendar','List'),
('tree,form,calendar','List With Calendar'),
('calendar,tree,form','Calendar'),
],
'size': 64,
'required': True,
}
def case_menu_create(self, cr, uid, data, context):
pool = pooler.get_pool(cr.dbname)
pool.get('crm.case.section').menu_create_data(cr, uid, data['form'], menu_lst, context)
return {}
def _menu_default(self, cr, uid, data, context):
result = {}
for menu in menu_lst:
result['menu'+str(menu[0])] = menu[1] + data['form']['menu_name']
result['menu'+str(menu[0])+'_option'] = menu[4]
return result
class wizard_section_menu_create(wizard.interface):
states = {
'init': {
'actions': [],
'result': {'type':'form', 'arch':section_form, 'fields':section_fields, 'state':[('end','Cancel'),('design_menu','Create menu Entries')]}
},
'design_menu': {
'actions': [_menu_default],
'result': {
'type':'form',
'arch':section_menu_form,
'fields':section_menu_fields,
'state':[
('end','Cancel'),
('create','Create menu Entries')
]
}
},
'create': {
'actions': [case_menu_create],
'result': {'type':'state', 'state':'end'}
}
}
wizard_section_menu_create('crm.case.section.menu')
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -1,109 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
#
# 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/>.
#
##############################################################################
from mx.DateTime import now
import wizard
import netsvc
import ir
import pooler
from tools.translate import _
case_form = """<?xml version="1.0"?>
<form string="Plan Meeting">
<field name="date"/>
<field name="duration" widget="float_time"/>
<label string="Note that you can also use the calendar view to graphically schedule your next meeting." colspan="4"/>
</form>"""
case_fields = {
'date': {'string': 'Meeting date', 'type': 'datetime', 'required': 1},
'duration': {'string': 'Duration (Hours)', 'type': 'float', 'required': 1}
}
class make_meeting(wizard.interface):
def _selectPartner(self, cr, uid, data, context):
case_obj = pooler.get_pool(cr.dbname).get('crm.case')
case = case_obj.browse(cr, uid, data['id'])
return {'date': case[0].date, 'duration': case[0].duration or 2.0}
def _makeMeeting(self, cr, uid, data, context):
pool = pooler.get_pool(cr.dbname)
case_obj = pool.get('crm.case')
sec_obj = pool.get('crm.case.section')
meeting_id = sec_obj.search(cr, uid, [('code','=','Mtngs')])
if not meeting_id:
raise wizard.except_wizard(_('Error !'),
_('You did not installed the Meetings when you configured the crm module.' \
'\nyou must create a section with the code \'Mtngs\'.'
))
for case in case_obj.browse(cr, uid, data['ids']):
new_id=case_obj.copy(cr, uid, case.id)
modif = {
'date': data['form']['date'],
'duration': data['form']['duration'],
'case_id': case.id,
}
if meeting_id:
modif['section_id']=meeting_id[0]
new_id = case_obj.write(cr, uid, [new_id], modif, context=context)
# case_obj._history(cr, uid, case_obj.browse(cr, uid, data['ids']), _('meeting'))
data_obj = pool.get('ir.model.data')
result = data_obj._get_id(cr, uid, 'crm', 'view_crm_case_meetings_filter')
id = data_obj.read(cr, uid, result, ['res_id'])
id1 = data_obj._get_id(cr, uid, 'crm', 'crm_case_calendar_view_meet')
id2 = data_obj._get_id(cr, uid, 'crm', 'crm_case_form_view_meet')
id3 = data_obj._get_id(cr, uid, 'crm', 'crm_case_tree_view_meet')
if id1:
id1 = data_obj.browse(cr, uid, id1, context=context).res_id
if id2:
id2 = data_obj.browse(cr, uid, id2, context=context).res_id
if id3:
id3 = data_obj.browse(cr, uid, id3, context=context).res_id
return {
'domain':"[('section_id','=','Meetings')]",
'name': _('Meetings'),
'view_type': 'form',
'view_mode': 'calendar,form,tree',
'res_model': 'crm.case',
'view_id': False,
'views': [(id1,'calendar'),(id2,'form'),(id3,'tree'),(False,'graph')],
'type': 'ir.actions.act_window',
'search_view_id': id['res_id']
}
states = {
'init': {
'actions': [_selectPartner],
'result': {'type': 'form', 'arch': case_form, 'fields': case_fields,
'state' : [('end', 'Cancel','gtk-cancel'),('order', 'Set Meeting','gtk-go-forward')]}
},
'order': {
'actions': [],
'result': {'type': 'action', 'action': _makeMeeting, 'state': 'end'}
}
}
make_meeting('crm.case.meeting')
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -1,127 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
# $Id$
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from mx.DateTime import now
import wizard
import netsvc
import ir
import pooler
import time
from tools.translate import _
case_form = """<?xml version="1.0"?>
<form string="Schedule Phone Call">
<separator string="Phone Call Description" colspan="4" />
<newline />
<field name='user_id' />
<field name='deadline' />
<newline />
<field name='note' colspan="4"/>
<newline />
<field name='section_id' />
<field name='category_id' domain="[('section_id','=',section_id)]"/>
</form>"""
case_fields = {
'user_id' : {'string' : 'Assign To', 'type' : 'many2one', 'relation' : 'res.users'},
'deadline' : {'string' : 'Planned Date', 'type' : 'datetime'},
'note' : {'string' : 'Goals', 'type' : 'text'},
'category_id' : {'string' : 'Category', 'type' : 'many2one', 'relation' : 'crm.case.categ', 'required' : True},
'section_id' : {'string' : 'Section', 'type' : 'many2one', 'relation' : 'crm.case.section', 'required' : True},
}
class reschedule_phone_call(wizard.interface):
def _default_values(self, cr, uid, data, context):
case_obj = pooler.get_pool(cr.dbname).get('crm.case')
sec_obj = pooler.get_pool(cr.dbname).get('crm.case.section')
sec_id = sec_obj.search(cr, uid, [('code', '=', 'Phone')])
if not sec_id:
raise wizard.except_wizard(_('Error !'),
_('You did not installed the Phone Calls when you configured the crm module.' \
'\nyou must create a section with the code \'Phone\'.'
))
categ_id=pooler.get_pool(cr.dbname).get('crm.case.categ').search(cr, uid, [('name','=','Outbound')])
case = case_obj.browse(cr, uid, data['ids'][0])
return {
'user_id' : case.user_id and case.user_id.id,
'category_id' : categ_id and categ_id[0] or case.categ_id and case.categ_id.id,
'section_id' : sec_id and sec_id[0],
'note' : case.description
}
def _doIt(self, cr, uid, data, context):
form = data['form']
pool = pooler.get_pool(cr.dbname)
mod_obj = pool.get('ir.model.data')
result = mod_obj._get_id(cr, uid, 'crm', 'view_crm_case_phonecalls_filter')
res = mod_obj.read(cr, uid, result, ['res_id'])
case_obj = pool.get('crm.case')
# Select the view
data_obj = pool.get('ir.model.data')
id2 = data_obj._get_id(cr, uid, 'crm', 'crm_case_phone_tree_view')
id3 = data_obj._get_id(cr, uid, 'crm', 'crm_case_phone_form_view')
if id2:
id2 = data_obj.browse(cr, uid, id2, context=context).res_id
if id3:
id3 = data_obj.browse(cr, uid, id3, context=context).res_id
# We duplicate the current object
for id in data['ids']:
new_case = case_obj.copy(cr, uid, id, {'case_id':id,'user_id':form['user_id'],'categ_id':form['category_id'],'description':form['note'],'date' : form['deadline'], 'section_id' : form['section_id']}, context=context)
# Don't forget to cancel the current object,
for case in case_obj.browse(cr, uid, data['ids']):
if case.section_id.code == 'Phone':
case_obj.write(cr, uid, [case.id], {'state' : 'cancel'})
value = {
'domain': "[('section_id','=',%d)]"%form['section_id'],
'name': _('Phone Call'),
'view_type': 'form',
'view_mode': 'tree,form',
'res_model': 'crm.case',
'res_id' : new_case,
'views': [(id3,'form'),(id2,'tree'),(False,'calendar'),(False,'graph')],
'type': 'ir.actions.act_window',
'search_view_id': res['res_id']
}
return value
states = {
'init': {
'actions': [_default_values],
'result': {'type': 'form', 'arch': case_form, 'fields': case_fields,
'state' : [('end', 'Cancel','gtk-cancel'),('order', 'Schedule Phone Call','gtk-go-forward')]}
},
'order': {
'actions': [],
'result': {'type': 'action', 'action': _doIt, 'state': 'end'}
}
}
reschedule_phone_call('crm.case.reschedule_phone_call')
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -1,201 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
#
# 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/>.
#
##############################################################################
from mx.DateTime import now
import wizard
import netsvc
import ir
import pooler
from tools.translate import _
partner_form = """<?xml version="1.0"?>
<form string="Convert To Partner">
<label string="Are you sure you want to create a partner based on this prospect ?" colspan="4"/>
<label string="You may have to verify that this partner does not exist already." colspan="4"/>
<newline />
<field name="action"/>
<group attrs="{'invisible':[('action','=','create')]}">
<field name="partner_id" attrs="{'required':[('action','=','exist')]}"/>
</group>
</form>"""
partner_fields = {
'action': {'type':'selection',
'selection':[('exist','Link to an existing partner'),('create','Create a new partner')],
'string':'Action', 'required':True, 'default': lambda *a:'create'},
'partner_id' : {'type':'many2one', 'relation':'res.partner', 'string':'Partner'},
}
case_form = """<?xml version="1.0"?>
<form string="Convert To Opportunity">
<field name="name"/>
<field name="partner_id"/>
<newline/>
<field name="planned_revenue"/>
<field name="probability"/>
</form>"""
case_fields = {
'name': {'type':'char', 'size':64, 'string':'Opportunity Summary', 'required':True},
'planned_revenue': {'type':'float', 'digits':(16,2), 'string': 'Expected Revenue'},
'probability': {'type':'float', 'digits':(16,2), 'string': 'Success Probability'},
'partner_id' : {'type':'many2one', 'relation':'res.partner', 'string':'Partner'},
}
class make_opportunity(wizard.interface):
def _selectopportunity(self, cr, uid, data, context):
pool = pooler.get_pool(cr.dbname)
case_obj = pool.get('crm.case')
for case in case_obj.browse(cr, uid, data['ids']):
if not case.partner_id:
return 'create_partner'
return {'name': case.name, 'probability': case.probability or 20.0,
'planned_revenue':case.planned_revenue, 'partner_id':case.partner_id.id}
def _selectChoice(self, cr, uid, data, context):
pool = pooler.get_pool(cr.dbname)
case_obj = pool.get('crm.case')
for case in case_obj.browse(cr, uid, data['ids']):
if not case.partner_id:
return 'create_partner'
return 'opportunity'
def _makeOrder(self, cr, uid, data, context):
pool = pooler.get_pool(cr.dbname)
data_obj = pool.get('ir.model.data')
result = data_obj._get_id(cr, uid, 'crm', 'view_crm_case_opportunities_filter')
res = data_obj.read(cr, uid, result, ['res_id'])
section_obj = pool.get('crm.case.section')
id = section_obj.search(cr, uid, [('code','=','oppor')], context=context)
if not id:
raise wizard.except_wizard(_('Error !'),
_('You did not installed the opportunities tracking when you configured the crm module.' \
'\nYou can not convert the prospect to an opportunity, you must create a section with the code \'oppor\'.'
))
id = id[0]
id2 = data_obj._get_id(cr, uid, 'crm', 'crm_case_form_view_oppor')
id3 = data_obj._get_id(cr, uid, 'crm', 'crm_case_tree_view_oppor')
if id2:
id2 = data_obj.browse(cr, uid, id2, context=context).res_id
if id3:
id3 = data_obj.browse(cr, uid, id3, context=context).res_id
case_obj = pool.get('crm.case')
new_pros=case_obj.copy(cr, uid, data['id'])
# case_obj._history(cr, uid, case_obj.browse(cr, uid, [new_pros]), 'convert')
case_obj.write(cr, uid, [new_pros], {
'section_id': id,
'name': data['form']['name'],
'planned_revenue': data['form']['planned_revenue'],
'probability': data['form']['probability'],
'partner_id': data['form']['partner_id'],
'case_id':data['id'],
'state':'open',
})
vals = {
'partner_id': data['form']['partner_id'],
'state':'done',
}
case_id = case_obj.read(cr, uid, data['id'], ['case_id'])['case_id']
if not case_id:
vals.update({'case_id' : new_pros})
case_obj.write(cr, uid, [data['id']], vals)
value = {
'domain': "[('section_id','=',%d)]"%(id),
'name': _('Opportunity'),
'view_type': 'form',
'view_mode': 'form,tree',
'res_model': 'crm.case',
'res_id': int(new_pros),
'view_id': False,
'views': [(id2,'form'),(id3,'tree'),(False,'calendar'),(False,'graph')],
'type': 'ir.actions.act_window',
'search_view_id': res['res_id']
}
return value
def _makePartner(self, cr, uid, data, context):
pool = pooler.get_pool(cr.dbname)
case_obj = pool.get('crm.case')
partner_obj = pool.get('res.partner')
contact_obj = pool.get('res.partner.address')
if data['form']['action']=='create':
for case in case_obj.browse(cr, uid, data['ids']):
partner_id = partner_obj.search(cr, uid, [('name', '=', case.partner_name or case.name)])
if partner_id:
raise wizard.except_wizard(_('Warning !'),_('A partner is already existing with the same name.'))
else:
partner_id = partner_obj.create(cr, uid, {
'name': case.partner_name or case.name,
'user_id': case.user_id.id,
'comment': case.description,
})
contact_id = contact_obj.create(cr, uid, {
'partner_id': partner_id,
'name': case.partner_name2,
'phone': case.partner_phone,
'mobile': case.partner_mobile,
'email': case.email_from
})
else:
partner = partner_obj.browse(cr,uid,data['form']['partner_id'])
partner_id=partner.id
contact_id=partner.address and partner.address[0].id
case_obj.write(cr, uid, data['ids'], {
'partner_id': partner_id,
'partner_address_id': contact_id
})
return {}
states = {
'init': {
'actions': [],
'result': {'type':'choice','next_state':_selectChoice}
},
'create_partner': {
'actions': [],
'result': {'type': 'form', 'arch': partner_form, 'fields': partner_fields,
'state' : [('end', 'Cancel', 'gtk-cancel'),('create', 'Continue', 'gtk-go-forward')]}
},
'create': {
'actions': [],
'result': {'type': 'action', 'action': _makePartner, 'state':'opportunity' }
},
'opportunity': {
'actions': [_selectopportunity],
'result': {'type': 'form', 'arch': case_form, 'fields': case_fields,
'state' : [('end', 'Cancel', 'gtk-cancel'),('confirm', 'Create Opportunity', 'gtk-go-forward')]}
},
'confirm': {
'actions': [],
'result': {'type': 'action', 'action': _makeOrder, 'state': 'end'}
}
}
make_opportunity('crm.case.opportunity_set')
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -1,113 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
#
# 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/>.
#
##############################################################################
from mx.DateTime import now
import wizard
import netsvc
import ir
import pooler
from tools.translate import _
case_form = """<?xml version="1.0"?>
<form string="Convert To Partner">
<label string="Are you sure you want to create a partner based on this prospect ?" colspan="4"/>
<label string="You may have to verify that this partner does not exist already." colspan="4"/>
<!--field name="close"/-->
</form>"""
case_fields = {
'close': {'type':'boolean', 'string':'Close Prospect'}
}
class make_partner(wizard.interface):
def _selectPartner(self, cr, uid, data, context):
pool = pooler.get_pool(cr.dbname)
case_obj = pool.get('crm.case')
for case in case_obj.browse(cr, uid, data['ids']):
if case.partner_id:
raise wizard.except_wizard(_('Warning !'),
_('A partner is already defined on this prospect.'))
return {}
def _makeOrder(self, cr, uid, data, context):
pool = pooler.get_pool(cr.dbname)
mod_obj = pool.get('ir.model.data')
result = mod_obj._get_id(cr, uid, 'base', 'view_res_partner_filter')
res = mod_obj.read(cr, uid, result, ['res_id'])
case_obj = pool.get('crm.case')
partner_obj = pool.get('res.partner')
contact_obj = pool.get('res.partner.address')
for case in case_obj.browse(cr, uid, data['ids']):
partner_id = partner_obj.search(cr, uid, [('name', '=', case.partner_name or case.name)])
if partner_id:
raise wizard.except_wizard(_('Warning !'),_('A partner is already existing with the same name.'))
else:
partner_id = partner_obj.create(cr, uid, {
'name': case.partner_name or case.name,
'user_id': case.user_id.id,
'comment': case.description,
})
contact_id = contact_obj.create(cr, uid, {
'partner_id': partner_id,
'name': case.partner_name2,
'phone': case.partner_phone,
'mobile': case.partner_mobile,
'email': case.email_from
})
case_obj.write(cr, uid, data['ids'], {
'partner_id': partner_id,
'partner_address_id': contact_id
})
if data['form']['close']:
case_obj.case_close(cr, uid, data['ids'])
value = {
'domain': "[]",
'view_type': 'form',
'view_mode': 'form,tree',
'res_model': 'res.partner',
'res_id': int(partner_id),
'view_id': False,
'type': 'ir.actions.act_window',
'search_view_id': res['res_id']
}
return value
states = {
'init': {
'actions': [_selectPartner],
'result': {'type': 'form', 'arch': case_form, 'fields': case_fields,
'state' : [('end', 'Cancel', 'gtk-cancel'),('confirm', 'Create Partner', 'gtk-go-forward')]}
},
'confirm': {
'actions': [],
'result': {'type': 'action', 'action': _makeOrder, 'state': 'end'}
}
}
make_partner('crm.case.partner_create')
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -1,124 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
#
# 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/>.
#
##############################################################################
from mx.DateTime import now
import wizard
import netsvc
import ir
import pooler
from tools.translate import _
case_form = """<?xml version="1.0"?>
<form string="Create Opportunity">
<field name="name"/>
<field name="partner_id" readonly="1"/>
<newline/>
<field name="planned_revenue"/>
<field name="probability"/>
</form>"""
case_fields = {
'name' : {'type' :'char', 'size' :64, 'string' :'Opportunity Name', 'required' :True},
'planned_revenue' : {'type' :'float', 'digits' :(16, 2), 'string' : 'Expected Revenue'},
'probability' : {'type' :'float', 'digits' :(16, 2), 'string' : 'Success Probability'},
'partner_id' : {'type' :'many2one', 'relation' :'res.partner', 'string' :'Partner'},
}
class create_opportunity(wizard.interface):
def _select_data(self, cr, uid, data, context):
pool = pooler.get_pool(cr.dbname)
part_obj = pool.get('res.partner')
part = part_obj.read(cr, uid, data['id' ], ['name'])
return {'partner_id' : data['id'], 'name' : part['name'] }
def _make_opportunity(self, cr, uid, data, context):
pool = pooler.get_pool(cr.dbname)
data_obj = pool.get('ir.model.data')
result = data_obj._get_id(cr, uid, 'crm', 'view_crm_case_opportunities_filter')
res = data_obj.read(cr, uid, result, ['res_id'])
section_obj = pool.get('crm.case.section')
id = section_obj.search(cr, uid, [('code', '=', 'oppor')], context=context)
if not id:
raise wizard.except_wizard(_('Error !'),
_('You did not installed the opportunities tracking when you configured the crm module.' \
'\nYou can not convert the prospect to an opportunity, you must create a section with the code \'oppor\'.'
))
id = id[0]
id2 = data_obj._get_id(cr, uid, 'crm', 'crm_case_form_view_oppor')
id3 = data_obj._get_id(cr, uid, 'crm', 'crm_case_tree_view_oppor')
if id2:
id2 = data_obj.browse(cr, uid, id2, context=context).res_id
if id3:
id3 = data_obj.browse(cr, uid, id3, context=context).res_id
part_obj = pool.get('res.partner')
address = part_obj.address_get(cr, uid, data['ids' ])
categ_obj = pool.get('crm.case.categ')
categ_ids = categ_obj.search(cr, uid, [('section_id','=',id), ('name','ilike','Part%')])
case_obj = pool.get('crm.case')
opp_id = case_obj.create(cr, uid, {
'section_id' : id,
'name' : data['form']['name'],
'planned_revenue' : data['form']['planned_revenue'],
'probability' : data['form']['probability'],
'partner_id' : data['form']['partner_id'],
'partner_address_id' : address['default'],
'categ_id' : categ_ids[0],
'case_id' :data['id'],
'state' :'draft',
})
value = {
'domain' : "[('section_id','=',%d)]"%(id),
'name' : _('Opportunity'),
'view_type' : 'form',
'view_mode' : 'form,tree',
'res_model' : 'crm.case',
'res_id' : opp_id,
'view_id' : False,
'views' : [(id2, 'form'), (id3, 'tree'), (False, 'calendar'), (False, 'graph')],
'type' : 'ir.actions.act_window',
'search_view_id' : res['res_id']
}
return value
states = {
'init' : {
'actions' : [_select_data],
'result' : {'type' : 'form', 'arch' : case_form, 'fields' : case_fields,
'state' : [('end', 'Cancel', 'gtk-cancel'), ('confirm', 'Create Opportunity', 'gtk-go-forward')]}
},
'confirm' : {
'actions' : [],
'result' : {'type' : 'action', 'action' : _make_opportunity, 'state' : 'end'}
}
}
create_opportunity('crm.case.partner.opportunity_create')
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -22,4 +22,5 @@
import crm_project_bug
import crm_project_future
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -22,7 +22,7 @@
{
'name': 'Customer Relationship Management',
'name': 'CRM Stuff in Project Management',
'version': '1.0',
'category': 'Generic Modules/CRM & SRM',
'description': """
@ -30,13 +30,17 @@
""",
'author': 'Tiny',
'website': 'http://www.openerp.com',
'depends': [ 'crm','project'],
'init_xml': [ 'crm_bugs_data.xml'
'depends': ['crm','project'],
'init_xml': [
'crm_bugs_data.xml'
],
'update_xml': [ 'crm_bugs_view.xml',
'crm_bugs_menu.xml',
],
'demo_xml': [],
'update_xml': [
'crm_bugs_view.xml',
'crm_bugs_menu.xml',
'crm_future_view.xml',
'crm_future_menu.xml',
],
'demo_xml': ['crm_bugs_demo.xml'],
'installable': True,
'active': False,
'certificate': '',

View File

@ -8,15 +8,15 @@
<record id="crm_case_buginaccountsmodule0" model="crm.project.bug">
<field name="partner_address_id" ref="base.res_partner_address_8"/>
<field eval="time.strftime('%Y-%m-08 10:15:00')" name="date"/>
<field name="category2_id" ref="crm.category1"/>
<field name="category2_id" ref="category1"/>
<field eval="&quot;5&quot;" name="priority"/>
<field name="user_id" ref="base.user_root"/>
<field name="partner_id" ref="base.res_partner_agrolait"/>
<field eval="&quot;open&quot;" name="state"/>
<field name="section_id" ref="crm.section_support"/>
<field name="section_id" ref="section_support"/>
<field eval="1" name="active"/>
<field name="categ_id" ref="crm.categ1"/>
<field name="stage_id" ref="crm.stage1"/>
<field name="categ_id" ref="categ1"/>
<field name="stage_id" ref="stage1"/>
<field eval="15.0" name="duration"/>
<field eval="&quot;Bug in Accounts module&quot;" name="name"/>
<field eval="&quot;agr@agrolait.com&quot;" name="email_from"/>
@ -32,175 +32,175 @@
<record id="crm_case_programnotgivingproperoutput0" model="crm.project.bug">
<field name="partner_address_id" ref="base.res_partner_address_tang"/>
<field eval="time.strftime('%Y-%m-15 12:50:00')" name="date"/>
<field name="category2_id" ref="crm.category2"/>
<field name="category2_id" ref="category2"/>
<field eval="&quot;3&quot;" name="priority"/>
<field name="user_id" ref="base.user_root"/>
<field name="partner_id" ref="base.res_partner_asus"/>
<field eval="&quot;done&quot;" name="state"/>
<field name="section_id" ref="crm.section_support"/>
<field name="section_id" ref="section_support"/>
<field eval="1" name="active"/>
<field eval="3.5" name="duration"/>
<field name="categ_id" ref="crm.categ1"/>
<field name="stage_id" ref="crm.stage2"/>
<field name="categ_id" ref="categ1"/>
<field name="stage_id" ref="stage2"/>
<field eval="&quot;Program not giving proper output&quot;" name="name"/>
</record>
<record id="crm_case_outputincorrect0" model="crm.project.bug">
<field name="partner_address_id" ref="base.res_partner_address_9"/>
<field eval="time.strftime('%Y-%m-18 14:30:00')" name="date"/>
<field name="category2_id" ref="crm.category1"/>
<field name="category2_id" ref="category1"/>
<field eval="&quot;4&quot;" name="priority"/>
<field name="user_id" ref="base.user_demo"/>
<field name="partner_id" ref="base.res_partner_2"/>
<field eval="&quot;cancel&quot;" name="state"/>
<field name="section_id" ref="crm.section_support"/>
<field name="section_id" ref="section_support"/>
<field eval="1" name="active"/>
<field eval="2.3" name="duration"/>
<field name="categ_id" ref="crm.categ1"/>
<field name="stage_id" ref="crm.stage3"/>
<field name="categ_id" ref="categ1"/>
<field name="stage_id" ref="stage3"/>
<field eval="&quot;Output incorrect&quot;" name="name"/>
</record>
<record id="crm_case_problemloadingpage0" model="crm.project.bug">
<field name="partner_address_id" ref="base.res_partner_address_13"/>
<field eval="time.strftime('%Y-%m-20 15:25:05')" name="date"/>
<field name="category2_id" ref="crm.category1"/>
<field name="category2_id" ref="category1"/>
<field eval="&quot;3&quot;" name="priority"/>
<field name="user_id" ref="base.user_root"/>
<field name="partner_id" ref="base.res_partner_14"/>
<field eval="&quot;cancel&quot;" name="state"/>
<field name="section_id" ref="crm.section_support"/>
<field name="section_id" ref="section_support"/>
<field eval="1" name="active"/>
<field eval="4.0" name="duration"/>
<field name="categ_id" ref="crm.categ1"/>
<field name="stage_id" ref="crm.stage4"/>
<field name="categ_id" ref="categ1"/>
<field name="stage_id" ref="stage4"/>
<field eval="&quot;Problem loading page&quot;" name="name"/>
</record>
<record id="crm_case_pagenotfound0" model="crm.project.bug">
<field eval="time.strftime('%Y-%m-22 18:15:00')" name="date"/>
<field name="category2_id" ref="crm.category1"/>
<field name="category2_id" ref="category1"/>
<field eval="&quot;3&quot;" name="priority"/>
<field name="user_id" ref="base.user_root"/>
<field name="partner_id" ref="base.res_partner_desertic_hispafuentes"/>
<field eval="&quot;draft&quot;" name="state"/>
<field name="section_id" ref="crm.section_support"/>
<field name="section_id" ref="section_support"/>
<field eval="1" name="active"/>
<field eval="1.0" name="duration"/>
<field name="categ_id" ref="crm.categ1"/>
<field name="stage_id" ref="crm.stage5"/>
<field name="categ_id" ref="categ1"/>
<field name="stage_id" ref="stage5"/>
<field eval="&quot;Page not Found&quot;" name="name"/>
</record>
<record id="crm_case_programmingerror0" model="crm.project.bug">
<field name="partner_address_id" ref="base.res_partner_address_10"/>
<field eval="time.strftime('%Y-%m-24 09:45:00')" name="date"/>
<field name="category2_id" ref="crm.category2"/>
<field name="category2_id" ref="category2"/>
<field eval="&quot;3&quot;" name="priority"/>
<field name="user_id" ref="base.user_root"/>
<field name="partner_id" ref="base.res_partner_5"/>
<field eval="&quot;pending&quot;" name="state"/>
<field name="section_id" ref="crm.section_support"/>
<field name="section_id" ref="section_support"/>
<field eval="1" name="active"/>
<field eval="4.0" name="duration"/>
<field name="categ_id" ref="crm.categ1"/>
<field name="stage_id" ref="crm.stage6"/>
<field name="categ_id" ref="categ1"/>
<field name="stage_id" ref="stage6"/>
<field eval="&quot;Programming Error&quot;" name="name"/>
</record>
<record id="crm_case_logicalerrorinprogram0" model="crm.project.bug">
<field name="partner_address_id" ref="base.res_partner_address_6"/>
<field eval="time.strftime('%Y-%m-26 11:10:00')" name="date"/>
<field name="category2_id" ref="crm.category1"/>
<field name="category2_id" ref="category1"/>
<field eval="&quot;2&quot;" name="priority"/>
<field name="user_id" ref="base.user_root"/>
<field name="partner_id" ref="base.res_partner_6"/>
<field eval="&quot;pending&quot;" name="state"/>
<field name="section_id" ref="crm.section_support"/>
<field name="section_id" ref="section_support"/>
<field eval="1" name="active"/>
<field eval="2.0" name="duration"/>
<field name="categ_id" ref="crm.categ1"/>
<field name="stage_id" ref="crm.stage7"/>
<field name="categ_id" ref="categ1"/>
<field name="stage_id" ref="stage7"/>
<field eval="&quot;Logical Error in Program&quot;" name="name"/>
</record>
<record id="crm_case_constrainterror0" model="crm.project.bug">
<field name="partner_address_id" ref="base.res_partner_address_6"/>
<field eval="time.strftime('%Y-%m-25 13:35:00')" name="date"/>
<field name="category2_id" ref="crm.category1"/>
<field name="category2_id" ref="category1"/>
<field eval="&quot;2&quot;" name="priority"/>
<field name="user_id" ref="base.user_root"/>
<field name="partner_id" ref="base.res_partner_6"/>
<field eval="&quot;pending&quot;" name="state"/>
<field name="section_id" ref="crm.section_support"/>
<field name="section_id" ref="section_support"/>
<field eval="1" name="active"/>
<field eval="7.3" name="duration"/>
<field name="categ_id" ref="crm.categ1"/>
<field name="stage_id" ref="crm.stage5"/>
<field name="categ_id" ref="categ1"/>
<field name="stage_id" ref="stage5"/>
<field eval="&quot;Constraint Error&quot;" name="name"/>
</record>
<record id="crm_case_errorinprogram0" model="crm.project.bug">
<field name="partner_address_id" ref="base.res_partner_address_10"/>
<field eval="time.strftime('%Y-%m-28 15:40:00')" name="date"/>
<field name="category2_id" ref="crm.category2"/>
<field name="category2_id" ref="category2"/>
<field eval="&quot;2&quot;" name="priority"/>
<field name="user_id" ref="base.user_demo"/>
<field name="partner_id" ref="base.res_partner_5"/>
<field eval="&quot;open&quot;" name="state"/>
<field name="section_id" ref="crm.section_support"/>
<field name="section_id" ref="section_support"/>
<field eval="1" name="active"/>
<field eval="1.3" name="duration"/>
<field name="categ_id" ref="crm.categ2"/>
<field name="stage_id" ref="crm.stage5"/>
<field name="categ_id" ref="categ2"/>
<field name="stage_id" ref="stage5"/>
<field eval="&quot;Error in Program&quot;" name="name"/>
</record>
<record id="crm_case_patcheserrorinprogram0" model="crm.project.bug">
<field name="partner_address_id" ref="base.res_partner_address_9"/>
<field eval="time.strftime('%Y-%m-28 16:30:00')" name="date"/>
<field name="category2_id" ref="crm.category2"/>
<field name="category2_id" ref="category2"/>
<field eval="&quot;2&quot;" name="priority"/>
<field name="user_id" ref="base.user_root"/>
<field name="partner_id" ref="base.res_partner_2"/>
<field eval="&quot;open&quot;" name="state"/>
<field name="section_id" ref="crm.section_support"/>
<field name="section_id" ref="section_support"/>
<field eval="1" name="active"/>
<field eval="13.0" name="duration"/>
<field name="categ_id" ref="crm.categ2"/>
<field name="stage_id" ref="crm.stage5"/>
<field name="categ_id" ref="categ2"/>
<field name="stage_id" ref="stage5"/>
<field eval="&quot;Patches Error in Program&quot;" name="name"/>
</record>
<record id="crm_case_newfeaturestobeadded0" model="crm.project.bug">
<field name="partner_address_id" ref="base.res_partner_address_wong"/>
<field eval="time.strftime('%Y-%m-01 12:15:10')" name="date"/>
<field name="category2_id" ref="crm.category1"/>
<field name="category2_id" ref="category1"/>
<field eval="&quot;4&quot;" name="priority"/>
<field name="user_id" ref="base.user_root"/>
<field name="partner_id" ref="base.res_partner_maxtor"/>
<field eval="&quot;open&quot;" name="state"/>
<field name="section_id" ref="crm.section_support"/>
<field name="section_id" ref="section_support"/>
<field eval="1" name="active"/>
<field eval="3.2" name="duration"/>
<field name="categ_id" ref="crm.categ3"/>
<field name="stage_id" ref="crm.stage1"/>
<field name="categ_id" ref="categ3"/>
<field name="stage_id" ref="stage1"/>
<field eval="&quot;New Features To Be Added&quot;" name="name"/>
</record>
<record id="crm_case_addmenustothemodule0" model="crm.project.bug">
<field name="partner_address_id" ref="base.res_partner_address_1"/>
<field eval="time.strftime('%Y-%m-05 18:00:00')" name="date"/>
<field name="category2_id" ref="crm.category2"/>
<field name="category2_id" ref="category2"/>
<field eval="&quot;1&quot;" name="priority"/>
<field name="user_id" ref="base.user_demo"/>
<field name="partner_id" ref="base.res_partner_9"/>
<field eval="&quot;done&quot;" name="state"/>
<field name="section_id" ref="crm.section_support"/>
<field name="section_id" ref="section_support"/>
<field eval="1" name="active"/>
<field eval="3.0" name="duration"/>
<field name="categ_id" ref="crm.categ3"/>
<field name="stage_id" ref="crm.stage2"/>
<field name="categ_id" ref="categ3"/>
<field name="stage_id" ref="stage2"/>
<field eval="&quot;Add menus to the module&quot;" name="name"/>
<field eval="&quot;info@opensides.be&quot;" name="email_from"/>
</record>
@ -208,16 +208,16 @@
<record id="crm_case_includeattendancesheetinproject0" model="crm.project.bug">
<field name="partner_address_id" ref="base.res_partner_address_2"/>
<field eval="time.strftime('%Y-%m-10 17:05:30')" name="date"/>
<field name="category2_id" ref="crm.category1"/>
<field name="category2_id" ref="category1"/>
<field eval="&quot;3&quot;" name="priority"/>
<field name="user_id" ref="base.user_root"/>
<field name="partner_id" ref="base.res_partner_10"/>
<field eval="&quot;cancel&quot;" name="state"/>
<field name="section_id" ref="crm.section_support"/>
<field name="section_id" ref="section_support"/>
<field eval="1" name="active"/>
<field eval="2.0" name="duration"/>
<field name="categ_id" ref="crm.categ3"/>
<field name="stage_id" ref="crm.stage3"/>
<field name="categ_id" ref="categ3"/>
<field name="stage_id" ref="stage3"/>
<field eval="&quot;Include Attendance sheet in Project&quot;" name="name"/>
<field eval="&quot;contact@tecsas.fr&quot;" name="email_from"/>
</record>
@ -227,48 +227,48 @@
<field name="partner_address_id" ref="base.res_partner_address_6"/>
<field name="som" ref="base.som_happy"/>
<field eval="time.strftime('%Y-%m-15 10:35:15')" name="date"/>
<field name="category2_id" ref="crm.category1"/>
<field name="category2_id" ref="category1"/>
<field eval="&quot;3&quot;" name="priority"/>
<field name="user_id" ref="base.user_root"/>
<field name="partner_id" ref="base.res_partner_6"/>
<field eval="&quot;draft&quot;" name="state"/>
<field name="section_id" ref="crm.section_support"/>
<field name="section_id" ref="section_support"/>
<field eval="1" name="active"/>
<field eval="2.45" name="duration"/>
<field name="categ_id" ref="crm.categ3"/>
<field name="stage_id" ref="crm.stage5"/>
<field name="categ_id" ref="categ3"/>
<field name="stage_id" ref="stage5"/>
<field eval="&quot;Create new object&quot;" name="name"/>
</record>
<record id="crm_case_improvereportsinhrms0" model="crm.project.bug">
<field name="partner_address_id" ref="base.res_partner_address_15"/>
<field eval="time.strftime('%Y-%m-19 12:15:00')" name="date"/>
<field name="category2_id" ref="crm.category1"/>
<field name="category2_id" ref="category1"/>
<field eval="&quot;4&quot;" name="priority"/>
<field name="user_id" ref="base.user_root"/>
<field name="partner_id" ref="base.res_partner_11"/>
<field eval="&quot;pending&quot;" name="state"/>
<field name="section_id" ref="crm.section_support"/>
<field name="section_id" ref="section_support"/>
<field eval="1" name="active"/>
<field eval="15.0" name="duration"/>
<field name="categ_id" ref="crm.categ3"/>
<field name="stage_id" ref="crm.stage7"/>
<field name="categ_id" ref="categ3"/>
<field name="stage_id" ref="stage7"/>
<field eval="&quot;Improve Reports in HRMS&quot;" name="name"/>
</record>
<record id="crm_case_improvereportsinpms0" model="crm.project.bug">
<field name="partner_address_id" ref="base.res_partner_address_15"/>
<field eval="time.strftime('%Y-%m-21 14:30:00')" name="date"/>
<field name="category2_id" ref="crm.category1"/>
<field name="category2_id" ref="category1"/>
<field eval="&quot;2&quot;" name="priority"/>
<field name="user_id" ref="base.user_demo"/>
<field name="partner_id" ref="base.res_partner_11"/>
<field eval="&quot;pending&quot;" name="state"/>
<field name="section_id" ref="crm.section_support"/>
<field name="section_id" ref="section_support"/>
<field eval="1" name="active"/>
<field eval="06.15" name="duration"/>
<field name="categ_id" ref="crm.categ3"/>
<field name="stage_id" ref="crm.stage5"/>
<field name="categ_id" ref="categ3"/>
<field name="stage_id" ref="stage5"/>
<field eval="&quot;Improve Reports in PMS&quot;" name="name"/>
</record>

View File

@ -7,6 +7,33 @@
# Bug Tracking
# ------------------------------------------------------
<record model="ir.ui.view" id="crm_bug_assign_wizard_form">
<field name="name">crm.project.bug.assign_wizard.form</field>
<field name="model">crm.project.bug.assign_wizard</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="To Assign">
<group col="2">
<field name="section_id" select="1" widget="selection"/>
<field name="user_id"/>
</group>
<newline/>
<separator colspan="4"/>
<group col="2" colspan="2">
<button icon="gtk-cancel" special="cancel" string="Cancel"/>
<button icon="gtk-execute" name="action_create" string="Assign" type="object"/>
</group>
</form>
</field>
</record>
<record id="action_crm_bug_assign_wizard" model="ir.actions.act_window">
<field name="name">To Assign</field>
<field name="res_model">crm.project.bug.assign_wizard</field>
<field name="view_type">form</field>
<field name="view_id" ref="crm_bug_assign_wizard_form"/>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
<record model="ir.ui.view" id="crm_case_form_view">
<field name="name">CRM - Bug Tracker Form</field>
@ -37,7 +64,7 @@
<field name="priority" string="Severity"/>
<group colspan="2">
<field name="case_id" select="1"/>
<button string="Assign" name="%(crm.crm_generic_wizard_act)d" type="action" />
<button string="Assign" name="%(action_crm_bug_assign_wizard)d" type="action" />
</group>
<newline/>
<separator string= "Description" colspan="4"/>
@ -149,7 +176,7 @@
</record>
<record id="view_crm_case_bugs_filter" model="ir.ui.view">
<field name="name">crm.case.bugs.select</field>
<field name="name">CRM - Bug Tracker Search</field>
<field name="model">crm.project.bug</field>
<field name="type">search</field>
<field name="arch" type="xml">
@ -194,28 +221,7 @@
</group>
</search>
</field>
</record>
<record id="view_crm_case_feature_request_filter" model="ir.ui.view">
<field name="name">crm.case.feature.request.select</field>
<field name="model">crm.project.bug</field>
<field name="type">search</field>
<field name="arch" type="xml">
<search string="Search Feature Request">
<group col='6' colspan='4'>
<filter icon="gtk-execute" string="My Feature Request" domain="[('user_id','=',uid)]" separator="1" help="Feature Requests Related to Current User"/>
<field name="state" select="1">
<filter icon="terp-crm" domain="[('state','=','draft')]" help="Draft Feature Request"/>
<filter icon="terp-crm" domain="[('state','=','open')]" help="Open Feature Request"/>
<filter icon="terp-crm" domain="[('state','=','pending')]" help="Pending Feature Request"/>
</field>
<separator orientation="vertical"/>
<field name="name" select='1'/>
<field name="user_id" select="1" widget="selection"/>
</group>
</search>
</field>
</record>
</record>
<record model="ir.ui.view" id="crm_case_calendar_view">
<field name="name">CRM - Bug Tracker Calendar</field>

View File

@ -0,0 +1,54 @@
<?xml version="1.0"?>
<openerp>
<data noupdate="1">
<record model="crm.case.categ" id="future_patch_categ">
<field name="name">Patches</field>
<field name="section_id" ref="section_support"/>
</record>
<record model="crm.case.stage" id="future_fixed_categ">
<field name="name">Fixed</field>
<field name="section_id" ref="section_support"/>
</record>
<record model="crm.case.stage" id="future_awaiting_categ">
<field name="name">Awaiting Response</field>
<field name="section_id" ref="section_support"/>
</record>
######################## Future Request (menu) ###########################
<!--
ALL BUGS
-->
<record model="ir.actions.act_window" id="action_crm_case_future">
<field name="name">Future Requests</field>
<field name="res_model">crm.project.future</field>
<field name="view_type">form</field>
<field name="view_mode">tree,calendar</field>
<field name="view_id" ref="crm_case_future_tree_view"/>
<field name="context" eval="{'default_state':'open'}"/>
<field name="search_view_id" ref="view_crm_case_future_filter"/>
</record>
<record model="ir.actions.act_window.view" id="action_crm_future_tree_view0">
<field name="sequence" eval="1"/>
<field name="view_mode">tree</field>
<field name="view_id" ref="crm_case_future_tree_view"/>
<field name="act_window_id" ref="action_crm_case_future"/>
</record>
<record model="ir.actions.act_window.view" id="action_crm_future_calendar_view0">
<field name="sequence" eval="2"/>
<field name="view_mode">calendar</field>
<field name="view_id" ref="crm_case_future_calendar_view"/>
<field name="act_window_id" ref="action_crm_case_future"/>
</record>
<record model="ir.actions.act_window.view" id="action_crm_future_form_view0">
<field name="sequence" eval="3"/>
<field name="view_mode">form</field>
<field name="view_id" ref="crm_case_future_form_view"/>
<field name="act_window_id" ref="action_crm_case_future"/>
</record>
<menuitem name="Future Requests" id="menu_crm_case_future_request" parent="menu_aftertask" action="action_crm_case_future"/>
</data>
</openerp>

View File

@ -0,0 +1,235 @@
<?xml version="1.0"?>
<openerp>
<data>
<!-- <menuitem name="CRM &amp; SRM" icon="terp-crm" id="menu_crm1"/> -->
# ------------------------------------------------------
# Future Request
# ------------------------------------------------------
<record model="ir.ui.view" id="crm_future_assign_wizard_form">
<field name="name">crm.project.future.assign_wizard.form</field>
<field name="model">crm.project.future.assign_wizard</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="To Assign">
<group col="2">
<field name="section_id" select="1" widget="selection"/>
<field name="user_id"/>
</group>
<newline/>
<separator colspan="4"/>
<group col="2" colspan="2">
<button icon="gtk-cancel" special="cancel" string="Cancel"/>
<button icon="gtk-execute" name="action_create" string="Assign" type="object"/>
</group>
</form>
</field>
</record>
<record id="action_crm_future_assign_wizard" model="ir.actions.act_window">
<field name="name">To Assign</field>
<field name="res_model">crm.project.future.assign_wizard</field>
<field name="view_type">form</field>
<field name="view_id" ref="crm_future_assign_wizard_form"/>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
<record model="ir.ui.view" id="crm_case_future_form_view">
<field name="name">CRM - Future Request Form</field>
<field name="model">crm.project.future</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Future Request Form">
<group colspan="4" col="6">
<field name="project_id"/>
<field name="name" string="Title" colspan="2"/>
<field name="section_id" colspan="1" widget="selection"/>
<label string="Resolution: " align="1.0"/>
<group colspan="1" col="2">
<field name="stage_id" select="1" nolabel="1"/>
<button icon="gtk-go-forward" string="" name="stage_next" type="object"/>
</group>
<field name="date"/>
<field name="user_id" />
</group>
<notebook colspan="4">
<page string="General">
<field name="partner_id" on_change="onchange_partner_id(partner_id, email_from)" colspan="2"/>
<field name="partner_address_id" string="Contact" on_change="onchange_partner_address_id(partner_address_id, email_from)" colspan="1"/>
<field name="email_from" colspan="2"/>
<separator colspan="4"/>
<field name="category2_id" string="Version"/>
<field name="categ_id" on_change="onchange_categ_id(categ_id)"/>
<field name="priority" string="Severity"/>
<group colspan="2">
<field name="case_id" select="1"/>
<button string="Assign" name="%(action_crm_future_assign_wizard)d" type="action" />
</group>
<newline/>
<separator string= "Description" colspan="4"/>
<field name="description" nolabel="1" colspan="4"/>
<separator colspan="4"/>
<group col="8" colspan="4">
<field name="state" />
<button name="case_close" string="Done" states="open,draft,pending" type="object" icon="gtk-jump-to"/>
<button name="case_open" string="Open" states="draft,pending" type="object" icon="gtk-go-forward"/>
<button name="case_cancel" string="Cancel" states="draft,open,pending" type="object" icon="gtk-cancel"/>
<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"/>
</group>
</page>
<page string="History">
<field name="id" select="1"/>
<field name="active" />
<separator colspan="4" string="Dates"/>
<field name="create_date"/>
<field name="date_closed"/>
<field name="date_action_last"/>
<field name="date_action_next"/>
<separator colspan="4" string="Estimates"/>
<field name="planned_revenue"/>
<field name="planned_cost"/>
<field name="probability"/>
<separator colspan="4" string="References"/>
<field name="ref" colspan="4"/>
<field name="ref2" colspan="4"/>
<field name="log_ids" nolabel="1" colspan="4">
<form string="Actions">
<separator string="Action Information" colspan="4"/>
<field name="name" colspan="4"/>
<field name="date" />
<field name="user_id" />
<field name="som" />
<field name="canal_id"/>
</form>
</field>
</page>
<page string="Events">
<field name="child_ids" colspan="4" nolabel="1">
<tree string="Related Cases">
<field name="id"/>
<field name="date"/>
<field name="name"/>
<field name="partner_id"/>
<field name="user_id"/>
<field name="section_id" widget="selection"/>
<field name="state"/>
</tree>
</field>
</page>
<page string="Emails">
<group colspan="4">
<field colspan="4" name="email_cc" string="CC"/>
</group>
<field name="history_line" colspan="4" nolabel="1" mode="form,tree">
<form string="Communication history">
<group col="7" colspan="4">
<field name="date"/>
<field name="email"/>
<field name="canal_id"/>
<button
string="Add a CC"
name="%(crm.action_view_crm_email_add_cc_wizard)d"
icon="gtk-add" type="action"/>
</group>
<newline/>
<field name="description" colspan="4" nolabel="1"/>
<button colspan="4" string="Reply to Last Email" name="%(crm.wizard_crm_send_mail)d" context="{'mail':'reply'}" icon="gtk-undo" type="action"/>
</form>
<tree string="Communication history">
<field name="description"/>
<field name="email"/>
<field name="date"/>
</tree>
</field>
<button colspan="4" string="Send New Email" name="%(crm.wizard_crm_new_send_mail)d" context="{'mail':'new'}" icon="gtk-go-forward" type="action"/>
</page>
</notebook>
</form>
</field>
</record>
<record model="ir.ui.view" id="crm_case_future_tree_view">
<field name="name">CRM - Future Request Tree</field>
<field name="model">crm.project.future</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Bugs Tree" colors="red:state=='open';black:state in ('draft', 'cancel','done','pending')">
<field name="id"/>
<field name="name" string="Title"/>
<field name="partner_id"/>
<field name="priority" string="Severity"/>
<field name="categ_id"/>
<field name="stage_id" string="Resolution"/>
<field name="category2_id" string="Version"/>
<field name="user_id"/>
<field name="state"/>
<button name="case_close" string="Done" states="open,draft,pending" type="object" icon="gtk-jump-to"/>
<button name="case_open" string="Open" states="draft,pending" type="object" icon="gtk-go-forward"/>
<button name="case_cancel" string="Cancel" states="draft,open,pending" type="object" icon="gtk-cancel"/>
<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"/>
</tree>
</field>
</record>
<record id="view_crm_case_future_filter" model="ir.ui.view">
<field name="name">CRM - Future Request Search</field>
<field name="model">crm.project.future</field>
<field name="type">search</field>
<field name="arch" type="xml">
<search string="Search Future Requests">
<group col="7" colspan="1">
<filter icon="gtk-apply" string="Fixed Future Requests"
domain="[('stage_id.name','=','Fixed')]"
separator="1" help="All Fixed Future Requests"
/>
<filter icon="gtk-media-pause" string="Waiting Response"
domain="[('stage_id.name','=','Awaiting Response')]"
separator="1" help="All Future Requests which are Waiting for Response"
/>
<separator orientation="vertical"/>
<filter icon="gtk-home" string=" Today "
separator="1"
domain="[('date','=',time.strftime('%%Y-%%m-%%d'))]"
help="Todays's Future Requests"
/>
<filter icon="gtk-media-rewind"
string=" 7 Days " separator="1"
domain="[('date','&lt;', time.strftime('%%Y-%%m-%%d')), ('date','&gt;=',(datetime.date.today()-datetime.timedelta(days=7)).strftime('%%Y-%%m-%%d'))]"
help="Future Requests during last 7 days"
/>
</group>
<separator orientation="vertical"/>
<group col="4" colspan="2">
<field name="name" select='1' string="Subject"/>
<field name="user_id" select="1" widget="selection">
<filter icon="terp-partner" domain="[('user_id','=',uid)]" help="My Future Requests" default="1"/>
<filter icon="terp-crm" domain="[('user_id','child_of',[uid])]" help="My department's Future Requests"/>
</field>
<field name="state" select="1">
<filter icon="gtk-new" domain="[('state','=','draft')]" help="Draft Future Requests"/>
<filter icon="gtk-yes" domain="[('state','=','open')]" help="Open Future Requests"/>
<filter icon="gtk-media-pause" domain="[('state','=','pending')]" help="Pending Future Requests"/>
</field>
</group>
</search>
</field>
</record>
<record model="ir.ui.view" id="crm_case_future_calendar_view">
<field name="name">CRM - Future Request Calendar</field>
<field name="model">crm.project.future</field>
<field name="type">calendar</field>
<field name="priority" eval="2"/>
<field name="arch" type="xml">
<calendar string="Bugs" date_start="date" color="user_id" date_delay="duration">
<field name="name"/>
<field name="partner_id"/>
</calendar>
</field>
</record>
</data>
</openerp>

View File

@ -39,7 +39,7 @@ class crm_project_bug(osv.osv):
_inherits = {'crm.case':"inherit_case_id"}
_columns = {
'inherit_case_id':fields.many2one('crm.case','Case'),
'project_id':fields.many2one('project.project', 'Project '),
'project_id':fields.many2one('project.project', 'Project'),
}
def _map_ids(self, method, cr, uid, ids, *args, **argv):
@ -53,6 +53,8 @@ class crm_project_bug(osv.osv):
def onchange_case_id(self, cr, uid, ids, *args, **argv):
return self._map_ids('onchange_case_id',cr,uid,ids,*args,**argv)
def stage_next(self, cr, uid, ids, *args, **argv):
return self._map_ids('stage_next',cr,uid,ids,*args,**argv)
def onchange_partner_id(self, cr, uid, ids, *args, **argv):
return self._map_ids('onchange_partner_id',cr,uid,ids,*args,**argv)
def onchange_partner_address_id(self, cr, uid, ids, *args, **argv):
@ -67,7 +69,64 @@ class crm_project_bug(osv.osv):
return self._map_ids('case_cancel',cr,uid,ids,*args,**argv)
def case_reset(self,cr, uid, ids, *args, **argv):
return self._map_ids('case_reset',cr,uid,ids,*args,**argv)
def case_escalate(self,cr, uid, ids, *args, **argv):
return self._map_ids('case_escalate',cr,uid,ids,*args,**argv)
def case_pending(self,cr, uid, ids, *args, **argv):
return self._map_ids('case_pending',cr,uid,ids,*args,**argv)
crm_project_bug()
class crm_bug_assign_wizard(osv.osv_memory):
_name = 'crm.project.bug.assign_wizard'
_columns = {
'section_id': fields.many2one('crm.case.section', 'Section', required=True),
'user_id': fields.many2one('res.users', 'Responsible'),
}
def _get_default_section(self, cr, uid, context):
case_id = context.get('active_id',False)
if not case_id:
return False
case_obj = self.pool.get('crm.project.bug')
case = case_obj.read(cr, uid, case_id, ['state','section_id'])
if case['state'] in ('done'):
raise osv.except_osv(_('Error !'), _('You can not assign Closed Case.'))
return case['section_id']
_defaults = {
'section_id': _get_default_section
}
def action_create(self, cr, uid, ids, context=None):
case_obj = self.pool.get('crm.project.bug')
case_id = context.get('active_id',[])
res = self.read(cr, uid, ids)[0]
case = case_obj.browse(cr, uid, case_id)
if case.state in ('done'):
raise osv.except_osv(_('Error !'), _('You can not assign Closed Case.'))
new_case_id = case_obj.copy(cr, uid, case_id, default=
{
'section_id':res.get('section_id',False),
'user_id':res.get('user_id',False),
'case_id' : case.inherit_case_id.id
}, context=context)
case_obj.case_close(cr, uid, [case_id])
data_obj = self.pool.get('ir.model.data')
result = data_obj._get_id(cr, uid, 'crm_project', 'view_crm_case_bugs_filter')
search_view = data_obj.read(cr, uid, result, ['res_id'])
value = {
'name': _('Bugs'),
'view_type': 'form',
'view_mode': 'form,tree',
'res_model': 'crm.project.bug',
'res_id': int(new_case_id),
'type': 'ir.actions.act_window',
'search_view_id': search_view['res_id']
}
return value
crm_bug_assign_wizard()

View File

@ -0,0 +1,131 @@
#-*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
#
# 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 time
import re
import os
import mx.DateTime
import base64
from tools.translate import _
import tools
from osv import fields,osv,orm
from osv.orm import except_orm
class crm_project_future_request(osv.osv):
_name = "crm.project.future"
_description = "Project Future Request"
_order = "id desc"
_inherits = {'crm.case':"inherit_case_id"}
_columns = {
'inherit_case_id':fields.many2one('crm.case','Case'),
'project_id':fields.many2one('project.project', 'Project'),
}
def _map_ids(self, method, cr, uid, ids, *args, **argv):
case_data = self.browse(cr, uid, ids)
new_ids = []
for case in case_data:
if case.inherit_case_id:
new_ids.append(case.inherit_case_id.id)
return getattr(self.pool.get('crm.case'),method)(cr, uid, new_ids, *args, **argv)
def onchange_case_id(self, cr, uid, ids, *args, **argv):
return self._map_ids('onchange_case_id',cr,uid,ids,*args,**argv)
def stage_next(self, cr, uid, ids, *args, **argv):
return self._map_ids('stage_next',cr,uid,ids,*args,**argv)
def onchange_partner_id(self, cr, uid, ids, *args, **argv):
return self._map_ids('onchange_partner_id',cr,uid,ids,*args,**argv)
def onchange_partner_address_id(self, cr, uid, ids, *args, **argv):
return self._map_ids('onchange_partner_address_id',cr,uid,ids,*args,**argv)
def onchange_categ_id(self, cr, uid, ids, *args, **argv):
return self._map_ids('onchange_categ_id',cr,uid,ids,*args,**argv)
def case_close(self,cr, uid, ids, *args, **argv):
return self._map_ids('case_close',cr,uid,ids,*args,**argv)
def case_open(self,cr, uid, ids, *args, **argv):
return self._map_ids('case_open',cr,uid,ids,*args,**argv)
def case_cancel(self,cr, uid, ids, *args, **argv):
return self._map_ids('case_cancel',cr,uid,ids,*args,**argv)
def case_reset(self,cr, uid, ids, *args, **argv):
return self._map_ids('case_reset',cr,uid,ids,*args,**argv)
def case_escalate(self,cr, uid, ids, *args, **argv):
return self._map_ids('case_escalate',cr,uid,ids,*args,**argv)
def case_pending(self,cr, uid, ids, *args, **argv):
return self._map_ids('case_pending',cr,uid,ids,*args,**argv)
crm_project_future_request()
class crm_future_request_assign_wizard(osv.osv_memory):
_name = 'crm.project.future.assign_wizard'
_columns = {
'section_id': fields.many2one('crm.case.section', 'Section', required=True),
'user_id': fields.many2one('res.users', 'Responsible'),
}
def _get_default_section(self, cr, uid, context):
case_id = context.get('active_id',False)
if not case_id:
return False
case_obj = self.pool.get('crm.project.future')
case = case_obj.read(cr, uid, case_id, ['state','section_id'])
if case['state'] in ('done'):
raise osv.except_osv(_('Error !'), _('You can not assign Closed Case.'))
return case['section_id']
_defaults = {
'section_id': _get_default_section
}
def action_create(self, cr, uid, ids, context=None):
case_obj = self.pool.get('crm.project.future')
case_id = context.get('active_id',[])
res = self.read(cr, uid, ids)[0]
case = case_obj.browse(cr, uid, case_id)
if case.state in ('done'):
raise osv.except_osv(_('Error !'), _('You can not assign Closed Case.'))
new_case_id = case_obj.copy(cr, uid, case_id, default=
{
'section_id':res.get('section_id',False),
'user_id':res.get('user_id',False),
'case_id' : case.inherit_case_id.id
}, context=context)
case_obj.case_close(cr, uid, [case_id])
data_obj = self.pool.get('ir.model.data')
result = data_obj._get_id(cr, uid, 'crm_project', 'view_crm_case_future_filter')
search_view = data_obj.read(cr, uid, result, ['res_id'])
value = {
'name': _('Future Requests'),
'view_type': 'form',
'view_mode': 'form,tree',
'res_model': 'crm.project.future',
'res_id': int(new_case_id),
'type': 'ir.actions.act_window',
'search_view_id': search_view['res_id']
}
return value
crm_future_request_assign_wizard()

View File

@ -25,15 +25,12 @@
'version': '1.0',
'category': 'Generic Modules/Sales & Purchases',
'description': """
This module adds a shortcut on one or several cases in the CRM.
This module adds a shortcut on one or several opportunity cases in the CRM.
This shortcut allows you to generate a sale order based on the selected case.
If different cases are open (a list), it generates one sale order by
case.
The case is then closed and linked to the generated sale order.
It also add a shortcut on one or several partners.
This shortcut allows you to generate a CRM case for the partners.
We suggest you to install this module if you installed both the sale and the
crm modules.
""",

View File

@ -4,7 +4,7 @@
<record model="ir.ui.view" id="crm_case_form_view_oppor">
<field name="name">CRM - Opportunities - Quote Inherit</field>
<field name="model">crm.case</field>
<field name="model">crm.opportunity</field>
<field name="type">form</field>
<field name="inherit_id" ref="crm.crm_case_form_view_oppor"/>
<field name="arch" type="xml">

View File

@ -4,17 +4,11 @@
<wizard
string="Make Quotation"
model="crm.case"
name="crm.case.make_order"
model="crm.opportunity"
name="crm.opportunity.make_order"
keyword="client_action_multi"
multi="True"
id="sale_crm_wizard"/>
<wizard
string="Make Case"
model="res.partner"
name="sale_crm.make_case"
keyword="client_action_multi"
id="sale_crm_make_case_wizard"/>
</data>
</openerp>

View File

@ -20,6 +20,6 @@
##############################################################################
import makesale
import makecase
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -1,92 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
#
# 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 wizard
import pooler
def _get_default(obj, cursor, uid, data, context=None):
'''Get default value'''
return {'user': uid}
def _make_case(obj, cursor, uid, data, context=None):
'''Create case'''
pool = pooler.get_pool(cursor.dbname)
case_obj = pool.get('crm.case')
mod_obj = pool.get('ir.model.data')
act_obj = pool.get('ir.actions.act_window')
new_id = []
for partner_id in data['ids']:
new_id.append(case_obj.create(cursor, uid, {
'name': data['form']['name'],
'section_id': data['form']['section'],
'partner_id': partner_id,
'description': data['form']['description'],
}))
result = mod_obj._get_id(cursor, uid, 'crm', 'crm_case_categ0-act')
res_id = mod_obj.read(cursor, uid, [result], ['res_id'])[0]['res_id']
result = act_obj.read(cursor, uid, [res_id])[0]
result['domain'] = str([('id', 'in', new_id)])
return result
class MakeCase(wizard.interface):
'''Wizard that create case on partner'''
case_form = """<?xml version="1.0"?>
<form string="Make Case">
<field name="name"/>
<field name="section"/>
<field name="user"/>
<field name="description" colspan="4"/>
</form>"""
case_fields = {
'name': {'string': 'Case Description', 'type': 'char', 'size': 64,
'required': True},
'section': {'string': 'Case Section', 'type': 'many2one',
'relation': 'crm.case.section', 'required': True},
'user': {'string': 'User Responsible', 'type': 'many2one',
'relation': 'res.users'},
'description': {'string': 'Your action', 'type': 'text'},
}
states = {
'init': {
'actions': [_get_default],
'result': {'type': 'form', 'arch': case_form, 'fields': case_fields,
'state': [
('end', 'Cancel'),
('create', 'Create')
]
}
},
'create': {
'actions': [],
'result': {'type': 'action', 'action': _make_case, 'state': 'end'}
}
}
MakeCase('sale_crm.make_case')
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -56,7 +56,7 @@ sale_fields = {
class make_sale(wizard.interface):
def _selectPartner(self, cr, uid, data, context):
case_obj = pooler.get_pool(cr.dbname).get('crm.case')
case_obj = pooler.get_pool(cr.dbname).get('crm.opportunity')
case = case_obj.read(cr, uid, data['ids'], ['partner_id'])
return {'partner_id': case[0]['partner_id']}
@ -65,7 +65,7 @@ class make_sale(wizard.interface):
mod_obj = pool.get('ir.model.data')
result = mod_obj._get_id(cr, uid, 'sale', 'view_sales_order_filter')
id = mod_obj.read(cr, uid, result, ['res_id'])
case_obj = pool.get('crm.case')
case_obj = pool.get('crm.opportunity')
sale_obj = pool.get('sale.order')
partner_obj = pool.get('res.partner')
sale_line_obj = pool.get('sale.order.line')
@ -95,7 +95,7 @@ class make_sale(wizard.interface):
raise wizard.except_wizard(_('Data Insufficient!'),_('Customer has no addresses defined!'))
vals = {
'origin': 'CRM:%s' % str(case.id),
'origin': 'CRM-Opportunity:%s' % str(case.id),
'section_id': case.section_id and case.section_id.id or False,
'picking_policy': data['form']['picking_policy'],
'shop_id': data['form']['shop_id'],
@ -148,6 +148,6 @@ class make_sale(wizard.interface):
}
}
make_sale('crm.case.make_order')
make_sale('crm.opportunity.make_order')
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: