Compare commits

...

15 Commits

Author SHA1 Message Date
Sébastien BEAU
a59c2e774a [IMP] add balance 2022-04-11 13:43:40 +02:00
beau sebastien
f166fe93be Merge pull request #159 from akretion/14.0-shopinvader_usability
[14.0][ADD] shopinvader_usability
2022-04-08 17:24:38 +02:00
Alexis de Lattre
b8a6cbcfea mrp_usability: Add fields in tree view with optional="hide"
sale_order_route: Add route_id in tree view with optional="hide"
2022-03-31 21:48:13 +02:00
Alexis de Lattre
f6b10a7caa [MIG] sale_order_add_bom from v10 to v14 2022-03-31 10:52:55 +02:00
Alexis de Lattre
371229e9e5 sale_order_add_bom: add kit wizard now available on pickings 2022-03-31 10:52:55 +02:00
Alexis de Lattre
1dbfd23524 Remove _rec_name from mrp.bom because there is now a native name_get() 2022-03-31 10:52:55 +02:00
Alexis de Lattre
9a9459f013 sale_order_add_bom: fix related field definition 2022-03-31 10:52:55 +02:00
Alexis de Lattre
5a58ae0d9a FIX my previous commit: related_sudo -> compute_sudo 2022-03-31 10:52:55 +02:00
Alexis de Lattre
b162227645 Add related_sudo where it may be needed
PEP8 fix
2022-03-31 10:52:55 +02:00
Alexis de Lattre
3c24e94122 Add module sale_force_invoice_status 2022-03-31 10:52:55 +02:00
Stéphane Bidoul (ACSONE)
400f316c7f [10.0] setup.py and addons versions (#35)
* [IMP] set 10.0 version prefix in all installable addons

* [FIX] 10.0 instead of 9.0 version prefix for sale_order_add_bom on 10.0 branch

* [ADD] setup.py for all installable addons
2022-03-31 10:52:55 +02:00
Alexis de Lattre
86af01667a Port sale_order_add_bom to v10 2022-03-31 10:52:55 +02:00
Alexis de Lattre
8967bf289a Add modules sale_from_private_stock and sale_order_add_bom
Port base_company_extension to v10
Avoid blockage on l10n_fr_infogreffe_connector
2022-03-31 10:52:55 +02:00
Alexis de Lattre
1fdaf52787 stock_valuation_xlsx: fix access right issue 2022-03-30 17:22:27 +02:00
Kevin Khao
df673718e5 [14.0][ADD] shopinvader_usability 2021-12-27 16:30:11 +03:00
19 changed files with 315 additions and 2 deletions

View File

@@ -242,6 +242,17 @@ class AccountMoveLine(models.Model):
compute='_compute_reconcile_string', string='Reconcile', store=True)
# for optional display in tree view
product_barcode = fields.Char(related='product_id.barcode', string="Product Barcode")
balance = fields.Monetary(
string='Balance',
default=0.0,
currency_field='company_currency_id',
compute="_compute_balance",
store=True)
@api.depends("credit", "debit")
def _compute_balance(self):
for line in self:
line.balance = line.debit - line.credit
def show_account_move_form(self):
self.ensure_one()

View File

@@ -70,6 +70,9 @@
<field name="matching_number" position="after">
<button title="View Journal Entry Form" type="object" name="show_account_move_form" icon="fa-arrow-right"/>
</field>
<field name="credit" position="after">
<field name="balance" sum="Balance" />
</field>
</field>
</record>

View File

@@ -29,4 +29,15 @@
</field>
</record>
<record id="mrp_production_tree_view" model="ir.ui.view">
<field name="model">mrp.production</field>
<field name="inherit_id" ref="mrp.mrp_production_tree_view"/>
<field name="arch" type="xml">
<field name="reservation_state" position="after">
<field name="location_src_id" optional="hide" groups="stock.group_stock_multi_locations"/>
<field name="location_dest_id" optional="hide" groups="stock.group_stock_multi_locations"/>
</field>
</field>
</record>
</odoo>

View File

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

View File

@@ -0,0 +1,29 @@
# Copyright 2016-2022 Akretion France (http://www.akretion.com/)
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
'name': 'Sale Order Add Bom',
'version': '14.0.1.0.0',
'category': 'Sales',
'license': 'AGPL-3',
'summary': 'Wizard to select a bom from a sale order',
'description': """
This module adds a wizard *Add Kit* on the form view of a quotation that allows the user to select a 'kit' BOM: Odoo will automatically add the components of the kit as sale order lines.
The wizard *Add Kit* is also available on a draft picking.
This module has been written by Alexis de Lattre from Akretion
<alexis.delattre@akretion.com>.
""",
'author': 'Akretion',
'website': 'https://github.com/akretion/odoo-usability',
'depends': ['sale', 'mrp'],
'data': [
'wizard/sale_add_phantom_bom_view.xml',
'views/sale_order.xml',
'views/stock_picking.xml',
'security/ir.model.access.csv',
],
'installable': True,
}

