Initial commit: Sale packages

This commit is contained in:
Ernad Husremovic 2025-08-29 15:20:49 +02:00
commit 14e3d26998
6469 changed files with 2479670 additions and 0 deletions

View file

@ -0,0 +1,142 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="attribute_tree_view" model="ir.ui.view">
<field name="name">product.attribute.tree</field>
<field name="model">product.attribute</field>
<field name="arch" type="xml">
<tree string="Variant Values" default_order="sequence, id">
<field name="sequence" widget="handle"/>
<field name="name"/>
<field name="display_type"/>
<field name="create_variant"/>
</tree>
</field>
</record>
<record id="product_attribute_view_form" model="ir.ui.view">
<field name="name">product.attribute.form</field>
<field name="model">product.attribute</field>
<field name="arch" type="xml">
<form string="Product Attribute">
<field name="number_related_products" invisible="1"/>
<sheet>
<div class="oe_button_box" name="button_box">
<button class="oe_stat_button" name="action_open_related_products"
type="object" icon="fa-bars"
attrs="{'invisible': [('number_related_products', '=', [])]}">
<div class="o_stat_info">
<span class="o_stat_value"><field name="number_related_products"/></span>
<span class="o_stat_text">Related Products</span>
</div>
</button>
</div>
<group name="main_fields" class="o_label_nowrap">
<label for="name" string="Attribute Name"/>
<field name="name" nolabel="1"/>
<field name="display_type" widget="radio"/>
<field name="create_variant" widget="radio" attrs="{'readonly': [('number_related_products', '!=', 0)]}"/>
</group>
<notebook>
<page string="Attribute Values" name="attribute_values">
<field name="value_ids" widget="one2many" nolabel="1">
<tree string="Values" editable="bottom">
<field name="sequence" widget="handle"/>
<field name="name"/>
<field name="display_type" invisible="1"/>
<field name="is_custom" groups="product.group_product_variant"/>
<field name="html_color" attrs="{'column_invisible': [('parent.display_type', '!=', 'color')]}" widget="color"/>
</tree>
</field>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<record id="attribute_action" model="ir.actions.act_window">
<field name="name">Attributes</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">product.attribute</field>
<field name="view_mode">tree,form</field>
</record>
<record id="product_template_attribute_line_form" model="ir.ui.view">
<field name="name">product.template.attribute.line.form</field>
<field name="model">product.template.attribute.line</field>
<field name="mode">primary</field>
<field name="priority" eval="8"/>
<field name="arch" type="xml">
<form string="Product Attribute and Values">
<group name="main_field">
<label for="attribute_id" string="Attribute Name"/>
<field name="attribute_id" nolabel="1"/>
<field name="value_ids" widget="one2many">
<tree string="Values">
<field name="name"/>
<field name="html_color"/>
</tree>
<form string="Values">
<field name="name"/>
</form>
</field>
</group>
</form>
</field>
</record>
<record id="product_template_attribute_value_view_tree" model="ir.ui.view">
<field name="name">product.template.attribute.value.view.tree</field>
<field name="model">product.template.attribute.value</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Attributes" create="0" delete="0">
<field name="attribute_id" optional="hide"/>
<field name="name"/>
<field name="display_type" optional="hide"/>
<field name="html_color" attrs="{'invisible': [('display_type', '!=', 'color')]}" widget="color"/>
<field name="ptav_active" optional="hide"/>
<field name="price_extra" widget="monetary" options="{'field_digits': True}"/>
<field name="currency_id" invisible="1"/>
</tree>
</field>
</record>
<record id="product_template_attribute_value_view_form" model="ir.ui.view">
<field name="name">product.template.attribute.value.view.form.</field>
<field name="model">product.template.attribute.value</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Product Attribute" create="0" delete="0">
<sheet>
<group>
<field name="ptav_active" readonly="1" attrs="{'invisible': [('ptav_active', '=', True)]}"/>
<field name="name"/>
<field name="display_type" invisible="1"/>
<field name="html_color" attrs="{'invisible': [('display_type', '!=', 'color')]}"/>
<field name="price_extra" widget="monetary" options="{'field_digits': True}"/>
<field name="currency_id" invisible="1"/>
<field name="exclude_for" widget="one2many" mode="tree">
<tree editable="bottom">
<field name="product_tmpl_id" />
<field name="value_ids" widget="many2many_tags" options="{'no_create': True}" />
</tree>
</field>
</group>
</sheet>
</form>
</field>
</record>
<record id="product_template_attribute_value_view_search" model="ir.ui.view">
<field name="model">product.template.attribute.value</field>
<field name="arch" type="xml">
<search>
<field name="name"/>
<filter string="Active" name="active" domain="[('ptav_active', '=', True)]"/>
<filter string="Inactive" name="inactive" domain="[('ptav_active', '=', False)]"/>
</search>
</field>
</record>
</odoo>

View file

@ -0,0 +1,64 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="product_category_form_view" model="ir.ui.view">
<field name="name">product.category.form</field>
<field name="model">product.category</field>
<field name="arch" type="xml">
<form class="oe_form_configuration">
<sheet>
<div class="oe_button_box" name="button_box">
<button class="oe_stat_button"
name="%(product_template_action_all)d"
icon="fa-th-list"
type="action"
context="{'search_default_categ_id': active_id, 'default_categ_id': active_id, 'group_expand': True}">
<div class="o_field_widget o_stat_info">
<span class="o_stat_value"><field name="product_count"/></span>
<span class="o_stat_text"> Products</span>
</div>
</button>
</div>
<div class="oe_title">
<label for="name" string="Category"/>
<h1><field name="name" placeholder="e.g. Lamps"/></h1>
</div>
<group name="first" col="2">
<field name="parent_id" class="oe_inline"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="product_category_list_view" model="ir.ui.view">
<field name="name">product.category.list</field>
<field name="model">product.category</field>
<field name="priority">1</field>
<field name="arch" type="xml">
<tree string="Product Categories">
<field name="display_name" string="Product Category"/>
</tree>
</field>
</record>
<record id="product_category_search_view" model="ir.ui.view">
<field name="name">product.category.search</field>
<field name="model">product.category</field>
<field name="arch" type="xml">
<search string="Product Categories">
<field name="name" string="Product Categories"/>
<field name="parent_id"/>
</search>
</field>
</record>
<record id="product_category_action_form" model="ir.actions.act_window">
<field name="name">Product Categories</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">product.category</field>
<field name="search_view_id" ref="product_category_search_view"/>
<field name="view_id" ref="product_category_list_view"/>
</record>
</odoo>

View file

