from odoo import fields, models, api from datetime import datetime, timedelta import logging _logger = logging.getLogger(__name__) class SalesTarget(models.Model): _name = 'sales.target' partner_id = fields.Many2one('res.partner', string='Customer') period = fields.Integer(string='Periode') omset_last_year = fields.Float(string='Omset Tahun Lalu') ongoing_omset_odoo = fields.Float(string='Omset Berjalan Odoo', compute='_compute_ongoing_omset') ongoing_omset_accurate = fields.Float(string='Omset Berjalan Accurate') ongoing_omset_adempiere = fields.Float(string='Omset Berjalan ADempiere') ongoing_omset_total = fields.Float(string='Total Omset', compute='_compute_total_omset') target = fields.Float(string='Target') ach_per_year = fields.Float(string='Ach/Year%', compute='_compute_achievement') ach_per_month = fields.Float(string='Ach/Month%', compute='_compute_achievement') sales_id = fields.Many2one('res.users', string='Salesperson', compute='_compute_partner') reference = fields.Char(string='Reference', compute='_compute_partner') def _compute_partner(self): for sales_target in self: sales_target.sales_id = sales_target.partner_id.user_id sales_target.reference = sales_target.partner_id.reference_number def _compute_achievement(self): for sales_target in self: if not sales_target.target or sales_target.target <= 0: sales_target.ach_per_year = 0 sales_target.ach_per_month = 0 return current_time = datetime.now() current_month = current_time.month sales_target.ach_per_year = sales_target.ongoing_omset_total/sales_target.target*100 sales_target.ach_per_month = sales_target.ongoing_omset_total/((sales_target.target/12)*current_month) def _compute_total_omset(self): for target in self: target.ongoing_omset_total = target.ongoing_omset_odoo + target.ongoing_omset_accurate + target.ongoing_omset_adempiere def _compute_ongoing_omset(self): for target in self: target.ongoing_omset_odoo = 0 if not target.ids: return True partners = [] if target.partner_id.parent_id: parent_id = target.partner_id.parent_id else: parent_id = target.partner_id partners += parent_id.child_ids partners.append(parent_id) datefrom = datetime(target.period, 1, 1, 00, 00) # datefrom = datefrom.strftime('%Y-%m-%d %H:%M:%S') dateto = datetime(target.period, 12, 31, 23, 59) # dateto = dateto.strftime('%Y-%m-%d %H:%M:%S') total_omset = 0 for partner in partners: domain = [ ('partner_id', '=', partner.id), ('state', 'not in', ['draft', 'cancel']), ('move_type', 'in', ('out_invoice', 'out_refund')), ('invoice_date', '>=', datefrom), ('invoice_date', '<=', dateto) ] invoices = target.env['account.move'].search(domain) for invoice in invoices: total_omset += invoice.amount_untaxed target.ongoing_omset_odoo = total_omset