[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,10 +24,12 @@ 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
@ -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>