View File

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

View File

@@ -0,0 +1,11 @@
# Copyright 2016-2022 Akretion France (http://www.akretion.com/)
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import models, fields
class MrpBom(models.Model):
_inherit = 'mrp.bom'
sale_ok = fields.Boolean(related='product_tmpl_id.sale_ok', store=True)

View File

@@ -0,0 +1,3 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_sale_add_phantom_bom_sale,Full access on sale.add.phantom.bom wizard to sale user,model_sale_add_phantom_bom,sales_team.group_sale_salesman,1,1,1,1
access_sale_add_phantom_bom_stock,Full access on sale.add.phantom.bom wizard to stock user,model_sale_add_phantom_bom,stock.group_stock_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_sale_add_phantom_bom_sale Full access on sale.add.phantom.bom wizard to sale user model_sale_add_phantom_bom sales_team.group_sale_salesman 1 1 1 1
3 access_sale_add_phantom_bom_stock Full access on sale.add.phantom.bom wizard to stock user model_sale_add_phantom_bom stock.group_stock_user 1 1 1 1

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2016-2022 Akretion France (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="view_order_form" model="ir.ui.view">
<field name="name">add.bom.sale.order.form</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<button name="action_quotation_send" position="before">
<button name="%(sale_add_phantom_bom_action)d" type="action"
string="Add Kit" states="draft,sent"/>
</button>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2021-2022 Akretion France (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo>
<data>
<record id="view_picking_form" model="ir.ui.view">
<field name="name">add.bom.stock.picking.form</field>
<field name="model">stock.picking</field>
<field name="inherit_id" ref="stock.view_picking_form"/>
<field name="arch" type="xml">
<button name="action_confirm" position="after">
<button name="%(sale_add_phantom_bom_action)d" type="action"
string="Add Kit" states="draft" groups="stock.group_stock_user"/>
</button>
</field>
</record>
</data>
</odoo>

View File

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

View File

@@ -0,0 +1,96 @@
# Copyright 2016-2022 Akretion France (http://www.akretion.com/)
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import models, fields, api, _
from odoo.exceptions import UserError
from odoo.tools import float_is_zero
class SaleAddPhantomBom(models.TransientModel):
_name = 'sale.add.phantom.bom'
_description = 'Add Kit to Quotation'
@api.model
def default_get(self, fields_list):
res = super().default_get(fields_list)
if self._context.get('active_model') == 'sale.order':
res['sale_id'] = self._context['active_id']
sale = self.env['sale.order'].browse(res['sale_id'])
res['company_id'] = sale.company_id.id
elif self._context.get('active_model') == 'stock.picking':
res['picking_id'] = self._context['active_id']
picking = self.env['stock.picking'].browse(res['picking_id'])
res['company_id'] = picking.company_id.id
else:
raise UserError(_(
"The wizard can only be started from a sale order or a picking."))
return res
bom_id = fields.Many2one(
'mrp.bom', 'Kit', required=True,
domain="['|', ('company_id', '=', False), ('company_id', '=', company_id), ('type', '=', 'phantom'), ('sale_ok', '=', True)]")
company_id = fields.Many2one('res.company', string='Company', required=True)
qty = fields.Integer(
string='Number of Kits to Add', default=1, required=True)
sale_id = fields.Many2one(
'sale.order', string='Quotation')
picking_id = fields.Many2one(
'stock.picking', string='Picking')
@api.model
def _prepare_sale_order_line(self, bom_line, sale_order, wizard_qty):
qty_in_product_uom = bom_line.product_uom_id._compute_quantity(
bom_line.product_qty,
bom_line.product_id.uom_id)
vals = {
'product_id': bom_line.product_id.id,
'product_uom_qty': qty_in_product_uom * wizard_qty,
'order_id': sale_order.id,
}
# on sale.order.line, company_id is a related field
return vals
@api.model
def _prepare_stock_move(self, bom_line, picking, wizard_qty):
product = bom_line.product_id
qty_in_product_uom = bom_line.product_uom_id._compute_quantity(
bom_line.product_qty, product.uom_id)
vals = {
'product_id': product.id,
'product_uom_qty': qty_in_product_uom * wizard_qty,
'product_uom': product.uom_id.id,
'picking_id': picking.id,
'company_id': picking.company_id.id,
'location_id': picking.location_id.id,
'location_dest_id': picking.location_dest_id.id,
'name': product.partner_ref,
}
return vals
def add(self):
self.ensure_one()
assert self.sale_id or self.picking_id, 'No related sale_id or picking_id'
if self.qty < 1:
raise UserError(_(
"The number of kits to add must be 1 or superior"))
assert self.bom_id.type == 'phantom', 'The BOM is not a kit'
if not self.bom_id.bom_line_ids:
raise UserError(_("The selected kit is empty !"))
prec = self.env['decimal.precision'].precision_get(
'Product Unit of Measure')
solo = self.env['sale.order.line']
smo = self.env['stock.move']
for line in self.bom_id.bom_line_ids:
if float_is_zero(line.product_qty, precision_digits=prec):
continue
# The onchange is played in the inherit of the create()
# of sale order line in the 'sale' module
# TODO: if needed, we could increment existing order lines
# with the same product instead of always creating new lines
if self.sale_id:
vals = self._prepare_sale_order_line(line, self.sale_id, self.qty)
solo.create(vals)
elif self.picking_id:
vals = self._prepare_stock_move(line, self.picking_id, self.qty)
smo.create(vals)

View File

@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2016-2022 Akretion France (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="sale_add_phantom_bom_form" model="ir.ui.view">
<field name="name">sale.add.phantom.bom.form</field>
<field name="model">sale.add.phantom.bom</field>
<field name="arch" type="xml">
<form>
<group name="main">
<field name="sale_id" invisible="1"/>
<field name="picking_id" invisible="1"/>
<field name="company_id" invisible="1"/>
<field name="bom_id" default_focus="1"/>
<field name="qty"/>
</group>
<footer>
<button name="add" type="object"
class="btn-primary" string="Add"/>
<button special="cancel" string="Cancel"/>
</footer>
</form>
</field>
</record>
<record id="sale_add_phantom_bom_action" model="ir.actions.act_window">
<field name="name">Add Kit</field>
<field name="res_model">sale.add.phantom.bom</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
</odoo>

View File

@@ -18,4 +18,25 @@
</field>
</record>
<record id="view_quotation_tree" model="ir.ui.view">
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale_stock.view_quotation_tree"/>
<field name="arch" type="xml">
<field name="warehouse_id" position="after">
<field name="route_id" optional="hide"/>
</field>
</field>
</record>
<record id="view_order_tree" model="ir.ui.view">
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale_stock.view_order_tree"/>
<field name="arch" type="xml">
<field name="warehouse_id" position="after">
<field name="route_id" optional="hide"/>
</field>
</field>
</record>
</odoo>

View File

View File

@@ -0,0 +1,18 @@
# Copyright 2021 Akretion
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
"name": "Shopinvader Usability",
"description": """
Shopinvader Usability""",
"version": "14.0.1.0.0",
"license": "AGPL-3",
"author": "Akretion",
"website": "https://github.com/OCA/odoo-usability",
"depends": [
"shopinvader",
"sale_usability",
],
"data": ["views/sale_views.xml"],
"auto_install": True,
}

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2021 Akretion
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
<odoo>
<record id="sale.action_quotations" model="ir.actions.act_window">
<field
name="domain"
>['&amp;', ('state', 'in', ('draft', 'sent', 'cancel')), ('typology', '=', 'sale')]</field>
</record>
<record id="sale.action_quotations_with_onboarding" model="ir.actions.act_window">
<field
name="domain"
>['&amp;', ('state', 'in', ('draft', 'sent', 'cancel')), ('typology', '=', 'sale')]</field>
</record>
<record id="sale.action_quotations_salesteams" model="ir.actions.act_window">
<field
name="domain"
>['&amp;', ('state', 'in', ('draft', 'sent', 'cancel')), ('typology', '=', 'sale')]</field>
</record>
</odoo>

View File

@@ -97,7 +97,7 @@ class StockValuationXlsx(models.TransientModel):
raise UserError(_(
"The selected inventory (%s) is not in done state.")
% self.inventory_id.display_name)
cost_method_real_count = self.env['ir.property'].search([
cost_method_real_count = self.env['ir.property'].sudo().search([
('company_id', '=', company_id),
('name', '=', 'property_cost_method'),
('value_text', '=', 'real'),

View File

@@ -79,7 +79,7 @@ class StockVariationXlsx(models.TransientModel):
else:
if self.start_date >= present:
raise UserError(_("The start date must be in the past."))
cost_method_real_count = self.env['ir.property'].search([
cost_method_real_count = self.env['ir.property'].sudo().search([
('company_id', '=', company_id),
('name', '=', 'property_cost_method'),
('value_text', '=', 'real'),