diff --git a/__manifest__.py b/__manifest__.py index 316cbed434c630a3a36360c21a82bb796397cd75..15d01adecfcfd74e678ab2d2162d5e63fba6b98b 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -14,11 +14,13 @@ # wizard "wizard/acc_sale_price_wizard_views.xml", "wizard/acc_sale_price_surplus_wizard_views.xml", + "wizard/acc_price_conf_wizard_views.xml", "wizard/acc_account_wizard_views.xml", "wizard/acc_account_surplus_wizard_views.xml", # views "views/assets.xml", "views/acc_sale_price_views.xml", + "views/acc_price_conf_views.xml", "views/acc_operation_views.xml", "views/acc_counter_views.xml", "views/acc_account_views.xml", diff --git a/models/__init__.py b/models/__init__.py index 7545f9fa668f82c1097f3e5b3db18fe1ebf09f0b..a10533d050bd9df713c41ad30498de66f8a8a264 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -2,6 +2,7 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from . import acc_sale_price +from . import acc_price_conf from . import acc_operation from . import acc_account from . import acc_counter diff --git a/models/acc_operation.py b/models/acc_operation.py index 32ade832e442fcc4af11dc2997cb2dc5dc820da8..d0a8c0730c8bc9aabaa5a78aee72e0efde5caa79 100644 --- a/models/acc_operation.py +++ b/models/acc_operation.py @@ -20,6 +20,23 @@ class AccOperation(models.Model): "Facturation Surplus activée", compute="_compute_is_surplus_active", store=True ) acc_sale_price_ids = fields.One2many("acc.sale.price", "acc_operation_id") + + acc_sale_price_conf_ids = fields.One2many( + "acc.price.conf", + "acc_operation_id", + domain=[("type", "=", "sale")], + string="Liste des Prix de Vente") + acc_buyer_price_conf_ids = fields.One2many( + "acc.price.conf", + "acc_operation_id", + domain=[("type", "=", "buyer")], + string="Liste des Prix d'Achat") + acc_accise_price_conf_ids = fields.One2many( + "acc.price.conf", + "acc_operation_id", + domain=[("type", "=", "accise")], + string="Liste des Tarifs ACCISE") + acc_sale_price_surplus_ids = fields.One2many( "acc.sale.price.buyer", "acc_operation_id" ) @@ -189,18 +206,20 @@ class AccOperation(models.Model): } ) - interval_ids = self.env["acc.sale.price"].search( + interval_ids = self.env["acc.price.conf"].search( [ ("acc_operation_id", "=", self.id), ("acc_injection_id", "=", acc_injection_id.id), ("acc_delivery_id", "=", acc_delivery_id.id), ("start_date", "<=", date_start), + ("type", "=", "sale"), ("end_date", "=", False), ] ) if not interval_ids: - price_ids = self.env["acc.sale.price"].search( + price_ids = self.env["acc.price.conf"].search( [ + ("type", "=", "sale"), ("acc_operation_id", "=", self.id), ("acc_injection_id", "=", acc_injection_id.id), ("acc_delivery_id", "=", acc_delivery_id.id), @@ -209,8 +228,9 @@ class AccOperation(models.Model): ("end_date", "=", False), ] ) - price2_ids = self.env["acc.sale.price"].search( + price2_ids = self.env["acc.price.conf"].search( [ + ("type", "=", "sale"), ("acc_operation_id", "=", self.id), ("acc_injection_id", "=", acc_injection_id.id), ("acc_delivery_id", "=", acc_delivery_id.id), @@ -449,8 +469,9 @@ class AccOperation(models.Model): } ) - interval_ids = self.env["acc.sale.price.buyer"].search( + interval_ids = self.env["acc.price.conf"].search( [ + ("type", "=", "buyer"), ("acc_operation_id", "=", self.id), ("acc_injection_id", "=", injection_id.id), ("acc_buyer_id", "=", injection_id.buyer_id.id), @@ -459,16 +480,18 @@ class AccOperation(models.Model): ] ) if not interval_ids: - price_ids = self.env["acc.sale.price.buyer"].search( + price_ids = self.env["acc.price.conf"].search( [ + ("type", "=", "buyer"), ("acc_operation_id", "=", self.id), ("acc_injection_id", "=", injection_id.id), ("acc_buyer_id", "=", injection_id.buyer_id.id), ("end_date", ">=", date_start), ] ) - price2_ids = self.env["acc.sale.price.buyer"].search( + price2_ids = self.env["acc.price.conf"].search( [ + ("type", "=", "buyer"), ("acc_operation_id", "=", self.id), ("acc_injection_id", "=", injection_id.id), ("acc_buyer_id", "=", injection_id.buyer_id.id), @@ -569,7 +592,7 @@ class AccOperation(models.Model): :param view_xmlid: Vue appelée :return: action """ - wiz = self.env["acc.sale.price.wizard"].create({}) + wiz = self.env["acc.price.conf.wizard"].create({}) view_id = self.env.ref( "acc_account.%s" % view_xmlid, ).id @@ -578,7 +601,7 @@ class AccOperation(models.Model): "type": "ir.actions.act_window", "view_type": "form", "view_mode": "form", - "res_model": "acc.sale.price.wizard", + "res_model": "acc.price.conf.wizard", "target": "new", "res_id": wiz.id, "view_id": view_id, @@ -586,7 +609,7 @@ class AccOperation(models.Model): } def open_x2m_matrix(self): - return self._open_x2m_matrix("x2many_2d_matrix_demo") + return self._open_x2m_matrix("x2many_2d_matrix_sale") # ------------------------------------------------------ # Financial method APP diff --git a/models/acc_price_conf.py b/models/acc_price_conf.py new file mode 100644 index 0000000000000000000000000000000000000000..0e55429d8c5b2042dd2ff2df9c3ab0af7cdcbf6f --- /dev/null +++ b/models/acc_price_conf.py @@ -0,0 +1,175 @@ +# Copyright 2023 Le Filament (<http://www.le-filament.com>) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from dateutil.relativedelta import relativedelta + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError + + +class AccPriceConf(models.Model): + _name = "acc.price.conf" + _description = "Gestion des prix" + + def _get_default_currency_id(self): + return self.env.company.currency_id.id + + # ------------------------------------------------------ + # Fields declaration + # ------------------------------------------------------ + acc_operation_id = fields.Many2one( + "acc.operation", "Opération", ondelete="cascade") + acc_injection_id = fields.Many2one( + "acc.counter", + domain=[("is_injection", "=", True)], + string="Point d'injection", + ondelete="cascade", + ) + acc_delivery_id = fields.Many2one( + "acc.counter", + domain=[("is_delivery", "=", True)], + string="Point de soutirage", + ondelete="cascade", + ) + acc_buyer_id = fields.Many2one( + "res.partner", + domain=[("is_buyer_surplus", "=", True)], + string="Acheteur de surplus", + ondelete="cascade", + ) + start_date = fields.Date("Début de la période") + end_date = fields.Date("Fin de la période") + currency_id = fields.Many2one( + "res.currency", "Devise", default=_get_default_currency_id + ) + price = fields.Float("Tarif", digits="Sale Price") + power_delivery = fields.Float(related="acc_delivery_id.power_delivery", store=True) + zip = fields.Char(related="acc_delivery_id.zip", store=True) + type = fields.Selection([ + ("sale", "Vente"), + ("buyer", "Achat"), + ("accise", "ACCISE") + ], string="Type de prix") + + @api.model_create_multi + def create(self, vals_list): + new_vals = [] + for vals in vals_list: + if "acc_operation_id" in vals: + acc_operation_id = vals["acc_operation_id"] + acc_operation = self.env["acc.operation"].browse(acc_operation_id) + if "acc_injection_id" in vals: + acc_injection_id = vals["acc_injection_id"] + if "acc_delivery_id" in vals: + acc_delivery_id = vals["acc_delivery_id"] + else: + acc_delivery_id = False + if "acc_buyer_id" in vals: + acc_buyer_id = vals["acc_buyer_id"] + else: + acc_buyer_id = False + if "start_date" in vals: + start_date = fields.Date.to_date(vals["start_date"]) + type = self.env.context.get("type") + vals["type"] = type + # If date start period doesn't exist + if type == "buyer": + price_ids = self.env["acc.price.conf"].search( + [ + ("type", "=", type), + ("acc_operation_id", "=", acc_operation_id), + ("acc_buyer_id", "=", acc_buyer_id), + ("acc_injection_id", "=", acc_injection_id), + ] + ) + else: + price_ids = self.env["acc.price.conf"].search( + [ + ("type", "=", type), + ("acc_operation_id", "=", acc_operation_id), + ("acc_delivery_id", "=", acc_delivery_id), + ("acc_injection_id", "=", acc_injection_id), + ] + ) + + if acc_operation.date_start_contract > start_date: + raise ValidationError( + _("L'opération n'est pas active à cette période là") + ) + + # Creation d'une nouvelle période date + # anniversaire à date renseignée - 1 jour + if not price_ids and acc_operation.date_start_contract < start_date: + val_new = { + "acc_operation_id": acc_operation_id, + "acc_injection_id": acc_injection_id, + "acc_delivery_id": acc_delivery_id, + "acc_buyer_id": acc_buyer_id, + "price": vals["price"], + "start_date": acc_operation.date_start_contract, + "end_date": start_date - relativedelta(days=1), + "type": type, + } + new_vals.append(val_new) + + # Si une période existe après la date renseignée + if type == "buyer": + price_ids = self.env["acc.price.conf"].search( + [ + ("acc_operation_id", "=", acc_operation_id), + ("acc_buyer_id", "=", acc_buyer_id), + ("acc_injection_id", "=", acc_injection_id), + ("start_date", "<=", start_date), + ("end_date", ">", start_date), + ("type", "=", type), + ] + ) + else: + price_ids = self.env["acc.price.conf"].search( + [ + ("acc_operation_id", "=", acc_operation_id), + ("acc_delivery_id", "=", acc_delivery_id), + ("acc_injection_id", "=", acc_injection_id), + ("start_date", "<=", start_date), + ("end_date", ">", start_date), + ("type", "=", type), + ] + ) + if price_ids: + if type == "sale": + message = "Un prix de vente existe déjà pour cette date là" + elif type == "buyer": + message = "Un prix d'achat existe déjà pour cette date là" + else: + message = "Un tarif ACCISE existe déjà pour cette date là" + raise ValidationError( + _(message) + ) + + if type == "buyer": + price_id = self.env["acc.price.conf"].search( + [ + ("type", "=", type), + ("acc_operation_id", "=", acc_operation_id), + ("acc_buyer_id", "=", acc_buyer_id), + ("acc_injection_id", "=", acc_injection_id), + ], + limit=1, + order="create_date desc", + ) + else: + price_id = self.env["acc.price.conf"].search( + [ + ("type", "=", type), + ("acc_operation_id", "=", acc_operation_id), + ("acc_delivery_id", "=", acc_delivery_id), + ("acc_injection_id", "=", acc_injection_id), + ], + limit=1, + order="create_date desc", + ) + if price_id: + price_id.end_date = start_date - relativedelta(days=1) + vals_list += new_vals + res = super(AccPriceConf, self).create(vals_list) + return res diff --git a/security/ir.model.access.csv b/security/ir.model.access.csv index 647f9df9e0cc4e25f779e3c40c19780d122e3ebb..4f95c3faf3f29caa39098db133a78b3151753b74 100644 --- a/security/ir.model.access.csv +++ b/security/ir.model.access.csv @@ -1,10 +1,14 @@ id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink "access_acc_sale_price_group_partner_manager","acc_sale_price group_partner_manager","model_acc_sale_price","base.group_partner_manager",1,1,1,1 "access_acc_sale_price_group_user","acc_sale_price group_user","model_acc_sale_price","base.group_user",1,0,0,0 +"access_acc_price_conf_group_partner_manager","acc_price_conf group_partner_manager","model_acc_price_conf","base.group_partner_manager",1,1,1,1 +"access_acc_price_conf_group_user","acc_price_conf group_user","model_acc_price_conf","base.group_user",1,0,0,0 "access_acc_sale_price_buyer_group_partner_manager","acc_sale_price_buyer group_partner_manager","model_acc_sale_price_buyer","base.group_partner_manager",1,1,1,1 "access_acc_sale_price_buyer_group_user","acc_sale_price_buyer group_user","model_acc_sale_price_buyer","base.group_user",1,0,0,0 "access_acc_sale_price_wizard_group_partner_manager","acc_sale_price_wizard group_partner_manager","model_acc_sale_price_wizard","base.group_partner_manager",1,1,1,1 "access_acc_sale_price_wizard_group_user","acc_sale_price_wizard group_user","model_acc_sale_price_wizard","base.group_user",1,0,0,0 +"access_acc_price_conf_wizard_group_partner_manager","acc_price_conf_wizard group_partner_manager","model_acc_price_conf_wizard","base.group_partner_manager",1,1,1,1 +"access_acc_price_conf_wizard_group_user","acc_price_conf_wizard group_user","model_acc_price_conf_wizard","base.group_user",1,0,0,0 "access_acc_sale_price_surplus_wizard_group_partner_manager","acc_sale_price_surplus_wizard group_partner_manager","model_acc_sale_price_surplus_wizard","base.group_partner_manager",1,1,1,1 "access_acc_sale_price_surplus_wizard_group_user","acc_sale_price_surplus_wizard group_user","model_acc_sale_price_surplus_wizard","base.group_user",1,0,0,0 "access_acc_account_group_partner_manager","acc_account group_partner_manager","model_acc_account","base.group_partner_manager",1,1,1,1 diff --git a/views/acc_operation_views.xml b/views/acc_operation_views.xml index 5e68cd60a21bc42b4a5af8b5b795168586c9068b..725eba6aa5bec6b6241cc39d0dee0febbe56fa10 100644 --- a/views/acc_operation_views.xml +++ b/views/acc_operation_views.xml @@ -77,15 +77,22 @@ <button string="Générer des Prix de vente" type="action" - name="%(acc_account.act_x2many_2d_matrix_demo)d" + context="{'type': 'sale'}" + name="%(acc_account.act_x2many_2d_matrix_sale)d" class="btn-primary" attrs="{'invisible': [('is_account_active', '=', False)]}" /> </header> - <field name="acc_sale_price_ids" widget="one2many"> + <field + name="acc_sale_price_conf_ids" + widget="one2many" + domain="[('type', '=', 'sale')]" + context="{'default_type': 'sale'}" + > <tree editable="bottom" default_order="start_date desc"> <field name="acc_injection_id" /> <field name="acc_delivery_id" /> + <field name="power_delivery" /> <field name="start_date" /> <field name="end_date" /> <field name="currency_id" invisible="1" /> @@ -102,12 +109,18 @@ <button string="Générer des Prix de vente Surplus" type="action" - name="%(acc_account.act_x2many_2d_matrix_demo_surplus)d" + context="{'type': 'buyer'}" + name="%(acc_account.act_x2many_2d_matrix_buyer)d" class="btn-primary" attrs="{'invisible': [('is_account_active', '=', False)]}" /> </header> - <field name="acc_sale_price_surplus_ids" widget="one2many"> + <field + name="acc_buyer_price_conf_ids" + widget="one2many" + domain="[('type', '=', 'buyer')]" + context="{'default_type': 'buyer'}" + > <tree editable="bottom" default_order="start_date desc"> <field name="acc_injection_id" /> <field name="acc_buyer_id" /> @@ -118,6 +131,39 @@ </tree> </field> </page> + <page + string="Tarifs ACCISE" + name="account_accise" + attrs="{'invisible': [('is_account_active', '=', False)]}" + > + <header> + <button + string="Générer les Tarifs ACCISE" + type="action" + name="%(acc_account.act_x2many_2d_matrix_sale)d" + class="btn-primary" + context="{'type': 'accise'}" + attrs="{'invisible': [('is_account_active', '=', False)]}" + /> + </header> + <field + name="acc_accise_price_conf_ids" + widget="one2many" + domain="[('type', '=', 'accise')]" + context="{'default_type': 'accise'}" + > + <tree editable="bottom" default_order="start_date desc"> + <field name="acc_injection_id" /> + <field name="acc_delivery_id" /> + <field name="power_delivery" /> + <field name="zip" /> + <field name="start_date" /> + <field name="end_date" /> + <field name="currency_id" invisible="1" /> + <field name="price" widget="monetary" /> + </tree> + </field> + </page> <page string="Facturation" name="account" diff --git a/views/acc_price_conf_views.xml b/views/acc_price_conf_views.xml new file mode 100644 index 0000000000000000000000000000000000000000..138e3bb7ea7d7018c279418443dcd3373e1db20b --- /dev/null +++ b/views/acc_price_conf_views.xml @@ -0,0 +1,127 @@ +<?xml version="1.0" encoding="utf-8" ?> +<odoo> + <data> + + <record id="acc_price_conf_form_view" model="ir.ui.view"> + <field name="name">acc.acc_price_conf.form</field> + <field name="model">acc.price.conf</field> + <field name="arch" type="xml"> + <form string="Gestion des prix"> + <sheet> + <group> + <field name="type"/> + </group> + <group> + <group> + <field name="acc_operation_id" /> + <field name="acc_injection_id" /> + <field name="acc_delivery_id" attrs="{'invisible': [('type', '=', 'buyer')]}"/> + <field name="acc_buyer_id" attrs="{'invisible': [('type', '!=', 'buyer')]}"/> + <field name="power_delivery" attrs="{'invisible': [('type', '=', 'buyer')]}"/> + <field name="zip" attrs="{'invisible': [('type', '!=', 'accise')]}"/> + </group> + <group> + <field name="start_date" /> + <field name="end_date" /> + <field + name="price" + widget='monetary' + options="{'field_digits': True}" + /> + <field name="currency_id" /> + </group> + </group> + </sheet> + </form> + </field> + </record> + + <record id="acc_sale_price_conf_tree_view" model="ir.ui.view"> + <field name="name">acc.sale.acc_price_conf.tree</field> + <field name="model">acc.price.conf</field> + <field name="arch" type="xml"> + <tree string="Prix de vente" default_order="start_date desc"> + <field name="acc_operation_id" /> + <field name="acc_injection_id" /> + <field name="acc_delivery_id" /> + <field name="power_delivery" /> + <field name="start_date" /> + <field name="end_date" /> + <field name="currency_id" invisible="1" /> + <field + name="price" + widget="monetary" + options="{'field_digits': True}" + /> + </tree> + </field> + </record> + + <record id="acc_buyer_price_conf_tree_view" model="ir.ui.view"> + <field name="name">acc.buyer.acc_price_conf.tree</field> + <field name="model">acc.price.conf</field> + <field name="arch" type="xml"> + <tree string="Prix de vente" default_order="start_date desc"> + <field name="acc_operation_id" /> + <field name="acc_injection_id" /> + <field name="acc_buyer_id" /> + <field name="power_delivery" /> + <field name="start_date" /> + <field name="end_date" /> + <field name="currency_id" invisible="1" /> + <field + name="price" + widget="monetary" + options="{'field_digits': True}" + /> + </tree> + </field> + </record> + + <record id="acc_sale_price_conf_act_window" model="ir.actions.act_window"> + <field name="name">Prix de Vente</field> + <field name="type">ir.actions.act_window</field> + <field name="res_model">acc.price.conf</field> + <field name="view_mode">tree,form</field> + <field name="domain">[('type', '=', 'sale')]</field> + <field name="context">{'default_type': 'sale'}</field> + <field name="view_id" ref="acc_sale_price_conf_tree_view" /> + <field name="help" type="html"> + <p class="o_view_nocontent_smiling_face"> + Créer une entrée de données + </p> + </field> + </record> + + <record id="acc_accise_price_conf_act_window" model="ir.actions.act_window"> + <field name="name">Prix ACCISE</field> + <field name="type">ir.actions.act_window</field> + <field name="res_model">acc.price.conf</field> + <field name="view_mode">tree,form</field> + <field name="domain">[('type', '=', 'accise')]</field> + <field name="context">{'default_type': 'accise'}</field> + <field name="view_id" ref="acc_sale_price_conf_tree_view" /> + <field name="help" type="html"> + <p class="o_view_nocontent_smiling_face"> + Créer une entrée de données + </p> + </field> + </record> + + <record id="acc_buyer_price_conf_act_window" model="ir.actions.act_window"> + <field name="name">Prix d'achat</field> + <field name="type">ir.actions.act_window</field> + <field name="res_model">acc.price.conf</field> + <field name="view_mode">tree,form</field> + <field name="domain">[('type', '=', 'buyer')]</field> + <field name="context">{'default_type': 'buyer'}</field> + <field name="view_id" ref="acc_buyer_price_conf_tree_view" /> + <field name="help" type="html"> + <p class="o_view_nocontent_smiling_face"> + Créer une entrée de données + </p> + </field> + </record> + + </data> +</odoo> diff --git a/views/menu_views.xml b/views/menu_views.xml index 430795c2e5e306a98e6319ac92a7c3353588a389..32c818bfaff5a5ddbb7dafd65f443a076a9e5c76 100644 --- a/views/menu_views.xml +++ b/views/menu_views.xml @@ -17,21 +17,53 @@ action="acc_account.action_acc_account" /> +<!-- <menuitem--> +<!-- id="acc_sale_price_menu"--> +<!-- parent="menu_account"--> +<!-- name="Prix de vente"--> +<!-- sequence="20"--> +<!-- action="acc_sale_price_act_window"--> +<!-- />--> + +<!-- <menuitem--> +<!-- id="acc_sale_price_buyer_menu"--> +<!-- parent="menu_account"--> +<!-- name="Prix de vente Acheteur"--> +<!-- sequence="30"--> +<!-- action="acc_sale_price_buyer_act_window"--> +<!-- />--> + <menuitem - id="acc_sale_price_menu" + id="acc_sale_price_conf_menu" parent="menu_account" - name="Prix de vente" + name="Gestion Prix de vente" sequence="20" - action="acc_sale_price_act_window" + action="acc_sale_price_conf_act_window" /> <menuitem - id="acc_sale_price_buyer_menu" + id="acc_accise_price_conf_menu" parent="menu_account" - name="Prix de vente Acheteur" - sequence="30" - action="acc_sale_price_buyer_act_window" + name="Gestion Tarifs ACCISE" + sequence="20" + action="acc_accise_price_conf_act_window" + /> + + <menuitem + id="acc_buyer_price_conf_menu" + parent="menu_account" + name="Gestion Prix d'achat" + sequence="20" + action="acc_buyer_price_conf_act_window" /> +<!-- --> +<!-- <menuitem--> +<!-- id="acc_sale_price_buyer_menu"--> +<!-- parent="menu_account"--> +<!-- name="Prix de vente Acheteur"--> +<!-- sequence="30"--> +<!-- action="acc_sale_price_buyer_act_window"--> +<!-- />--> <menuitem id="acc_acc_account_menu" diff --git a/wizard/__init__.py b/wizard/__init__.py index 0f3a3cf624661d8490442d61aba36419c3472789..f5bf661aef42eb8d58deec2bc325c670b0deb52e 100644 --- a/wizard/__init__.py +++ b/wizard/__init__.py @@ -2,6 +2,7 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from . import acc_sale_price_wizard +from . import acc_price_conf_wizard from . import acc_sale_price_surplus_wizard from . import acc_account_wizard from . import acc_account_surplus_wizard diff --git a/wizard/acc_price_conf_wizard.py b/wizard/acc_price_conf_wizard.py new file mode 100644 index 0000000000000000000000000000000000000000..3e1cf400d98e4446b1fc945fbb6b60c203c31c87 --- /dev/null +++ b/wizard/acc_price_conf_wizard.py @@ -0,0 +1,91 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import api, fields, models + + +class AccPriceConfWizard(models.TransientModel): + _name = "acc.price.conf.wizard" + _description = "Gestion des prix wizard" + + def _default_operation_id(self): + return self.env.context.get("active_id") + + def _default_type(self): + return self.env.context.get("type") + + def _default_price_conf_ids(self): + type = self.env.context.get("type") + if type == "buyer": + inj_ids = self.env["acc.counter"].search( + [ + ("is_injection", "=", True), + ("acc_operation_id", "=", self.env.context.get("active_id")), + ("buyer_id", "!=", False), + ] + ) + + return [ + ( + 0, + 0, + { + "acc_buyer_id": inj.buyer_id.id, + "acc_injection_id": inj.id, + "acc_operation_id": self.env.context.get("active_id"), + }, + ) + # # if there isn't a demo line record for the user, create a new one + # if not rec.acc_sale_price_ids.filtered(lambda x: x.acc_operation_id == op) else + # # otherwise, return the line + # (4, rec.acc_sale_price_ids.filtered(lambda x: x.acc_operation_id == usr)[0].id) + for inj in inj_ids + ] + else: + inj_ids = self.env["acc.counter"].search( + [ + ("is_injection", "=", True), + ("acc_operation_id", "=", self.env.context.get("active_id")), + ] + ) + recs = self.env["acc.counter"].search( + [ + ("is_delivery", "=", True), + ("acc_operation_id", "=", self.env.context.get("active_id")), + ] + ) + + return [ + ( + 0, + 0, + { + "acc_delivery_id": rec.id, + "acc_injection_id": inj.id, + "acc_operation_id": self.env.context.get("active_id"), + }, + ) + # # if there isn't a demo line record for the user, create a new one + # if not rec.acc_sale_price_ids.filtered(lambda x: x.acc_operation_id == op) else + # # otherwise, return the line + # (4, rec.acc_sale_price_ids.filtered(lambda x: x.acc_operation_id == usr)[0].id) + for rec in recs + for inj in inj_ids + ] + + + acc_price_conf_ids = fields.Many2many( + "acc.price.conf", default=lambda self: self._default_price_conf_ids() + ) + start_date = fields.Date("Début de période", default=fields.Date.context_today) + acc_operation_id = fields.Many2one("acc.operation", default=_default_operation_id) + type = fields.Selection([ + ("sale", "Vente"), + ("buyer", "Achat"), + ("accise", "ACCISE") + ], default=_default_type) + + @api.onchange("start_date") + def _onchange_start_date(self): + if self.start_date: + for price in self.acc_price_conf_ids: + price.start_date = self.start_date + diff --git a/wizard/acc_price_conf_wizard_views.xml b/wizard/acc_price_conf_wizard_views.xml new file mode 100644 index 0000000000000000000000000000000000000000..c284b60ffd709e24822116827ebc1f7d982bc89a --- /dev/null +++ b/wizard/acc_price_conf_wizard_views.xml @@ -0,0 +1,91 @@ +<?xml version="1.0" encoding="utf-8" ?> +<odoo> + <record id="x2many_2d_matrix_sale" model="ir.ui.view"> + <field name="name">acc.sale.price.conf.wizard.wiz</field> + <field name="model">acc.price.conf.wizard</field> + <field name="type">form</field> + <field name="arch" type="xml"> + <form> + <field name="acc_operation_id" invisible="1" /> + <group> + <group> + <field name="start_date" /> + <field name="type" invisible="1"/> + </group> + </group> + <field + name="acc_price_conf_ids" + widget="x2many_2d_matrix" + field_x_axis="acc_injection_id" + field_y_axis="acc_delivery_id" + field_value="price" + show_row_totals="0" + show_column_totals="0" + > + <tree> + <field name="acc_injection_id" /> + <field name="acc_delivery_id" /> + <field name="price" /> + <field name="type" /> + <field name="acc_operation_id" /> + <field name="start_date" /> + </tree> + </field> + </form> + </field> + </record> + + <record id="x2many_2d_matrix_buyer" model="ir.ui.view"> + <field name="name">acc.buyer.price.conf.wizard.wiz</field> + <field name="model">acc.price.conf.wizard</field> + <field name="type">form</field> + <field name="arch" type="xml"> + <form> + <field name="acc_operation_id" invisible="1" /> + <group> + <group> + <field name="start_date" /> + <field name="type" invisible="1"/> + </group> + </group> + <field + name="acc_price_conf_ids" + widget="x2many_2d_matrix" + field_x_axis="acc_injection_id" + field_y_axis="acc_buyer_id" + field_value="price" + show_row_totals="0" + show_column_totals="0" + > + <tree> + <field name="acc_injection_id" /> + <field name="acc_buyer_id" /> + <field name="price" /> + <field name="type" /> + <field name="acc_operation_id" /> + <field name="start_date" /> + </tree> + </field> + </form> + </field> + </record> + + <record id="act_x2many_2d_matrix_sale" model="ir.actions.act_window"> + <field name="name">Gestion prix de vente</field> + <field name="type">ir.actions.act_window</field> + <field name="res_model">acc.price.conf.wizard</field> + <field name="view_mode">form</field> + <field name="view_id" ref="x2many_2d_matrix_sale" /> + <field name="target">new</field> + </record> + + <record id="act_x2many_2d_matrix_buyer" model="ir.actions.act_window"> + <field name="name">Gestion prix d'achat</field> + <field name="type">ir.actions.act_window</field> + <field name="res_model">acc.price.conf.wizard</field> + <field name="view_mode">form</field> + <field name="view_id" ref="x2many_2d_matrix_buyer" /> + <field name="target">new</field> + </record> + +</odoo>