odoo-Morpheus/morpheus_crm/models/crm_lead.py
2025-07-31 15:58:49 +02:00

204 lines
7.0 KiB
Python

from odoo import models, fields, api, _
from odoo.exceptions import ValidationError, UserError
class CrmLead(models.Model):
_inherit = 'crm.lead'
addetto_acquisti = fields.Many2one(
'res.users',
string='Addetto acquisti'
)
addetto_acquisti_2 = fields.Many2one(
'res.users',
string='Addetto acquisti 2'
)
addetto_vendite_2 = fields.Many2one(
'res.users',
string='Addetto vendite 2'
)
def action_set_stage_wishlist_verificata(self):
self.ensure_one() # Assicura che il metodo sia chiamato su un singolo record, tipico per un click da form.
# Trova lo stadio di destinazione "Wishlist verificata"
# Per maggiore robustezza, se conosci l'XML ID dello stadio, usa:
# target_stage = self.env.ref('nome_tuo_modulo.xml_id_dello_stadio_wishlist_verificata', raise_if_not_found=False)
target_stage = self.env['crm.stage'].search([('name', '=', 'Wishlist verificata')], limit=1)
if not target_stage:
raise UserError(_("Lo stadio 'Wishlist verificata' non è stato trovato. Assicurati che esista."))
# Verifica se l'opportunità è effettivamente nello stadio "Nuova" prima di cambiarlo
# (questa è una doppia verifica, dato che l'XML dovrebbe già nascondere il bottone)
if self.stage_id.name == 'Nuova':
if self.stage_id.id == target_stage.id:
# Già nello stadio desiderato (improbabile se il bottone è visibile solo in "Nuova")
return True
self.write({'stage_id': target_stage.id})
else:
# Questo messaggio potrebbe apparire se la condizione 'invisible' nell'XML non fosse perfetta
# o se il metodo fosse chiamato da un'altra parte.
raise UserError(_("L'opportunità deve essere nello stadio 'Nuova' per poterla inviare a 'Wishlist verificata'."))
return True
verifica_target = fields.Selection([
('yes', ''),
('no', 'No')
], string="Verificato target ITA/EEUU")
motivo_verifica_negata = fields.Text(string="Motivo mancata verifica")
percent_provvigioni = fields.Float(
string="% Provvigioni",
digits=(5, 2),
help="Inserisci la percentuale"
)
agente_id = fields.Many2one(
'res.partner',
string="Agente",
domain="[('is_company', '=', False)]",
help="Seleziona l'agente di riferimento")
@api.onchange('partner_id')
def _onchange_partner_id_set_agente(self):
if self.partner_id:
if self.partner_id.agente_id:
self.agente_id = self.partner_id.agente_id
self.percent_provvigioni = self.partner_id.percent_provvigioni
@api.model
def create(self, vals):
if vals.get('partner_id'):
partner = self.env['res.partner'].browse(vals['partner_id'])
if not vals.get('agente_id') and partner.agente_id:
vals['agente_id'] = partner.agente_id.id
if not vals.get('percent_provvigioni'):
vals['percent_provvigioni'] = partner.percent_provvigioni
return super(CrmLead, self).create(vals)
# Campi per la Richiesta Offerta
fornitore_id = fields.Many2one('res.partner', string="Fornitore")
buyer = fields.Char(string="Buyer")
prodotti_richiesti = fields.Text(string="Prodotti Richiesti")
minimo_ordine = fields.Char(string="Minimo Ordine")
# Modifica del campo categoria_ids (Many2many)
categoria_ids = fields.Many2many(
'crm.wishlist.categoria',
string="Categorie"
)
sottocategoria_ids = fields.Many2many(
'crm.wishlist.sottocategoria',
string="Sottocategorie",
domain="[('categoria_id', 'in', categoria_ids)]"
)
stagione = fields.Selection([
('close_out', 'Close Out'),
('attuale', 'Attuale'),
('preordine', 'Pre-ordine'),
], string="Stagione")
budget = fields.Monetary(string="Budget", currency_field='currency_id')
currency_id = fields.Many2one('res.currency', string='Valuta', default=lambda self: self.env.company.currency_id.id)
tipo_richiesta = fields.Selection([
('quotazione', 'Quotazione'),
('generica', 'Generica'),
], string="Tipo Richiesta")
brand = fields.Char(string="Brand")
target = fields.Char(string="Target")
genere_ids = fields.Many2many(
'crm.lead.genere', # Riferimento al nuovo modello
string="Genere"
)
note = fields.Text(string="Note")
shelf_life = fields.Char(string="Shelf life")
allegato_ids = fields.Many2many('ir.attachment', string="Allegati")
# Computazione del completamento della wishlist
wishlist_complete_percent = fields.Float(
string="Completamento Wishlist (%)",
compute="_compute_wishlist_complete_percent",
store=True
)
@api.depends(
'categoria_ids',
'sottocategoria_ids',
'stagione',
'budget',
'tipo_richiesta',
'brand',
'target',
'genere_ids',
'verifica_target',
)
def _compute_wishlist_complete_percent(self):
for lead in self:
fields_to_check = [
'categoria_ids', 'sottocategoria_ids', 'stagione', 'budget',
'tipo_richiesta', 'brand', 'target',
'genere_ids', 'verifica_target',
]
total = len(fields_to_check)
completed = 0
for field_name in fields_to_check:
value = getattr(lead, field_name)
if value: # Per i Many2many, questo verifica se la relazione non è vuota
completed += 1
lead.wishlist_complete_percent = round((completed / total) * 100.0, 2) if total else 0.0
@api.onchange('tipo_richiesta')
def _onchange_tipo_richiesta(self):
if self.tipo_richiesta == 'quotazione':
self.priority = '3'
elif self.tipo_richiesta == 'generica':
self.priority = '2'
else:
self.priority = '1'
class WishlistCategoria(models.Model):
_name = 'crm.wishlist.categoria'
_description = 'Categoria Wishlist'
name = fields.Char(string="Nome Categoria")
class WishlistSottocategoria(models.Model):
_name = 'crm.wishlist.sottocategoria'
_description = 'Sottocategoria Wishlist'
name = fields.Char(required=True)
categoria_id = fields.Many2one(
'crm.wishlist.categoria',
string='Categoria di appartenenza',
required=True,
ondelete='cascade',
)
# Nuovo modello per le opzioni del Genere
class CrmLeadGenere(models.Model):
_name = 'crm.lead.genere'
_description = 'Genere per Lead CRM'
name = fields.Char(string="Nome Genere", required=True, translate=True)