# -*- coding: utf-8 -*- from odoo import models, fields, api, exceptions class MklabMarketAction(models.Model): _name = 'mklab.marketaction' name = fields.Char( string='Название акции', compute='_compute_name', store=True, ) start_date = fields.Date(string='Дата начала отгрузок', required=True) end_date = fields.Date(string='Дата окончания отгрузок', required=True) start_sale_date = fields.Date(string='Дата начала продаж на полке', required=True) end_sale_date = fields.Date(string='Дата окончания продаж на полке', required=True) product_line_ids = fields.One2many( comodel_name='mklab.productline', inverse_name='action_id', string='Продукты', ) partner_line_ids = fields.One2many( comodel_name='mklab.partnerline', inverse_name='action_id', string='Контрагенты', ) @api.constrains('start_date', 'end_date', 'start_sale_date', 'end_sale_date') def _check_dates(self): for s in self: if s.end_date < s.start_date: raise exceptions.ValidationError( 'Дата начала отгрузок должна быть меньше даты окончания!') if s.end_sale_date < s.start_sale_date: raise exceptions.ValidationError( 'Дата начала продаж на полке должна быть меньше даты окончания!') @api.depends('start_date', 'end_date') def _compute_name(self): for s in self: s.name = str(s.start_date) if s.start_date and s.end_date else '' class MklabProductLine(models.Model): _name = 'mklab.productline' action_id = fields.Many2one( comodel_name='mklab.marketaction', string='Акция', index=True, ) product_id = fields.Many2one( comodel_name='product.product', string='Товар', required=True, index=True, ) discount_ship = fields.Float(string='Скидка поставки', required=True) discount_sale = fields.Float(string='Скидка на полке', required=True) expected_growth = fields.Float( string='Ожидаемый рост продаж, %', required=True, default=20, ) class MklabPartnerLine(models.Model): _name = 'mklab.partnerline' action_id = fields.Many2one( comodel_name='mklab.marketaction', string='Акция', index=True, ) partner_id = fields.Many2one( comodel_name='res.partner', string='Контрагент', required=True, index=True, ) pos_qty = fields.Float(string='Процент точек', required=True)