from odoo import models, fields, api,_ from odoo.exceptions import UserError, ValidationError,Warning from psycopg2 import sql, DatabaseError from werkzeug import utils import json class opendons_aggregate_partner(models.Model): _name = 'opendons.aggregate.partner' _description = 'opération marketing : partner agregats' partner_id = fields.Many2one('res.partner',string='partner',readonly=True) first_donation_product_id=fields.Many2one('product.product',string='first donation product affectation',readonly=True) first_donation_date=fields.Date(string='first donation date', readonly=True) first_donation_operation_id = fields.Many2one('opendon.operation',string='first donation operation',readonly=True) max_amount_donation=fields.Float(string='max amount donation',readonly=True) annual_average_number_donation=fields.Float(string='annual average number of donation',readonly=True) average_amount_donation=fields.Float(string='average amount donation',readonly=True) rfm_score=fields.Float(string='rfm score',readonly=True) def compute_aggregate(self): vals={} self._compute_init() partners=self.env['res.partner'].search([]) for partner in partners: vals['partner_id']=int(partner.id) vals['first_donation_product_id']=self._compute_first_donation_product(partner.id) first_donation_date=self._compute_first_donation_date(partner.id) if first_donation_date:vals['first_donation_date']=first_donation_date vals['first_donation_operation_id']=self._compute_first_donation_operation(partner.id) #vals['max_amount_donation']=self._compute_max_amount_donation(partner_id)) #vals['annual_average_number_donation']=self._compute_annual_average_number_donation(partner_id)) #vals['average_amount_donation']=self._compute_average_amount_donation(partner_id)) #vals['rfm_score']=self._compute_rfm_score(partner_id)) res=self.env['opendons.aggregate.partner'].create(vals) def _compute_init(self): aggregate=self.env['opendons.aggregate.partner'].search([]) aggregate.unlink() return True def _compute_first_donation_product(self,partner_id): first_donation=self.env['donation.donation'].search([('partner_id','=',int(partner_id)),('recurring_template','=',False),('state','=','done')],limit=1,order="donation_date asc") if first_donation: first_line_donation=self.env['donation.line'].search([('donation_id','=',int(first_donation.id))],limit=1,order="id asc") if first_line_donation: return int(first_line_donation.product_id) return False def _compute_first_donation_operation(self,partner_id): first_donation=self.env['donation.donation'].search([('partner_id','=',int(partner_id)),('recurring_template','=',False),('state','=','done')],limit=1,order="donation_date asc") if first_donation: return int(first_donation.operation_id) else: return False def _compute_first_donation_date(self,partner_id): first_donation=self.env['donation.donation'].search([('partner_id','=',int(partner_id)),('recurring_template','=',False),('state','=','done')],limit=1,order="donation_date asc") if first_donation: return first_donation.donation_date else: return False def _compute_max_amount_donation(self,partner_id): return True def _compute_annual_average_number_donation(self,partner_id): return True def _compute_average_amount_donation(self,partner_id): return True def _compute_rfm_score(self,partner_id): return True