@ -0,0 +1,85 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="product_packaging_tree_view" model="ir.ui.view">
<field name="name">product.packaging.tree.view</field>
<field name="model">product.packaging</field>
<field name="arch" type="xml">
<tree string="Product Packagings" name="packaging">
<field name="sequence" widget="handle"/>
<field name="product_id"/>
<field name="name" string="Packaging"/>
<field name="qty"/>
<field name="product_uom_id" options="{'no_open': True, 'no_create': True}" groups="uom.group_uom"/>
<field name="barcode" optional="hide"/>
<field name="company_id" groups="base.group_multi_company" optional="hide"/>
<field name="company_id" groups="!base.group_multi_company" invisible="1"/>
</tree>
</field>
</record>
<record id="product_packaging_tree_view2" model="ir.ui.view">
<field name="name">product.packaging.tree.view2</field>
<field name="model">product.packaging</field>
<field name="mode">primary</field>
<field name="inherit_id" ref="product.product_packaging_tree_view"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='product_id']" position="replace"/>
<xpath expr="//tree[@name='packaging']" position="attributes">
<attribute name="editable">bottom</attribute>
</xpath>
</field>
</record>
<record id="product_packaging_form_view" model="ir.ui.view">
<field name="name">product.packaging.form.view</field>
<field name="model">product.packaging</field>
<field name="arch" type="xml">
<form string="Product Packaging">
<sheet>
<label for="name" string="Packaging"/>
<h1>
<field name="name"/>
</h1>
<group>
<field name="id" invisible='1'/>
<field name="company_id" invisible="1"/>
<group name="group_product">
<field name="product_id" required='True' attrs="{'readonly': [('id', '!=', False)]}"/>
</group>
<group name="qty">
<label for="qty" string="Contained quantity"/>
<div class="o_row">
<field name="qty"/>
<field name="product_uom_id" options="{'no_open': True, 'no_create': True}" groups="uom.group_uom"/>
</div>
<field name="barcode"/>
<field name="company_id" groups="base.group_multi_company"/>
</group>
</group>
</sheet>
</form>
</field>
</record>
<record id="product_packaging_form_view2" model="ir.ui.view">
<field name="name">product.packaging.form.view2</field>
<field name="model">product.packaging</field>
<field name="mode">primary</field>
<field name="inherit_id" ref="product.product_packaging_form_view"/>
<field name="arch" type="xml">
<xpath expr="//group[@name='group_product']" position="replace"/>
<xpath expr="//field[@name='id']" position="replace"/>
</field>
</record>
<record model="ir.actions.act_window" id="action_packaging_view">
<field name="name">Product Packagings</field>
<field name="res_model">product.packaging</field>
<field name="domain">[('product_id', '!=', False)]</field>
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'tree', 'view_id': ref('product_packaging_tree_view')}),
(0, 0, {'view_mode': 'form', 'view_id': ref('product_packaging_form_view')})]"/>
</record>
</odoo>

View file

@ -0,0 +1,183 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record model="ir.ui.view" id="product_pricelist_item_view_search">
<field name="name">product.pricelist.item.search</field>
<field name="model">product.pricelist.item</field>
<field name="arch" type="xml">
<search string="Products Price Rules Search">
<filter name="Product Rule" domain="[('applied_on', '=', '1_product')]"/>
<filter name="Variant Rule" domain="[('applied_on', '=', '0_product_variant')]" groups="product.group_product_variant"/>
<separator/>
<field name="pricelist_id"/>
<field name="company_id" groups="base.group_multi_company"/>
<field name="currency_id" groups="base.group_multi_currency"/>
<filter string="Archived" name="inactive" domain="[('active','=',False)]"/>
<group expand="0" string="Group By">
<filter string="Product" name="groupby_product" domain="[]" context="{'group_by': 'product_tmpl_id'}"/>
<filter string="Variant"
name="groupby_product_variant"
domain="[('applied_on', '=', '0_product_variant')]"
context="{'group_by': 'product_id'}"
groups="product.group_product_variant"/>
<filter string="Pricelist"
name="groupby_vendor"
domain="[]"
context="{'group_by': 'pricelist_id'}"
groups="product.group_product_pricelist"/>
</group>
</search>
</field>
</record>
<record id="product_pricelist_item_tree_view" model="ir.ui.view">
<field name="name">product.pricelist.item.tree</field>
<field name="model">product.pricelist.item</field>
<field name="priority">10</field>
<field name="arch" type="xml">
<tree string="Price Rules">
<field name="pricelist_id"/>
<field name="name" string="Applied On"/>
<field name="price"/>
<field name="min_quantity" colspan="4"/>
<field name="date_start" optional="hide"/>
<field name="date_end" optional="hide"/>
<field name="company_id" groups="base.group_multi_company" optional="show"/>
</tree>
</field>
</record>
<record id="product_pricelist_item_tree_view_from_product" model="ir.ui.view">
<!-- Access and edit price rules from a given product/product variant -->
<field name="name">product.pricelist.item.tree</field>
<field name="model">product.pricelist.item</field>
<field name="priority">100</field>
<field name="arch" type="xml">
<tree string="Pricelist Rules" editable="bottom">
<!-- Scope = coming from a product/product template -->
<field name="pricelist_id" string="Pricelist" options="{'no_create_edit':1, 'no_open': 1}"/>
<field name="name" string="Applied On"/>
<field name="company_id" invisible="1"/>
<field name="categ_id" invisible="1"/>
<field name="product_tmpl_id"
invisible="context.get('active_model')!='product.category'"
attrs="{'required': [('applied_on', '=', '1_product')]}"
domain="[('categ_id', '=', context.get('default_categ_id', True)), '|', ('company_id', '=', company_id), ('company_id', '=', False)]"
options="{'no_create_edit':1, 'no_open': 1}"/>
<field name="product_id"
groups="product.group_product_variant"
invisible="context.get('product_without_variants', False)"
readonly="context.get('active_model')=='product.product'"
attrs="{'required': [('applied_on', '=', '0_product_variant')]}"
domain="['|', '|',
('id', '=', context.get('default_product_id', 0)),
('product_tmpl_id', '=', context.get('default_product_tmpl_id', 0)),
('categ_id', '=', context.get('default_categ_id', 0)), '|', ('company_id', '=', company_id), ('company_id', '=', False)
]"
options="{'no_create_edit':1, 'no_open': 1}"
/>
<field name="min_quantity" colspan="4"/>
<field name="currency_id" invisible="1"/>
<field name="fixed_price" string="Price" required='1'/>
<field name="date_start" optional="show"/>
<field name="date_end" optional="show"/>
<field name="applied_on" invisible="1"/>
<field name="company_id" groups="base.group_multi_company" optional="show" options="{'no_create':1, 'no_open': 1}"/>
</tree>
</field>
</record>
<record id="product_pricelist_item_form_view" model="ir.ui.view">
<field name="name">product.pricelist.item.form</field>
<field name="model">product.pricelist.item</field>
<field name="arch" type="xml">
<form string="Pricelist Rule">
<sheet>
<field name="name" invisible="1"/>
<field name="company_id" invisible="1"/>
<group name="pricelist_rule_computation" groups="product.group_sale_pricelist" string="Price Computation">
<group name="pricelist_rule_method">
<field name="compute_price" string="Computation" widget="radio"/>
</group>
<div class="alert alert-info" role="alert" groups="uom.group_uom">
The computed price is expressed in the default Unit of Measure of the product.
</div>
</group>
<group name="pricelist_rule_base" groups="product.group_sale_pricelist">
<group>
<field name="price" invisible="1"/>
<field name="fixed_price" widget="monetary"
attrs="{'invisible': [('compute_price', '!=', 'fixed')]}"
options="{'field_digits': True}"/>
<label for="percent_price" string="Discount" attrs="{'invisible':[('compute_price', '!=', 'percentage')]}"/>
<div class="o_row" attrs="{'invisible':[('compute_price', '!=', 'percentage')]}">
<field name="percent_price" class="oe_inline" attrs="{'invisible':[('compute_price', '!=', 'percentage')]}"/>%
</div>
<field name="base" attrs="{'invisible':[('compute_price', '!=', 'formula')]}"/>
<field name="base_pricelist_id" attrs="{
'invisible': ['|', ('compute_price', '!=', 'formula'), ('base', '!=', 'pricelist')],
'required': [('compute_price', '=', 'formula'), ('base', '=', 'pricelist')],
'readonly': [('base', '!=', 'pricelist')]}"/>
<label for="price_discount" string="Discount" attrs="{'invisible':[('compute_price', '!=', 'formula')]}"/>
<div class="o_row" attrs="{'invisible':[('compute_price', '!=', 'formula')]}">
<field name="price_discount"/>
<span>%</span>
</div>
<field name="price_surcharge"
widget="monetary"
string="Extra Fee"
attrs="{'invisible':[('compute_price', '!=', 'formula')]}"
options="{'field_digits': True}"/>
<field name="price_round" string="Rounding Method" attrs="{'invisible':[('compute_price', '!=', 'formula')]}"/>
<label string="Margins" for="price_min_margin" attrs="{'invisible':[('compute_price', '!=', 'formula')]}"/>
<div class="o_row" attrs="{'invisible':[('compute_price', '!=', 'formula')]}">
<field name="price_min_margin" string="Min. Margin" class="oe_inline"
widget="monetary"
nolabel="1"
options="{'field_digits': True}"/>
<i class="fa fa-long-arrow-right mx-2 oe_edit_only" aria-label="Arrow icon" title="Arrow"/>
<field name="price_max_margin" string="Max. Margin" class="oe_inline"
widget="monetary"
nolabel="1"
options="{'field_digits': True}"/>
</div>
</group>
<div class="alert alert-info" role="alert" style="white-space: pre;" attrs="{'invisible': [('compute_price', '!=', 'formula')]}">
<field name="rule_tip"/>
</div>
</group>
<group string="Conditions">
<group name="pricelist_rule_target">
<field name="applied_on" widget="radio"/>
<field name="categ_id" options="{'no_create':1}" attrs="{
'invisible':[('applied_on', '!=', '2_product_category')],
'required':[('applied_on', '=', '2_product_category')]}"/>
<field name="product_tmpl_id" options="{'no_create':1}" attrs="{
'invisible':[('applied_on', '!=', '1_product')],
'required':[('applied_on', '=', '1_product')]}"/>
<field name="product_id" options="{'no_create':1}" attrs="{
'invisible':[('applied_on', '!=', '0_product_variant')],
'required':[('applied_on', '=', '0_product_variant')]}"/>
</group>
<group name="pricelist_rule_limits">
<field name="min_quantity"/>
<label for="date_start" string="Validity"/>
<div class="o_row">
<field name="date_start" widget="daterange" options='{"related_end_date": "date_end"}'/>
<i class="fa fa-long-arrow-right mx-2 oe_edit_only" aria-label="Arrow icon" title="Arrow"/>
<field name="date_end" widget="daterange" options='{"related_start_date": "date_start"}'/>
</div>
</group>
<group name="pricelist_rule_related" groups="base.group_no_one">
<field name="pricelist_id" invisible="1"/>
<field name="currency_id" groups="base.group_multi_currency"/>
<field name="company_id" groups="base.group_multi_company"/>
</group>
</group>
</sheet>
</form>
</field>
</record>
</odoo>

