131 lines
4 KiB
Python
131 lines
4 KiB
Python
# Copyright 2025 Bemade
|
|
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl-3.0.html)
|
|
|
|
"""Journal de synchronisation pour Odoo to Bemade Customer.
|
|
|
|
Ce module enregistre toutes les opérations de synchronisation effectuées
|
|
entre Odoo client et Bemade pour des fins d'audit et de dépannage.
|
|
"""
|
|
|
|
from odoo import api, fields, models, _
|
|
|
|
|
|
class OdooToBemadeCustomerSyncLog(models.Model):
|
|
"""Journal des synchronisations.
|
|
|
|
Enregistre toutes les opérations de synchronisation pour traçabilité.
|
|
"""
|
|
|
|
_name = 'odoo.to.bemade.customer.sync.log'
|
|
_description = 'Journal de synchronisation Bemade'
|
|
_inherit = 'odoo.sync.log'
|
|
_order = 'create_date desc'
|
|
|
|
name = fields.Char(
|
|
string='Opération',
|
|
required=True,
|
|
)
|
|
model_id = fields.Many2one(
|
|
comodel_name='odoo.to.bemade.customer.sync.model',
|
|
string='Modèle',
|
|
ondelete='set null',
|
|
)
|
|
record_id = fields.Integer(
|
|
string='ID Enregistrement',
|
|
)
|
|
operation = fields.Selection(
|
|
selection=[
|
|
('sync', 'Synchronisation'),
|
|
('delete', 'Suppression'),
|
|
('conflict', 'Conflit'),
|
|
('error', 'Erreur'),
|
|
],
|
|
string='Type d\'opération',
|
|
required=True,
|
|
)
|
|
direction = fields.Selection(
|
|
selection=[
|
|
('to_bemade', 'Odoo → Bemade'),
|
|
('from_bemade', 'Bemade → Odoo'),
|
|
],
|
|
string='Direction',
|
|
)
|
|
result = fields.Selection(
|
|
selection=[
|
|
('success', 'Succès'),
|
|
('warning', 'Avertissement'),
|
|
('error', 'Erreur'),
|
|
],
|
|
string='Résultat',
|
|
required=True,
|
|
)
|
|
execution_time = fields.Float(
|
|
string='Temps d\'exécution (s)',
|
|
digits=(10, 3),
|
|
)
|
|
details = fields.Text(
|
|
string='Détails',
|
|
)
|
|
remote_id = fields.Char(
|
|
string='ID Bemade',
|
|
)
|
|
queue_id = fields.Many2one(
|
|
comodel_name='odoo.to.bemade.customer.sync.queue',
|
|
string='Entrée file d\'attente',
|
|
ondelete='set null',
|
|
)
|
|
user_id = fields.Many2one(
|
|
comodel_name='res.users',
|
|
string='Utilisateur',
|
|
default=lambda self: self.env.user.id,
|
|
readonly=True,
|
|
)
|
|
|
|
def action_view_record(self):
|
|
"""Affiche l'enregistrement associé à cette entrée de journal."""
|
|
self.ensure_one()
|
|
if not self.model_id or not self.record_id:
|
|
return False
|
|
|
|
return {
|
|
'name': _('Enregistrement synchronisé'),
|
|
'type': 'ir.actions.act_window',
|
|
'res_model': self.model_id.model,
|
|
'res_id': self.record_id,
|
|
'view_mode': 'form',
|
|
}
|
|
|
|
@api.model
|
|
def log(self, operation, model=None, record_id=None, result='success', details=None,
|
|
direction=None, remote_id=None, queue_id=None, execution_time=0):
|
|
"""Crée une entrée dans le journal des synchronisations."""
|
|
model_id = False
|
|
if model and isinstance(model, str):
|
|
model_rec = self.env['odoo.to.bemade.customer.sync.model'].search(
|
|
[('model', '=', model)], limit=1)
|
|
if model_rec:
|
|
model_id = model_rec.id
|
|
elif model and hasattr(model, 'id'):
|
|
model_id = model.id
|
|
|
|
name = f"{operation.capitalize()}"
|
|
if model_id:
|
|
model_name = self.env['odoo.to.bemade.customer.sync.model'].browse(model_id).name
|
|
name += f" - {model_name}"
|
|
if record_id:
|
|
name += f" #{record_id}"
|
|
|
|
vals = {
|
|
'name': name,
|
|
'model_id': model_id,
|
|
'record_id': record_id,
|
|
'operation': operation,
|
|
'result': result,
|
|
'details': details,
|
|
'direction': direction,
|
|
'remote_id': remote_id,
|
|
'queue_id': queue_id and queue_id if isinstance(queue_id, int) else queue_id and queue_id.id,
|
|
'execution_time': execution_time,
|
|
}
|
|
|
|
return self.create(vals)
|