new module reception_purchase_total

This commit is contained in:
Marc Durepos 2025-02-24 11:50:49 -05:00
parent bb5b211d9c
commit f615f8c960
6 changed files with 150 additions and 0 deletions

View file

@ -0,0 +1 @@
from . import models

View file

@ -0,0 +1,33 @@
{
"name": "Reception Purchase Total",
"version": "18.0.1.0.0",
"category": "Inventory/Purchase",
"summary": "Display purchase totals on stock reception views",
"description": """
This module adds purchase price totals to stock reception views. Specifically:
* Adds a total amount column to stock move lines in receptions, showing the purchase price * quantity
* Shows a total amount at the bottom of operations and detailed operations tabs in:
- Reception form view
- Batch Transfer form view
* Links stock moves to their original purchase order line prices
Technical Details:
* Extends stock.move to compute total amount based on purchase line price
* Adds computed fields and view inheritance to display totals
* Compatible with standard Odoo purchase and inventory workflows
""",
"author": "Bemade Inc.",
"website": "https://www.bemade.org",
"depends": [
"stock",
"purchase_stock",
],
"data": [
"views/stock_picking_views.xml",
],
"license": "LGPL-3",
"installable": True,
"auto_install": False,
"application": False,
}

View file

@ -0,0 +1,2 @@
from . import stock_move
from . import stock_move_line

View file

@ -0,0 +1,32 @@
from odoo import api, fields, models
class StockMove(models.Model):
_inherit = "stock.move"
purchase_price_unit = fields.Float(
string="Purchase Unit Price",
related="purchase_line_id.price_unit",
digits="Product Price",
readonly=True,
help="Unit price from the related purchase order line",
)
purchase_price_total = fields.Float(
string="Purchase Total",
compute="_compute_purchase_price_total",
help="Total price based on purchase unit price and move quantity",
)
picking_type_code = fields.Selection(
related="picking_id.picking_type_code",
readonly=True,
)
purchase_currency_id = fields.Many2one(
related="purchase_line_id.currency_id",
string="Purchase Currency",
readonly=True,
)
@api.depends("purchase_price_unit", "quantity")
def _compute_purchase_price_total(self):
for move in self:
move.purchase_price_total = move.purchase_price_unit * move.quantity

View file

@ -0,0 +1,34 @@
from odoo import fields, models, api
class StockMoveLine(models.Model):
_inherit = "stock.move.line"
picking_type_code = fields.Selection(
related="picking_id.picking_type_id.code",
string="Operation Type",
store=True,
readonly=True,
)
purchase_price_unit = fields.Float(
string="Purchase Unit Price",
related="move_id.purchase_price_unit",
readonly=True,
help="Unit price from the related purchase order line",
)
purchase_price_total = fields.Float(
string="Purchase Total",
compute="_compute_purchase_price_total",
help="Total price for this move line based on purchase price and quantity",
)
purchase_currency_id = fields.Many2one(
related="move_id.purchase_currency_id",
string="Purchase Currency",
readonly=True,
)
@api.depends("purchase_price_unit", "quantity")
def _compute_purchase_price_total(self):
for line in self:
line.purchase_price_total = line.purchase_price_unit * line.quantity

View file

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Stock Move List View for Batches -->
<record id="view_move_tree_inherit_reception_purchase_total" model="ir.ui.view">
<field name="name">stock.move.tree.inherit.reception.purchase.total</field>
<field name="model">stock.move</field>
<field name="inherit_id" ref="stock_picking_batch.view_picking_move_tree_inherited"/>
<field name="arch" type="xml">
<field name="product_uom" position="after">
<field name="picking_type_code" invisible="1"/>
<field name="purchase_currency_id" invisible="1"/>
<field name="purchase_price_unit" optional="show" invisible="picking_type_code != 'incoming'" widget="monetary" options="{'currency_field': 'purchase_currency_id'}"/>
<field name="purchase_price_total" optional="show" sum="Total Purchase Amount" invisible="picking_type_code != 'incoming'" widget="monetary" options="{'currency_field': 'purchase_currency_id'}"/>
</field>
</field>
</record>
<!-- Stock Move Line List View for Batches -->
<record id="view_move_line_tree_inherit_reception_purchase_total" model="ir.ui.view">
<field name="name">stock.move.line.tree.inherit.reception.purchase.total</field>
<field name="model">stock.move.line</field>
<field name="inherit_id" ref="stock_picking_batch.view_move_line_tree"/>
<field name="arch" type="xml">
<field name="quantity" position="after">
<field name="picking_type_code" invisible="1"/>
<field name="purchase_currency_id" invisible="1"/>
<field name="purchase_price_unit" optional="show" invisible="picking_type_code != 'incoming'" widget="monetary" options="{'currency_field': 'purchase_currency_id'}"/>
<field name="purchase_price_total" optional="show" sum="Total Purchase Amount" invisible="picking_type_code != 'incoming'" widget="monetary" options="{'currency_field': 'purchase_currency_id'}"/>
</field>
</field>
</record>
<!-- Stock Picking Form View -->
<record id="view_picking_form_inherit_reception_purchase_total" model="ir.ui.view">
<field name="name">stock.picking.form.inherit.reception.purchase.total</field>
<field name="model">stock.picking</field>
<field name="inherit_id" ref="stock.view_picking_form"/>
<field name="arch" type="xml">
<!-- Add total to operations tab -->
<xpath expr="//page[@name='operations']//field[@name='move_ids_without_package']//list" position="inside">
<field name="picking_type_code" invisible="1"/>
<field name="purchase_currency_id" invisible="1"/>
<field name="purchase_price_unit" optional="show" invisible="picking_type_code != 'incoming'" widget="monetary" options="{'currency_field': 'purchase_currency_id'}"/>
<field name="purchase_price_total" optional="show" sum="Total Purchase Amount" invisible="picking_type_code != 'incoming'" widget="monetary" options="{'currency_field': 'purchase_currency_id'}"/>
</xpath>
</field>
</record>
</odoo>