[wip] changed wizzard to use only sale_order_lines

TODO:
Onchange has to recompute all record of the recordset and not only itself
This commit is contained in:
Niels Göttsch 2024-07-04 20:28:10 +02:00
parent ea416d2aa6
commit 1e21f38099
6 changed files with 75 additions and 23 deletions

View file

@ -9,6 +9,7 @@
"data": [ "data": [
"views/sale_order_views.xml", "views/sale_order_views.xml",
"views/sale_order_line_views.xml", "views/sale_order_line_views.xml",
"wizard/sale_max_qty_line_views.xml",
"wizard/sale_max_qty_chooser_views.xml", "wizard/sale_max_qty_chooser_views.xml",
"views/templates.xml", "views/templates.xml",
"security/ir.model.access.csv", "security/ir.model.access.csv",

View file

@ -24,13 +24,15 @@ class SaleOrder(models.Model):
action = { action = {
"name": _("Min max qty wizard"), "name": _("Min max qty wizard"),
"type": "ir.actions.act_window", "type": "ir.actions.act_window",
"res_model": "sale.max.qty.chooser", "res_model": "sale.max.qty.line",
"view_mode": "form", "view_mode": "tree",
"target": "new", "target": "current",
"res_id": sale_max_qty_chooser.id, "editable": True,
"context": {"search_default_group_by_product": 1},
"domain": [("id", "in", sale_max_qty_chooser.sale_max_qty_ids.ids)],
} }
return action return action
def action_sale_order_lines(self): def action_sale_order_lines(self):
""" """
Here you need to create the wizzard objects first and then call the wizzard with the newly created id Here you need to create the wizzard objects first and then call the wizzard with the newly created id
@ -40,6 +42,8 @@ class SaleOrder(models.Model):
"type": "ir.actions.act_window", "type": "ir.actions.act_window",
"res_model": "sale.order.line", "res_model": "sale.order.line",
"view_mode": "tree,form", "view_mode": "tree,form",
"target": "current",
"context": {"group_by": "product_id"},
"domain": [("id", "in", self.order_line.ids)], "domain": [("id", "in", self.order_line.ids)],
} }

View file

@ -4,7 +4,7 @@
<field name="name">sale.order.line.tree</field> <field name="name">sale.order.line.tree</field>
<field name="model">sale.order.line</field> <field name="model">sale.order.line</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<tree create="false"> <tree create="false" expand="1">
<field name="order_id"/> <field name="order_id"/>
<field name="order_partner_id"/> <field name="order_partner_id"/>
<field name="name"/> <field name="name"/>

View file

@ -1,24 +1,23 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<odoo> <odoo>
<record id="view_sale_max_qty_chooser_form" model="ir.ui.view"> <record id="view_sale_max_qty_chooser_form" model="ir.ui.view">
<field name="name">Sale Max Quantity Chhooser</field> <field name="name">Sale Max Quantity Chhooser</field>
<field name="model">sale.max.qty.chooser</field> <field name="model">sale.max.qty.chooser</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<form> <form>
<div class="oe_grey"> <div class="oe_grey">
<p>Headline</p> <p>Sale Orders</p>
<field name="sale_order_ids" widget="many2many_tags"/> <field name="sale_order_ids" widget="many2many_tags"/>
</div> </div>
<field name="sale_max_qty_ids"> <field name="sale_max_qty_ids" context="{'search_default_group_by_qty': 1}">
<tree create="0" editable="1"> <!-- <tree create="0" editable="1" default_order="product_id">
<field name="product_id"/> <field name="product_id" context="{'group_by': 'product_id'}" />
<field name="qty"/> <field name="qty"/>
<field name="max_qty"/> <field name="max_qty"/>
<field name="packaging_size"/> <field name="packaging_size"/>
<field name="quantity_fits_packaging" widget="boolean"/> <field name="quantity_fits_packaging" widget="boolean"/>
<field name="reset_to_draft"/> <field name="reset_to_draft"/>
</tree> </tree> -->
</field> </field>
<footer> <footer>
<button <button
@ -38,6 +37,11 @@
<field name="name">Set Quantities</field> <field name="name">Set Quantities</field>
<field name="res_model">sale.max.qty.chooser</field> <field name="res_model">sale.max.qty.chooser</field>
<field name="view_mode">form</field> <field name="view_mode">form</field>
<field name="target">new</field> <field name="target">current</field>
<field name="context">
{
'search_default_group_by_product': 1,
}
</field>
</record> </record>
</odoo> </odoo>

