Skip to content
Snippets Groups Projects
Commit 4c9c249c authored by David Beguin's avatar David Beguin
Browse files

[IMP] sale_crm : create partner on new quotation if no customer set on opportunity

When creating a quotation from a opportunity that does not have any
customer set, we ended up on a quotation without any customer or any of
the contact information entered on the crm.lead.

If no customer is set on the opportunity, when hitting New Quotation button,
a modal is displayed to ask the user what to do to fill in the customer field.

- Create a new customer : Use the information from the opportunity to create
automatically a res.partner. Set the res.partner on the quotation
and on the opportunity.
- Use an existing customer : Set this customer on the quotation
and on the opportunity.

Task ID : 1917332
Closes PR #30475
parent 9ea4fefe
Branches
Tags
No related merge requests found
......@@ -64,4 +64,8 @@ class PartnerBinding(models.TransientModel):
partner = Partner.search([('name', 'ilike', '%' + lead.contact_name+'%')], limit=1)
return partner.id
if lead.name: # to be aligned with _create_lead_partner, search on lead's name as last possibility
partner = Partner.search([('name', 'ilike', '%' + lead.name + '%')], limit=1)
return partner.id
return False
......@@ -2,6 +2,7 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import models
from . import wizard
from odoo import api, SUPERUSER_ID
......
......@@ -22,7 +22,8 @@ modules.
'views/partner_views.xml',
'views/sale_order_views.xml',
'views/crm_lead_views.xml',
'views/crm_team_views.xml'
'views/crm_team_views.xml',
'wizard/crm_opportunity_to_quotation_views.xml'
],
'auto_install': True,
'uninstall_hook': 'uninstall_hook'
......
......@@ -60,3 +60,25 @@ class CrmLead(models.Model):
res['invoiced']['target'] = self.env.user.target_sales_invoiced
return res
def action_sale_quotations_new(self):
if not self.partner_id:
return self.env.ref("sale_crm.crm_quotation_partner_action").read()[0]
else:
return self.action_new_quotation()
def action_new_quotation(self):
action = self.env.ref("sale_crm.sale_action_quotations_new").read()[0]
action['context'] = {
'search_default_opportunity_id': self.id,
'default_opportunity_id': self.id,
'search_default_partner_id': self.partner_id.id,
'default_partner_id': self.partner_id.id,
'default_team_id': self.team_id.id,
'default_campaign_id': self.campaign_id.id,
'default_medium_id': self.medium_id.id,
'default_origin': self.name,
'default_name': self.name,
'default_source_id': self.source_id.id
}
return action
......@@ -7,15 +7,8 @@
<field name="inherit_id" ref="crm.crm_case_form_view_oppor"/>
<field name="arch" type="xml">
<xpath expr="//button[@name='action_set_won_rainbowman']" position="before">
<button string="New Quotation" name="%(sale_action_quotations_new)d" type="action" class="oe_highlight"
attrs="{'invisible': ['&amp;', ('probability', '=', 0), ('active', '=', False)]}"
context="{'search_default_partner_id': partner_id,
'default_partner_id': partner_id,
'default_team_id': team_id,
'default_campaign_id': campaign_id,
'default_medium_id': medium_id,
'default_origin': name,
'default_source_id': source_id}"/>
<button string="New Quotation" name="action_sale_quotations_new" type="object" class="oe_highlight"
attrs="{'invisible': ['&amp;', ('probability', '=', 0), ('active', '=', False)]}"/>
</xpath>
<button name="action_schedule_meeting" position="after">
<button class="oe_stat_button" type="action"
......
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import crm_opportunity_to_quotation
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, fields, models, _
from odoo.exceptions import UserError
class Opportunity2Quotation(models.TransientModel):
_name = 'crm.quotation.partner'
_description = 'Create new or use existing Customer on new Quotation'
_inherit = 'crm.partner.binding'
@api.model
def default_get(self, fields):
result = super(Opportunity2Quotation, self).default_get(fields)
active_model = self._context.get('active_model')
if active_model != 'crm.lead':
raise UserError(_('You can only apply this action from a lead.'))
active_id = self._context.get('active_id')
if 'lead_id' in fields and active_id:
result['lead_id'] = active_id
return result
action = fields.Selection([
('create', 'Create a new customer'),
('exist', 'Use an existing customer')
], 'Quotation Customer', required=True)
lead_id = fields.Many2one('crm.lead', "Associated Lead", required=True)
@api.multi
def action_apply(self):
""" Convert lead to opportunity or merge lead and opportunity and open
the freshly created opportunity view.
"""
self.ensure_one()
self.lead_id.write({
'partner_id': self.partner_id.id if self.action == 'exist' else self._create_partner()
})
self.lead_id._onchange_partner_id()
return self.lead_id.action_new_quotation()
def _create_partner(self):
""" Create partner based on action.
:return int: created res.partner id
"""
self.ensure_one()
result = self.lead_id.handle_partner_assignation(action='create')
return result.get(self.lead_id.id)
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="crm_quotation_partner_view_form" model="ir.ui.view">
<field name="name">crm.quotation.partner.view.form</field>
<field name="model">crm.quotation.partner</field>
<field name="arch" type="xml">
<form string="New Quotation">
<group>
<group>
<field name="action" widget="radio"/>
<field name="lead_id" invisible="1"/>
</group>
</group>
<group>
<group>
<field name="partner_id" attrs="{'invisible': [('action','!=','exist')], 'required':[('action', '=','exist')]}"/>
</group>
</group>
<footer>
<button name="action_apply" string="Confirm" type="object" class="btn-primary"/>
<button string="Cancel" class="btn-secondary" special="cancel"/>
</footer>
</form>
</field>
</record>
<record id="crm_quotation_partner_action" model="ir.actions.act_window">
<field name="name">New Quotation</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">crm.quotation.partner</field>
<field name="view_mode">form</field>
<field name="view_id" ref="crm_quotation_partner_view_form"/>
<field name="target">new</field>
</record>
</odoo>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment