diff --git a/crm_lead_lost_reason_add_info/README.rst b/crm_lead_lost_reason_add_info/README.rst new file mode 100644 index 00000000..3948187d --- /dev/null +++ b/crm_lead_lost_reason_add_info/README.rst @@ -0,0 +1,63 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 + +=========================================== +CRM Lead Lost Reason Additional Information +=========================================== + +This module extends the CRM lead management system in Odoo by adding additional fields to capture detailed information about lost opportunities. It includes enhancements to both the lead form and the lost reason wizard to include competitor-related details. + +Features +======== + +- **Extended CRM Lead Form**: + Adds new fields to the CRM lead form to capture information about competitors when a lead is marked as lost. The fields include: + - Competitor Manufacturer + - Competitor Integrator + - Competitor Reseller + - Competitor Price + - Lost Reason Notes + +- **Enhanced Lost Reason Wizard**: + Includes the new fields in the lost reason wizard, allowing users to update or provide additional details when a lead is marked as lost. + +- **Automatic Field Population**: + The wizard automatically populates the fields with information from the CRM lead record when opening the wizard. + +Usage +===== + +Once installed, the module will: +- **Extend the CRM Lead Form**: + + - Navigate to CRM > Leads. + - Open a lead and check the "Competitor Details" group in the form view. + +- **Enhance the Lost Reason Wizard**: + - When marking a lead as lost, the wizard will now include additional fields for competitor information and lost reason notes. + +Configuration +============= + +No specific configuration is required. The module will automatically integrate with the existing CRM lead and lost reason views. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smash it by providing detailed and welcomed feedback. + +Credits +======= + +Contributors +------------ +* Ana Juaristi +* Unai Beristain +* Lucía Echeverría + +Do not contact contributors directly about support or help with technical issues. + +License +======= +This project is licensed under the AGPL-3 License. For more details, please refer to the LICENSE file or visit . diff --git a/crm_lead_lost_reason_add_info/__init__.py b/crm_lead_lost_reason_add_info/__init__.py new file mode 100644 index 00000000..64face17 --- /dev/null +++ b/crm_lead_lost_reason_add_info/__init__.py @@ -0,0 +1 @@ +from . import models, wizards diff --git a/crm_lead_lost_reason_add_info/__manifest__.py b/crm_lead_lost_reason_add_info/__manifest__.py new file mode 100644 index 00000000..372d4f8c --- /dev/null +++ b/crm_lead_lost_reason_add_info/__manifest__.py @@ -0,0 +1,18 @@ +{ + "name": "CRM Lead Lost Reason Additional Information", + "version": "18.0.1.0.0", + "summary": "Enhances CRM leads with detailed information on lost opportunities.", + "category": "Sales/CRM", + "author": "Avanzosc", + "website": "https://github.com/avanzosc/crm-addons", + "license": "AGPL-3", + "depends": [ + "crm", + ], + "data": [ + "views/crm_lead_views.xml", + "wizards/crm_lead_lost_reason_wizard_views.xml", + ], + "installable": True, + "auto_install": False, +} diff --git a/crm_lead_lost_reason_add_info/i18n/crm_lead_lost_reason_add_info.pot b/crm_lead_lost_reason_add_info/i18n/crm_lead_lost_reason_add_info.pot new file mode 100644 index 00000000..51a17ba5 --- /dev/null +++ b/crm_lead_lost_reason_add_info/i18n/crm_lead_lost_reason_add_info.pot @@ -0,0 +1,62 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * crm_lead_lost_reason_add_info +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-03-23 13:31+0000\n" +"PO-Revision-Date: 2026-03-23 13:31+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: crm_lead_lost_reason_add_info +#: model_terms:ir.ui.view,arch_db:crm_lead_lost_reason_add_info.view_crm_lead_form_inherit +#: model_terms:ir.ui.view,arch_db:crm_lead_lost_reason_add_info.view_crm_lead_lost_reason_wizard_inherit +msgid "Competitor Details" +msgstr "" + +#. module: crm_lead_lost_reason_add_info +#: model:ir.model.fields,field_description:crm_lead_lost_reason_add_info.field_crm_lead__competitor_integrator_id +#: model:ir.model.fields,field_description:crm_lead_lost_reason_add_info.field_crm_lead_lost__competitor_integrator_id +msgid "Competitor Integrator" +msgstr "" + +#. module: crm_lead_lost_reason_add_info +#: model:ir.model.fields,field_description:crm_lead_lost_reason_add_info.field_crm_lead__competitor_manufacturer_id +#: model:ir.model.fields,field_description:crm_lead_lost_reason_add_info.field_crm_lead_lost__competitor_manufacturer_id +msgid "Competitor Manufacturer" +msgstr "" + +#. module: crm_lead_lost_reason_add_info +#: model:ir.model.fields,field_description:crm_lead_lost_reason_add_info.field_crm_lead__competitor_price +#: model:ir.model.fields,field_description:crm_lead_lost_reason_add_info.field_crm_lead_lost__competitor_price +msgid "Competitor Price" +msgstr "" + +#. module: crm_lead_lost_reason_add_info +#: model:ir.model.fields,field_description:crm_lead_lost_reason_add_info.field_crm_lead__competitor_reseller_id +#: model:ir.model.fields,field_description:crm_lead_lost_reason_add_info.field_crm_lead_lost__competitor_reseller_id +msgid "Competitor Reseller" +msgstr "" + +#. module: crm_lead_lost_reason_add_info +#: model:ir.model,name:crm_lead_lost_reason_add_info.model_crm_lead_lost +msgid "Get Lost Reason" +msgstr "" + +#. module: crm_lead_lost_reason_add_info +#: model:ir.model,name:crm_lead_lost_reason_add_info.model_crm_lead +msgid "Lead/Opportunity" +msgstr "" + +#. module: crm_lead_lost_reason_add_info +#: model:ir.model.fields,field_description:crm_lead_lost_reason_add_info.field_crm_lead__lost_reason_notes +#: model:ir.model.fields,field_description:crm_lead_lost_reason_add_info.field_crm_lead_lost__lost_reason_notes +msgid "Lost Reason Notes" +msgstr "" diff --git a/crm_lead_lost_reason_add_info/i18n/es.po b/crm_lead_lost_reason_add_info/i18n/es.po new file mode 100644 index 00000000..4cab4c25 --- /dev/null +++ b/crm_lead_lost_reason_add_info/i18n/es.po @@ -0,0 +1,62 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * crm_lead_lost_reason_add_info +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-03-23 13:31+0000\n" +"PO-Revision-Date: 2026-03-23 13:31+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: crm_lead_lost_reason_add_info +#: model_terms:ir.ui.view,arch_db:crm_lead_lost_reason_add_info.view_crm_lead_form_inherit +#: model_terms:ir.ui.view,arch_db:crm_lead_lost_reason_add_info.view_crm_lead_lost_reason_wizard_inherit +msgid "Competitor Details" +msgstr "Detalles del Competidor" + +#. module: crm_lead_lost_reason_add_info +#: model:ir.model.fields,field_description:crm_lead_lost_reason_add_info.field_crm_lead__competitor_integrator_id +#: model:ir.model.fields,field_description:crm_lead_lost_reason_add_info.field_crm_lead_lost__competitor_integrator_id +msgid "Competitor Integrator" +msgstr "Integrador del Competidor" + +#. module: crm_lead_lost_reason_add_info +#: model:ir.model.fields,field_description:crm_lead_lost_reason_add_info.field_crm_lead__competitor_manufacturer_id +#: model:ir.model.fields,field_description:crm_lead_lost_reason_add_info.field_crm_lead_lost__competitor_manufacturer_id +msgid "Competitor Manufacturer" +msgstr "Fabricante del Competidor" + +#. module: crm_lead_lost_reason_add_info +#: model:ir.model.fields,field_description:crm_lead_lost_reason_add_info.field_crm_lead__competitor_price +#: model:ir.model.fields,field_description:crm_lead_lost_reason_add_info.field_crm_lead_lost__competitor_price +msgid "Competitor Price" +msgstr "Precio del Competidor" + +#. module: crm_lead_lost_reason_add_info +#: model:ir.model.fields,field_description:crm_lead_lost_reason_add_info.field_crm_lead__competitor_reseller_id +#: model:ir.model.fields,field_description:crm_lead_lost_reason_add_info.field_crm_lead_lost__competitor_reseller_id +msgid "Competitor Reseller" +msgstr "Revendedor del Competidor" + +#. module: crm_lead_lost_reason_add_info +#: model:ir.model,name:crm_lead_lost_reason_add_info.model_crm_lead_lost +msgid "Get Lost Reason" +msgstr "Obtener razón de pérdida" + +#. module: crm_lead_lost_reason_add_info +#: model:ir.model,name:crm_lead_lost_reason_add_info.model_crm_lead +msgid "Lead/Opportunity" +msgstr "Lead/Oportunidad" + +#. module: crm_lead_lost_reason_add_info +#: model:ir.model.fields,field_description:crm_lead_lost_reason_add_info.field_crm_lead__lost_reason_notes +#: model:ir.model.fields,field_description:crm_lead_lost_reason_add_info.field_crm_lead_lost__lost_reason_notes +msgid "Lost Reason Notes" +msgstr "Notas sobre la razón de la pérdida" diff --git a/crm_lead_lost_reason_add_info/models/__init__.py b/crm_lead_lost_reason_add_info/models/__init__.py new file mode 100644 index 00000000..e66f0d6c --- /dev/null +++ b/crm_lead_lost_reason_add_info/models/__init__.py @@ -0,0 +1 @@ +from . import crm_lead diff --git a/crm_lead_lost_reason_add_info/models/crm_lead.py b/crm_lead_lost_reason_add_info/models/crm_lead.py new file mode 100644 index 00000000..3ae71a79 --- /dev/null +++ b/crm_lead_lost_reason_add_info/models/crm_lead.py @@ -0,0 +1,23 @@ +from odoo import fields, models + + +class CrmLead(models.Model): + _inherit = "crm.lead" + + competitor_manufacturer_id = fields.Many2one( + "res.partner", + string="Competitor Manufacturer", + domain=[("is_company", "=", True)], + ) + competitor_integrator_id = fields.Many2one( + "res.partner", + string="Competitor Integrator", + domain=[("is_company", "=", True)], + ) + competitor_reseller_id = fields.Many2one( + "res.partner", + string="Competitor Reseller", + domain=[("is_company", "=", True)], + ) + competitor_price = fields.Float() + lost_reason_notes = fields.Text() diff --git a/crm_lead_lost_reason_add_info/pyproject.toml b/crm_lead_lost_reason_add_info/pyproject.toml new file mode 100644 index 00000000..4231d0cc --- /dev/null +++ b/crm_lead_lost_reason_add_info/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/crm_lead_lost_reason_add_info/views/crm_lead_views.xml b/crm_lead_lost_reason_add_info/views/crm_lead_views.xml new file mode 100644 index 00000000..7b1690ba --- /dev/null +++ b/crm_lead_lost_reason_add_info/views/crm_lead_views.xml @@ -0,0 +1,49 @@ + + + + crm.lead.form.inherit + crm.lead + + + + + + + + + + + + + + + + crm.case.tree.view.leads + crm.lead + + + + + + + + + + + + + + crm.case.tree.view.leads + crm.lead + + + + + + + + + + + + diff --git a/crm_lead_lost_reason_add_info/wizards/__init__.py b/crm_lead_lost_reason_add_info/wizards/__init__.py new file mode 100644 index 00000000..cf624366 --- /dev/null +++ b/crm_lead_lost_reason_add_info/wizards/__init__.py @@ -0,0 +1 @@ +from . import crm_lead_lost_reason_wizard diff --git a/crm_lead_lost_reason_add_info/wizards/crm_lead_lost_reason_wizard.py b/crm_lead_lost_reason_add_info/wizards/crm_lead_lost_reason_wizard.py new file mode 100644 index 00000000..4214917b --- /dev/null +++ b/crm_lead_lost_reason_add_info/wizards/crm_lead_lost_reason_wizard.py @@ -0,0 +1,57 @@ +from odoo import api, fields, models + + +class CrmLeadLostReasonWizard(models.TransientModel): + _inherit = "crm.lead.lost" + + competitor_manufacturer_id = fields.Many2one( + "res.partner", + string="Competitor Manufacturer", + domain=[("is_company", "=", True)], + ) + competitor_integrator_id = fields.Many2one( + "res.partner", + string="Competitor Integrator", + domain=[("is_company", "=", True)], + ) + competitor_reseller_id = fields.Many2one( + "res.partner", + string="Competitor Reseller", + domain=[("is_company", "=", True)], + ) + competitor_price = fields.Float() + lost_reason_notes = fields.Text() + + @api.model + def default_get(self, fields): + res = super().default_get(fields) + lead = self.env["crm.lead"].browse(self.env.context.get("active_id")) + if lead: + res.update( + { + "competitor_manufacturer_id": lead.competitor_manufacturer_id.id, + "competitor_integrator_id": lead.competitor_integrator_id.id, + "competitor_reseller_id": lead.competitor_reseller_id.id, + "competitor_price": lead.competitor_price, + "lost_reason_notes": lead.lost_reason_notes, + } + ) + return res + + def action_lost_reason_apply(self): + """ + Applies the lost reason and updates the lead with additional fields. + """ + res = super().action_lost_reason_apply() + lead = self.env["crm.lead"].browse(self.env.context.get("active_id")) + if lead: + lead.write( + { + "competitor_manufacturer_id": self.competitor_manufacturer_id.id, + "competitor_integrator_id": self.competitor_integrator_id.id, + "competitor_reseller_id": self.competitor_reseller_id.id, + "competitor_price": self.competitor_price, + "lost_reason_notes": self.lost_reason_notes, + } + ) + return res diff --git a/crm_lead_lost_reason_add_info/wizards/crm_lead_lost_reason_wizard_views.xml b/crm_lead_lost_reason_add_info/wizards/crm_lead_lost_reason_wizard_views.xml new file mode 100644 index 00000000..ee9a52ad --- /dev/null +++ b/crm_lead_lost_reason_add_info/wizards/crm_lead_lost_reason_wizard_views.xml @@ -0,0 +1,19 @@ + + + + crm.lead.lost.reason.wizard.inherit + crm.lead.lost + + + + + + + + + + + + + +