View file

@ -0,0 +1,152 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record model="ir.ui.view" id="product_pricelist_view_search">
<field name="name">product.pricelist.search</field>
<field name="model">product.pricelist</field>
<field name="arch" type="xml">
<search string="Products Price Search">
<field name="name" string="Products Price"/>
<field name="currency_id" groups="base.group_multi_currency"/>
<filter string="Archived" name="inactive" domain="[('active','=',False)]"/>
</search>
</field>
</record>
<record id="product_pricelist_view_tree" model="ir.ui.view">
<field name="name">product.pricelist.tree</field>
<field name="model">product.pricelist</field>
<field name="arch" type="xml">
<tree string="Products Price List" sample="1">
<field name="sequence" widget="handle"/>
<field name="name"/>
<field name="discount_policy" groups="product.group_discount_per_so_line"/>
<field name="currency_id" groups="base.group_multi_currency"/>
<field name="company_id" groups="base.group_multi_company"/>
</tree>
</field>
</record>
<record id="product_pricelist_view_kanban" model="ir.ui.view">
<field name="name">product.pricelist.kanban</field>
<field name="model">product.pricelist</field>
<field name="arch" type="xml">
<kanban class="o_kanban_mobile" sample="1">
<templates>
<t t-name="kanban-box">
<div t-attf-class="oe_kanban_global_click">
<div id="product_pricelist" class="o_kanban_record_top mb0">
<div class="o_kanban_record_headings">
<strong class="o_kanban_record_title">
<span><field name="name"/></span>
</strong>
</div>
<strong>
<i class="fa fa-money" role="img" aria-label="Currency" title="Currency"></i> <field name="currency_id"/>
</strong>
</div>
<field name="discount_policy" groups="product.group_discount_per_so_line"/>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<record id="product_pricelist_view" model="ir.ui.view">
<field name="name">product.pricelist.form</field>
<field name="model">product.pricelist</field>
<field name="arch" type="xml">
<form string="Products Price List">
<sheet>
<widget name="web_ribbon" title="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}"/>
<div class="oe_title">
<h1><field name="name" placeholder="e.g. USD Retailers"/></h1>
</div>
<group>
<group name="pricelist_settings">
<field name="currency_id" groups="base.group_multi_currency"/>
<field name="active" invisible="1"/>
<field name="company_id" groups="base.group_multi_company" options="{'no_create': True}"/>
</group>
</group>
<notebook>
<page name="pricelist_rules" string="Price Rules">
<field name="item_ids" nolabel="1" context="{'default_base':'list_price'}">
<tree groups="!product.group_sale_pricelist" string="Pricelist Rules" editable="bottom">
<field name="product_tmpl_id" string="Products" required="1"/>
<field name="product_id" string="Variants"
groups="product.group_product_variant"
domain="[('product_tmpl_id', '=', product_tmpl_id)]"
options="{'no_create':1}"/>
<field name="min_quantity"/>
<field name="fixed_price" string="Price"/>
<field name="currency_id" invisible="1"/>
<field name="pricelist_id" invisible="1"/>
<!-- Pricelist ID is here only for related fields to be correctly computed -->
<field name="date_start"/>
<field name="date_end"/>
<field name="base" invisible="1"/>
<field name="applied_on" invisible="1"/>
<field name="company_id" invisible="1"/>
</tree>
<!-- When in advanced pricelist mode : pricelist rules
Should open in a form view and not be editable inline anymore.
-->
<tree groups="product.group_sale_pricelist" string="Pricelist Rules">
<field name="product_tmpl_id" invisible="1"/>
<field name="name" string="Applicable On"/>
<field name="min_quantity"/>
<field name="price" string="Price"/>
<field name="date_start"/>
<field name="date_end"/>
<field name="base" invisible="1"/>
<field name="price_discount" invisible="1"/>
<field name="applied_on" invisible="1"/>
<field name="compute_price" invisible="1"/>
</tree>
</field>
</page>
<page name="pricelist_config" string="Configuration">
<group>
<group name="pricelist_availability" string="Availability">
<field name="country_group_ids" widget="many2many_tags"/>
</group>
<group name="pricelist_discounts" groups="product.group_discount_per_so_line" string="Discounts">
<field name="discount_policy" widget="radio"/>
</group>
</group>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<record id="product_pricelist_action2" model="ir.actions.act_window">
<field name="name">Pricelists</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">product.pricelist</field>
<field name="view_mode">tree,kanban,form</field>
<field name="search_view_id" ref="product_pricelist_view_search" />
<field name="context">{"default_base":'list_price'}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a new pricelist
</p><p>
A price is a set of sales prices or rules to compute the price of sales order lines based on products, product categories, dates and ordered quantities.
This is the perfect tool to handle several pricings, seasonal discounts, etc.
</p><p>
You can assign pricelists to your customers or select one when creating a new sales quotation.
</p>
</field>
</record>
<record id="product_pricelist_item_action" model="ir.actions.act_window">
<field name="name">Price Rules</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">product.pricelist.item</field>
<field name="view_mode">tree,form</field>
</record>
</odoo>

