234 lines
8.5 KiB
Python
234 lines
8.5 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'."))
|
|
|
|
# --- Invio email agli addetti acquisti ---
|
|
emails = []
|
|
if self.addetto_acquisti and self.addetto_acquisti.partner_id.email:
|
|
emails.append(self.addetto_acquisti.partner_id.email)
|
|
if self.addetto_acquisti_2 and self.addetto_acquisti_2.partner_id.email:
|
|
emails.append(self.addetto_acquisti_2.partner_id.email)
|
|
if not emails:
|
|
return True # Nessun destinatario, esci silenziosamente
|
|
|
|
base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url')
|
|
opportunity_url = f"{base_url}/web#id={self.id}&model=crm.lead&view_type=form&page=wishlist_cliente"
|
|
button_html = f'<a href="{opportunity_url}" style="display:inline-block;padding:8px 16px;background:#1976d2;color:#fff;text-decoration:none;border-radius:4px;">Apri wishlist cliente</a>'
|
|
body_html = f"""
|
|
Gentile Ufficio acquisti,<br/><br/>
|
|
è stata verificata la wishlist presente nella seguente opportunità:<br/><br/>
|
|
<b>Nome cliente:</b> {self.partner_id.name}<br/>
|
|
<b>Nome opportunità:</b> {self.name}<br/><br/>
|
|
|
|
{button_html}
|
|
"""
|
|
mail_values = {
|
|
'subject': f"Wishlist verificata - {self.name}",
|
|
'body_html': body_html,
|
|
'email_to': ','.join(emails),
|
|
'auto_delete': True,
|
|
'model': 'crm.lead',
|
|
'res_id': self.id,
|
|
}
|
|
self.env['mail.mail'].sudo().create(mail_values).send()
|
|
return True
|
|
|
|
|
|
|
|
verifica_target = fields.Selection([
|
|
('yes', 'Sì'),
|
|
('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_create_multi
|
|
def create(self, vals_list):
|
|
for vals in vals_list:
|
|
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_list)
|
|
|
|
|
|
# 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)
|