<field name="model">product.product</field>
<field name="arch" type="xml">
<search string="Product">
- <field name="name" string="Product" filter_domain="['|',('name','ilike',self),('default_code','ilike',self)]"/>
+ <field name="name" string="Product" filter_domain="['|','|',('name','ilike',self),('default_code','ilike',self),('variants','ilike',self)]"/>
<filter string="Services" icon="terp-accessories-archiver" domain="[('type','=','service')]"/>
<filter string="Consumable" name="consumable" icon="terp-accessories-archiver" domain="[('type','=','consu')]" help="Consumable products"/>
<separator/>
<filter string='Default Unit of Measure' icon="terp-mrp" domain="[]" context="{'group_by' : 'uom_id'}"/>
<filter string='Type' icon="terp-stock_symbol-selection" domain="[]" context="{'group_by' : 'type'}"/>
<filter string='Company' icon="terp-go-home" domain="[]" context="{'group_by' : 'company_id'}" groups="base.group_multi_company"/>
+ <filter string='Template' name="template_id" domain="[]" context="{'group_by' : 'product_tmpl_id'}" groups="product.group_product_variant"/>
</group>
</search>
</field>
<tree colors="red:virtual_available<0;blue:virtual_available>=0 and state in ('draft', 'end', 'obsolete');black:virtual_available>=0 and state not in ('draft', 'end', 'obsolete')" string="Products">
<field name="default_code"/>
<field name="name"/>
+ <field name="variants" groups="product.group_product_variant"/>
<field name="categ_id" invisible="1"/>
<field name="type" invisible="1"/>
- <field name="variants" groups="product.group_product_variant"/>
<field name="uom_id" string="Unit of Measure" groups="product.group_uom"/>
<field name="qty_available"/>
<field name="virtual_available"/>
<field name="standard_price" invisible="1"/>
<field name="state"/>
<field name="company_id" groups="base.group_multi_company" invisible="1"/>
+ <field name="product_tmpl_id" invisible="1"/>
</tree>
</field>
</record>
<field name="arch" type="xml">
<form string="Product" version="7.0">
<sheet>
- <field name="image_medium" widget="image" class="oe_avatar oe_left"/>
+ <field name="is_only_child" invisible="1"/>
+ <field name="image_medium" widget="image" class="oe_avatar oe_left"
+ attrs="{'readonly': [('is_only_child', '=', False)]}"/>
<div class="oe_title">
<div class="oe_edit_only">
- <label for="name" string="Product Name"/>
+ <label for="name" name='label_name' string="Product Name"
+ attrs="{'invisible': [('is_only_child', '=', False)]}"/>
+ <label for="name" name='label_name' string="Product Template"
+ attrs="{'invisible': [('is_only_child', '=', True)]}"/>
</div>
<h1>
- <field name="name"/>
+ <field name="name" class="oe_inline"
+ attrs="{'required': [('is_only_child', '=', True)],
+ 'invisible': [('is_only_child', '=', False)]}"/>
+ <field name="product_tmpl_id" class="oe_inline" readonly="1" required="0"
+ attrs="{'invisible': [('is_only_child', '=', True)]}"/>
+ <span groups="product.group_product_variant"
+ attrs="{'invisible': [('is_only_child', '=', True), ('variants', '=', False)]}">
+ - <field name="variants" placeholder="Variant Name" class="oe_inline"/>
+ </span>
</h1>
+ <span attrs="{'invisible': [('is_only_child', '=', True)]}">
+ <p>Generic product settings are managed on
+ <button name="open_product_template" type="object" string="the template" class="oe_link"/>
+ </p>
+ </span>
<label for="categ_id" class="oe_edit_only"/>
- <h2><field name="categ_id"/></h2>
+ <h2><field name="categ_id" attrs="{'readonly': [('is_only_child', '=', False)]}"/></h2>
+ <label for="public_categ_id" class="oe_edit_only"/>
+ <h3><field name="public_categ_id" attrs="{'readonly': [('is_only_child', '=', False)]}"/></h3>
<div name="options" groups="base.group_user">
<field name="sale_ok"/>
<label for="sale_ok"/>
<page string="Information">
<group>
<group>
- <field name="type"/>
- <field name="uom_id" on_change="onchange_uom(uom_id,uom_po_id)" groups="product.group_uom"/>
- <field name="list_price"/>
+ <field name="type"
+ attrs="{'invisible': [('is_only_child', '=', False)]}"/>
+ <field name="uom_id" on_change="onchange_uom(uom_id,uom_po_id)" groups="product.group_uom"
+ attrs="{'invisible': [('is_only_child', '=', False)]}"/>
+ <field name="lst_price" string="Public Sale Price"
+ attrs="{'readonly': [('is_only_child', '=', False)]}"/>
+ <field name="price_extra"
+ attrs="{'invisible': [('is_only_child', '=', True)]}"/>
</group>
<group>
<field name="default_code"/>
<div name="ean">
<field name="ean13" placeholder="e.g. 5901234123457"/>
</div>
- </group>
- <group>
- <field groups="product.group_product_variant" name="variants"/>
- <field name="price_margin" groups="product.group_product_variant"/>
- <field name="price_extra" groups="product.group_product_variant"/>
+ <field name="company_id" groups="base.group_multi_company" widget="selection"
+ attrs="{'invisible': [('is_only_child', '=', False)]}"/>
+ <field name="active" />
</group>
</group>
- <field name="description" placeholder="describe the product characteristics..."/>
+ <field name="description" placeholder="describe the product characteristics..."
+ attrs="{'readonly': [('is_only_child', '=', False)]}"/>
</page>
<page string="Procurements" groups="base.group_user">
<group name="procurement">
<group name="general">
- <field name="cost_method" groups="product.group_costing_method"/>
- <field name="standard_price" attrs="{'readonly':[('cost_method','=','average')]}"/>
+ <field name="cost_method" groups="product.group_costing_method"
+ attrs="{'readonly': [('is_only_child', '=', False)]}"/>
+ <field name="standard_price"
+ attrs="{'readonly': ['|', ('cost_method','=','average'), ('is_only_child', '=', False)]}"/>
</group>
<group name="procurement_uom" groups="product.group_uom" string="Purchase">
- <field name="uom_po_id"/>
+ <field name="uom_po_id"
+ attrs="{'readonly': [('is_only_child', '=', False)]}"/>
</group>
</group>
<separator string="Description for Suppliers"/>
<page string="Inventory" groups="base.group_user">
<group name="inventory">
<group name="status" string="Status">
- <field name="state"/>
- <field name="product_manager"/>
+ <field name="state"
+ attrs="{'readonly': [('is_only_child', '=', False)]}"/>
+ <field name="product_manager"
+ attrs="{'readonly': [('is_only_child', '=', False)]}"
+ context="{'default_groups_ref': ['base.group_user', 'base.group_partner_manager', 'base.group_sale_manager']}"/>
</group>
<group name="Weights" string="Weights">
- <field digits="(14, 3)" name="volume" attrs="{'readonly':[('type','=','service')]}"/>
- <field name="weight" attrs="{'readonly':[('type','=','service')]}"/>
- <field name="weight_net" attrs="{'readonly':[('type','=','service')]}"/>
+ <field digits="(14, 3)" name="volume"
+ attrs="{'readonly': ['|', ('type','=','service'), ('is_only_child', '=', False)]}"/>
+ <field name="weight"
+ attrs="{'readonly': ['|', ('type','=','service'), ('is_only_child', '=', False)]}"/>
+ <field name="weight_net"
+ attrs="{'readonly': ['|', ('type','=','service'), ('is_only_child', '=', False)]}"/>
</group>
</group>
</page>
<group name="sale">
<group string="Sale Conditions">
<label for="warranty"/>
- <div>
+ <div attrs="{'readonly': [('is_only_child', '=', False)]}">
<field name="warranty" class="oe_inline"/> months
</div>
</group>
<group groups="product.group_uos" string="Unit of Measure">
- <field name="uos_id"/>
- <field name="uos_coeff"/>
- <field name="mes_type"/>
+ <field name="uos_id"
+ attrs="{'readonly': [('is_only_child', '=', False)]}"/>
+ <field name="uos_coeff"
+ attrs="{'readonly': [('is_only_child', '=', False)]}"/>
+ <field name="mes_type"
+ attrs="{'readonly': [('is_only_child', '=', False)]}"/>
</group>
</group>
- <field name="packaging" groups="product.group_stock_packaging">
+ <field name="packaging" groups="product.group_stock_packaging"
+ attrs="{'readonly': [('is_only_child', '=', False)]}">
<form string="Packaging" version="7.0">
<group col="4">
<field name="ean"/>
</form>
</field>
<separator string="Description for Quotations"/>
- <field name="description_sale" placeholder="note to be displayed on quotations..."/>
+ <field name="description_sale" placeholder="note to be displayed on quotations..."
+ attrs="{'readonly': [('is_only_child', '=', False)]}"/>
</page>
</notebook>
</sheet>
<div class="oe_kanban_details">
<h4>
<a type="open">
- <t t-if="record.code.raw_value">[<field name="code"/>]</t> <field name="name"/>
+ <t t-if="record.code.raw_value">[<field name="code"/>]</t> <field name="name"/> <t t-if="record.variants.raw_value">(<field name="variants"/>)</t>
</a>
</h4>
<div name="tags"/>
</record>
<menuitem id="base.menu_product" name="Products" parent="base.menu_base_partner" sequence="9"/>
- <menuitem action="product.product_normal_action_sell" id="product.menu_products" parent="base.menu_product" sequence="1"/>
+ <menuitem id="product.menu_products" action="product.product_normal_action_sell" parent="base.menu_product" sequence="1"/>
<record id="product_normal_action_puchased" model="ir.actions.act_window">
<field name="name">Products</field>
action="product_category_action"
id="product.menu_products_category"
parent="base.menu_product"
- sequence="0" groups="base.group_no_one"/>
+ sequence="30" groups="base.group_no_one"/>
<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>
</record>
+ <!-- Product Public Categories -->
+ <record id="product_public_category_form_view" model="ir.ui.view">
+ <field name="name">product.public.category.form</field>
+ <field name="model">product.public.category</field>
+ <field name="arch" type="xml">
+ <form string="Pos/Public Categories" version="7.0">
+ <sheet>
+ <field name="image_medium" widget='image' class="oe_avatar oe_right"/>
+ <div class="oe_left">
+ <group>
+ <field name="name"/>
+ <field name="parent_id"/>
+ <field name="sequence"/>
+ </group>
+ </div>
+ </sheet>
+ </form>
+ </field>
+ </record>
+ <record id="product_public_category_tree_view" model="ir.ui.view">
+ <field name="name">product.public.category.tree</field>
+ <field name="model">product.public.category</field>
+ <field name="field_parent" eval="False"/>
+ <field name="arch" type="xml">
+ <tree string="Product Product Categories">
+ <field name="sequence" invisible="1"/>
+ <field name="complete_name"/>
+ </tree>
+ </field>
+ </record>
+ <record id="product_public_category_action" model="ir.actions.act_window">
+ <field name="name">Pos/Public Product Categories</field>
+ <field name="type">ir.actions.act_window</field>
+ <field name="res_model">product.public.category</field>
+ <field name="view_type">form</field>
+ <field name="view_mode">tree,form</field>
+ <field name="view_id" eval="False"/>
+ <field name="help" type="html">
+ <p class="oe_view_nocontent_create">
+ Click to define a new category.
+ </p><p>
+ Categories are used to browse your products through the
+ touchscreen interface.
+ </p><p>
+ If you put a photo on the category, the layout of the
+ touchscreen interface will automatically. We suggest not to put
+ a photo on categories for small (1024x768) screens.
+ </p>
+ </field>
+ </record>
+ <menuitem action="product_public_category_action" id="menu_product_public_category" parent="prod_config_main" sequence="10" />
+ <!-- END -->
+
<!-- Unit of Measure -->
<record id="product_uom_tree_view" model="ir.ui.view">
</field>
</record>
<menuitem
- action="product_ul_form_action" groups="product.group_stock_packaging" id="menu_product_ul_form_action" parent="prod_config_main" sequence="3"/>
+ action="product_ul_form_action" groups="product.group_stock_packaging" id="menu_product_ul_form_action" parent="prod_config_main" sequence="5"/>
<record id="product_packaging_tree_view" model="ir.ui.view">
<field name="name">product.packaging.tree.view</field>
</field>
</record>
+ <!-- Variants -->
+ <record id="product_variant_search_form_view" model="ir.ui.view">
+ <field name="name">product.variant.search.form</field>
+ <field name="model">product.product</field>
+ <field name="arch" type="xml">
+ <search string="Product Variant">
+ <field name="product_tmpl_id"/>
+ <field name="name" string="Product" filter_domain="['|','|',('name','ilike',self),('default_code','ilike',self),('variants','ilike',self)]"/>
+ <group expand='0' string='Group by...'>
+ <filter string='Template' name="template_id" domain="[]" context="{'group_by' : 'product_tmpl_id'}"/>
+ </group>
+ </search>
+ </field>
+ </record>
<record id="product_variant_form_view" model="ir.ui.view">
<field name="name">product.variant.form</field>
<field name="model">product.product</field>
<group col="4">
<field name="product_tmpl_id"/>
<field name="active"/>
- <field name="variants"/>
+ <field name="variants" required="1"/>
<field name="default_code"/>
<field name="price_margin"/>
<field name="price_extra"/>
</form>
</field>
</record>
-
<record id="product_variant_tree_view" model="ir.ui.view">
<field name="name">product.variant.tree</field>
<field name="model">product.product</field>
<field name="arch" type="xml">
<tree string="Product Variant">
<field name="product_tmpl_id"/>
- <field name="active"/>
<field name="variants"/>
<field name="default_code"/>
<field name="price_margin"/>
<field name="price_extra"/>
+ <field name="company_id" invisible="1"/>
+ <field name="type" invisible="1"/>
+ <field name="uom_id" invisible="1"/>
+ <field name="categ_id" invisible="1"/>
</tree>
</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="domain">[('variants','!=', '')]</field>
+ <field name="res_model">product.product</field>
+ <field name="view_type">form</field>
+ <field name="view_mode">tree,form,kanban</field>
+ <field name="view_id" ref="product_variant_tree_view"/>
+ <field name="search_view_id" ref="product_variant_search_form_view"/>
+ <field name="help" type="html">
+ <p class="oe_view_nocontent_create">
+ Click to define a new variant of product.
+ </p>
+ </field>
+ </record>
+ <record id="tree_view_product_variant" model="ir.actions.act_window.view">
+ <field name="sequence" eval="10"/>
+ <field name="view_mode">tree</field>
+ <field name="view_id" ref="product_variant_tree_view"/>
+ <field name="act_window_id" ref="product_variant_action"/>
+ </record>
+ <record id="form_view_product_variant" model="ir.actions.act_window.view">
+ <field name="sequence" eval="20"/>
+ <field name="view_mode">form</field>
+ <field name="view_id" ref="product_variant_form_view"/>
+ <field name="act_window_id" ref="product_variant_action"/>
+ </record>
+ <menuitem action="product.product_variant_action" id="product.menu_variant_product" parent="prod_config_main" sequence="4" groups="product.group_product_variant"/>
+
+ <!-- templates -->
+
+ <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 Template">
+ <field name="name" string="Product"/>
+ <filter string="Services" icon="terp-accessories-archiver" domain="[('type','=','service')]"/>
+ <filter string="Consumable" name="consumable" icon="terp-accessories-archiver" domain="[('type','=','consu')]" help="Consumable products"/>
+ <separator/>
+ <filter string="Can be Sold" name="filter_to_sell" icon="terp-accessories-archiver-minus" domain="[('sale_ok','=',1)]"/>
+ <field name="categ_id"/>
+ <group expand='0' string='Group by...'>
+ <filter string='Category' icon="terp-stock_symbol-selection" domain="[]" context="{'group_by' : 'categ_id'}"/>
+ <filter string='Default Unit of Measure' icon="terp-mrp" domain="[]" context="{'group_by' : 'uom_id'}"/>
+ <filter string='Type' icon="terp-stock_symbol-selection" domain="[]" context="{'group_by' : 'type'}"/>
+ </group>
+ </search>
+ </field>
+ </record>
<record id="product_template_tree_view" model="ir.ui.view">
<field name="name">product.template.product.tree</field>
<field name="categ_id"/>
<field name="type"/>
<field name="state"/>
+ <field name="uom_id" invisible="1"/>
</tree>
</field>
</record>
<field name="model">product.template</field>
<field name="arch" type="xml">
<form string="Product Template" version="7.0">
- <label for="name" class="oe_edit_only"/>
- <h1><field name="name"/></h1>
- <label for="categ_id" class="oe_edit_only"/>
- <h2><field name="categ_id"/></h2>
- <notebook>
- <page string="Information">
- <group>
- <group string="Product Type">
+ <sheet>
+ <field name="image_medium" widget="image" class="oe_avatar oe_left"/>
+ <div class="oe_title">
+ <div class="oe_edit_only">
+ <label for="name" string="Product Name"/>
+ </div>
+ <h1>
+ <field name="name"/>
+ </h1>
+ <label for="categ_id" class="oe_edit_only"/>
+ <h2><field name="categ_id"/></h2>
+ <label for="public_categ_id" class="oe_edit_only"/>
+ <h3><field name="public_categ_id"/></h3>
+ <div name="options" groups="base.group_user">
<field name="sale_ok"/>
- </group>
- <group string="Procurement">
- <field name="type"/>
- </group>
-
- <group string="Base Prices">
- <field name="list_price"/>
- <field name="standard_price" attrs="{'readonly':[('cost_method','=','average')]}"/>
- <field name="cost_method"/>
- </group>
-
- <group string="Weights">
- <field digits="(14, 3)" name="volume" attrs="{'readonly':[('type','=','service')]}"/>
- <field digits="(14, 3)" name="weight" attrs="{'readonly':[('type','=','service')]}"/>
- <field digits="(14, 3)" name="weight_net" attrs="{'readonly':[('type','=','service')]}"/>
- </group>
-
- <group name="status" string="Status">
- <field name="categ_id"/>
- <field name="state"/>
- <field name="product_manager"/>
- </group>
-
- <group name="uom" string="Unit of Measure">
- <field name="uom_id" on_change="onchange_uom(uom_id,uom_po_id)" groups="product.group_uom"/>
- <field name="uom_po_id"/>
- </group>
-
- <group name="uos" groups="product.group_uom" string="Second Unit of Measure">
- <field name="uos_id"/>
- <field name="uos_coeff"/>
- <field name="mes_type"/>
- </group>
- </group>
- </page>
- <page string="Procurement & Locations">
- <group>
- <group name="delay" string="Delays">
- <label for="produce_delay"/>
- <div>
- <field name="produce_delay" class="oe_inline"/> days
- </div>
- <field name="warranty"/>
+ <label for="sale_ok"/>
+ </div>
+ </div>
+ <notebook>
+ <page string="Information">
+ <group colspan="4">
+ <group>
+ <field name="type"/>
+ <field name="uom_id" on_change="onchange_uom(uom_id,uom_po_id)" groups="product.group_uom"/>
+ <field name="list_price"/>
+ </group>
+ <group>
+ <field name="company_id" groups="base.group_multi_company" widget="selection"/>
+ </group>
</group>
- </group>
-
- </page>
- <page string="Suppliers">
- <field name="seller_ids"/>
- </page>
- <page string="Descriptions">
- <separator string="Internal Description"/>
- <field name="description"/>
- <separator string="Sale Description"/>
- <field name="description_sale"/>
- <separator string="Purchase Description"/>
- <field name="description_purchase"/>
- </page>
- </notebook>
+ <group colspan="4" string="Product Variants" groups="product.group_product_variant">
+ <field colspan="4" name="product_variant_ids" nolabel="1" >
+ <tree string="Product Variants" editable="bottom">
+ <field name="variants" required="1"/>
+ <field name="price_margin" string="Variant Price Margin"/>
+ <field name="price_extra"/>
+ <field name="lst_price" string="Sale Price" readonly="1"/>
+ </tree>
+ </field>
+ </group>
+ <field name="description" placeholder="describe the product characteristics..."/>
+ </page>
+ <page string="Procurements" groups="base.group_user">
+ <group name="procurement">
+ <group name="general">
+ <field name="cost_method" groups="product.group_costing_method"/>
+ <field name="standard_price" attrs="{'readonly':[('cost_method','=','average')]}"/>
+ </group>
+ <group name="delay" string="Delays">
+ <label for="produce_delay"/>
+ <div>
+ <field name="produce_delay" class="oe_inline" style="vertical-align:baseline"/> days
+ </div>
+ </group>
+ <group name="procurement_uom" groups="product.group_uom" string="Purchase">
+ <field name="uom_po_id"/>
+ </group>
+ </group>
+ <separator string="Suppliers"/>
+ <field name="seller_ids"/>
+ <separator string="Description for Suppliers"/>
+ <field name="description_purchase" placeholder="This note will be displayed on requests for quotation..."/>
+ </page>
+ <page string="Inventory">
+ <group name="inventory">
+ <group name="status" string="Status">
+ <field name="state"/>
+ <field name="product_manager"/>
+ </group>
+ <group name ="weight" string="Weights">
+ <field digits="(14, 3)" name="volume" attrs="{'readonly':[('type','=','service')]}"/>
+ <field digits="(14, 3)" name="weight" attrs="{'readonly':[('type','=','service')]}"/>
+ <field digits="(14, 3)" name="weight_net" attrs="{'readonly':[('type','=','service')]}"/>
+ </group>
+ </group>
+ </page>
+ <page string="Sales" attrs="{'invisible':[('sale_ok','=',False)]}">
+ <group name="sale">
+ <group name="sale_condition" string="Sale Conditions">
+ <label for="warranty"/>
+ <div>
+ <field name="warranty" class="oe_inline" style="vertical-align:baseline"/> months
+ </div>
+ </group>
+ <group groups="product.group_uos" string="Unit of Measure">
+ <field name="uos_id"/>
+ <field name="uos_coeff"/>
+ <field name="mes_type"/>
+ </group>
+ </group>
+ <separator string="Description for Quotations"/>
+ <field name="description_sale" placeholder="note to be displayed on quotations..."/>
+ </page>
+ </notebook>
+ </sheet>
+ <div class="oe_chatter">
+ <field name="message_follower_ids" widget="mail_followers"/>
+ <field name="message_ids" widget="mail_thread"/>
+ </div>
</form>
</field>
</record>
- <record id="product_template_action_tree" model="ir.actions.act_window">
- <field name="name">Product Templates</field>
+ <record model="ir.ui.view" id="product_template_kanban_view">
+ <field name="name">Product Template Kanban</field>
+ <field name="model">product.template</field>
+ <field name="arch" type="xml">
+ <kanban>
+ <field name="image_small"/>
+ <field name="list_price"/>
+ <templates>
+ <t t-name="kanban-box">
+ <div class="oe_kanban_vignette oe_semantic_html_override">
+ <a type="open"><img t-att-src="kanban_image('product.template', 'image_small', record.id.value)" class="oe_kanban_image"/></a>
+ <div class="oe_kanban_details">
+ <h4>
+ <a type="open">
+ <field name="name"/>
+ </a>
+ </h4>
+ <div name="tags"/>
+ <ul>
+ <li>Price: <field name="list_price"></field></li>
+ </ul>
+ </div>
+ </div>
+ </t>
+ </templates>
+ </kanban>
+ </field>
+ </record>
+
+ <record id="product_template_action" model="ir.actions.act_window">
+ <field name="name">Templates</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_type">form</field>
- <field name="view_id" ref="product_template_tree_view"/>
+ <field name="view_id" ref="product_template_kanban_view"/>
+ <field name="context">{"search_default_filter_to_sell":1}</field>
</record>
+ <menuitem action="product_template_action"
+ id="menu_product_template_action"
+ parent="base.menu_product" sequence="20"
+ groups="product.group_product_variant"/>
+
</data>
</openerp>