View file

@ -0,0 +1,137 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="product_supplierinfo_form_view" model="ir.ui.view">
<field name="name">product.supplierinfo.form.view</field>
<field name="model">product.supplierinfo</field>
<field name="arch" type="xml">
<form string="Vendor Information">
<sheet>
<group>
<group name="vendor" string="Vendor">
<field name="product_variant_count" invisible="1"/>
<field name="partner_id" context="{'res_partner_search_mode': 'supplier'}"/>
<field name="product_name"/>
<field name="product_code"/>
<label for="delay"/>
<div>
<field name="delay" class="oe_inline"/> days
</div>
</group>
<group string="Pricelist">
<field name="product_tmpl_id" string="Product" invisible="context.get('visible_product_tmpl_id', True)"/>
<field name="product_id" groups="product.group_product_variant" options="{'no_create': True}"/>
<label for="min_qty"/>
<div class="o_row">
<field name="min_qty"/>
<field name="product_uom" groups="uom.group_uom"/>
</div>
<label for="price" string="Unit Price"/>
<div class="o_row">
<field name="price" class="oe_inline" /><field name="currency_id" groups="base.group_multi_currency"/>
</div>
<label for="date_start" string="Validity"/>
<div class="o_row"><field name="date_start" class="oe_inline"/> to <field name="date_end" class="oe_inline"/></div>
<field name="company_id" options="{'no_create': True}"/>
</group>
</group>
</sheet>
</form>
</field>
</record>
<record id="product_supplierinfo_search_view" model="ir.ui.view">
<field name="name">product.supplierinfo.search.view</field>
<field name="model">product.supplierinfo</field>
<field name="arch" type="xml">
<search string="Vendor">
<field name="partner_id"/>
<field name="product_tmpl_id"/>
<filter string="Active Products" name="active_products" domain="['|', ('product_tmpl_id.active', '=', True),('product_id.active', '=', True)]"/>
<separator />
<filter string="Active" name="active" domain="['|', ('date_end', '=', False), ('date_end', '&gt;=', (context_today() - datetime.timedelta(days=1)).strftime('%Y-%m-%d'))]"/>
<filter string="Archived" name="archived" domain="[('date_end', '&lt;', (context_today() - datetime.timedelta(days=1)).strftime('%Y-%m-%d'))]"/>
<group expand="0" string="Group By">
<filter string="Product" name="groupby_product" domain="[]" context="{'group_by': 'product_tmpl_id'}"/>
<filter string="Vendor" name="groupby_vendor" domain="[]" context="{'group_by': 'partner_id'}"/>
</group>
</search>
</field>
</record>
<record id="product_supplierinfo_view_kanban" model="ir.ui.view">
<field name="name">product.supplierinfo.kanban</field>
<field name="model">product.supplierinfo</field>
<field name="arch" type="xml">
<kanban class="o_kanban_mobile">
<field name="min_qty"/>
<field name="delay"/>
<field name="price"/>
<field name="partner_id"/>
<field name="currency_id"/>
<templates>
<t t-name="kanban-box">
<div class="oe_kanban_global_click">
<div class="row mb4">
<strong class="col-6">
<span t-esc="record.partner_id.value"/>
</strong>
<strong class="col-6 text-end">
<strong><field name="price" widget="monetary"/></strong>
</strong>
<div class="col-6">
<span t-esc="record.min_qty.value"/>
</div>
<div class="col-6 text-end">
<span t-esc="record.delay.value"/> days
</div>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<record id="product_supplierinfo_tree_view" model="ir.ui.view">
<field name="name">product.supplierinfo.tree.view</field>
<field name="model">product.supplierinfo</field>
<field name="arch" type="xml">
<tree string="Vendor Information" multi_edit="1">
<field name="sequence" widget="handle"/>
<field name="partner_id" readonly="1"/>
<field name="product_id" readonly="1" optional="hide"
invisible="context.get('product_template_invisible_variant', False)"
groups="product.group_product_variant"/>
<field name="product_tmpl_id" string="Product" readonly="1"
invisible="context.get('visible_product_tmpl_id', True)"/>
<field name="product_name" optional="hide"/>
<field name="product_code" optional="hide"/>
<field name="date_start" optional="hide"/>
<field name="date_end" optional="hide"/>
<field name="company_id" readonly="1" groups="base.group_multi_company"/>
<field name="min_qty" optional="hide"/>
<field name="product_uom" groups="uom.group_uom" optional="hide"/>
<field name="price" string="Price"/>
<field name="currency_id" groups="base.group_multi_currency"/>
<field name="delay" optional="hide"/>
</tree>
</field>
</record>
<record id="product_supplierinfo_type_action" model="ir.actions.act_window">
<field name="name">Vendor Pricelists</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">product.supplierinfo</field>
<field name="view_mode">tree,form,kanban</field>
<field name="context">{'visible_product_tmpl_id': False, 'search_default_active_products': True}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
No vendor pricelist found
</p><p>
Register the prices requested by your vendors for each product, based on the quantity and the period.
</p>
</field>
</record>
</odoo>

View file

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Product Tags -->
<record id="product_tag_form_view" model="ir.ui.view">
<field name="name">product.tag.form</field>
<field name="model">product.tag</field>
<field name="arch" type="xml">
<form string="Product Tag">
<sheet>
<group>
<group>
<field name="name"/>
<field name="color" widget="color_picker"/>
</group>
</group>
<group>
<field name="product_ids" widget="many2many_tags"
attrs="{'invisible':[('product_ids','=',[])]}"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="product_tag_tree_view" model="ir.ui.view">
<field name="name">product.tag.tree</field>
<field name="model">product.tag</field>
<field name="arch" type="xml">
<tree string="Product Tags">
<field name="name"/>
<field name="color" widget="color_picker"/>
</tree>
</field>
</record>
<record id="product_tag_action" model="ir.actions.act_window">
<field name="name">Product Tags</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">product.tag</field>
<field name="view_mode">tree,form</field>
<field name="view_id" eval="False"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Define a new tag
</p><p>
Tags are used to search product for a given theme.
</p>
</field>
</record>
</odoo>

View file