View file

@ -1,4 +1,5 @@
from odoo import fields, models, api from odoo import _, api, fields, models
from odoo.exceptions import UserError
class SaleMaxQtyLine(models.TransientModel): class SaleMaxQtyLine(models.TransientModel):
@ -9,23 +10,37 @@ class SaleMaxQtyLine(models.TransientModel):
_name = "sale.max.qty.line" _name = "sale.max.qty.line"
_description = "Max qty Sale Order Lines" _description = "Max qty Sale Order Lines"
name = fields.Char()
sale_max_qty_chooser = fields.Many2one("sale.max.qty.chooser") sale_max_qty_chooser = fields.Many2one("sale.max.qty.chooser")
qty = fields.Float() qty = fields.Float()
max_qty = fields.Float(related="sale_line_id.product_uom_max_qty") max_qty = fields.Float(related="sale_line_id.product_uom_max_qty")
packaging_size = fields.Float(compute="_compute_packaging_size") packaging_size = fields.Float(compute="_compute_packaging_size")
quantity_fits_packaging = fields.Boolean(compute='_compute_quantity_fits_packaging') quantity_fits_packaging = fields.Boolean(compute="_compute_quantity_fits_packaging")
total_quantity = fields.Float(compute="_compute_quantity_fits_packaging")
sale_line_id = fields.Many2one("sale.order.line") sale_line_id = fields.Many2one("sale.order.line")
product_id = fields.Many2one(related="sale_line_id.product_id") product_id = fields.Many2one(related="sale_line_id.product_id", store=True)
reset_to_draft = fields.Boolean() reset_to_draft = fields.Boolean()
def _compute_packaging_size(self): def _compute_packaging_size(self):
for sale_order in self: for max_qty_line in self:
sale_order.packaging_size = min(sale_order.sale_line_id.product_id.packaging_ids.mapped('qty'), default=1.0) max_qty_line.packaging_size = min(
max_qty_line.sale_line_id.product_id.packaging_ids.mapped("qty"), default=1.0
)
@api.depends('packaging_size', 'qty') @api.onchange("qty")
def _compute_quantity_fits_packaging(self): def _compute_quantity_fits_packaging(self):
for sale_order in self: for max_qty_line in self:
order_lines = self.sale_max_qty_chooser.sale_max_qty_ids.filtered(lambda line: line.sale_line_id.product_id == sale_order.product_id) order_lines = max_qty_line.sale_max_qty_chooser.sale_max_qty_ids.filtered(
total_quantity = sum(order_lines.mapped('qty')) lambda line: line.sale_line_id.product_id == max_qty_line.product_id
sale_order.quantity_fits_packaging = total_quantity % sale_order.packaging_size == 0 )
max_qty_line.total_quantity = sum(order_lines.mapped("qty"))
max_qty_line.quantity_fits_packaging = max_qty_line.total_quantity % max_qty_line.packaging_size == 0
# for order_line in order_lines:
# order_line.quantity_fits_packaging = max_qty_line.quantity_fits_packaging
@api.constrains("qty")
def _check_product_uom_qty(self):
for max_qty_line in self:
if max_qty_line.max_qty != 0 and max_qty_line.qty > max_qty_line.max_qty:
raise UserError(_("The quantity must be less than or equal to the maximum quantity."))

View file

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_sale_max_qty_line_search" model="ir.ui.view">
<field name="name">sale.max.qty.line.search</field>
<field name="model">sale.max.qty.line</field>
<field name="arch" type="xml">
<search>
<filter string="Product" name="group_by_product" context="{'group_by':'product_id'}"/>
</search>
</field>
</record>
<record id="viw_sale_max_qty_line_tree" model="ir.ui.view">
<field name="name">sale.max.qty.line.tree</field>
<field name="model">sale.max.qty.line</field>
<field name="arch" type="xml">
<tree editable="bottom" create="0" expand="1">
<field name="product_id"/>
<field name="qty"/>
<field name="max_qty"/>
<field name="packaging_size"/>
<field name="quantity_fits_packaging" widget="boolean"/>
<field name="reset_to_draft"/>
</tree>
</field>
</record>
</odoo>