@ -0,0 +1,179 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="product_template_tree_view" model="ir.ui.view">
<field name="name">product.template.product.tree</field>
<field name="model">product.template</field>
<field name="arch" type="xml">
<tree string="Product" multi_edit="1" sample="1">
<header>
<button string="Print Labels" type="object" name="action_open_label_layout"/>
</header>
<field name="product_variant_count" invisible="1"/>
<field name="sale_ok" invisible="1"/>
<field name="currency_id" invisible="1"/>
<field name="cost_currency_id" invisible="1"/>
<field name="priority" widget="priority" optional="show" nolabel="1"/>
<field name="name" string="Product Name"/>
<field name="default_code" optional="show"/>
<field name="product_tag_ids" widget="many2many_tags" options="{'color_field': 'color'}" optional="show"/>
<field name="barcode" optional="hide" attrs="{'readonly': [('product_variant_count', '>', 1)]}"/>
<field name="company_id" options="{'no_create': True}"
groups="base.group_multi_company" optional="hide"/>
<field name="list_price" string="Sales Price" widget='monetary' options="{'currency_field': 'currency_id'}" optional="show" decoration-muted="not sale_ok"/>
<field name="standard_price" widget='monetary' options="{'currency_field': 'cost_currency_id'}" optional="show" readonly="1"/>
<field name="categ_id" optional="hide"/>
<field name="detailed_type" optional="hide" readonly="1"/>
<field name="type" invisible="1"/>
<field name="uom_id" readonly="1" optional="show" groups="uom.group_uom"/>
<field name="active" invisible="1"/>
<field name="activity_exception_decoration" widget="activity_exception"/>
</tree>
</field>
</record>
<record id="product_template_only_form_view" model="ir.ui.view">
<field name="name">product.template.product.form</field>
<field name="model">product.template</field>
<field name="mode">primary</field>
<field name="priority" eval="8" />
<field name="inherit_id" ref="product.product_template_form_view"/>
<field name="arch" type="xml">
<xpath expr="//form" position="attributes">
<attribute name="name">Product Template</attribute>
</xpath>
<field name="categ_id" position="after">
<field name="default_code" attrs="{'invisible': [('product_variant_count', '>', 1)]}"/>
<field name="barcode" attrs="{'invisible': [('product_variant_count', '>', 1)]}"/>
</field>
<div name="button_box" position="inside">
<button name="%(product.product_variant_action)d" type="action"
icon="fa-sitemap" class="oe_stat_button"
attrs="{'invisible': [('product_variant_count', '&lt;=', 1)]}"
groups="product.group_product_variant">
<field string="Variants" name="product_variant_count" widget="statinfo" />
</button>
</div>
<xpath expr="//page[@name='general_information']" position="after">
<page name="variants" string="Attributes &amp; Variants" groups="product.group_product_variant">
<field name="attribute_line_ids" widget="one2many" context="{'show_attribute': False}">
<tree string="Variants" editable="bottom" decoration-info="value_count &lt;= 1">
<field name="value_count" invisible="1"/>
<field name="attribute_id" attrs="{'readonly': [('id', '!=', False)]}"/>
<field name="value_ids" widget="many2many_tags" options="{'no_create_edit': True, 'color_field': 'color'}" context="{'default_attribute_id': attribute_id, 'show_attribute': False}"/>
<button string="Configure" class="float-end btn-secondary"
type="object" name="action_open_attribute_values"
groups="product.group_product_variant"/>
</tree>
</field>
<p class="oe_grey oe_edit_only">
<strong>Warning</strong>: adding or deleting attributes
will delete and recreate existing variants and lead
to the loss of their possible customizations.
</p>
</page>
</xpath>
</field>
</record>
<record id="product_template_kanban_view" model="ir.ui.view">
<field name="name">Product.template.product.kanban</field>
<field name="model">product.template</field>
<field name="arch" type="xml">
<kanban sample="1" class="o_kanban_product_template">
<field name="id"/>
<field name="product_variant_count"/>
<field name="currency_id"/>
<field name="activity_state"/>
<progressbar field="activity_state" colors='{"planned": "success", "today": "warning", "overdue": "danger"}'/>
<templates>
<t t-name="kanban-box">
<div class="oe_kanban_card oe_kanban_global_click">
<div class="o_kanban_image me-1">
<img t-att-src="kanban_image('product.template', 'image_128', record.id.raw_value)" alt="Product" class="o_image_64_contain"/>
</div>
<div class="oe_kanban_details">
<div class="o_kanban_record_top mb-0">
<div class="o_kanban_record_headings">
<strong class="o_kanban_record_title">
<field name="name"/>
</strong>
</div>
<field name="priority" widget="priority"/>
</div>
<t t-if="record.default_code.value">[<field name="default_code"/>]</t>
<div t-if="record.product_variant_count.value &gt; 1" groups="product.group_product_variant">
<strong>
<t t-esc="record.product_variant_count.value"/> Variants
</strong>
</div>
<div name="product_lst_price" class="mt-1">
Price: <field name="list_price" widget="monetary" options="{'currency_field': 'currency_id', 'field_digits': True}"></field>
</div>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<record id="product_template_view_activity" model="ir.ui.view">
<field name="name">product.template.activity</field>
<field name="model">product.template</field>
<field name="arch" type="xml">
<activity string="Products">
<field name="id"/>
<templates>
<div t-name="activity-box">
<img t-att-src="activity_image('product.template', 'image_128', record.id.raw_value)" role="img" t-att-title="record.id.value" t-att-alt="record.id.value"/>
<div>
<field name="name" display="full"/>
<div t-if="record.default_code.value" class="text-muted">
[<field name="default_code"/>]
</div>
</div>
</div>
</templates>
</activity>
</field>
</record>
<record id="product_template_action" model="ir.actions.act_window">
<field name="name">Products</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">product.template</field>
<field name="view_mode">kanban,tree,form</field>
<field name="view_id" ref="product_template_kanban_view"/>
<field name="search_view_id" ref="product.product_template_search_view"/>
<field name="context">{"search_default_filter_to_sell":1}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a new product
</p><p>
You must define a product for everything you sell or purchase,
whether it's a storable product, a consumable or a service.
</p>
</field>
</record>
<record id="action_product_template_price_list_report" model="ir.actions.server">
<field name="name">Generate Pricelist Report</field>
<field name="groups_id" eval="[(4, ref('product.group_product_pricelist'))]"/>
<field name="model_id" ref="product.model_product_template"/>
<field name="binding_model_id" ref="product.model_product_template"/>
<field name="state">code</field>
<field name="code">
ctx = env.context
ctx.update({'default_pricelist': env['product.pricelist'].search([], limit=1).id})
action = {
'name': 'Pricelist Report',
'type': 'ir.actions.client',
'tag': 'generate_pricelist',
'context': ctx,
}
</field>
</record>
</odoo>

View file

@ -0,0 +1,496 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- base structure of product.template, common with product.product -->
<record id="product_template_form_view" model="ir.ui.view">
<field name="name">product.template.common.form</field>
<field name="model">product.template</field>
<field name="mode">primary</field>
<field name="arch" type="xml">
<form string="Product">
<header>
<button string="Print Labels" type="object" name="action_open_label_layout" attrs="{'invisible': [('detailed_type', '==', 'service')]}"/>
</header>
<sheet name="product_form">
<field name='product_variant_count' invisible='1'/>
<field name='is_product_variant' invisible='1'/>
<field name='attribute_line_ids' invisible='1'/>
<field name="type" invisible="1"/>
<field name="company_id" invisible="1"/>
<div class="oe_button_box" name="button_box">
<button class="oe_stat_button"
name="open_pricelist_rules"
icon="fa-list-ul"
groups="product.group_product_pricelist"
type="object">
<div class="o_field_widget o_stat_info">
<span class="o_stat_value">
<field name="pricelist_item_count"/>
</span>
<span attrs="{'invisible': [('pricelist_item_count', '=', 1)]}">
Extra Prices
</span>
<span attrs="{'invisible': [('pricelist_item_count', '!=', 1)]}">
Extra Price
</span>
</div>
</button>
</div>
<widget name="web_ribbon" title="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}"/>
<field name="id" invisible="True"/>
<field name="image_1920" widget="image" class="oe_avatar" options="{'preview_image': 'image_128'}"/>
<div class="oe_title">
<label for="name" string="Product Name"/>
<h1>
<div class="d-flex">
<field name="priority" widget="priority" class="me-3"/>
<field class="text-break" name="name" placeholder="e.g. Cheese Burger"/>
</div>
</h1>
</div>
<div name="options">
<span class="d-inline-block">
<field name="sale_ok"/>
<label for="sale_ok"/>
</span>
<span class="d-inline-block">
<field name="purchase_ok"/>
<label for="purchase_ok"/>
</span>
</div>
<notebook>
<page string="General Information" name="general_information">
<group>
<group name="group_general">
<field name="active" invisible="1"/>
<field name="detailed_type"/>
<field name="product_tooltip" string="" class="fst-italic text-muted"/>
<field name="uom_id" groups="uom.group_uom" options="{'no_create': True}"/>
<field name="uom_po_id" groups="uom.group_uom" options="{'no_create': True}"/>
</group>
<group name="group_standard_price">
<label for="list_price"/>
<div name="pricing">
<field name="list_price" class="oe_inline" widget='monetary'
options="{'currency_field': 'currency_id', 'field_digits': True}"/>
</div>
<label for="standard_price" attrs="{'invisible': [('product_variant_count', '&gt;', 1), ('is_product_variant', '=', False)]}"/>
<div name="standard_price_uom" attrs="{'invisible': [('product_variant_count', '&gt;', 1), ('is_product_variant', '=', False)]}">
<field name="standard_price" class="oe_inline" widget='monetary' options="{'currency_field': 'cost_currency_id', 'field_digits': True}"/>
<span groups="uom.group_uom" >per
<field name="uom_name" class="oe_inline"/>
</span>
</div>
<field name="categ_id" string="Product Category"/>
<field name="product_tag_ids" widget="many2many_tags" options="{'color_field': 'color'}"/>
<field name="company_id" groups="base.group_multi_company"
options="{'no_create': True}"/>
<field name="currency_id" invisible="1"/>
<field name="cost_currency_id" invisible="1"/>
<field name="product_variant_id" invisible="1"/>
</group>
</group>
<group string="Internal Notes">
<field colspan="2" name="description" nolabel="1" placeholder="This note is only for internal purposes."/>
</group>
</page>
<page string="Sales" attrs="{'invisible':[('sale_ok','=',False)]}" name="sales" invisible="1">
<group name="sale">
<group string="Upsell &amp; Cross-Sell" name="upsell" invisible="1"/>
</group>
<group>
<group string="Sales Description" name="description">
<field colspan="2" name="description_sale" nolabel="1" placeholder="This note is added to sales orders and invoices."/>
</group>
</group>
</page>
<page string="Purchase" name="purchase" attrs="{'invisible': [('purchase_ok','=',False)]}" invisible="1">
<group name="purchase">
<group string="Vendor Bills" name="bill"/>
</group>
</page>
<page string="Inventory" name="inventory" groups="product.group_stock_packaging" attrs="{'invisible':[('type', '=', 'service')]}">
<group name="inventory">
<group name="group_lots_and_weight" string="Logistics" attrs="{'invisible': [('type', 'not in', ['product', 'consu'])]}">
<label for="weight" attrs="{'invisible':[('product_variant_count', '>', 1), ('is_product_variant', '=', False)]}"/>
<div class="o_row" name="weight" attrs="{'invisible':[('product_variant_count', '>', 1), ('is_product_variant', '=', False)]}">
<field name="weight" class="oe_inline"/>
<field name="weight_uom_name"/>
</div>
<label for="volume" attrs="{'invisible':[('product_variant_count', '>', 1), ('is_product_variant', '=', False)]}"/>
<div class="o_row" name="volume" attrs="{'invisible':[('product_variant_count', '>', 1), ('is_product_variant', '=', False)]}">
<field name="volume" string="Volume" class="oe_inline"/>
<field name="volume_uom_name"/>
</div>
</group>
</group>
<group name="packaging" string="Packaging"
colspan="4"
attrs="{'invisible':['|', ('type', 'not in', ['product', 'consu']), ('product_variant_count', '>', 1), ('is_product_variant', '=', False)]}"
groups="product.group_stock_packaging">
<field colspan="2" name="packaging_ids" nolabel="1" context="{'tree_view_ref':'product.product_packaging_tree_view2', 'default_company_id': company_id}"/>
</group>
</page>
</notebook>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids"/>
<field name="activity_ids"/>
<field name="message_ids"/>
</div>
</form>
</field>
</record>
<record id="product_template_search_view" model="ir.ui.view">
<field name="name">product.template.search</field>
<field name="model">product.template</field>
<field name="arch" type="xml">
<search string="Product">
<field name="name" string="Product" filter_domain="['|', '|', '|', ('default_code', 'ilike', self), ('product_variant_ids.default_code', 'ilike', self),('name', 'ilike', self), ('barcode', 'ilike', self)]"/>
<field name="categ_id" filter_domain="[('categ_id', 'child_of', raw_value)]"/>
<separator/>
<filter string="Services" name="services" domain="[('type','=','service')]"/>
<filter string="Products" name="consumable" domain="[('type', 'in', ['consu', 'product'])]"/>
<separator/>
<filter string="Can be Sold" name="filter_to_sell" domain="[('sale_ok','=',True)]"/>
<filter string="Can be Purchased" name="filter_to_purchase" domain="[('purchase_ok', '=', True)]"/>
<separator/>
<field string="Attributes" name="attribute_line_ids" groups="product.group_product_variant"/>
<filter invisible="1" string="Late Activities" name="activities_overdue"
domain="[('my_activity_date_deadline', '&lt;', context_today().strftime('%Y-%m-%d'))]"
help="Show all records which has next action date is before today"/>
<filter invisible="1" string="Today Activities" name="activities_today"
domain="[('my_activity_date_deadline', '=', context_today().strftime('%Y-%m-%d'))]"/>
<filter invisible="1" string="Future Activities" name="activities_upcoming_all"
domain="[('my_activity_date_deadline', '&gt;', context_today().strftime('%Y-%m-%d'))
]"/>
<separator/>
<filter string="Favorites" name="favorites" domain="[('priority','=','1')]"/>
<separator/>
<filter string="Warnings" name="activities_exception"
domain="[('activity_exception_decoration', '!=', False)]"/>
<separator/>
<filter string="Archived" name="inactive" domain="[('active','=',False)]"/>
<group expand="1" string="Group By">
<filter string="Product Type" name="type" context="{'group_by':'detailed_type'}"/>
<filter string="Product Category" name="categ_id" context="{'group_by':'categ_id'}"/>
</group>
</search>
</field>
</record>
<record id="product_template_action_all" model="ir.actions.act_window">
<field name="name">Products</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">product.template</field>
<field name="view_mode">kanban,tree,form</field>
<field name="context">{}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a new product
</p>
</field>
</record>
<record id="product_search_form_view" model="ir.ui.view">
<field name="name">product.product.search</field>
<field name="model">product.product</field>
<field name="mode">primary</field>
<field name="inherit_id" ref="product.product_template_search_view"/>
<field name="arch" type="xml">
<field name="name" position="replace">
<field name="name" string="Product" filter_domain="['|', '|', ('default_code', 'ilike', self), ('name', 'ilike', self), ('barcode', 'ilike', self)]"/>
</field>
<field name="attribute_line_ids" position="replace">
<field name="product_template_attribute_value_ids" groups="product.group_product_variant"/>
<field name="product_tmpl_id" string="Product Template"/>
</field>
</field>
</record>
<record id="product_normal_action" model="ir.actions.act_window">
<field name="name">Product Variants</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">product.product</field>
<field name="view_mode">tree,form,kanban,activity</field>
<field name="search_view_id" ref="product_search_form_view"/>
<field name="view_id" eval="False"/> <!-- Force empty -->
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a new product variant
</p><p>
You must define a product for everything you sell or purchase,
whether it's a storable product, a consumable or a service.
</p>
</field>
</record>
<record id="product_variant_easy_edit_view" model="ir.ui.view">
<field name="name">product.product.view.form.easy</field>
<field name="model">product.product</field>
<field name="mode">primary</field>
<field name="arch" type="xml">
<form string="Variant Information" duplicate="false">
<header>
<button string="Print Labels" type="object" name="action_open_label_layout"/>
</header>
<sheet>
<div class="oe_button_box" name="button_box"/>
<widget name="web_ribbon" title="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}"/>
<field name="active" invisible="1"/>
<field name="id" invisible="1"/>
<field name="company_id" invisible="1"/>
<field name="image_1920" widget="image" class="oe_avatar" options="{'preview_image': 'image_128'}"/>
<div class="oe_title">
<label for="name" string="Product Name"/>
<h1><field name="name" readonly="1" placeholder="e.g. Odoo Enterprise Subscription"/></h1>
<field name="product_template_attribute_value_ids" widget="many2many_tags" readonly="1"/>
<p>
<span>All general settings about this product are managed on</span>
<button name="open_product_template" type="object" string="the product template." class="oe_link oe_link_product ps-0 ms-1 mb-1"/>
</p>
</div>
<group>
<group name="codes" string="Codes">
<field name="default_code"/>
<field name="barcode"/>
<field name="type" invisible="1"/>
</group>
<group name="pricing" string="Pricing">
<field name="product_variant_count" invisible="1"/>
<label for="lst_price" string="Sales Price"/>
<div class="o_row">
<field name="lst_price" class="oe_inline" widget='monetary' options="{'currency_field': 'currency_id', 'field_digits': True}" attrs="{'readonly': [('product_variant_count', '&gt;', 1)]}"/>
</div>
<label for="standard_price"/>
<div class="o_row">
<field name="standard_price" widget='monetary' class="oe_inline" options="{'currency_field': 'cost_currency_id'}"/>
</div>
<field name="currency_id" invisible='1'/>
<field name="cost_currency_id" invisible="1"/>
</group>
</group>
<group>
<group name="weight" string="Logistics" attrs="{'invisible':[('type', 'not in', ['product', 'consu'])]}">
<label for="volume"/>
<div class="o_row">
<field name="volume" class="oe_inline"/>
<span><field name="volume_uom_name"/></span>
</div>
<label for="weight"/>
<div class="o_row">
<field name="weight" class="oe_inline"/>
<span><field name="weight_uom_name"/></span>
</div>
</group>
<group name="tags" string="Tags">
<field name="product_tag_ids" string="Product Template Tags" widget="many2many_tags" readonly="1" options="{'no_open': True, 'color_field': 'color'}"/>
<field name="additional_product_tag_ids" widget="many2many_tags" options="{'no_open': True, 'color_field': 'color'}"/>
</group>
</group>
<group>
<group name="packaging" string="Packaging" groups="product.group_stock_packaging">
<field colspan="2" name="packaging_ids" nolabel="1"
context="{'tree_view_ref':'product.product_packaging_tree_view2', 'default_company_id': company_id}"/>
</group>
</group>
</sheet>
</form>
</field>
</record>
<record id="product_variant_action" model="ir.actions.act_window">
<field name="name">Product Variants</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">product.product</field>
<field name="context">{'search_default_product_tmpl_id': [active_id], 'default_product_tmpl_id': active_id, 'create': False}</field>
<field name="search_view_id" ref="product_search_form_view"/>
<field name="view_ids"
eval="[(5, 0, 0),
(0, 0, {'view_mode': 'tree'}),
(0, 0, {'view_mode': 'form', 'view_id': ref('product_variant_easy_edit_view')}),
(0, 0, {'view_mode': 'kanban'})]"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a new product variant
</p><p>
You must define a product for everything you sell or purchase,
whether it's a storable product, a consumable or a service.
The product form contains information to simplify the sale process:
price, notes in the quotation, accounting data, procurement methods, etc.
</p>
</field>
</record>
<record id="product_product_tree_view" model="ir.ui.view">
<field name="name">product.product.tree</field>
<field name="model">product.product</field>
<field eval="7" name="priority"/>
<field name="arch" type="xml">
<tree string="Product Variants" multi_edit="1" duplicate="false" sample="1">
<header>
<button string="Print Labels" type="object" name="action_open_label_layout"/>
</header>
<field name="priority" widget="priority" nolabel="1" readonly="1"/>
<field name="default_code" optional="show" readonly="1"/>
<field name="barcode" optional="hide" readonly="1"/>
<field name="name" readonly="1"/>
<field name="product_template_variant_value_ids" widget="many2many_tags" groups="product.group_product_variant" readonly="1"/>
<field name="company_id" groups="base.group_multi_company" optional="hide" readonly="1"/>
<field name="lst_price" optional="show" string="Sales Price"/>
<field name="standard_price" optional="show"/>
<field name="categ_id" optional="hide"/>
<field name="product_tag_ids" widget="many2many_tags" options="{'color_field': 'color', 'no_edit_color': 1}" optional="hide"/>
<field name="type" optional="hide" readonly="1"/>
<field name="uom_id" options="{'no_open': True, 'no_create': True}" groups="uom.group_uom" optional="show" readonly="1"/>
<field name="product_tmpl_id" invisible="1" readonly="1"/>
<field name="active" invisible="1"/>
</tree>
</field>
</record>
<record id="product_normal_form_view" model="ir.ui.view">
<field name="name">product.product.form</field>
<field name="model">product.product</field>
<field name="mode">primary</field>
<field eval="7" name="priority"/>
<field name="inherit_id" ref="product.product_template_form_view"/>
<field name="arch" type="xml">
<form position="attributes">
<attribute name="string">Product Variant</attribute>
<attribute name="duplicate">false</attribute>
</form>
<xpath expr="//div[@name='standard_price_uom']" position="after">
<field name="default_code"/>
<field name="barcode"/>
</xpath>
<xpath expr="//field[@name='priority']" position="attributes">
<attribute name="readonly">1</attribute>
</xpath>
<field name="list_price" position="attributes">
<attribute name="attrs">{'readonly': [('product_variant_count', '&gt;', 1)]}</attribute>
<attribute name="invisible">1</attribute>
</field>
<xpath expr="//label[@for='list_price']" position="replace">
<label for="lst_price"/>
</xpath>
<field name="list_price" position="after">
<field name="lst_price" class="oe_inline" widget='monetary' options="{'currency_field': 'currency_id', 'field_digits': True}"/>
</field>
<group name="packaging" position="attributes">
<attribute name="attrs">{'invisible': 0}</attribute>
</group>
<field name="name" position="after">
<field name="product_tmpl_id" class="oe_inline" readonly="1" invisible="1" attrs="{'required': [('id', '!=', False)]}"/>
</field>
<xpath expr="//div[hasclass('oe_title')]" position="inside">
<field name="product_template_variant_value_ids" widget="many2many_tags" readonly="1" groups="product.group_product_variant"/>
</xpath>
<field name="product_tag_ids" position="attributes">
<attribute name="options">{'no_open': True, 'color_field': 'color'}</attribute>
</field>
<field name="product_tag_ids" position="after">
<field name="additional_product_tag_ids" widget="many2many_tags" options="{'no_open': True, 'color_field': 'color'}"/>
</field>
</field>
</record>
<record id="product_kanban_view" model="ir.ui.view">
<field name="name">Product Kanban</field>
<field name="model">product.product</field>
<field name="arch" type="xml">
<kanban sample="1">
<field name="id"/>
<field name="lst_price"/>
<field name="activity_state"/>
<field name="color"/>
<progressbar field="activity_state" colors='{"planned": "success", "today": "warning", "overdue": "danger"}'/>
<templates>
<t t-name="kanban-box">
<div class="oe_kanban_global_click">
<div class="o_kanban_image">
<img t-att-src="kanban_image('product.product', 'image_128', record.id.raw_value)" alt="Product" class="o_image_64_contain"/>
</div>
<div class="oe_kanban_details">
<field name="priority" widget="priority" readonly="1"/>
<strong class="o_kanban_record_title">
<field name="name"/>
<small t-if="record.default_code.value">[<field name="default_code"/>]</small>
</strong>
<div class="o_kanban_tags_section">
<field name="product_template_variant_value_ids" groups="product.group_product_variant" widget="many2many_tags" options="{'color_field': 'color'}"/>
</div>
<ul>
<li><strong>Price: <field name="lst_price"></field></strong></li>
</ul>
<div name="tags"/>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<record id="product_product_view_activity" model="ir.ui.view">
<field name="name">product.product.activity</field>
<field name="model">product.product</field>
<field name="arch" type="xml">
<activity string="Product Variants">
<field name="id"/>
<field name="default_code"/>
<templates>
<div t-name="activity-box">
<img t-att-src="activity_image('product.product', 'image_128', record.id.raw_value)" role="img" t-att-title="record.id.value" t-att-alt="record.id.value"/>
<div>
<field name="name" display="full"/>
<div t-if="record.default_code.value" class="text-muted">
[<field name="default_code"/>]
</div>
</div>
</div>
</templates>
</activity>
</field>
</record>
<record id="product_normal_action_sell" model="ir.actions.act_window">
<field name="name">Product Variants</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">product.product</field>
<field name="view_mode">kanban,tree,form,activity</field>
<field name="context">{"search_default_filter_to_sell":1}</field>
<field name="view_id" ref="product_product_tree_view"/>
<field name="search_view_id" ref="product_search_form_view"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a new product variant
</p><p>
You must define a product for everything you sell, whether it's a physical product,
a consumable or a service you offer to customers.
The product form contains information to simplify the sale process:
price, notes in the quotation, accounting data, procurement methods, etc.
</p>
</field>
</record>
<record id="action_product_price_list_report" model="ir.actions.server">
<field name="name">Generate Pricelist</field>
<field name="groups_id" eval="[(4, ref('group_product_pricelist'))]"/>
<field name="model_id" ref="product.model_product_product"/>
<field name="binding_model_id" ref="product.model_product_product"/>
<field name="state">code</field>
<field name="code">
ctx = env.context
ctx.update({'default_pricelist': env['product.pricelist'].search([], limit=1).id})
action = {
'name': 'Pricelist Report',
'type': 'ir.actions.client',
'tag': 'generate_pricelist',
'context': ctx,
}
</field>
</record>
</odoo>

View file

@ -0,0 +1,66 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="res_config_settings_view_form" model="ir.ui.view">
<field name="name">res.config.settings.view.form.inherit.product</field>
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="base_setup.res_config_settings_view_form"/>
<field name="arch" type="xml">
<xpath expr="//div[@id='companies']" position="after">
<h2>Units of Measure</h2>
<div class="row mt16 o_settings_container" id="product_general_settings">
<div class="col-12 col-lg-6 o_setting_box" id="weight_uom_setting">
<div class="o_setting_left_pane">
</div>
<div class="o_setting_right_pane">
<label for="product_weight_in_lbs" string="Weight"/>
<div class="text-muted">
Define your weight unit of measure
</div>
<div class="content-group">
<div class="mt16">
<field name="product_weight_in_lbs" class="o_light_label" widget="radio" options="{'horizontal': true}"/>
</div>
</div>
</div>
</div>
<div class="col-12 col-lg-6 o_setting_box" id="manage_volume_uom_setting">
<div class="o_setting_right_pane">
<label for="product_volume_volume_in_cubic_feet" string="Volume"/>
<div class="text-muted">
Define your volume unit of measure
</div>
<div class="content-group">
<div class="mt16">
<field name="product_volume_volume_in_cubic_feet" class="o_light_label" widget="radio" options="{'horizontal': true}"/>
</div>
</div>
</div>
</div>
</div>
</xpath>
<xpath expr="//div[@id='product_get_pic_setting']" position="replace">
<div class="col-12 col-lg-6 o_setting_box" id="product_get_pic_setting">
<div class="o_setting_left_pane">
<field name="module_product_images"/>
</div>
<div class="o_setting_right_pane">
<label for="module_product_images" string="Google Images"/>
<a href="https://www.odoo.com/documentation/16.0/applications/sales/sales/products_prices/products/product_images.html"
title="Documentation" class="o_doc_link" target="_blank"/>
<div class="text-muted">
Get product pictures using Barcode
</div>
<div class="content-group mt16"
attrs="{'invisible': [('module_product_images','=',False)]}"
id="msg_module_product_images">
<div class="mt16 text-warning">
<strong>Save</strong> this page and come back
here to set up the feature.
</div>
</div>
</div>
</div>
</xpath>
</field>
</record>
</odoo>

View file

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="inherits_website_sale_country_group_form" model="ir.ui.view">
<field name="name">res.country.group.form.inherit.product</field>
<field name="model">res.country.group</field>
<field name="inherit_id" ref="base.view_country_group_form"/>
<field name="arch" type="xml">
<group name="country_group" position="after">
<field name="pricelist_ids"/>
</group>
</field>
</record>
</odoo>

View file

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_partner_property_form" model="ir.ui.view">
<field name="name">res.partner.product.property.form.inherit</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form"/>
<field name="arch" type="xml">
<group name="sale">
<field name="property_product_pricelist" groups="product.group_product_pricelist" attrs="{'invisible': [('is_company','=',False),('parent_id','!=',False)]}"/>
<div name="parent_pricelists" groups="product.group_product_pricelist" colspan="2" attrs="{'invisible': ['|',('is_company','=',True),('parent_id','=',False)]}">
<p>Pricelists are managed on <button name="open_commercial_entity" type="object" string="the parent company" class="oe_link"/></p>
</div>
</group>
</field>
</record>
</odoo>