Merge lp:~openerp-dev/openobject-addons/trunk-product-variants-ref-chm into lp:openobject-addons

Proposed by Christophe Matthieu (OpenERP)
Status: Work in progress
Proposed branch: lp:~openerp-dev/openobject-addons/trunk-product-variants-ref-chm
Merge into: lp:openobject-addons
Diff against target: 12892 lines (+2771/-5884)
123 files modified
account/product_view.xml (+25/-30)
account_anglo_saxon/product_view.xml (+4/-15)
event_sale/event_sale_view.xml (+10/-23)
hr_expense/hr_expense.py (+2/-2)
hr_expense/hr_expense_view.xml (+7/-5)
membership/membership.py (+1/-1)
membership/membership_view.xml (+16/-21)
mrp/mrp.py (+216/-175)
mrp/mrp_demo.xml (+101/-142)
mrp/mrp_view.xml (+90/-85)
mrp/procurement.py (+4/-2)
mrp/product.py (+43/-11)
mrp/report/price.py (+2/-2)
mrp/security/ir.model.access.csv (+4/-0)
mrp/stock.py (+6/-5)
mrp/test/bom_with_service_type_product.yml (+7/-7)
mrp/test/order_demo.yml (+2/-2)
mrp/views/report_mrpbomstructure.xml (+1/-2)
mrp/wizard/change_production_qty.py (+2/-2)
mrp_byproduct/test/mrp_byproduct.yml (+2/-2)
point_of_sale/point_of_sale.py (+68/-18)
point_of_sale/point_of_sale_demo.xml (+160/-159)
point_of_sale/point_of_sale_view.xml (+61/-9)
point_of_sale/security/ir.model.access.csv (+2/-2)
point_of_sale/static/src/js/db.js (+1/-1)
point_of_sale/static/src/js/models.js (+2/-2)
point_of_sale/static/src/js/widgets.js (+1/-1)
product/pricelist.py (+22/-7)
product/product.py (+332/-209)
product/product_data.xml (+0/-5)
product/product_demo.xml (+136/-422)
product/product_view.xml (+336/-575)
product/report/product_label.xml (+1/-1)
product/security/ir.model.access.csv (+8/-2)
product/security/product_security.xml (+0/-15)
product/test/product_pricelist.yml (+8/-8)
product_email_template/views/product_view.xml (+5/-5)
product_expiry/product_expiry.py (+1/-1)
product_expiry/product_expiry_view.xml (+3/-3)
product_extended/product_extended.py (+5/-5)
product_manufacturer/__init__.py (+0/-24)
product_manufacturer/__openerp__.py (+0/-46)
product_manufacturer/i18n/ar.po (+0/-75)
product_manufacturer/i18n/bg.po (+0/-81)
product_manufacturer/i18n/bs.po (+0/-72)
product_manufacturer/i18n/ca.po (+0/-82)
product_manufacturer/i18n/cs.po (+0/-72)
product_manufacturer/i18n/da.po (+0/-72)
product_manufacturer/i18n/de.po (+0/-83)
product_manufacturer/i18n/el.po (+0/-75)
product_manufacturer/i18n/es.po (+0/-83)
product_manufacturer/i18n/es_CR.po (+0/-84)
product_manufacturer/i18n/es_EC.po (+0/-79)
product_manufacturer/i18n/es_MX.po (+0/-89)
product_manufacturer/i18n/es_VE.po (+0/-89)
product_manufacturer/i18n/et.po (+0/-72)
product_manufacturer/i18n/fi.po (+0/-81)
product_manufacturer/i18n/fr.po (+0/-82)
product_manufacturer/i18n/gl.po (+0/-82)
product_manufacturer/i18n/hr.po (+0/-78)
product_manufacturer/i18n/hu.po (+0/-77)
product_manufacturer/i18n/it.po (+0/-81)
product_manufacturer/i18n/ja.po (+0/-75)
product_manufacturer/i18n/lt.po (+0/-72)
product_manufacturer/i18n/lv.po (+0/-72)
product_manufacturer/i18n/mk.po (+0/-72)
product_manufacturer/i18n/mn.po (+0/-83)
product_manufacturer/i18n/nb.po (+0/-75)
product_manufacturer/i18n/nl.po (+0/-82)
product_manufacturer/i18n/pl.po (+0/-81)
product_manufacturer/i18n/product_manufacturer.pot (+0/-71)
product_manufacturer/i18n/pt.po (+0/-81)
product_manufacturer/i18n/pt_BR.po (+0/-81)
product_manufacturer/i18n/ro.po (+0/-82)
product_manufacturer/i18n/ru.po (+0/-81)
product_manufacturer/i18n/sl.po (+0/-72)
product_manufacturer/i18n/sr.po (+0/-78)
product_manufacturer/i18n/sr@latin.po (+0/-72)
product_manufacturer/i18n/sv.po (+0/-78)
product_manufacturer/i18n/tr.po (+0/-81)
product_manufacturer/i18n/zh_CN.po (+0/-81)
product_manufacturer/i18n/zh_TW.po (+0/-72)
product_manufacturer/product_manufacturer.py (+0/-41)
product_manufacturer/product_manufacturer_view.xml (+0/-53)
product_manufacturer/security/ir.model.access.csv (+0/-2)
project_mrp/project_mrp.py (+1/-1)
project_mrp/project_mrp_view.xml (+4/-4)
purchase/purchase.py (+6/-0)
purchase/purchase_view.xml (+42/-39)
purchase_requisition/purchase_requisition.py (+2/-2)
purchase_requisition/purchase_requisition_view.xml (+4/-4)
report_intrastat/report_intrastat_view.xml (+1/-1)
sale/res_config.py (+0/-30)
sale/res_config_view.xml (+0/-4)
sale/sale.py (+1/-1)
sale_mrp/test/cancellation_propagated.yml (+6/-5)
sale_mrp/test/sale_mrp.yml (+1/-1)
sale_mrp/tests/test_move_explode.py (+2/-2)
stock/product.py (+77/-20)
stock/product_view.xml (+130/-62)
stock/stock_view.xml (+3/-116)
stock_account/product_view.xml (+3/-13)
stock_account/stock_account.py (+0/-2)
stock_landed_costs/product.py (+2/-2)
stock_landed_costs/product_view.xml (+10/-8)
stock_landed_costs/stock_landed_costs_view.xml (+7/-14)
warning/warning.py (+1/-30)
warning/warning_view.xml (+2/-2)
website_quote/data/website_quotation_demo.xml (+0/-3)
website_sale/controllers/main.py (+24/-7)
website_sale/data/data.xml (+4/-5)
website_sale/data/demo.xml (+257/-2)
website_sale/models/__init__.py (+0/-1)
website_sale/models/product.py (+90/-30)
website_sale/models/res_config.py (+0/-15)
website_sale/security/ir.model.access.csv (+6/-4)
website_sale/static/src/css/website_sale.css (+20/-0)
website_sale/static/src/css/website_sale.sass (+15/-0)
website_sale/static/src/js/website.tour.sale.js (+39/-4)
website_sale/static/src/js/website_sale.js (+59/-47)
website_sale/tests/test_sale_process.py (+1/-0)
website_sale/views/templates.xml (+176/-52)
website_sale/views/views.xml (+78/-70)
To merge this branch: bzr merge lp:~openerp-dev/openobject-addons/trunk-product-variants-ref-chm
Reviewer Review Type Date Requested Status
OpenERP Core Team Pending
Review via email: mp+217190@code.launchpad.net
To post a comment you must log in.
9368. By Christophe Matthieu (OpenERP)

[WIP]

9369. By Christophe Matthieu (OpenERP)

[MERGE] from trunk

9370. By Christophe Matthieu (OpenERP)

[IMP] product: remove group_product_variant and group_product_mono

9371. By Christophe Matthieu (OpenERP)

[WIP]

9372. By Christophe Matthieu (OpenERP)

[WIP] product: move membership to product template

9373. By Christophe Matthieu (OpenERP)

[IMP] product: merge variants and information vue

9374. By Christophe Matthieu (OpenERP)

[IMP] product: create funcion field to sum product variant qty and move field xml to product template

9375. By Christophe Matthieu (OpenERP)

[IMP] product: remove is_only_child field and add is_product_variant field; add related field

9376. By Christophe Matthieu (OpenERP)

[WIP]

9377. By Christophe Matthieu (OpenERP)

[FIX] product product_available

9378. By Christophe Matthieu (OpenERP)

[MERGE] from trunk

9379. By Christophe Matthieu (OpenERP)

[FIX] product views

9380. By Christophe Matthieu (OpenERP)

[FIX] views mode primary of inherit

9381. By Christophe Matthieu (OpenERP)

[FIX] views mode primary of inherit

9382. By Christophe Matthieu (OpenERP)

[IMP] stock: move valuation field from product.product to product template

9383. By Christophe Matthieu (OpenERP)

[IMP] purshase add purchase_count function field on product.template

9384. By Christophe Matthieu (OpenERP)

[FIX] product views

9385. By Christophe Matthieu (OpenERP)

[FIX] product views

9386. By Christophe Matthieu (OpenERP)

[FIX] product views

9387. By Christophe Matthieu (OpenERP)

[FIX] product views

9388. By Christophe Matthieu (OpenERP)

[FIX] product views

9389. By Christophe Matthieu (OpenERP)

[FIX] product views

9390. By Christophe Matthieu (OpenERP)

[FIX] product views

9391. By Christophe Matthieu (OpenERP)

[MERGE] from trunk

9392. By Christophe Matthieu (OpenERP)

[FIX] website_sale: variant searches and search bare

9393. By Christophe Matthieu (OpenERP)

[IMP] website_sale: search with default_code, description_sale

9394. By Christophe Matthieu (OpenERP)

[FIX] stock: product views

9395. By Christophe Matthieu (OpenERP)

[FIX] product_expiry: product view

9396. By Christophe Matthieu (OpenERP)

[FIX] mrp: product view

9397. By Christophe Matthieu (OpenERP)

[IMP] product: search product template function of attribute and product.product

9398. By Christophe Matthieu (OpenERP)

[FIX] product: views

9399. By Christophe Matthieu (OpenERP)

[IMP] product: button layout

9400. By Christophe Matthieu (OpenERP)

[IMP] stock: display qty on hand (sum of variants) on product template

9401. By Christophe Matthieu (OpenERP)

[IMP] product: display qty on product template

9402. By Christophe Matthieu (OpenERP)

[FIX] purchase: product view

9403. By Christophe Matthieu (OpenERP)

[FIX] purchase: remove wrong product view

9404. By Christophe Matthieu (OpenERP)

[IMP] stock: product view

9405. By Christophe Matthieu (OpenERP)

[FIX] product view

9406. By Christophe Matthieu (OpenERP)

[FIX] product view

9407. By Christophe Matthieu (OpenERP)

[IMP] product view

9408. By Christophe Matthieu (OpenERP)

[IMP] product view

9409. By Christophe Matthieu (OpenERP)

[IMP] product view

9410. By Christophe Matthieu (OpenERP)

[IMP] product view

9411. By Christophe Matthieu (OpenERP)

[IMP] product view

9412. By Christophe Matthieu (OpenERP)

[IMP] product: Creation of variants; Try to unlink with savepoint

9413. By Christophe Matthieu (OpenERP)

[FIX] product: _check_ean_key and add contition for call create_variant_ids

9414. By Christophe Matthieu (OpenERP)

[IMP] membership: membership field invisible if type is not service

9415. By Christophe Matthieu (OpenERP)

[IMP] product: move warranty to product template, imp view

9416. By Christophe Matthieu (OpenERP)

[IMP] product: move point of sale fields from product to template

9417. By Christophe Matthieu (OpenERP)

[IMP] product: move 'Can be Expensed' and 'Can constitute a landed cost' from product to template

9418. By Christophe Matthieu (OpenERP)

[IMP] stock: moves route_ids from product to template

9419. By Christophe Matthieu (OpenERP)

[WIP] mrp.bom: refactoring: split mrp.bom

9420. By Christophe Matthieu (OpenERP)

[WIP] mrp: mrp.bom refactoring

9421. By Christophe Matthieu (OpenERP)

[IMP] stock: move track fields from product to template

9422. By Christophe Matthieu (OpenERP)

[FIX] mrp: access right and demo

9423. By Christophe Matthieu (OpenERP)

[IMP] mrp: bom view

9424. By Christophe Matthieu (OpenERP)

[FIX] mrp: remove domains: bom_id = False

9425. By Christophe Matthieu (OpenERP)

[FIX] mrp: bom

9426. By Christophe Matthieu (OpenERP)

[FIX] mrp: bom and test

9427. By Christophe Matthieu (OpenERP)

[IMP] product: title view

9428. By Christophe Matthieu (OpenERP)

[IMP] product view

9429. By Christophe Matthieu (OpenERP)

[IMP] mrp: re-active report mrp.bom

9430. By Christophe Matthieu (OpenERP)

[FIX] sale_mrp: test cancelation_propagate: remove company_id and name

9431. By Christophe Matthieu (OpenERP)

[IMP] mrp: bom & bom.line views

9432. By Christophe Matthieu (OpenERP)

[FIX] mrp: mrp.bom.line editable tree view

9433. By Christophe Matthieu (OpenERP)

[IMP] mrp: add a search view for mrp.bom.line

9434. By Christophe Matthieu (OpenERP)

[FIX] mrp: bom default values and call to _bom_find

9435. By Christophe Matthieu (OpenERP)

[FIX] mrp: default value for product_uom

9436. By Christophe Matthieu (OpenERP)

[FIX] mrp: order uom by id for default values

9437. By Christophe Matthieu (OpenERP)

[FIX] website_sale: filter by attributes

9438. By Christophe Matthieu (OpenERP)

[IMP] product: split public category into website and pos

9439. By Christophe Matthieu (OpenERP)

[IMP] website_sale: add a test to customize page and use the variant filter

9440. By Christophe Matthieu (OpenERP)

[FIX] pos: pos.category

9441. By Christophe Matthieu (OpenERP)

[FIX] website_sale: category search

9442. By Christophe Matthieu (OpenERP)

[FIX] website_sale: tour

9443. By Christophe Matthieu (OpenERP)

[IMP] product: simplify product demo data

9444. By Christophe Matthieu (OpenERP)

[FIX] website_sale: tour cycling because the 'Product Attribute's Filters' template is activate.

9445. By Christophe Matthieu (OpenERP)

[FIX] mrp: view, move view_type, view_mode from view to action

9446. By Christophe Matthieu (OpenERP)

[IMP] product: price_extra is function of attributes value and product template

9447. By Christophe Matthieu (OpenERP)

[FIX] website_sale: display variant prices and text-muted

9448. By Christophe Matthieu (OpenERP)

[IMP] website_sale: add type of attributes

9449. By Christophe Matthieu (OpenERP)

[FIX] website_sale: bug to display attribute values on product detail

9450. By Christophe Matthieu (OpenERP)

[IMP] product view

9451. By Christophe Matthieu (OpenERP)

[MERGE] from trunk

Unmerged revisions

9451. By Christophe Matthieu (OpenERP)

[MERGE] from trunk

9450. By Christophe Matthieu (OpenERP)

[IMP] product view

9449. By Christophe Matthieu (OpenERP)

[FIX] website_sale: bug to display attribute values on product detail

9448. By Christophe Matthieu (OpenERP)

[IMP] website_sale: add type of attributes

9447. By Christophe Matthieu (OpenERP)

[FIX] website_sale: display variant prices and text-muted

9446. By Christophe Matthieu (OpenERP)

[IMP] product: price_extra is function of attributes value and product template

9445. By Christophe Matthieu (OpenERP)

[FIX] mrp: view, move view_type, view_mode from view to action

9444. By Christophe Matthieu (OpenERP)

[FIX] website_sale: tour cycling because the 'Product Attribute's Filters' template is activate.

9443. By Christophe Matthieu (OpenERP)

[IMP] product: simplify product demo data

9442. By Christophe Matthieu (OpenERP)

[FIX] website_sale: tour

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'account/product_view.xml'
--- account/product_view.xml 2014-01-22 09:58:26 +0000
+++ account/product_view.xml 2014-05-26 16:10:21 +0000
@@ -1,57 +1,52 @@
1<?xml version="1.0" encoding="utf-8"?>1<?xml version="1.0" encoding="utf-8"?>
2<openerp>2<openerp>
3 <data>3 <data>
4 <record id="product_normal_form_view" model="ir.ui.view">4 <record id="product_template_form_view" model="ir.ui.view">
5 <field name="name">product.normal.form.inherit</field>5 <field name="name">product.template.form.inherit</field>
6 <field name="model">product.product</field>6 <field name="model">product.template</field>
7 <field name="priority">5</field>7 <field name="priority">5</field>
8 <field name="inherit_id" ref="product.product_normal_form_view"/>8 <field name="inherit_id" ref="product.product_template_form_view"/>
9 <field name="arch" type="xml">9 <field name="arch" type="xml">
10 <notebook position="inside">10 <page string="Sales" position="after">
11 <page string="Accounting" groups="account.group_account_invoice">11 <page string="Accounting" groups="account.group_account_invoice">
12 <group>
13 <label for="categ_id" string="Internal Category"/>
14 <div><field name="categ_id" colspan="3" nolabel="1"/></div>
15 </group>
12 <group name="properties">16 <group name="properties">
13 <group>17 <group>
14 <field name="property_account_income" domain="[('type','=','other')]" groups="account.group_account_user"18 <field name="property_account_income" domain="[('type','=','other')]" groups="account.group_account_user"
15 attrs="{'readonly': [('is_only_child', '=', False)]}"/>19 attrs="{'readonly': [('is_product_variant', '=', True)]}"/>
16 <field name="taxes_id" colspan="2" widget="many2many_tags"20 <field name="taxes_id" colspan="2" widget="many2many_tags"
17 attrs="{'readonly':[ '|', ('sale_ok','=',0), ('is_only_child', '=', False)]}"/>21 attrs="{'readonly':[ '|', ('sale_ok','=',0), ('is_product_variant', '=', True)]}"/>
18 </group>22 </group>
19 <group>23 <group>
20 <field name="property_account_expense" domain="[('type','=','other')]" groups="account.group_account_user"24 <field name="property_account_expense" domain="[('type','=','other')]" groups="account.group_account_user"
21 attrs="{'readonly': [('is_only_child', '=', False)]}"/>25 attrs="{'readonly': [('is_product_variant', '=', True)]}"/>
22 <field name="supplier_taxes_id" colspan="2" widget="many2many_tags"26 <field name="supplier_taxes_id" colspan="2" widget="many2many_tags"
23 attrs="{'readonly': [('is_only_child', '=', False)]}"/>27 attrs="{'readonly': [('is_product_variant', '=', True)]}"/>
24 </group>28 </group>
25 </group>29 </group>
26 </page>30 </page>
27 </notebook>31 </page>
28 </field>32 </field>
29 </record>33 </record>
3034
31 <record id="product_template_form_view" model="ir.ui.view">35 <record id="product_template_search_view" model="ir.ui.view">
32 <field name="name">product.template.product.form.inherit</field>36 <field name="name">product.template.search</field>
33 <field name="model">product.template</field>37 <field name="model">product.template</field>
34 <field name="inherit_id" ref="product.product_template_form_view"/>38 <field name="mode">primary</field>
39 <field name="inherit_id" ref="product.product_template_search_view"/>
35 <field name="arch" type="xml">40 <field name="arch" type="xml">
36 <notebook position="inside">41 <field name="product_variant_ids" position="after">
37 <page string="Accounting">42 <field name="categ_id"/>
38 <group name="properties">43 </field>
39 <group>44 <xpath expr="//group[@string='Group by...']" position="inside">
40 <field name="property_account_income" domain="[('type','&lt;&gt;','view'),('type','&lt;&gt;','consolidation')]"/>45 <filter string='Category' icon="terp-stock_symbol-selection" domain="[]" context="{'group_by' : 'categ_id'}"/>
41 <field name="taxes_id" colspan="2" widget="many2many_tags"/>46 </xpath>
42 </group>47 </field>
43 <group>
44 <field name="property_account_expense" domain="[('type','&lt;&gt;','view'),('type','&lt;&gt;','consolidation')]"/>
45 <field name="supplier_taxes_id" colspan="2" widget="many2many_tags"/>
46 </group>
47 </group>
48 </page>
49 </notebook>
50 </field>
51 </record>48 </record>
5249
53
54
55 <record id="view_category_property_form" model="ir.ui.view">50 <record id="view_category_property_form" model="ir.ui.view">
56 <field name="name">product.category.property.form.inherit</field>51 <field name="name">product.category.property.form.inherit</field>
57 <field name="model">product.category</field>52 <field name="model">product.category</field>
5853
=== modified file 'account_anglo_saxon/product_view.xml'
--- account_anglo_saxon/product_view.xml 2013-11-22 05:48:50 +0000
+++ account_anglo_saxon/product_view.xml 2014-05-26 16:10:21 +0000
@@ -1,29 +1,18 @@
1<?xml version="1.0"?>1<?xml version="1.0"?>
2<openerp>2<openerp>
3 <data>3 <data>
4 <record id="product_normal_form_view" model="ir.ui.view">4 <record id="product_template_form_view" model="ir.ui.view">
5 <field name="name">product.normal.form.inherit.stock</field>5 <field name="name">product.normal.form.inherit.stock</field>
6 <field name="model">product.product</field>
7 <field name="inherit_id" ref="account.product_normal_form_view"/>
8 <field name="arch" type="xml">
9 <field name="property_account_expense" position="after">
10 <label string="" colspan="2"/>
11 <field name="property_account_creditor_price_difference" domain="[('type','&lt;&gt;','view'),('type','&lt;&gt;','consolidation')]" attrs="{'readonly':[('purchase_ok','=',0)]}" />
12 <newline/>
13 </field>
14 </field>
15 </record>
16
17 <record id="product_template_form_view" model="ir.ui.view">
18 <field name="name">product.template.product.form.inherit</field>
19 <field name="model">product.template</field>6 <field name="model">product.template</field>
20 <field name="inherit_id" ref="account.product_template_form_view"/>7 <field name="inherit_id" ref="account.product_template_form_view"/>
21 <field name="arch" type="xml">8 <field name="arch" type="xml">
22 <field name="property_account_expense" position="after">9 <field name="property_account_expense" position="after">
10 <label string="" colspan="2"/>
11 <field name="purchase_ok" invisible="1"/>
23 <field name="property_account_creditor_price_difference" domain="[('type','&lt;&gt;','view'),('type','&lt;&gt;','consolidation')]" attrs="{'readonly':[('purchase_ok','=',0)]}" />12 <field name="property_account_creditor_price_difference" domain="[('type','&lt;&gt;','view'),('type','&lt;&gt;','consolidation')]" attrs="{'readonly':[('purchase_ok','=',0)]}" />
24 <newline/>13 <newline/>
25 </field>14 </field>
26 </field>15 </field>
27 </record>16 </record>
2817
29 <record id="view_category_property_form" model="ir.ui.view">18 <record id="view_category_property_form" model="ir.ui.view">
3019
=== modified file 'event_sale/event_sale_view.xml'
--- event_sale/event_sale_view.xml 2014-05-12 05:01:53 +0000
+++ event_sale/event_sale_view.xml 2014-05-26 16:10:21 +0000
@@ -1,18 +1,19 @@
1<?xml version="1.0"?>1<?xml version="1.0"?>
2<openerp>2<openerp>
3 <data>3 <data>
4 <record model="ir.ui.view" id="event_sale_product_form">4
5 <field name="model">product.product</field>5 <record model="ir.ui.view" id="event_sale_product_template_form">
6 <field name="inherit_id" ref="product.product_normal_form_view" />6 <field name="model">product.template</field>
7 <field name="inherit_id" ref="product.product_template_form_view" />
7 <field name="arch" type="xml">8 <field name="arch" type="xml">
8 <div name="options" position="after">9 <div name="options" position="inside">
9 <field name="event_ok" on_change="onchange_event_ok(type, event_ok, context)"10 <div>
10 attrs="{'readonly': [('is_only_child', '=', False)]}"/>11 <field name="event_ok" on_change="onchange_event_ok(type, event_ok, context)"/>
11 <label for="event_ok"/>12 <label for="event_ok"/>
13 </div>
12 </div>14 </div>
13 <field name='type' position="after">15 <field name='type' position="after">
14 <field name="event_type_id" attrs="{'invisible': [('event_ok', '=', False)],16 <field name="event_type_id" attrs="{'invisible': [('event_ok', '=', False)]}"/>
15 'readonly': [('is_only_child', '=', False)]}"/>
16 </field>17 </field>
17 </field>18 </field>
18 </record>19 </record>
@@ -50,20 +51,6 @@
50 </field>51 </field>
51 </record>52 </record>
5253
53 <record model="ir.ui.view" id="event_sale_product_template_form">
54 <field name="model">product.template</field>
55 <field name="inherit_id" ref="product.product_template_form_view" />
56 <field name="arch" type="xml">
57 <div name="options" position="inside">
58 <field name="event_ok" on_change="onchange_event_ok(type, event_ok, context)"/>
59 <label for="event_ok"/>
60 </div>
61 <field name='company_id' position="after">
62 <field name="event_type_id" attrs="{'invisible': [('event_ok', '=', False)]}"/>
63 </field>
64 </field>
65 </record>
66
67 <record model="ir.ui.view" id="event_order_line">54 <record model="ir.ui.view" id="event_order_line">
68 <field name="name">event.sale.order</field>55 <field name="name">event.sale.order</field>
69 <field name="model">sale.order</field>56 <field name="model">sale.order</field>
7057
=== modified file 'hr_expense/hr_expense.py'
--- hr_expense/hr_expense.py 2014-03-10 14:36:00 +0000
+++ hr_expense/hr_expense.py 2014-05-26 16:10:21 +0000
@@ -392,8 +392,8 @@
392 return result392 return result
393393
394394
395class product_product(osv.osv):395class product_template(osv.osv):
396 _inherit = "product.product"396 _inherit = "product.template"
397 _columns = {397 _columns = {
398 'hr_expense_ok': fields.boolean('Can be Expensed', help="Specify if the product can be selected in an HR expense line."),398 'hr_expense_ok': fields.boolean('Can be Expensed', help="Specify if the product can be selected in an HR expense line."),
399 }399 }
400400
=== modified file 'hr_expense/hr_expense_view.xml'
--- hr_expense/hr_expense_view.xml 2014-04-11 13:18:42 +0000
+++ hr_expense/hr_expense_view.xml 2014-05-26 16:10:21 +0000
@@ -191,13 +191,15 @@
191191
192192
193 <record id="view_product_hr_expense_form" model="ir.ui.view">193 <record id="view_product_hr_expense_form" model="ir.ui.view">
194 <field name="name">product.product.expense.form</field>194 <field name="name">product.template.expense.form</field>
195 <field name="model">product.product</field>195 <field name="model">product.template</field>
196 <field name="inherit_id" ref="product.product_normal_form_view"/>196 <field name="inherit_id" ref="product.product_template_form_view"/>
197 <field name="arch" type="xml">197 <field name="arch" type="xml">
198 <div name="options" position="inside">198 <div name="options" position="inside">
199 <field name="hr_expense_ok"/>199 <div>
200 <label for="hr_expense_ok"/>200 <field name="hr_expense_ok"/>
201 <label for="hr_expense_ok"/>
202 </div>
201 </div>203 </div>
202 </field>204 </field>
203 </record>205 </record>
204206
=== modified file 'membership/membership.py'
--- membership/membership.py 2013-10-27 12:31:04 +0000
+++ membership/membership.py 2014-05-26 16:10:21 +0000
@@ -462,7 +462,7 @@
462 return super(Product,self).fields_view_get(cr, user, view_id, view_type, context, toolbar, submenu)462 return super(Product,self).fields_view_get(cr, user, view_id, view_type, context, toolbar, submenu)
463463
464 '''Product'''464 '''Product'''
465 _inherit = 'product.product'465 _inherit = 'product.template'
466 _columns = {466 _columns = {
467 'membership': fields.boolean('Membership', help='Check if the product is eligible for membership.'),467 'membership': fields.boolean('Membership', help='Check if the product is eligible for membership.'),
468 'membership_date_from': fields.date('Membership Start Date', help='Date from which membership becomes active.'),468 'membership_date_from': fields.date('Membership Start Date', help='Date from which membership becomes active.'),
469469
=== modified file 'membership/membership_view.xml'
--- membership/membership_view.xml 2013-10-27 12:31:04 +0000
+++ membership/membership_view.xml 2014-05-26 16:10:21 +0000
@@ -8,7 +8,7 @@
88
9 <record model="ir.ui.view" id="membership_product_search_form_view">9 <record model="ir.ui.view" id="membership_product_search_form_view">
10 <field name="name">membership.product.search.form</field>10 <field name="name">membership.product.search.form</field>
11 <field name="model">product.product</field>11 <field name="model">product.template</field>
12 <field name="arch" type="xml">12 <field name="arch" type="xml">
13 <search string="Membership Products">13 <search string="Membership Products">
14 <field name="name" filter_domain="['|',('name','ilike',self),('code','ilike',self)]" string="Membership Product"/>14 <field name="name" filter_domain="['|',('name','ilike',self),('code','ilike',self)]" string="Membership Product"/>
@@ -24,10 +24,9 @@
2424
25 <record model="ir.ui.view" id="membership_products_tree">25 <record model="ir.ui.view" id="membership_products_tree">
26 <field name="name">Membership products</field>26 <field name="name">Membership products</field>
27 <field name="model">product.product</field>27 <field name="model">product.template</field>
28 <field name="arch" type="xml">28 <field name="arch" type="xml">
29 <tree string="Membership products">29 <tree string="Membership products">
30 <field name="code"/>
31 <field name="name"/>30 <field name="name"/>
32 <field name="membership_date_from"/>31 <field name="membership_date_from"/>
33 <field name="membership_date_to"/>32 <field name="membership_date_to"/>
@@ -41,7 +40,7 @@
4140
42 <record model="ir.ui.view" id="membership_products_form">41 <record model="ir.ui.view" id="membership_products_form">
43 <field name="name">Membership Products</field>42 <field name="name">Membership Products</field>
44 <field name="model">product.product</field>43 <field name="model">product.template</field>
45 <field name="arch" type="xml">44 <field name="arch" type="xml">
46 <form string="Membership products" version="7.0">45 <form string="Membership products" version="7.0">
47 <sheet>46 <sheet>
@@ -81,31 +80,27 @@
81 </field>80 </field>
82 </record>81 </record>
8382
84 <record model="ir.ui.view" id="product_normal_form_view">83 <record model="ir.ui.view" id="product_template_form_view">
85 <field name="name">Membership Products</field>84 <field name="name">Membership Products</field>
86 <field name="model">product.product</field>85 <field name="model">product.template</field>
87 <field name="priority">6</field>86 <field name="priority">6</field>
88 <field name="inherit_id" ref="product.product_normal_form_view"/>87 <field name="inherit_id" ref="product.product_template_form_view"/>
89 <field name="arch" type="xml">88 <field name="arch" type="xml">
90 <page string="Accounting" position="after">89 <field name="type" position="after">
91 <page string="Membership">90 <field name="membership" readonly="0" attrs="{'invisible': [('type', '!=', 'service')]}"/>
92 <group col="1">91 </field>
93 <group>92 <field name="description" position="before">
94 <field name="membership" readonly="0"/>93 <group attrs="{'invisible':[('membership','=',False)]}">
95 </group>94 <field name="membership_date_from" readonly="0" attrs="{'required':[('membership','=',True)]}"/>
96 <group attrs="{'invisible':[('membership','=',False)]}">95 <field name="membership_date_to" readonly="0" attrs="{'required':[('membership','=',True)]}"/>
97 <field name="membership_date_from" readonly="0" attrs="{'required':[('membership','=',True)]}"/>96 </group>
98 <field name="membership_date_to" readonly="0" attrs="{'required':[('membership','=',True)]}"/>97 </field>
99 </group>
100 </group>
101 </page>
102 </page>
103 </field>98 </field>
104 </record>99 </record>
105100
106 <record model="ir.actions.act_window" id="action_membership_products">101 <record model="ir.actions.act_window" id="action_membership_products">
107 <field name="name">Membership Products</field>102 <field name="name">Membership Products</field>
108 <field name="res_model">product.product</field>103 <field name="res_model">product.template</field>
109 <field name="domain">[('membership','=',True), ('type', '=', 'service')]</field>104 <field name="domain">[('membership','=',True), ('type', '=', 'service')]</field>
110 <field name="context">{'membership':True, 'type':'service', 'default_membership': True, 'default_type': 'service'}</field>105 <field name="context">{'membership':True, 'type':'service', 'default_membership': True, 'default_type': 'service'}</field>
111 <field name="search_view_id" ref="membership_product_search_form_view"/>106 <field name="search_view_id" ref="membership_product_search_form_view"/>
112107
=== modified file 'mrp/mrp.py'
--- mrp/mrp.py 2014-05-08 11:59:17 +0000
+++ mrp/mrp.py 2014-05-26 16:10:21 +0000
@@ -178,207 +178,266 @@
178 bom_parent = bom_obj.browse(cr, uid, bom_id, context=context)178 bom_parent = bom_obj.browse(cr, uid, bom_id, context=context)
179 for bom in self.browse(cr, uid, ids, context=context):179 for bom in self.browse(cr, uid, ids, context=context):
180 if (bom_parent) or (bom.id == bom_id):180 if (bom_parent) or (bom.id == bom_id):
181 result[bom.id] = map(lambda x: x.id, bom.bom_lines)181 result[bom.id] = map(lambda x: x.id, bom.bom_line_ids)
182 else:182 else:
183 result[bom.id] = []183 result[bom.id] = []
184 if bom.bom_lines:184 if bom.bom_line_ids:
185 continue185 continue
186 ok = ((name=='child_complete_ids'))186 ok = ((name=='child_complete_ids'))
187 if (bom.type=='phantom' or ok):187 if (bom.type=='phantom' or ok):
188 sids = bom_obj.search(cr, uid, [('bom_id','=',False),('product_id','=',bom.product_id.id)])188 sids = bom_obj.search(cr, uid, [('product_tmpl_id','=',bom.product_tmpl_id.id)])
189 if sids:189 if sids:
190 bom2 = bom_obj.browse(cr, uid, sids[0], context=context)190 bom2 = bom_obj.browse(cr, uid, sids[0], context=context)
191 result[bom.id] += map(lambda x: x.id, bom2.bom_lines)191 result[bom.id] += map(lambda x: x.id, bom2.bom_line_ids)
192
193 return result192 return result
194193
195 _columns = {194 _columns = {
196 'name': fields.char('Name', size=64),195 'name': fields.char('Name', size=64),
197 'code': fields.char('Reference', size=16),196 'code': fields.char('Reference', size=16),
198 'active': fields.boolean('Active', help="If the active field is set to False, it will allow you to hide the bills of material without removing it."),197 'active': fields.boolean('Active', help="If the active field is set to False, it will allow you to hide the bills of material without removing it."),
199 'type': fields.selection([('normal', 'Normal BoM'), ('phantom', 'Sets / Phantom')], 'BoM Type', required=True,198 'type': fields.selection([('normal', 'Normal'), ('phantom', 'Set')], 'BoM Type', required=True,
200 help= "If a by-product is used in several products, it can be useful to create its own BoM. "\199 help= "Set: When processing a sales order for this product, the delivery order will contain the raw materials, instead of the finished product."),
201 "Though if you don't want separated production orders for this by-product, select Set/Phantom as BoM type. "\
202 "If a Phantom BoM is used for a root product, it will be sold and shipped as a set of components, instead of being produced."),
203 'date_start': fields.date('Valid From', help="Validity of this BoM or component. Keep empty if it's always valid."),
204 'date_stop': fields.date('Valid Until', help="Validity of this BoM or component. Keep empty if it's always valid."),
205 'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of bills of material."),
206 'position': fields.char('Internal Reference', size=64, help="Reference to a position in an external plan."),200 'position': fields.char('Internal Reference', size=64, help="Reference to a position in an external plan."),
207 'product_id': fields.many2one('product.product', 'Product', required=True),201 'product_tmpl_id': fields.many2one('product.template', 'Product', required=True),
208 'product_uos_qty': fields.float('Product UOS Qty'),202 'product_id': fields.many2one('product.product', 'Product Variant',
209 'product_uos': fields.many2one('product.uom', 'Product UOS', help="Product UOS (Unit of Sale) is the unit of measurement for the invoicing and promotion of stock."),203 domain="[('product_tmpl_id','=',product_tmpl_id)]",
204 help="If a product variant is defined the BOM is available only for this product."),
205 'bom_line_ids': fields.one2many('mrp.bom.line', 'bom_id', 'BoM Lines'),
206
210 'product_qty': fields.float('Product Quantity', required=True, digits_compute=dp.get_precision('Product Unit of Measure')),207 'product_qty': fields.float('Product Quantity', required=True, digits_compute=dp.get_precision('Product Unit of Measure')),
211 'product_uom': fields.many2one('product.uom', 'Product Unit of Measure', required=True, help="Unit of Measure (Unit of Measure) is the unit of measurement for the inventory control"),208 'product_uom': fields.many2one('product.uom', 'Product Unit of Measure', required=True, help="Unit of Measure (Unit of Measure) is the unit of measurement for the inventory control"),
209 'date_start': fields.date('Valid From', help="Validity of this BoM. Keep empty if it's always valid."),
210 'date_stop': fields.date('Valid Until', help="Validity of this BoM. Keep empty if it's always valid."),
211 'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of bills of material."),
212 'routing_id': fields.many2one('mrp.routing', 'Routing', help="The list of operations (list of work centers) to produce the finished product. "\
213 "The routing is mainly used to compute work center costs during operations and to plan future loads on work centers based on production planning."),
212 'product_rounding': fields.float('Product Rounding', help="Rounding applied on the product quantity."),214 'product_rounding': fields.float('Product Rounding', help="Rounding applied on the product quantity."),
213 'product_efficiency': fields.float('Manufacturing Efficiency', required=True, help="A factor of 0.9 means a loss of 10% within the production process."),215 'product_efficiency': fields.float('Manufacturing Efficiency', required=True, help="A factor of 0.9 means a loss of 10% during the production process."),
214 'bom_lines': fields.one2many('mrp.bom', 'bom_id', 'BoM Lines'),216 'property_ids': fields.many2many('mrp.property', string='Properties'),
215 'bom_id': fields.many2one('mrp.bom', 'Parent BoM', ondelete='cascade', select=True),
216 'routing_id': fields.many2one('mrp.routing', 'Routing', help="The list of operations (list of work centers) to produce the finished product. The routing is mainly used to compute work center costs during operations and to plan future loads on work centers based on production planning."),
217 'property_ids': fields.many2many('mrp.property', 'mrp_bom_property_rel', 'bom_id', 'property_id', 'Properties'),
218 'child_complete_ids': fields.function(_child_compute, relation='mrp.bom', string="BoM Hierarchy", type='many2many'),217 'child_complete_ids': fields.function(_child_compute, relation='mrp.bom', string="BoM Hierarchy", type='many2many'),
219 'company_id': fields.many2one('res.company', 'Company', required=True),218 'company_id': fields.many2one('res.company', 'Company', required=True),
220 }219 }
220
221 def _get_uom_id(self, cr, uid, *args):
222 return self.pool["product.uom"].search(cr, uid, [], limit=1, order='id')[0]
221 _defaults = {223 _defaults = {
222 'active': lambda *a: 1,224 'active': lambda *a: 1,
225 'product_qty': lambda *a: 1.0,
223 'product_efficiency': lambda *a: 1.0,226 'product_efficiency': lambda *a: 1.0,
224 'product_qty': lambda *a: 1.0,
225 'product_rounding': lambda *a: 0.0,227 'product_rounding': lambda *a: 0.0,
226 'type': lambda *a: 'normal',228 'type': lambda *a: 'normal',
229 'product_uom': _get_uom_id,
227 'company_id': lambda self, cr, uid, c: self.pool.get('res.company')._company_default_get(cr, uid, 'mrp.bom', context=c),230 'company_id': lambda self, cr, uid, c: self.pool.get('res.company')._company_default_get(cr, uid, 'mrp.bom', context=c),
228 }231 }
229 _order = "sequence"232 _order = "sequence"
230 _parent_name = "bom_id"233
231 _sql_constraints = [234 def _bom_find(self, cr, uid, product_uom, product_tmpl_id=None, product_id=None, properties=None):
232 ('bom_qty_zero', 'CHECK (product_qty>0)', 'All product quantities must be greater than 0.\n' \
233 'You should install the mrp_byproduct module if you want to manage extra products on BoMs !'),
234 ]
235
236 def _check_recursion(self, cr, uid, ids, context=None):
237 level = 100
238 while len(ids):
239 cr.execute('select distinct bom_id from mrp_bom where id IN %s', (tuple(ids),))
240 ids = filter(None, map(lambda x: x[0], cr.fetchall()))
241 if not level:
242 return False
243 level -= 1
244 return True
245
246 def _check_product(self, cr, uid, ids, context=None):
247 all_prod = []
248 boms = self.browse(cr, uid, ids, context=context)
249 def check_bom(boms):
250 res = True
251 for bom in boms:
252 if bom.product_id.id in all_prod:
253 res = res and False
254 all_prod.append(bom.product_id.id)
255 lines = bom.bom_lines
256 if lines:
257 res = res and check_bom([bom_id for bom_id in lines if bom_id not in boms])
258 return res
259 return check_bom(boms)
260
261 _constraints = [
262 (_check_recursion, 'Error ! You cannot create recursive BoM.', ['parent_id']),
263 (_check_product, 'BoM line product should not be same as BoM product.', ['product_id']),
264 ]
265
266 def onchange_product_id(self, cr, uid, ids, product_id, name, product_qty=0, context=None):
267 """ Changes UoM and name if product_id changes.
268 @param name: Name of the field
269 @param product_id: Changed product_id
270 @return: Dictionary of changed values
271 """
272 res = {}
273 if product_id:
274 prod = self.pool.get('product.product').browse(cr, uid, product_id, context=context)
275 res['value'] = {'name': prod.name, 'product_uom': prod.uom_id.id, 'product_uos_qty': 0, 'product_uos': False}
276 if prod.uos_id.id:
277 res['value']['product_uos_qty'] = product_qty * prod.uos_coeff
278 res['value']['product_uos'] = prod.uos_id.id
279 return res
280
281 def onchange_uom(self, cr, uid, ids, product_id, product_uom, context=None):
282 res = {'value': {}}
283 if not product_uom or not product_id:
284 return res
285 product = self.pool.get('product.product').browse(cr, uid, product_id, context=context)
286 uom = self.pool.get('product.uom').browse(cr, uid, product_uom, context=context)
287 if uom.category_id.id != product.uom_id.category_id.id:
288 res['warning'] = {'title': _('Warning'), 'message': _('The Product Unit of Measure you chose has a different category than in the product form.')}
289 res['value'].update({'product_uom': product.uom_id.id})
290 return res
291
292 def _bom_find(self, cr, uid, product_id, product_uom, properties=None):
293 """ Finds BoM for particular product and product uom.235 """ Finds BoM for particular product and product uom.
294 @param product_id: Selected product.236 @param product_tmpl_id: Selected product.
295 @param product_uom: Unit of measure of a product.237 @param product_uom: Unit of measure of a product.
296 @param properties: List of related properties.238 @param properties: List of related properties.
297 @return: False or BoM id.239 @return: False or BoM id.
298 """240 """
299 if properties is None:241 if properties is None:
300 properties = []242 properties = []
301 domain = [('product_id', '=', product_id), ('bom_id', '=', False),243 domain = None
302 '|', ('date_start', '=', False), ('date_start', '<=', time.strftime(DEFAULT_SERVER_DATETIME_FORMAT)),244 if product_id:
303 '|', ('date_stop', '=', False), ('date_stop', '>=', time.strftime(DEFAULT_SERVER_DATETIME_FORMAT))]245 domain = ['|',('product_id', '=', product_id),('product_tmpl_id.product_variant_ids', '=', product_id)]
246 else:
247 domain = [('product_id', '=', False), ('product_tmpl_id', '=', product_tmpl_id)]
248 if product_uom:
249 domain += [('product_uom','=',product_uom)]
250 domain = domain + [ '|', ('date_start', '=', False), ('date_start', '<=', time.strftime(DEFAULT_SERVER_DATETIME_FORMAT)),
251 '|', ('date_stop', '=', False), ('date_stop', '>=', time.strftime(DEFAULT_SERVER_DATETIME_FORMAT))]
304 ids = self.search(cr, uid, domain)252 ids = self.search(cr, uid, domain)
305 max_prop = 0
306 result = False
307 for bom in self.pool.get('mrp.bom').browse(cr, uid, ids):253 for bom in self.pool.get('mrp.bom').browse(cr, uid, ids):
308 prop = 0254 if not set(map(int,bom.property_ids or [])) - set(properties or []):
309 for prop_id in bom.property_ids:255 return bom.id
310 if prop_id.id in properties:256 return False
311 prop += 1
312 if (prop > max_prop) or ((max_prop == 0) and not result):
313 result = bom.id
314 max_prop = prop
315 return result
316257
317 def _bom_explode(self, cr, uid, bom, factor, properties=None, addthis=False, level=0, routing_id=False):258 def _bom_explode(self, cr, uid, bom, product, factor, properties=None, level=0, routing_id=False, previous_products=None, master_bom=None):
318 """ Finds Products and Work Centers for related BoM for manufacturing order.259 """ Finds Products and Work Centers for related BoM for manufacturing order.
319 @param bom: BoM of particular product.260 @param bom: BoM of particular product template.
261 @param product: Select a particular variant of the BoM. If False use BoM without variants.
320 @param factor: Factor of product UoM.262 @param factor: Factor of product UoM.
321 @param properties: A List of properties Ids.263 @param properties: A List of properties Ids.
322 @param addthis: If BoM found then True else False.
323 @param level: Depth level to find BoM lines starts from 10.264 @param level: Depth level to find BoM lines starts from 10.
265 @param previous_products: List of product previously use by bom explore to avoid recursion
266 @param master_bom: When recursion, used to display the name of the master bom
324 @return: result: List of dictionaries containing product details.267 @return: result: List of dictionaries containing product details.
325 result2: List of dictionaries containing Work Center details.268 result2: List of dictionaries containing Work Center details.
326 """269 """
327 routing_obj = self.pool.get('mrp.routing')270 routing_obj = self.pool.get('mrp.routing')
328 factor = factor / (bom.product_efficiency or 1.0)271 all_prod = [] + (previous_products or [])
329 factor = _common.ceiling(factor, bom.product_rounding)272 master_bom = master_bom or bom
330 if factor < bom.product_rounding:273
331 factor = bom.product_rounding274 def _factor(factor, product_efficiency, product_rounding):
275 factor = factor / (product_efficiency or 1.0)
276 factor = _common.ceiling(factor, product_rounding)
277 if factor < product_rounding:
278 factor = product_rounding
279 return factor
280
281 factor = _factor(factor, bom.product_efficiency, bom.product_rounding)
282
332 result = []283 result = []
333 result2 = []284 result2 = []
334 phantom = False285
335 if bom.type == 'phantom' and not bom.bom_lines:286 routing = (routing_id and routing_obj.browse(cr, uid, routing_id)) or bom.routing_id or False
336 newbom = self._bom_find(cr, uid, bom.product_id.id, bom.product_uom.id, properties)287 if routing:
337288 for wc_use in routing.workcenter_lines:
338 if newbom:289 wc = wc_use.workcenter_id
339 res = self._bom_explode(cr, uid, self.browse(cr, uid, [newbom])[0], factor * bom.product_qty, properties, addthis=True, level=level + 10)290 d, m = divmod(factor, wc_use.workcenter_id.capacity_per_cycle)
340 result = result + res[0]291 mult = (d + (m and 1.0 or 0.0))
341 result2 = result2 + res[1]292 cycle = mult * wc_use.cycle_nbr
342 phantom = True293 result2.append({
343 else:294 'name': tools.ustr(wc_use.name) + ' - ' + tools.ustr(bom.product_tmpl_id.name_get()[0][1]),
344 phantom = False295 'workcenter_id': wc.id,
345 if not phantom:296 'sequence': level + (wc_use.sequence or 0),
346 if addthis and not bom.bom_lines:297 'cycle': cycle,
298 'hour': float(wc_use.hour_nbr * mult + ((wc.time_start or 0.0) + (wc.time_stop or 0.0) + cycle * (wc.time_cycle or 0.0)) * (wc.time_efficiency or 1.0)),
299 })
300
301 for bom_line_id in bom.bom_line_ids:
302 if bom_line_id.date_start and bom_line_id.date_start > time.strftime(DEFAULT_SERVER_DATETIME_FORMAT) or \
303 bom_line_id.date_stop and bom_line_id.date_stop > time.strftime(DEFAULT_SERVER_DATETIME_FORMAT):
304 continue
305 # check properties
306 if set(map(int,bom_line_id.property_ids or [])) - set(properties or []):
307 continue
308 # all bom_line_id variant values must be in the product
309 if bom_line_id.variants_ids:
310 if not product or (set(map(int,bom_line_id.variants_ids or [])) - set(map(int,product.variant_ids))):
311 continue
312
313 if bom_line_id.product_id.id in all_prod:
314 raise osv.except_osv(_('Invalid Action!'), _('BoM "%s" contains a BoM line with a product recursion: "%s".') % (master_bom.name,bom_line_id.product_id.name_get()[0][1]))
315 all_prod.append(bom_line_id.product_id.id)
316
317 if bom_line_id.type != "phantom":
347 result.append({318 result.append({
348 'name': bom.product_id.name,319 'name': bom_line_id.product_id.name,
349 'product_id': bom.product_id.id,320 'product_id': bom_line_id.product_id.id,
350 'product_qty': bom.product_qty * factor,321 'product_qty': _factor(bom_line_id.product_qty * factor, bom_line_id.product_efficiency, bom_line_id.product_rounding),
351 'product_uom': bom.product_uom.id,322 'product_uom': bom_line_id.product_uom.id,
352 'product_uos_qty': bom.product_uos and bom.product_uos_qty * factor or False,323 'product_uos_qty': bom_line_id.product_uos and bom_line_id.product_uos_qty * factor or False,
353 'product_uos': bom.product_uos and bom.product_uos.id or False,324 'product_uos': bom_line_id.product_uos and bom_line_id.product_uos.id or False,
354 })325 })
355 routing = (routing_id and routing_obj.browse(cr, uid, routing_id)) or bom.routing_id or False326 else:
356 if routing:327 bom_id = self._bom_find(cr, uid, bom_line_id.product_uom.id, product_id=bom_line_id.product_id.id, properties=properties)
357 for wc_use in routing.workcenter_lines:328 bom2 = self.browse(cr, uid, bom_id)
358 wc = wc_use.workcenter_id329 if bom2:
359 d, m = divmod(factor, wc_use.workcenter_id.capacity_per_cycle)330 res = self._bom_explode(cr, uid, bom2, bom_line_id.product_id, factor,
360 mult = (d + (m and 1.0 or 0.0))331 properties=properties, level=level + 10, previous_products=all_prod, master_bom=master_bom)
361 cycle = mult * wc_use.cycle_nbr332 result = result + res[0]
362 result2.append({333 result2 = result2 + res[1]
363 'name': tools.ustr(wc_use.name) + ' - ' + tools.ustr(bom.product_id.name),334 else:
364 'workcenter_id': wc.id,335 raise osv.except_osv(_('Invalid Action!'), _('BoM "%s" contains a phantom BoM line but the product "%s" don\'t have any BoM defined.') % (master_bom.name,bom_line_id.product_id.name_get()[0][1]))
365 'sequence': level + (wc_use.sequence or 0),336
366 'cycle': cycle,
367 'hour': float(wc_use.hour_nbr * mult + ((wc.time_start or 0.0) + (wc.time_stop or 0.0) + cycle * (wc.time_cycle or 0.0)) * (wc.time_efficiency or 1.0)),
368 })
369 for bom2 in bom.bom_lines:
370 res = self._bom_explode(cr, uid, bom2, factor, properties, addthis=True, level=level + 10)
371 result = result + res[0]
372 result2 = result2 + res[1]
373 return result, result2337 return result, result2
374338
375 def copy_data(self, cr, uid, id, default=None, context=None):339 def copy_data(self, cr, uid, id, default=None, context=None):
376 if default is None:340 if default is None:
377 default = {}341 default = {}
378 bom_data = self.read(cr, uid, id, [], context=context)342 bom_data = self.read(cr, uid, id, [], context=context)
379 default.update(name=_("%s (copy)") % (bom_data['name']), bom_id=False)343 default.update(name=_("%s (copy)") % (bom_data['name']))
380 return super(mrp_bom, self).copy_data(cr, uid, id, default, context=context)344 return super(mrp_bom, self).copy_data(cr, uid, id, default, context=context)
381345
346 def onchange_uom(self, cr, uid, ids, product_tmpl_id, product_uom, context=None):
347 res = {'value': {}}
348 if not product_uom or not product_tmpl_id:
349 return res
350 product = self.pool.get('product.template').browse(cr, uid, product_tmpl_id, context=context)
351 uom = self.pool.get('product.uom').browse(cr, uid, product_uom, context=context)
352 if uom.category_id.id != product.uom_id.category_id.id:
353 res['warning'] = {'title': _('Warning'), 'message': _('The Product Unit of Measure you chose has a different category than in the product form.')}
354 res['value'].update({'product_uom': product.uom_id.id})
355 return res
356
357 def onchange_product_tmpl_id(self, cr, uid, ids, product_tmpl_id, product_qty=0, context=None):
358 """ Changes UoM and name if product_id changes.
359 @param product_id: Changed product_id
360 @return: Dictionary of changed values
361 """
362 res = {}
363 if product_tmpl_id:
364 prod = self.pool.get('product.template').browse(cr, uid, product_tmpl_id, context=context)
365 res['value'] = {
366 'name': prod.name,
367 'product_uom': prod.uom_id.id,
368 }
369 return res
370
371class mrp_bom_line(osv.osv):
372 _name = 'mrp.bom.line'
373 _order = "sequence"
374
375 _columns = {
376 'type': fields.selection([('normal', 'Normal'), ('phantom', 'Phantom')], 'BoM Line Type', required=True,
377 help="Phantom: this product line will not appear in the raw materials of manufacturing orders,"
378 "it will be directly replaced by the raw materials of its own BoM, without triggering"
379 "an extra manufacturing order."),
380 'product_id': fields.many2one('product.product', 'Product', required=True),
381 'product_uos_qty': fields.float('Product UOS Qty'),
382 'product_uos': fields.many2one('product.uom', 'Product UOS', help="Product UOS (Unit of Sale) is the unit of measurement for the invoicing and promotion of stock."),
383 'product_qty': fields.float('Product Quantity', required=True, digits_compute=dp.get_precision('Product Unit of Measure')),
384 'product_uom': fields.many2one('product.uom', 'Product Unit of Measure', required=True,
385 help="Unit of Measure (Unit of Measure) is the unit of measurement for the inventory control"),
386
387 'date_start': fields.date('Valid From', help="Validity of component. Keep empty if it's always valid."),
388 'date_stop': fields.date('Valid Until', help="Validity of component. Keep empty if it's always valid."),
389 'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying."),
390 'routing_id': fields.many2one('mrp.routing', 'Routing', help="The list of operations (list of work centers) to produce the finished product. The routing is mainly used to compute work center costs during operations and to plan future loads on work centers based on production planning."),
391 'product_rounding': fields.float('Product Rounding', help="Rounding applied on the product quantity."),
392 'product_efficiency': fields.float('Manufacturing Efficiency', required=True, help="A factor of 0.9 means a loss of 10% within the production process."),
393 'property_ids': fields.many2many('mrp.property', string='Properties'),
394
395 'bom_id': fields.many2one('mrp.bom', 'Parent BoM', ondelete='cascade', select=True, required=True),
396 'variants_ids': fields.many2many('product.attribute.value', string='Variants', help="BOM Product Variants needed form apply this line."),
397 }
398
399 def _get_uom_id(self, cr, uid, *args):
400 return self.pool["product.uom"].search(cr, uid, [], limit=1, order='id')[0]
401 _defaults = {
402 'product_qty': lambda *a: 1.0,
403 'product_efficiency': lambda *a: 1.0,
404 'product_rounding': lambda *a: 0.0,
405 'type': lambda *a: 'normal',
406 'product_uom': _get_uom_id,
407 }
408 _sql_constraints = [
409 ('bom_qty_zero', 'CHECK (product_qty>0)', 'All product quantities must be greater than 0.\n' \
410 'You should install the mrp_byproduct module if you want to manage extra products on BoMs !'),
411 ]
412
413 def onchange_uom(self, cr, uid, ids, product_id, product_uom, context=None):
414 res = {'value': {}}
415 if not product_uom or not product_id:
416 return res
417 product = self.pool.get('product.product').browse(cr, uid, product_id, context=context)
418 uom = self.pool.get('product.uom').browse(cr, uid, product_uom, context=context)
419 if uom.category_id.id != product.uom_id.category_id.id:
420 res['warning'] = {'title': _('Warning'), 'message': _('The Product Unit of Measure you chose has a different category than in the product form.')}
421 res['value'].update({'product_uom': product.uom_id.id})
422 return res
423
424 def onchange_product_id(self, cr, uid, ids, product_id, product_qty=0, context=None):
425 """ Changes UoM if product_id changes.
426 @param product_id: Changed product_id
427 @return: Dictionary of changed values
428 """
429 res = {}
430 if product_id:
431 prod = self.pool.get('product.product').browse(cr, uid, product_id, context=context)
432 res['value'] = {
433 'product_uom': prod.uom_id.id,
434 'product_uos_qty': 0,
435 'product_uos': False
436 }
437 if prod.uos_id.id:
438 res['value']['product_uos_qty'] = product_qty * prod.uos_coeff
439 res['value']['product_uos'] = prod.uos_id.id
440 return res
382441
383class mrp_production(osv.osv):442class mrp_production(osv.osv):
384 """443 """
@@ -475,7 +534,7 @@
475 'date_planned': fields.datetime('Scheduled Date', required=True, select=1, readonly=True, states={'draft': [('readonly', False)]}),534 'date_planned': fields.datetime('Scheduled Date', required=True, select=1, readonly=True, states={'draft': [('readonly', False)]}),
476 'date_start': fields.datetime('Start Date', select=True, readonly=True),535 'date_start': fields.datetime('Start Date', select=True, readonly=True),
477 'date_finished': fields.datetime('End Date', select=True, readonly=True),536 'date_finished': fields.datetime('End Date', select=True, readonly=True),
478 'bom_id': fields.many2one('mrp.bom', 'Bill of Material', domain=[('bom_id', '=', False)], readonly=True, states={'draft': [('readonly', False)]},537 'bom_id': fields.many2one('mrp.bom', 'Bill of Material', readonly=True, states={'draft': [('readonly', False)]},
479 help="Bill of Materials allow you to define the list of required raw materials to make a finished product."),538 help="Bill of Materials allow you to define the list of required raw materials to make a finished product."),
480 'routing_id': fields.many2one('mrp.routing', string='Routing', on_delete='set null', readonly=True, states={'draft': [('readonly', False)]},539 'routing_id': fields.many2one('mrp.routing', string='Routing', on_delete='set null', readonly=True, states={'draft': [('readonly', False)]},
481 help="The list of operations (list of work centers) to produce the finished product. The routing is mainly used to compute work center costs during operations and to plan future loads on work centers based on production plannification."),540 help="The list of operations (list of work centers) to produce the finished product. The routing is mainly used to compute work center costs during operations and to plan future loads on work centers based on production plannification."),
@@ -586,7 +645,7 @@
586 }}645 }}
587 bom_obj = self.pool.get('mrp.bom')646 bom_obj = self.pool.get('mrp.bom')
588 product = self.pool.get('product.product').browse(cr, uid, product_id, context=context)647 product = self.pool.get('product.product').browse(cr, uid, product_id, context=context)
589 bom_id = bom_obj._bom_find(cr, uid, product.id, product.uom_id and product.uom_id.id, [])648 bom_id = bom_obj._bom_find(cr, uid, product.uom_id and product.uom_id.id, product_id=product.id, properties=[])
590 routing_id = False649 routing_id = False
591 if bom_id:650 if bom_id:
592 bom_point = bom_obj.browse(cr, uid, bom_id, context=context)651 bom_point = bom_obj.browse(cr, uid, bom_id, context=context)
@@ -635,7 +694,7 @@
635 bom_point = production.bom_id694 bom_point = production.bom_id
636 bom_id = production.bom_id.id695 bom_id = production.bom_id.id
637 if not bom_point:696 if not bom_point:
638 bom_id = bom_obj._bom_find(cr, uid, production.product_id.id, production.product_uom.id, properties)697 bom_id = bom_obj._bom_find(cr, uid, production.product_uom.id, product_id=production.product_id.id, properties=properties)
639 if bom_id:698 if bom_id:
640 bom_point = bom_obj.browse(cr, uid, bom_id)699 bom_point = bom_obj.browse(cr, uid, bom_id)
641 routing_id = bom_point.routing_id.id or False700 routing_id = bom_point.routing_id.id or False
@@ -646,9 +705,8 @@
646705
647 # get components and workcenter_lines from BoM structure706 # get components and workcenter_lines from BoM structure
648 factor = uom_obj._compute_qty(cr, uid, production.product_uom.id, production.product_qty, bom_point.product_uom.id)707 factor = uom_obj._compute_qty(cr, uid, production.product_uom.id, production.product_qty, bom_point.product_uom.id)
649 res = bom_obj._bom_explode(cr, uid, bom_point, factor / bom_point.product_qty, properties, routing_id=production.routing_id.id)708 # product_lines, workcenter_lines
650 results = res[0] # product_lines709 results, results2 = bom_obj._bom_explode(cr, uid, bom_point, production.product_id, factor / bom_point.product_qty, properties, routing_id=production.routing_id.id)
651 results2 = res[1] # workcenter_lines
652 # reset product_lines in production order710 # reset product_lines in production order
653 for line in results:711 for line in results:
654 line['production_id'] = production.id712 line['production_id'] = production.id
@@ -777,15 +835,18 @@
777 dicts = {}835 dicts = {}
778 # Find product qty to be consumed and consume it836 # Find product qty to be consumed and consume it
779 for scheduled in production.product_lines:837 for scheduled in production.product_lines:
780 consumed_qty = consumed_data.get(scheduled.product_id.id, 0.0)838 product_id = scheduled.product_id.id
839
840 consumed_qty = consumed_data.get(product_id, 0.0)
841
781 # qty available for consume and produce842 # qty available for consume and produce
782 qty_avail = scheduled.product_qty - consumed_qty843 qty_avail = scheduled.product_qty - consumed_qty
783 if qty_avail <= 0.0:844 if qty_avail <= 0.0:
784 # there will be nothing to consume for this raw material845 # there will be nothing to consume for this raw material
785 continue846 continue
786847
787 if not dicts.get(scheduled.product_id.id):848 if not dicts.get(product_id):
788 dicts[scheduled.product_id.id] = {}849 dicts[product_id] = {}
789850
790 # total qty of consumed product we need after this consumption851 # total qty of consumed product we need after this consumption
791 total_consume = ((product_qty + produced_qty) * scheduled.product_qty / production.product_qty)852 total_consume = ((product_qty + produced_qty) * scheduled.product_qty / production.product_qty)
@@ -795,9 +856,8 @@
795 for move in production.move_lines:856 for move in production.move_lines:
796 if qty <= 0.0:857 if qty <= 0.0:
797 break858 break
798 if move.product_id.id != scheduled.product_id.id:859 if move.product_id.id != product_id:
799 continue860 continue
800 product_id = scheduled.product_id.id
801861
802 q = min(move.product_qty, qty)862 q = min(move.product_qty, qty)
803 quants = quant_obj.quants_get_prefered_domain(cr, uid, move.location_id, scheduled.product_id, q, domain=[('qty', '>', 0.0)],863 quants = quant_obj.quants_get_prefered_domain(cr, uid, move.location_id, scheduled.product_id, q, domain=[('qty', '>', 0.0)],
@@ -895,7 +955,8 @@
895 #consumed more in wizard than previously planned955 #consumed more in wizard than previously planned
896 product = self.pool.get('product.product').browse(cr, uid, consume['product_id'], context=context)956 product = self.pool.get('product.product').browse(cr, uid, consume['product_id'], context=context)
897 extra_move_id = self._make_consume_line_from_data(cr, uid, production, product, product.uom_id.id, remaining_qty, False, 0, context=context)957 extra_move_id = self._make_consume_line_from_data(cr, uid, production, product, product.uom_id.id, remaining_qty, False, 0, context=context)
898 stock_mov_obj.action_done(cr, uid, [extra_move_id], context=context)958 if extra_move_id:
959 stock_mov_obj.action_done(cr, uid, [extra_move_id], context=context)
899960
900 self.message_post(cr, uid, production_id, body=_("%s produced") % self._description, context=context)961 self.message_post(cr, uid, production_id, body=_("%s produced") % self._description, context=context)
901 self.signal_button_produce_done(cr, uid, [production_id])962 self.signal_button_produce_done(cr, uid, [production_id])
@@ -1111,24 +1172,4 @@
1111 'production_id': fields.many2one('mrp.production', 'Production Order', select=True),1172 'production_id': fields.many2one('mrp.production', 'Production Order', select=True),
1112 }1173 }
11131174
1114class product_product(osv.osv):
1115 _inherit = "product.product"
1116 def _bom_orders_count(self, cr, uid, ids, field_name, arg, context=None):
1117 Bom = self.pool('mrp.bom')
1118 Production = self.pool('mrp.production')
1119 return {
1120 product_id: {
1121 'bom_count': Bom.search_count(cr, uid, [('product_id', '=', product_id), ('bom_id', '=', False)], context=context),
1122 'mo_count': Production.search_count(cr,uid, [('product_id', '=', product_id)], context=context),
1123 'bom_strct': Bom.search_count(cr, uid, [('product_id', '=', product_id), ('bom_id', '=', False)], context=context),
1124 }
1125 for product_id in ids
1126 }
1127 _columns = {
1128 'bom_ids': fields.one2many('mrp.bom', 'product_id', 'Bill of Materials'),
1129 'bom_count': fields.function(_bom_orders_count, string='# Bill of Material', type='integer', multi="_bom_order_count"),
1130 'bom_strct': fields.function(_bom_orders_count, string='# Bill of Material Structure', type='integer', multi="_bom_order_count"),
1131 'mo_count': fields.function(_bom_orders_count, string='# Manufacturing Orders', type='integer', multi="_bom_order_count"),
1132 }
1133
1134# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:1175# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
11351176
=== modified file 'mrp/mrp_demo.xml'
--- mrp/mrp_demo.xml 2014-01-20 14:42:43 +0000
+++ mrp/mrp_demo.xml 2014-05-26 16:10:21 +0000
@@ -245,407 +245,366 @@
245245
246 <record id="mrp_bom_1" model="mrp.bom">246 <record id="mrp_bom_1" model="mrp.bom">
247 <field name="name">HDD 500GB</field>247 <field name="name">HDD 500GB</field>
248 <field name="product_id" ref="product.product_product_18"/>248 <field name="product_tmpl_id" ref="product.product_product_18_product_template"/>
249 <field name="product_qty">1</field>
250 <field name="product_uom" ref="product.product_uom_unit"/>249 <field name="product_uom" ref="product.product_uom_unit"/>
251 <field name="sequence">5</field> 250 <field name="sequence">5</field>
252 <field name="routing_id" ref="mrp_routing_0"/>251 <field name="routing_id" ref="mrp_routing_0"/>
253 <field name="type">normal</field>252 <field name="type">normal</field>
254 </record>253 </record>
255254
255 <record id="mrp_bom_line_1" model="mrp.bom.line">
256 <field name="product_id" ref="product.product_product_17"/>
257 <field name="product_qty">2</field>
258 <field name="product_uom" ref="product.product_uom_unit"/>
259 <field name="sequence">5</field>
260 <field name="type">normal</field>
261 <field name="bom_id" ref="mrp_bom_1"/>
262 </record>
263
256 <record id="mrp_bom_2" model="mrp.bom">264 <record id="mrp_bom_2" model="mrp.bom">
257 <field name="name">320GB HDD</field>
258 <field name="product_id" ref="product.product_product_17"/>
259 <field name="product_qty">2</field>
260 <field name="product_uom" ref="product.product_uom_unit"/>
261 <field name="sequence">5</field>
262 <field name="type">normal</field>
263 <field name="bom_id" ref="mrp_bom_1"/>
264 </record>
265
266 <record id="mrp_bom_3" model="mrp.bom">
267 <field name="name">HDD 2TB on Demand</field>265 <field name="name">HDD 2TB on Demand</field>
268 <field name="product_id" ref="product.product_product_19"/>266 <field name="product_tmpl_id" ref="product.product_product_19_product_template"/>
269 <field name="product_qty">1</field>
270 <field name="product_uom" ref="product.product_uom_unit"/>267 <field name="product_uom" ref="product.product_uom_unit"/>
271 <field name="sequence">5</field> 268 <field name="sequence">5</field>
272 <field name="routing_id" ref="mrp_routing_1"/>269 <field name="routing_id" ref="mrp_routing_1"/>
273 <field name="type">normal</field>270 <field name="type">normal</field>
274 </record>271 </record>
275272
276 <record id="mrp_bom_4" model="mrp.bom">273 <record id="mrp_bom_line_2" model="mrp.bom.line">
277 <field name="name">HDD 500GB</field>
278 <field name="product_id" ref="product.product_product_18"/>274 <field name="product_id" ref="product.product_product_18"/>
279 <field name="product_qty">4</field>275 <field name="product_qty">4</field>
280 <field name="product_uom" ref="product.product_uom_unit"/>276 <field name="product_uom" ref="product.product_uom_unit"/>
281 <field name="sequence">5</field> 277 <field name="sequence">5</field>
282 <field name="type">normal</field>278 <field name="type">normal</field>
279 <field name="bom_id" ref="mrp_bom_2"/>
280 </record>
281
282 <record id="mrp_bom_3" model="mrp.bom">
283 <field name="name">HDD on Demand</field>
284 <field name="product_tmpl_id" ref="product.product_product_19_product_template"/>
285 <field name="product_uom" ref="product.product_uom_unit"/>
286 <field name="sequence">10</field>
287 <field name="type">normal</field>
288 </record>
289
290 <record id="mrp_bom_line_3" model="mrp.bom.line">
291 <field name="product_id" ref="product.product_product_17"/>
292 <field name="product_qty">1</field>
293 <field name="product_uom" ref="product.product_uom_unit"/>
294 <field name="sequence">5</field>
295 <field name="type">normal</field>
283 <field name="bom_id" ref="mrp_bom_3"/>296 <field name="bom_id" ref="mrp_bom_3"/>
284 </record>297 </record>
285298
286 <record id="mrp_bom_5" model="mrp.bom">299 <record id="mrp_bom_4" model="mrp.bom">
287 <field name="name">HDD on Demand</field>
288 <field name="product_id" ref="product.product_product_19"/>
289 <field name="product_qty">1</field>
290 <field name="product_uom" ref="product.product_uom_unit"/>
291 <field name="sequence">10</field>
292 <field name="type">normal</field>
293 </record>
294
295 <record id="mrp_bom_6" model="mrp.bom">
296 <field name="name">320GB HDD</field>
297 <field name="product_id" ref="product.product_product_17"/>
298 <field name="product_qty">1</field>
299 <field name="product_uom" ref="product.product_uom_unit"/>
300 <field name="sequence">5</field>
301 <field name="type">normal</field>
302 <field name="bom_id" ref="mrp_bom_5"/>
303 </record>
304
305 <record id="mrp_bom_7" model="mrp.bom">
306 <field name="name">Laptop Customized</field>300 <field name="name">Laptop Customized</field>
307 <field name="product_id" ref="product.product_product_27"/>301 <field name="product_tmpl_id" ref="product.product_product_27_product_template"/>
308 <field name="product_qty">1</field>
309 <field name="product_uom" ref="product.product_uom_unit"/>302 <field name="product_uom" ref="product.product_uom_unit"/>
310 <field name="sequence">5</field> 303 <field name="sequence">5</field>
311 <field name="routing_id" ref="mrp_routing_1"/>304 <field name="routing_id" ref="mrp_routing_1"/>
312 <field name="type">normal</field>305 <field name="type">normal</field>
313 </record>306 </record>
314307
315 <record id="mrp_bom_8" model="mrp.bom">308 <record id="mrp_bom_line_4" model="mrp.bom.line">
316 <field name="name">Windows 7 Professional</field>
317 <field name="product_id" ref="product.product_product_40"/>309 <field name="product_id" ref="product.product_product_40"/>
318 <field name="product_qty">1</field>310 <field name="product_qty">1</field>
319 <field name="product_uom" ref="product.product_uom_unit"/>311 <field name="product_uom" ref="product.product_uom_unit"/>
320 <field name="sequence">2</field> 312 <field name="sequence">2</field>
321 <field name="type">normal</field>313 <field name="type">normal</field>
322 <field name="bom_id" ref="mrp_bom_7"/>314 <field name="bom_id" ref="mrp_bom_4"/>
323 </record>315 </record>
324316
325 <record id="mrp_bom_9" model="mrp.bom">317 <record id="mrp_bom_line_5" model="mrp.bom.line">
326 <field name="name">USB Keyboard, QWERTY</field>
327 <field name="product_id" ref="product.product_product_8"/>318 <field name="product_id" ref="product.product_product_8"/>
328 <field name="product_qty">1</field>319 <field name="product_qty">1</field>
329 <field name="product_uom" ref="product.product_uom_unit"/>320 <field name="product_uom" ref="product.product_uom_unit"/>
330 <field name="sequence">4</field> 321 <field name="sequence">4</field>
331 <field name="type">normal</field>322 <field name="type">normal</field>
332 <field name="bom_id" ref="mrp_bom_7"/>323 <field name="bom_id" ref="mrp_bom_4"/>
333 </record>324 </record>
334325
335 <record id="mrp_bom_10" model="mrp.bom">326 <record id="mrp_bom_line_6" model="mrp.bom.line">
336 <field name="name">Mouse, Wireless</field>
337 <field name="product_id" ref="product.product_product_12"/>327 <field name="product_id" ref="product.product_product_12"/>
338 <field name="product_qty">1</field>328 <field name="product_qty">1</field>
339 <field name="product_uom" ref="product.product_uom_unit"/>329 <field name="product_uom" ref="product.product_uom_unit"/>
340 <field name="sequence">6</field> 330 <field name="sequence">6</field>
341 <field name="type">normal</field>331 <field name="type">normal</field>
342 <field name="bom_id" ref="mrp_bom_7"/>332 <field name="bom_id" ref="mrp_bom_4"/>
343 </record>333 </record>
344334
345 <record id="mrp_bom_11" model="mrp.bom">335 <record id="mrp_bom_5" model="mrp.bom">
346 <field name="name">Laptop Customized + Azerty</field>336 <field name="name">Laptop Customized + Azerty</field>
347 <field name="product_id" ref="product.product_product_27"/>337 <field name="product_tmpl_id" ref="product.product_product_27_product_template"/>
348 <field name="product_qty">1</field>
349 <field name="product_uom" ref="product.product_uom_unit"/>338 <field name="product_uom" ref="product.product_uom_unit"/>
350 <field name="sequence">10</field> 339 <field name="sequence">10</field>
351 <field name="type">normal</field>340 <field name="type">normal</field>
352 </record>341 </record>
353342
354 <record id="mrp_bom_12" model="mrp.bom">343 <record id="mrp_bom_line_7" model="mrp.bom.line">
355 <field name="name">Windows 7 Professional</field>
356 <field name="product_id" ref="product.product_product_40"/>344 <field name="product_id" ref="product.product_product_40"/>
357 <field name="product_qty">1</field>345 <field name="product_qty">1</field>
358 <field name="product_uom" ref="product.product_uom_unit"/>346 <field name="product_uom" ref="product.product_uom_unit"/>
359 <field name="sequence">2</field> 347 <field name="sequence">2</field>
360 <field name="type">normal</field>348 <field name="type">normal</field>
361 <field name="bom_id" ref="mrp_bom_11"/>349 <field name="bom_id" ref="mrp_bom_5"/>
362 </record>350 </record>
363351
364 <record id="mrp_bom_13" model="mrp.bom">352 <record id="mrp_bom_line_8" model="mrp.bom.line">
365 <field name="name">USB Keyboard, AZERTY</field>
366 <field name="product_id" ref="product.product_product_9"/>353 <field name="product_id" ref="product.product_product_9"/>
367 <field name="product_qty">1</field>354 <field name="product_qty">1</field>
368 <field name="product_uom" ref="product.product_uom_unit"/>355 <field name="product_uom" ref="product.product_uom_unit"/>
369 <field name="sequence">4</field> 356 <field name="sequence">4</field>
370 <field name="type">normal</field>357 <field name="type">normal</field>
371 <field name="bom_id" ref="mrp_bom_11"/>358 <field name="bom_id" ref="mrp_bom_5"/>
372 </record>359 </record>
373360
374 <record id="mrp_bom_14" model="mrp.bom">361 <record id="mrp_bom_line_9" model="mrp.bom.line">
375 <field name="name">Mouse, Laser</field>
376 <field name="product_id" ref="product.product_product_11"/>362 <field name="product_id" ref="product.product_product_11"/>
377 <field name="product_qty">1</field>363 <field name="product_qty">1</field>
378 <field name="product_uom" ref="product.product_uom_unit"/>364 <field name="product_uom" ref="product.product_uom_unit"/>
379 <field name="sequence">6</field> 365 <field name="sequence">6</field>
380 <field name="type">normal</field>366 <field name="type">normal</field>
381 <field name="bom_id" ref="mrp_bom_11"/>367 <field name="bom_id" ref="mrp_bom_5"/>
382 </record>368 </record>
383369
384 <record id="mrp_bom_15" model="mrp.bom">370 <record id="mrp_bom_6" model="mrp.bom">
385 <field name="name">Computer Case-1</field>371 <field name="name">Computer Case-1</field>
386 <field name="product_id" ref="product.product_product_16"/>372 <field name="product_tmpl_id" ref="product.product_product_16_product_template"/>
387 <field name="product_qty">1</field>
388 <field name="product_uom" ref="product.product_uom_unit"/>373 <field name="product_uom" ref="product.product_uom_unit"/>
389 <field name="sequence">5</field> 374 <field name="sequence">5</field>
390 <field name="type">normal</field>375 <field name="type">normal</field>
391 </record>376 </record>
392377
393 <record id="mrp_bom_16" model="mrp.bom">378 <record id="mrp_bom_line_10" model="mrp.bom.line">
394 <field name="name">Processesor AMD 8-Core</field>
395 <field name="product_id" ref="product.product_product_23"/>379 <field name="product_id" ref="product.product_product_23"/>
396 <field name="product_qty">1</field>380 <field name="product_qty">1</field>
397 <field name="product_uom" ref="product.product_uom_unit"/>381 <field name="product_uom" ref="product.product_uom_unit"/>
398 <field name="sequence">4</field> 382 <field name="sequence">4</field>
399 <field name="type">normal</field>383 <field name="type">normal</field>
400 <field name="bom_id" ref="mrp_bom_15"/>384 <field name="bom_id" ref="mrp_bom_6"/>
401 </record>385 </record>
402386
403 <record id="mrp_bom_17" model="mrp.bom">387 <record id="mrp_bom_line_11" model="mrp.bom.line">
404 <field name="name">Motherboard I9P57</field>
405 <field name="product_id" ref="product.product_product_20"/>388 <field name="product_id" ref="product.product_product_20"/>
406 <field name="product_qty">1</field>389 <field name="product_qty">1</field>
407 <field name="product_uom" ref="product.product_uom_unit"/>390 <field name="product_uom" ref="product.product_uom_unit"/>
408 <field name="sequence">6</field> 391 <field name="sequence">6</field>
409 <field name="type">normal</field>392 <field name="type">normal</field>
410 <field name="bom_id" ref="mrp_bom_15"/>393 <field name="bom_id" ref="mrp_bom_6"/>
411 </record>394 </record>
412395
413 <record id="mrp_bom_18" model="mrp.bom">396 <record id="mrp_bom_line_12" model="mrp.bom.line">
414 <field name="name">HDD 320GB</field>
415 <field name="product_id" ref="product.product_product_17"/>397 <field name="product_id" ref="product.product_product_17"/>
416 <field name="product_qty">1</field>398 <field name="product_qty">1</field>
417 <field name="product_uom" ref="product.product_uom_unit"/>399 <field name="product_uom" ref="product.product_uom_unit"/>
418 <field name="sequence">8</field> 400 <field name="sequence">8</field>
419 <field name="type">normal</field>401 <field name="type">normal</field>
420 <field name="bom_id" ref="mrp_bom_15"/>402 <field name="bom_id" ref="mrp_bom_6"/>
421 </record>403 </record>
422404
423 <record id="mrp_bom_19" model="mrp.bom">405 <record id="mrp_bom_7" model="mrp.bom">
424 <field name="name">Computer Case-2</field>406 <field name="name">Computer Case-2</field>
425 <field name="product_id" ref="product.product_product_16"/>407 <field name="product_tmpl_id" ref="product.product_product_16_product_template"/>
426 <field name="product_qty">1</field>
427 <field name="product_uom" ref="product.product_uom_unit"/>408 <field name="product_uom" ref="product.product_uom_unit"/>
428 <field name="sequence">10</field> 409 <field name="sequence">10</field>
429 <field name="type">normal</field>410 <field name="type">normal</field>
430 </record>411 </record>
431412
432 <record id="mrp_bom_20" model="mrp.bom">413 <record id="mrp_bom_line_13" model="mrp.bom.line">
433 <field name="name">Processor Core i5 2.70 Ghz</field>
434 <field name="product_id" ref="product.product_product_22"/>414 <field name="product_id" ref="product.product_product_22"/>
435 <field name="product_qty">1</field>415 <field name="product_qty">1</field>
436 <field name="product_uom" ref="product.product_uom_unit"/>416 <field name="product_uom" ref="product.product_uom_unit"/>
437 <field name="sequence">2</field> 417 <field name="sequence">2</field>
438 <field name="type">normal</field>418 <field name="type">normal</field>
439 <field name="bom_id" ref="mrp_bom_19"/>419 <field name="bom_id" ref="mrp_bom_7"/>
440 </record>420 </record>
441421
442 <record id="mrp_bom_21" model="mrp.bom">422 <record id="mrp_bom_line_14" model="mrp.bom.line">
443 <field name="name">Motherboard A20Z7</field>
444 <field name="product_id" ref="product.product_product_21"/>423 <field name="product_id" ref="product.product_product_21"/>
445 <field name="product_qty">1</field>424 <field name="product_qty">1</field>
446 <field name="product_uom" ref="product.product_uom_unit"/>425 <field name="product_uom" ref="product.product_uom_unit"/>
447 <field name="sequence">4</field> 426 <field name="sequence">4</field>
448 <field name="type">normal</field>427 <field name="type">normal</field>
449 <field name="bom_id" ref="mrp_bom_19"/>428 <field name="bom_id" ref="mrp_bom_7"/>
450 </record>429 </record>
451430
452 <record id="mrp_bom_22" model="mrp.bom">431 <record id="mrp_bom_line_15" model="mrp.bom.line">
453 <field name="name">HDD 500GB</field>
454 <field name="product_id" ref="product.product_product_18"/>432 <field name="product_id" ref="product.product_product_18"/>
455 <field name="product_qty">1</field>433 <field name="product_qty">1</field>
456 <field name="product_uom" ref="product.product_uom_unit"/>434 <field name="product_uom" ref="product.product_uom_unit"/>
457 <field name="sequence">6</field> 435 <field name="sequence">6</field>
458 <field name="type">normal</field>436 <field name="type">normal</field>
459 <field name="bom_id" ref="mrp_bom_19"/>437 <field name="bom_id" ref="mrp_bom_7"/>
460 </record>438 </record>
461439
462 <record id="mrp_bom_23" model="mrp.bom">440 <record id="mrp_bom_line_16" model="mrp.bom.line">
463 <field name="name">Graphics Card</field>
464 <field name="product_id" ref="product.product_product_24"/>441 <field name="product_id" ref="product.product_product_24"/>
465 <field name="product_qty">1</field>442 <field name="product_qty">1</field>
466 <field name="product_uom" ref="product.product_uom_unit"/>443 <field name="product_uom" ref="product.product_uom_unit"/>
467 <field name="sequence">10</field> 444 <field name="sequence">10</field>
468 <field name="type">normal</field>445 <field name="type">normal</field>
469 <field name="bom_id" ref="mrp_bom_19"/>446 <field name="bom_id" ref="mrp_bom_7"/>
470 </record>447 </record>
471448
472 <record id="mrp_bom_24" model="mrp.bom">449 <record id="mrp_bom_8" model="mrp.bom">
473 <field name="name">PC Assemble + 2GB RAM</field>450 <field name="name">PC Assemble + 2GB RAM</field>
474 <field name="product_id" ref="product.product_product_4"/>451 <field name="product_tmpl_id" ref="product.product_product_4_product_template"/>
475 <field name="product_qty">1</field>
476 <field name="product_uom" ref="product.product_uom_unit"/>452 <field name="product_uom" ref="product.product_uom_unit"/>
477 <field name="sequence">5</field> 453 <field name="sequence">5</field>
478 <field name="type">phantom</field>454 <field name="type">phantom</field>
479 </record>455 </record>
480456
481 <record id="mrp_bom_25" model="mrp.bom">457 <record id="mrp_bom_line_17" model="mrp.bom.line">
482 <field name="name">15" LCD Monitor </field>
483 <field name="product_id" ref="product.product_product_6"/>458 <field name="product_id" ref="product.product_product_6"/>
484 <field name="product_qty">1</field>459 <field name="product_qty">1</field>
485 <field name="product_uom" ref="product.product_uom_unit"/>460 <field name="product_uom" ref="product.product_uom_unit"/>
486 <field name="sequence">2</field> 461 <field name="sequence">2</field>
487 <field name="type">normal</field>462 <field name="type">normal</field>
488 <field name="bom_id" ref="mrp_bom_24"/>463 <field name="bom_id" ref="mrp_bom_8"/>
489 </record>464 </record>
490465
491 <record id="mrp_bom_26" model="mrp.bom">466 <record id="mrp_bom_line_18" model="mrp.bom.line">
492 <field name="name">Computer Case-1</field>
493 <field name="product_id" ref="product.product_product_16"/>467 <field name="product_id" ref="product.product_product_16"/>
494 <field name="product_qty">1</field>468 <field name="product_qty">1</field>
495 <field name="product_uom" ref="product.product_uom_unit"/>469 <field name="product_uom" ref="product.product_uom_unit"/>
496 <field name="sequence">4</field> 470 <field name="sequence">4</field>
497 <field name="type">normal</field>471 <field name="type">normal</field>
498 <field name="bom_id" ref="mrp_bom_24"/>472 <field name="bom_id" ref="mrp_bom_8"/>
499 </record>473 </record>
500474
501 <record id="mrp_bom_27" model="mrp.bom">475 <record id="mrp_bom_line_19" model="mrp.bom.line">
502 <field name="name">Mouse, Laser</field>
503 <field name="product_id" ref="product.product_product_11"/>476 <field name="product_id" ref="product.product_product_11"/>
504 <field name="product_qty">1</field>477 <field name="product_qty">1</field>
505 <field name="product_uom" ref="product.product_uom_unit"/>478 <field name="product_uom" ref="product.product_uom_unit"/>
506 <field name="sequence">6</field> 479 <field name="sequence">6</field>
507 <field name="type">normal</field>480 <field name="type">normal</field>
508 <field name="bom_id" ref="mrp_bom_24"/>481 <field name="bom_id" ref="mrp_bom_8"/>
509 </record>482 </record>
510483
511 <record id="mrp_bom_28" model="mrp.bom">484 <record id="mrp_bom_line_20" model="mrp.bom.line">
512 <field name="name">USB Keyboard, QWERTY</field>
513 <field name="product_id" ref="product.product_product_8"/>485 <field name="product_id" ref="product.product_product_8"/>
514 <field name="product_qty">1</field>486 <field name="product_qty">1</field>
515 <field name="product_uom" ref="product.product_uom_unit"/>487 <field name="product_uom" ref="product.product_uom_unit"/>
516 <field name="sequence">8</field> 488 <field name="sequence">8</field>
517 <field name="type">normal</field>489 <field name="type">normal</field>
518 <field name="bom_id" ref="mrp_bom_24"/>490 <field name="bom_id" ref="mrp_bom_8"/>
519 </record>491 </record>
520492
521 <record id="mrp_bom_29" model="mrp.bom">493 <record id="mrp_bom_line_21" model="mrp.bom.line">
522 <field name="name">RAM DDR2 1GB</field>
523 <field name="product_id" ref="product.product_product_15"/>494 <field name="product_id" ref="product.product_product_15"/>
524 <field name="product_qty">2</field>495 <field name="product_qty">2</field>
525 <field name="product_uom" ref="product.product_uom_unit"/>496 <field name="product_uom" ref="product.product_uom_unit"/>
526 <field name="sequence">10</field> 497 <field name="sequence">10</field>
527 <field name="type">normal</field>498 <field name="type">normal</field>
528 <field name="bom_id" ref="mrp_bom_24"/>499 <field name="bom_id" ref="mrp_bom_8"/>
529 </record>500 </record>
530501
531 <record id="mrp_bom_30" model="mrp.bom">502 <record id="mrp_bom_9" model="mrp.bom">
532 <field name="name">PC Assemble + 512MB RAM</field>503 <field name="name">PC Assemble + 512MB RAM</field>
533 <field name="product_id" ref="product.product_product_3"/>504 <field name="product_tmpl_id" ref="product.product_product_3_product_template"/>
534 <field name="product_qty">1</field>
535 <field name="product_uom" ref="product.product_uom_unit"/>505 <field name="product_uom" ref="product.product_uom_unit"/>
536 <field name="sequence">5</field> 506 <field name="sequence">5</field>
537 <field name="routing_id" ref="mrp_routing_2"/>507 <field name="routing_id" ref="mrp_routing_2"/>
538 <field name="type">phantom</field>508 <field name="type">phantom</field>
539 </record>509 </record>
540510
541 <record id="mrp_bom_31" model="mrp.bom">511 <record id="mrp_bom_line_22" model="mrp.bom.line">
542 <field name="name">17" LCD Monitor</field>
543 <field name="product_id" ref="product.product_product_7"/>512 <field name="product_id" ref="product.product_product_7"/>
544 <field name="product_qty">1</field>513 <field name="product_qty">1</field>
545 <field name="product_uom" ref="product.product_uom_unit"/>514 <field name="product_uom" ref="product.product_uom_unit"/>
546 <field name="sequence">2</field> 515 <field name="sequence">2</field>
547 <field name="type">normal</field>516 <field name="type">normal</field>
548 <field name="bom_id" ref="mrp_bom_30"/>517 <field name="bom_id" ref="mrp_bom_9"/>
549 </record>518 </record>
550519
551 <record id="mrp_bom_32" model="mrp.bom">520 <record id="mrp_bom_line_23" model="mrp.bom.line">
552 <field name="name">Computer Case-2</field>
553 <field name="product_id" ref="product.product_product_16"/>521 <field name="product_id" ref="product.product_product_16"/>
554 <field name="product_qty">1</field>522 <field name="product_qty">1</field>
555 <field name="product_uom" ref="product.product_uom_unit"/>523 <field name="product_uom" ref="product.product_uom_unit"/>
556 <field name="sequence">4</field> 524 <field name="sequence">4</field>
557 <field name="type">normal</field>525 <field name="type">normal</field>
558 <field name="bom_id" ref="mrp_bom_30"/>526 <field name="bom_id" ref="mrp_bom_9"/>
559 </record>527 </record>
560528
561 <record id="mrp_bom_33" model="mrp.bom">529 <record id="mrp_bom_line_24" model="mrp.bom.line">
562 <field name="name">Mouse, Laser</field>
563 <field name="product_id" ref="product.product_product_11"/>530 <field name="product_id" ref="product.product_product_11"/>
564 <field name="product_qty">1</field>531 <field name="product_qty">1</field>
565 <field name="product_uom" ref="product.product_uom_unit"/>532 <field name="product_uom" ref="product.product_uom_unit"/>
566 <field name="sequence">6</field> 533 <field name="sequence">6</field>
567 <field name="type">normal</field>534 <field name="type">normal</field>
568 <field name="bom_id" ref="mrp_bom_30"/>535 <field name="bom_id" ref="mrp_bom_9"/>
569 </record>536 </record>
570537
571 <record id="mrp_bom_34" model="mrp.bom">538 <record id="mrp_bom_line_25" model="mrp.bom.line">
572 <field name="name">USB Keyboard, QWERTY</field>
573 <field name="product_id" ref="product.product_product_8"/>539 <field name="product_id" ref="product.product_product_8"/>
574 <field name="product_qty">1</field>540 <field name="product_qty">1</field>
575 <field name="product_uom" ref="product.product_uom_unit"/>541 <field name="product_uom" ref="product.product_uom_unit"/>
576 <field name="sequence">8</field> 542 <field name="sequence">8</field>
577 <field name="type">normal</field>543 <field name="type">normal</field>
578 <field name="bom_id" ref="mrp_bom_30"/>544 <field name="bom_id" ref="mrp_bom_9"/>
579 </record>545 </record>
580546
581 <record id="mrp_bom_35" model="mrp.bom">547 <record id="mrp_bom_line_26" model="mrp.bom.line">
582 <field name="name">RAM DDR 512MB</field>
583 <field name="product_id" ref="product.product_product_13"/>548 <field name="product_id" ref="product.product_product_13"/>
584 <field name="product_qty">1</field>549 <field name="product_qty">1</field>
585 <field name="product_uom" ref="product.product_uom_unit"/>550 <field name="product_uom" ref="product.product_uom_unit"/>
586 <field name="sequence">10</field> 551 <field name="sequence">10</field>
587 <field name="type">normal</field>552 <field name="type">normal</field>
588 <field name="bom_id" ref="mrp_bom_30"/>553 <field name="bom_id" ref="mrp_bom_9"/>
589 </record>554 </record>
590555
591 <record id="mrp_bom_36" model="mrp.bom">556 <record id="mrp_bom_10" model="mrp.bom">
592 <field name="name">PC Assemble + Custom RAM (PC on Demand)</field>557 <field name="name">PC Assemble + Custom RAM (PC on Demand)</field>
593 <field name="product_id" ref="product.product_product_5"/>558 <field name="product_tmpl_id" ref="product.product_product_5_product_template"/>
594 <field name="product_qty">1</field>
595 <field name="product_uom" ref="product.product_uom_unit"/>559 <field name="product_uom" ref="product.product_uom_unit"/>
596 <field name="sequence">5</field> 560 <field name="sequence">5</field>
597 <field name="routing_id" ref="mrp_routing_2"/>561 <field name="routing_id" ref="mrp_routing_2"/>
598 <field name="type">phantom</field>562 <field name="type">phantom</field>
599 </record>563 </record>
600564
601 <record id="mrp_bom_37" model="mrp.bom">565 <record id="mrp_bom_line_27" model="mrp.bom.line">
602 <field name="name">15" LCD Monitor </field>
603 <field name="product_id" ref="product.product_product_6"/>566 <field name="product_id" ref="product.product_product_6"/>
604 <field name="product_qty">1</field>567 <field name="product_qty">1</field>
605 <field name="product_uom" ref="product.product_uom_unit"/>568 <field name="product_uom" ref="product.product_uom_unit"/>
606 <field name="sequence">2</field> 569 <field name="sequence">2</field>
607 <field name="type">normal</field>570 <field name="type">normal</field>
608 <field name="bom_id" ref="mrp_bom_36"/>571 <field name="bom_id" ref="mrp_bom_10"/>
609 </record>572 </record>
610573
611 <record id="mrp_bom_38" model="mrp.bom">574 <record id="mrp_bom_line_28" model="mrp.bom.line">
612 <field name="name">Computer Case-1</field>
613 <field name="product_id" ref="product.product_product_16"/>575 <field name="product_id" ref="product.product_product_16"/>
614 <field name="product_qty">1</field>576 <field name="product_qty">1</field>
615 <field name="product_uom" ref="product.product_uom_unit"/>577 <field name="product_uom" ref="product.product_uom_unit"/>
616 <field name="sequence">4</field> 578 <field name="sequence">4</field>
617 <field name="type">normal</field>579 <field name="type">normal</field>
618 <field name="bom_id" ref="mrp_bom_36"/>580 <field name="bom_id" ref="mrp_bom_10"/>
619 </record>581 </record>
620582
621 <record id="mrp_bom_39" model="mrp.bom">583 <record id="mrp_bom_line_29" model="mrp.bom.line">
622 <field name="name">RAM DDR 512MB</field>
623 <field name="product_id" ref="product.product_product_13"/>584 <field name="product_id" ref="product.product_product_13"/>
624 <field name="product_qty">1</field>585 <field name="product_qty">1</field>
625 <field name="product_uom" ref="product.product_uom_unit"/>586 <field name="product_uom" ref="product.product_uom_unit"/>
626 <field name="sequence">6</field> 587 <field name="sequence">6</field>
627 <field name="type">normal</field>588 <field name="type">normal</field>
628 <field name="bom_id" ref="mrp_bom_36"/>589 <field name="bom_id" ref="mrp_bom_10"/>
629 </record>590 </record>
630591
631 <record id="mrp_bom_40" model="mrp.bom">592 <record id="mrp_bom_line_30" model="mrp.bom.line">
632 <field name="name">Mouse, Laser</field>
633 <field name="product_id" ref="product.product_product_11"/>593 <field name="product_id" ref="product.product_product_11"/>
634 <field name="product_qty">1</field>594 <field name="product_qty">1</field>
635 <field name="product_uom" ref="product.product_uom_unit"/>595 <field name="product_uom" ref="product.product_uom_unit"/>
636 <field name="sequence">8</field> 596 <field name="sequence">8</field>
637 <field name="type">normal</field>597 <field name="type">normal</field>
638 <field name="bom_id" ref="mrp_bom_36"/>598 <field name="bom_id" ref="mrp_bom_10"/>
639 </record>599 </record>
640600
641 <record id="mrp_bom_41" model="mrp.bom">601 <record id="mrp_bom_line_31" model="mrp.bom.line">
642 <field name="name">USB Keyboard, QWERTY</field>
643 <field name="product_id" ref="product.product_product_8"/>602 <field name="product_id" ref="product.product_product_8"/>
644 <field name="product_qty">1</field>603 <field name="product_qty">1</field>
645 <field name="product_uom" ref="product.product_uom_unit"/>604 <field name="product_uom" ref="product.product_uom_unit"/>
646 <field name="sequence">10</field> 605 <field name="sequence">10</field>
647 <field name="type">normal</field>606 <field name="type">normal</field>
648 <field name="bom_id" ref="mrp_bom_36"/>607 <field name="bom_id" ref="mrp_bom_10"/>
649 </record>608 </record>
650609
651 <record id="mrp_production_1" model="mrp.production">610 <record id="mrp_production_1" model="mrp.production">
@@ -654,7 +613,7 @@
654 <field name="product_qty">3</field>613 <field name="product_qty">3</field>
655 <field name="location_src_id" ref="stock.stock_location_stock"/>614 <field name="location_src_id" ref="stock.stock_location_stock"/>
656 <field name="location_dest_id" ref="stock.stock_location_output"/>615 <field name="location_dest_id" ref="stock.stock_location_output"/>
657 <field name="bom_id" ref="mrp_bom_24"/>616 <field name="bom_id" ref="mrp_bom_8"/>
658 <field name="routing_id" ref="mrp.mrp_routing_2"/>617 <field name="routing_id" ref="mrp.mrp_routing_2"/>
659 </record>618 </record>
660619
@@ -663,7 +622,7 @@
663 <field name="product_uom" ref="product.product_uom_unit"/>622 <field name="product_uom" ref="product.product_uom_unit"/>
664 <field name="location_src_id" ref="stock.stock_location_stock"/>623 <field name="location_src_id" ref="stock.stock_location_stock"/>
665 <field name="location_dest_id" ref="stock.stock_location_output"/>624 <field name="location_dest_id" ref="stock.stock_location_output"/>
666 <field name="bom_id" ref="mrp.mrp_bom_7"/>625 <field name="bom_id" ref="mrp.mrp_bom_4"/>
667 <field name="routing_id" ref="mrp.mrp_routing_1"/>626 <field name="routing_id" ref="mrp.mrp_routing_1"/>
668 </record>627 </record>
669 <workflow action="button_confirm" model="mrp.production" ref="mrp_production_1"/>628 <workflow action="button_confirm" model="mrp.production" ref="mrp_production_1"/>
670629
=== modified file 'mrp/mrp_view.xml'
--- mrp/mrp_view.xml 2014-05-07 18:29:17 +0000
+++ mrp/mrp_view.xml 2014-05-26 16:10:21 +0000
@@ -347,22 +347,17 @@
347 <form string="Bill of Material" version="7.0">347 <form string="Bill of Material" version="7.0">
348 <group>348 <group>
349 <group>349 <group>
350 <field name="product_id" on_change="onchange_product_id(product_id, name, product_qty, context)" class="oe_inline"/>350 <field name="product_tmpl_id" on_change="onchange_product_tmpl_id(product_tmpl_id, product_qty, context)"/>
351 <field name="product_id"/>
352 <field name="product_uom" class="oe_inline" on_change="onchange_uom(product_tmpl_id, product_uom)" groups="product.group_uom"/>
351 <label for="product_qty" string="Quantity"/>353 <label for="product_qty" string="Quantity"/>
352 <div>354 <div>
353 <field name="product_qty" class="oe_inline" on_change="onchange_product_id(product_id, name, product_qty, context)"/>355 <field name="product_qty" class="oe_inline" on_change="onchange_product_tmpl_id(product_tmpl_id, product_qty, context)"/>
354 <field name="product_uom" class="oe_inline" on_change="onchange_uom(product_id, product_uom)" groups="product.group_uom"/>356 <field name="product_uom" class="oe_inline" on_change="onchange_uom(product_tmpl_id, product_uom)" groups="product.group_uom"/>
355 </div>
356 <label for="product_uos_qty" groups="product.group_uos"/>
357 <div groups="product.group_uos" >
358 <field name="product_uos_qty"
359 class="oe_inline"/>
360 <label string="-" attrs="{'invisible':[('product_uos','=',False)]}" class="oe_inline"/>
361 <field name="product_uos" class="oe_inline"/>
362 </div>357 </div>
363 <label for="routing_id" class="oe_inline" groups="mrp.group_mrp_routings"/>358 <label for="routing_id" class="oe_inline" groups="mrp.group_mrp_routings"/>
364 <div groups="mrp.group_mrp_routings">359 <div groups="mrp.group_mrp_routings">
365 <field name="routing_id" class="oe_inline"/>360 <field name="routing_id" class="oe_inline"/>
366 </div>361 </div>
367 </group>362 </group>
368 <group>363 <group>
@@ -378,14 +373,19 @@
378 </group>373 </group>
379 <notebook>374 <notebook>
380 <page string="Components">375 <page string="Components">
381 <field name="bom_lines" widget="one2many_list">376 <field name="bom_line_ids" widget="one2many_list">
382 <tree string="Components" editable="bottom">377 <tree string="Components" editable="bottom">
383 <field name="product_id" on_change="onchange_product_id(product_id, name)"/>378 <field name="sequence" widget="handle"/>
379 <field name="product_id" on_change="onchange_product_id(product_id, product_qty)"/>
380 <field name="type"/>
384 <field name="product_qty"/>381 <field name="product_qty"/>
382 <field name="product_rounding"/>
383 <field name="product_efficiency"/>
385 <field name="product_uom" on_change="onchange_uom(product_id, product_uom)" groups="product.group_uom"/>384 <field name="product_uom" on_change="onchange_uom(product_id, product_uom)" groups="product.group_uom"/>
386 <field name="name" invisible="1"/>
387 <field name="date_start"/>385 <field name="date_start"/>
388 <field name="date_stop"/>386 <field name="date_stop"/>
387 <field name="routing_id"/>
388 <field name="variants_ids" widget="many2many_tags"/>
389 </tree>389 </tree>
390 </field>390 </field>
391 </page>391 </page>
@@ -393,7 +393,6 @@
393 <group>393 <group>
394 <group>394 <group>
395 <field name="position"/>395 <field name="position"/>
396 <field name="bom_id"/>
397 <field name="sequence"/>396 <field name="sequence"/>
398 <field name="active"/>397 <field name="active"/>
399 </group>398 </group>
@@ -422,11 +421,11 @@
422 <field name="arch" type="xml">421 <field name="arch" type="xml">
423 <search string="Search Bill Of Material">422 <search string="Search Bill Of Material">
424 <field name="name" string="Bill Of Material" filter_domain="['|',('name','ilike',self),('code','ilike',self)]"/>423 <field name="name" string="Bill Of Material" filter_domain="['|',('name','ilike',self),('code','ilike',self)]"/>
425 <field name="bom_lines" string="Components"/>424 <field name="bom_line_ids" string="Components"/>
426 <field name="product_id"/>425 <field name="product_tmpl_id"/>
427 <field name="company_id" groups="base.group_multi_company"/>426 <field name="company_id" groups="base.group_multi_company"/>
428 <group expand="0" string="Group By...">427 <group expand="0" string="Group By...">
429 <filter string="Product" icon="terp-accessories-archiver" domain="[]" context="{'group_by':'product_id'}"/>428 <filter string="Product" icon="terp-accessories-archiver" domain="[]" context="{'group_by':'product_tmpl_id'}"/>
430 <filter string='Default Unit of Measure' icon="terp-mrp" domain="[]" context="{'group_by' : 'product_uom'}"/>429 <filter string='Default Unit of Measure' icon="terp-mrp" domain="[]" context="{'group_by' : 'product_uom'}"/>
431 <filter string="Routing" icon="terp-stock_align_left_24" domain="[]" context="{'group_by':'routing_id'}"/>430 <filter string="Routing" icon="terp-stock_align_left_24" domain="[]" context="{'group_by':'routing_id'}"/>
432 <filter string='Type' icon="terp-stock_symbol-selection" domain="[]" context="{'group_by' : 'type'}"/>431 <filter string='Type' icon="terp-stock_symbol-selection" domain="[]" context="{'group_by' : 'type'}"/>
@@ -439,13 +438,13 @@
439 <record id="mrp_bom_tree_view" model="ir.ui.view">438 <record id="mrp_bom_tree_view" model="ir.ui.view">
440 <field name="name">mrp.bom.tree</field>439 <field name="name">mrp.bom.tree</field>
441 <field name="model">mrp.bom</field>440 <field name="model">mrp.bom</field>
442 <field name="field_parent">child_complete_ids</field>441 <!--field name="field_parent">child_complete_ids</field-->
443 <field name="arch" type="xml">442 <field name="arch" type="xml">
444 <tree string="Bill of Materials">443 <tree string="Bill of Materials">
445 <field name="sequence" invisible="1"/>444 <field name="sequence" invisible="1"/>
446 <field name="name" invisible="1"/>445 <field name="name" invisible="1"/>
446 <field name="product_tmpl_id"/>
447 <field name="product_id"/>447 <field name="product_id"/>
448 <field name="product_qty"/>
449 <field name="product_uom" groups="product.group_uom"/>448 <field name="product_uom" groups="product.group_uom"/>
450 <field name="code"/>449 <field name="code"/>
451 <field name="type"/>450 <field name="type"/>
@@ -455,32 +454,12 @@
455 </tree>454 </tree>
456 </field>455 </field>
457 </record>456 </record>
458 <record id="mrp_bom_component_tree_view" model="ir.ui.view">457
459 <field name="name">mrp.bom.component.tree</field>
460 <field name="model">mrp.bom</field>
461 <field name="field_parent">child_complete_ids</field>
462 <field name="arch" type="xml">
463 <tree string="BoM Structure">
464 <field name="sequence" invisible="1"/>
465 <field name="name" groups="base.group_no_one"/>
466 <field name="code"/>
467 <field name="product_id"/>
468 <field name="bom_id" groups="product.group_mrp_properties"/>
469 <field name="product_qty"/>
470 <field name="product_uom" groups="product.group_uom"/>
471 <field name="type"/>
472 <field name="routing_id" groups="mrp.group_mrp_routings"/>
473 <field name="date_start" groups="product.group_mrp_properties"/>
474 <field name="date_stop" groups="product.group_mrp_properties"/>
475 </tree>
476 </field>
477 </record>
478 <record id="mrp_bom_form_action" model="ir.actions.act_window">458 <record id="mrp_bom_form_action" model="ir.actions.act_window">
479 <field name="name">Bill of Materials</field>459 <field name="name">Bill of Materials</field>
480 <field name="type">ir.actions.act_window</field>460 <field name="type">ir.actions.act_window</field>
481 <field name="res_model">mrp.bom</field>461 <field name="res_model">mrp.bom</field>
482 <field name="view_type">form</field>462 <field name="view_type">form</field>
483 <field name="domain">[('bom_id','=',False)]</field>
484 <field name="search_view_id" ref="view_mrp_bom_filter"/>463 <field name="search_view_id" ref="view_mrp_bom_filter"/>
485 <field name="help" type="html">464 <field name="help" type="html">
486 <p class="oe_view_nocontent_create">465 <p class="oe_view_nocontent_create">
@@ -495,13 +474,56 @@
495 </p>474 </p>
496 </field>475 </field>
497 </record>476 </record>
477
478 <record id="mrp_bom_component_tree_view" model="ir.ui.view">
479 <field name="name">mrp.bom.component.tree</field>
480 <field name="model">mrp.bom.line</field>
481 <field name="arch" type="xml">
482 <tree string="Components" editable="top">
483 <field name="sequence" widget="handle"/>
484 <field name="bom_id"/>
485 <field name="product_id" on_change="onchange_product_id(product_id)"/>
486 <field name="type"/>
487 <field name="product_qty"/>
488 <field name="product_rounding"/>
489 <field name="product_efficiency"/>
490 <field name="product_uom" on_change="onchange_uom(product_id, product_uom)" groups="product.group_uom"/>
491 <field name="product_uos_qty" groups="product.group_uos"/>
492 <field name="product_uos" groups="product.group_uos"/>
493 <field name="date_start"/>
494 <field name="date_stop"/>
495 <field name="routing_id"/>
496 <field name="variants_ids" widget="many2many_tags"/>
497 <field name="property_ids" widget="many2many_tags"/>
498 </tree>
499 </field>
500 </record>
501
502 <record id="view_mrp_bom_line_filter" model="ir.ui.view">
503 <field name="name">mrp.bom.line.select</field>
504 <field name="model">mrp.bom.line</field>
505 <field name="arch" type="xml">
506 <search string="Search Bill Of Material Components">
507 <field name="bom_id"/>
508 <field name="product_id"/>
509 <group expand="0" string="Group By...">
510 <filter string="Bill Of Material" icon="terp-accessories-archiver" domain="[]" context="{'group_by':'bom_id'}"/>
511 <filter string="Product" icon="terp-accessories-archiver" domain="[]" context="{'group_by':'product_id'}"/>
512 <filter string='Default Unit of Measure' icon="terp-mrp" domain="[]" context="{'group_by' : 'product_uom'}"/>
513 <filter string="Routing" icon="terp-stock_align_left_24" domain="[]" context="{'group_by':'routing_id'}"/>
514 <filter string='Type' icon="terp-stock_symbol-selection" domain="[]" context="{'group_by' : 'type'}"/>
515 <filter string=" Valid From Month" icon="terp-go-month" domain="[]" context="{'group_by':'date_start'}" help="Valid From Date by Month"/>
516 </group>
517 </search>
518 </field>
519 </record>
520
498 <record id="mrp_bom_form_action2" model="ir.actions.act_window">521 <record id="mrp_bom_form_action2" model="ir.actions.act_window">
499 <field name="name">Bill of Material Components</field>522 <field name="name">Bill of Material Components</field>
500 <field name="type">ir.actions.act_window</field>523 <field name="type">ir.actions.act_window</field>
501 <field name="res_model">mrp.bom</field>524 <field name="res_model">mrp.bom.line</field>
502 <field name="view_type">form</field>525 <field name="view_type">tree</field>
503 <field name="view_id" ref="mrp_bom_component_tree_view"/>526 <field name="view_mode">tree</field>
504 <field name="domain">[]</field>
505 <field name="help" type="html">527 <field name="help" type="html">
506 <p class="oe_view_nocontent_create">528 <p class="oe_view_nocontent_create">
507 Click to add a component to a bill of material.529 Click to add a component to a bill of material.
@@ -512,47 +534,32 @@
512 </p>534 </p>
513 </field>535 </field>
514 </record>536 </record>
515 <record id="product_search_form_view_procurment" model="ir.ui.view">537
516 <field name="name">product.search.bom</field>538 <record id="product_template_search_view_procurment" model="ir.ui.view">
517 <field name="model">product.product</field>539 <field name="name">product.template.search.bom</field>
518 <field name="inherit_id" ref="product.product_search_form_view"/>540 <field name="model">product.template</field>
541 <field name="inherit_id" ref="product.product_template_search_view"/>
519 <field name="arch" type="xml">542 <field name="arch" type="xml">
520 <xpath expr="//filter[@string='Consumable']" position="after">543 <xpath expr="//filter[@string='Consumable']" position="after">
521 <separator/>544 <separator/>
522 <filter string="Components" name="components" icon="terp-accessories-archiver" domain="[('bom_ids','not in',[]),('bom_ids.bom_id','!=',False)]"/>545 <filter string="Components" name="components" icon="terp-accessories-archiver" domain="[('bom_ids','not in',[])]"/>
523 </xpath>546 </xpath>
524 </field>547 </field>
525 </record>548 </record>
526 549
527 <record id="product_template_form_view_inherit" model="ir.ui.view">550 <record id="product_template_form_view_inherit" model="ir.ui.view">
528 <field name="name">product.template.form.view.inherited</field>551 <field name="name">product.product.form.view.inherited</field>
529 <field name="model">product.product</field>552 <field name="model">product.product</field>
530 <field name="inherit_id" ref="product.product_template_form_view"/>553 <field name="inherit_id" ref="product.product_normal_form_view"/>
531 <field name="arch" type="xml">554 <field name="arch" type="xml">
532 <xpath expr="//field[@name='warranty']" position="before">555 <group name="sale_condition" position="inside">
533 <label for="produce_delay"/>556 <label for="produce_delay" attrs="{'invisible':[('type','=','service')]}"/>
534 <div>557 <div attrs="{'invisible':[('type','=','service')]}">
535 <field name="produce_delay" class="oe_inline"/> days558 <field name="produce_delay" class="oe_inline"/> days
536 </div>559 </div>
537 </xpath>560 </group>
538 </field>561 </field>
539 </record>562 </record>
540
541 <record id="view_normal_procurement_locations_form_inherited" model="ir.ui.view">
542 <field name="name">product.normal.procurement.locations.inherited</field>
543 <field name="model">product.product</field>
544 <field name="inherit_id" ref="product.product_normal_form_view"/>
545 <field name="arch" type="xml">
546 <xpath expr="//group[@name='procurement_uom']" position="after">
547 <group name="delay" string="Delays" attrs="{'invisible':[('type','=','service')]}">
548 <label for="produce_delay" />
549 <div attrs="{'invisible':[('type','=','service')]}">
550 <field name="produce_delay" class="oe_inline" style="vertical-align:baseline"/> days
551 </div>
552 </group>
553 </xpath>
554 </field>
555 </record>
556563
557 <record id="view_mrp_product_form_inherited" model="ir.ui.view">564 <record id="view_mrp_product_form_inherited" model="ir.ui.view">
558 <field name="name">product.form.mrp.inherited</field>565 <field name="name">product.form.mrp.inherited</field>
@@ -686,7 +693,7 @@
686 </div>693 </div>
687 <group>694 <group>
688 <group>695 <group>
689 <field name="product_id" on_change="product_id_change(product_id, product_qty)" domain="[('bom_ids','!=',False),('bom_ids.bom_id','=',False),('bom_ids.type','!=','phantom')]" class="oe_inline" context='{"default_type": "product"}'/>696 <field name="product_id" on_change="product_id_change(product_id, product_qty)" domain="[('bom_ids','!=',False),('bom_ids.type','!=','phantom')]" class="oe_inline" context='{"default_type": "product"}'/>
690 <label for="product_qty"/>697 <label for="product_qty"/>
691 <div>698 <div>
692 <field name="product_qty" class="oe_inline" on_change="product_id_change(product_id, product_qty)"/>699 <field name="product_qty" class="oe_inline" on_change="product_id_change(product_id, product_qty)"/>
@@ -980,7 +987,7 @@
980 <field name="arch" type="xml">987 <field name="arch" type="xml">
981 <data>988 <data>
982 <xpath expr="//field[@name='origin']" position="before">989 <xpath expr="//field[@name='origin']" position="before">
983 <field name="bom_id" domain="[('product_id','=',product_id),('bom_id','=',False)]"/>990 <field name="bom_id" domain="[('product_id','=',product_id)]"/>
984 <field name="production_id" attrs="{'invisible': [('production_id','=',False)]}"/>991 <field name="production_id" attrs="{'invisible': [('production_id','=',False)]}"/>
985 </xpath>992 </xpath>
986 <xpath expr="//field[@name='origin']" position="after">993 <xpath expr="//field[@name='origin']" position="after">
@@ -992,7 +999,6 @@
992 </field>999 </field>
993 </record>1000 </record>
9941001
995
996 <!-- Menu for Resource for MRP-->1002 <!-- Menu for Resource for MRP-->
9971003
998 <record id="mrp_workcenter_action" model="ir.actions.act_window">1004 <record id="mrp_workcenter_action" model="ir.actions.act_window">
@@ -1029,14 +1035,13 @@
10291035
1030 <record id="act_product_mrp_bom_open" model="ir.actions.act_window">1036 <record id="act_product_mrp_bom_open" model="ir.actions.act_window">
1031 <field name="name">BoM Structure</field>1037 <field name="name">BoM Structure</field>
1032 <field name="context">{'default_product_id': active_id}</field>1038 <field name="context">{'default_product_tmpl_id': active_id}</field>
1033 <field name="domain">[('product_id', 'in', active_ids),('bom_id','=',False)]</field>1039 <field name="domain">[('product_tmpl_id', 'in', active_ids)]</field>
1034 <field name="res_model">mrp.bom</field>1040 <field name="res_model">mrp.bom</field>
1035 </record>1041 </record>
1036 <record model="ir.actions.act_window" id="product_open_bom">1042 <record model="ir.actions.act_window" id="product_open_bom">
1037 <field name="context">{'default_product_id': active_id, 'search_default_product_id': active_id}</field>1043 <field name="context">{'default_product_tmpl_id': active_id, 'search_default_product_tmpl_id': active_id}</field>
1038 <field name="name">Bill of Materials</field>1044 <field name="name">Bill of Materials</field>
1039 <field name="domain">[('bom_id','=',False)]</field>
1040 <field name="res_model">mrp.bom</field>1045 <field name="res_model">mrp.bom</field>
1041 <field name="view_type">form</field>1046 <field name="view_type">form</field>
1042 </record>1047 </record>
@@ -1046,12 +1051,12 @@
1046 <field name="res_model">mrp.production</field>1051 <field name="res_model">mrp.production</field>
1047 <field name="view_id" ref="mrp_production_tree_view"/>1052 <field name="view_id" ref="mrp_production_tree_view"/>
1048 </record>1053 </record>
1049 <record model="ir.ui.view" id="product_form_view_bom_button">1054 <record model="ir.ui.view" id="product_template_form_view_bom_button">
1050 <field name="name">product.product.procurement</field>1055 <field name="name">product.template.procurement</field>
1051 <field name="model">product.product</field>1056 <field name="model">product.template</field>
1052 <field name="inherit_id" ref="product.product_normal_form_view"/>1057 <field name="inherit_id" ref="product.product_template_form_view"/>
1053 <field name="arch" type="xml">1058 <field name="arch" type="xml">
1054 <xpath expr="//div[@name='buttons']" position="inside">1059 <div name="buttons" position="inside">
1055 <button class="oe_inline oe_stat_button" name="%(product_open_bom)d" type="action" 1060 <button class="oe_inline oe_stat_button" name="%(product_open_bom)d" type="action"
1056 groups="mrp.group_mrp_user" attrs="{'invisible':[('type', '=', 'service')]}" icon="fa-flask">1061 groups="mrp.group_mrp_user" attrs="{'invisible':[('type', '=', 'service')]}" icon="fa-flask">
1057 <field string="Bill of Materials" name="bom_count" widget="statinfo" />1062 <field string="Bill of Materials" name="bom_count" widget="statinfo" />
@@ -1064,7 +1069,7 @@
1064 groups="mrp.group_mrp_user" attrs="{'invisible':[('type', '=', 'service')]}" icon="fa-list-alt">1069 groups="mrp.group_mrp_user" attrs="{'invisible':[('type', '=', 'service')]}" icon="fa-list-alt">
1065 <field string="Manufacturing" name="mo_count" widget="statinfo" />1070 <field string="Manufacturing" name="mo_count" widget="statinfo" />
1066 </button>1071 </button>
1067 </xpath>1072 </div>
1068 </field>1073 </field>
1069 </record>1074 </record>
1070 1075
10711076
=== modified file 'mrp/procurement.py'
--- mrp/procurement.py 2014-05-07 17:14:31 +0000
+++ mrp/procurement.py 2014-05-26 16:10:21 +0000
@@ -62,7 +62,8 @@
62 """62 """
63 for procurement in self.browse(cr, uid, ids, context=context):63 for procurement in self.browse(cr, uid, ids, context=context):
64 properties = [x.id for x in procurement.property_ids]64 properties = [x.id for x in procurement.property_ids]
65 bom_id = self.pool.get('mrp.bom')._bom_find(cr, uid, procurement.product_id.id, procurement.product_uom.id, properties)65 bom_id = self.pool.get('mrp.bom')._bom_find(cr, uid, procurement.product_uom.id,
66 product_id=procurement.product_id.id, properties=properties)
66 if not bom_id:67 if not bom_id:
67 return False68 return False
68 return True69 return True
@@ -83,7 +84,8 @@
83 routing_id = procurement.bom_id.routing_id.id84 routing_id = procurement.bom_id.routing_id.id
84 else:85 else:
85 properties = [x.id for x in procurement.property_ids]86 properties = [x.id for x in procurement.property_ids]
86 bom_id = bom_obj._bom_find(cr, uid, procurement.product_id.id, procurement.product_uom.id, properties)87 bom_id = bom_obj._bom_find(cr, uid, procurement.product_uom.id,
88 product_id=procurement.product_id.id, properties=properties)
87 bom = bom_obj.browse(cr, uid, bom_id, context=context)89 bom = bom_obj.browse(cr, uid, bom_id, context=context)
88 routing_id = bom.routing_id.id90 routing_id = bom.routing_id.id
8991
9092
=== modified file 'mrp/product.py'
--- mrp/product.py 2014-01-07 10:39:15 +0000
+++ mrp/product.py 2014-05-26 16:10:21 +0000
@@ -20,27 +20,59 @@
20##############################################################################20##############################################################################
2121
22from openerp.osv import fields, osv22from openerp.osv import fields, osv
23from openerp.tools.translate import _23
2424
25class product_template(osv.osv):
26 _inherit = "product.template"
27 def _bom_orders_count(self, cr, uid, ids, field_name, arg, context=None):
28 Bom = self.pool('mrp.bom')
29 res = {}
30 for product_tmpl_id in ids:
31 nb = Bom.search_count(cr, uid, [('product_tmpl_id', '=', product_tmpl_id)], context=context)
32 res[product_tmpl_id] = {
33 'bom_count': nb,
34 'bom_strct': nb,
35 }
36 return res
37
38 def _bom_orders_count_mo(self, cr, uid, ids, name, arg, context=None):
39 res = {}
40 for product_tmpl_id in self.browse(cr, uid, ids):
41 res[product_tmpl_id.id] = sum([p.mo_count for p in product_tmpl_id.product_variant_ids])
42 return res
43
44 _columns = {
45 "bom_ids": fields.one2many('mrp.bom', 'product_tmpl_id','Bill of Materials'),
46 'bom_count': fields.function(_bom_orders_count, string='# Bill of Material', type='integer', multi="_bom_order_count"),
47 'bom_strct': fields.function(_bom_orders_count, string='# Bill of Material Structure', type='integer', multi="_bom_order_count"),
48 'mo_count': fields.function(_bom_orders_count_mo, string='# Manufacturing Orders', type='integer'),
49 }
50 def copy(self, cr, uid, id, default=None, context=None):
51 if not default:
52 default = {}
53 default.update({
54 'bom_ids': []
55 })
56 return super(product_template, self).copy(cr, uid, id, default, context=context)
2557
26class product_product(osv.osv):58class product_product(osv.osv):
27 _inherit = "product.product" 59 _inherit = "product.product"
60 def _bom_orders_count(self, cr, uid, ids, field_name, arg, context=None):
61 Production = self.pool('mrp.production')
62 res = {}
63 for product_id in ids:
64 res[product_id] = Production.search_count(cr,uid, [('product_id', '=', product_id)], context=context)
65 return res
66
28 _columns = {67 _columns = {
29 "bom_ids": fields.one2many('mrp.bom', 'product_id','Bill of Materials', domain=[('bom_id','=',False)]),
30 "produce_delay": fields.float('Manufacturing Lead Time', help="Average delay in days to produce this product. In the case of multi-level BOM, the manufacturing lead times of the components will be added."),68 "produce_delay": fields.float('Manufacturing Lead Time', help="Average delay in days to produce this product. In the case of multi-level BOM, the manufacturing lead times of the components will be added."),
31 'track_production': fields.boolean('Track Manufacturing Lots', help="Forces to specify a Serial Number for all moves containing this product and generated by a Manufacturing Order"),69 'track_production': fields.boolean('Track Manufacturing Lots', help="Forces to specify a Serial Number for all moves containing this product and generated by a Manufacturing Order"),
70 'mo_count': fields.function(_bom_orders_count, string='# Manufacturing Orders', type='integer'),
32 }71 }
33 72
34 _defaults = {73 _defaults = {
35 "produce_delay": 1,74 "produce_delay": 1,
36 }75 }
37 def copy(self, cr, uid, id, default=None, context=None):
38 if not default:
39 default = {}
40 default.update({
41 'bom_ids': []
42 })
43 return super(product_product, self).copy(cr, uid, id, default, context=context)
4476
4577
4678
4779
=== modified file 'mrp/report/price.py'
--- mrp/report/price.py 2014-01-06 13:57:00 +0000
+++ mrp/report/price.py 2014-05-26 16:10:21 +0000
@@ -144,7 +144,7 @@
144144
145 for product in product_pool.browse(cr, uid, ids, context=context):145 for product in product_pool.browse(cr, uid, ids, context=context):
146 product_uom_name = to_xml(product.uom_id.name)146 product_uom_name = to_xml(product.uom_id.name)
147 bom_id = bom_pool._bom_find(cr, uid, product.id, product.uom_id.id)147 bom_id = bom_pool._bom_find(cr, uid, product.uom_id.id, product_id=product.id)
148 title = "<title>%s</title>" %(_("Cost Structure"))148 title = "<title>%s</title>" %(_("Cost Structure"))
149 title += "<title>%s</title>" % (to_xml(product.name))149 title += "<title>%s</title>" % (to_xml(product.name))
150 xml += "<lines style='header'>" + title + prod_header + "</lines>"150 xml += "<lines style='header'>" + title + prod_header + "</lines>"
@@ -168,7 +168,7 @@
168 else:168 else:
169 bom = bom_pool.browse(cr, uid, bom_id, context=context)169 bom = bom_pool.browse(cr, uid, bom_id, context=context)
170 factor = number * product.uom_id.factor / bom.product_uom.factor170 factor = number * product.uom_id.factor / bom.product_uom.factor
171 sub_boms = bom_pool._bom_explode(cr, uid, bom, factor / bom.product_qty)171 sub_boms = bom_pool._bom_explode(cr, uid, bom, product, factor / bom.product_qty)
172 total = 0172 total = 0
173 total_strd = 0173 total_strd = 0
174 parent_bom = {174 parent_bom = {
175175
=== modified file 'mrp/security/ir.model.access.csv'
--- mrp/security/ir.model.access.csv 2014-05-02 13:03:52 +0000
+++ mrp/security/ir.model.access.csv 2014-05-26 16:10:21 +0000
@@ -4,6 +4,7 @@
4access_mrp_routing,mrp.routing,model_mrp_routing,mrp.group_mrp_user,1,0,0,04access_mrp_routing,mrp.routing,model_mrp_routing,mrp.group_mrp_user,1,0,0,0
5access_mrp_routing_workcenter,mrp.routing.workcenter,model_mrp_routing_workcenter,mrp.group_mrp_user,1,0,0,05access_mrp_routing_workcenter,mrp.routing.workcenter,model_mrp_routing_workcenter,mrp.group_mrp_user,1,0,0,0
6access_mrp_bom,mrp.bom,model_mrp_bom,group_mrp_user,1,0,0,06access_mrp_bom,mrp.bom,model_mrp_bom,group_mrp_user,1,0,0,0
7access_mrp_bom_line,mrp.bom.line,model_mrp_bom_line,group_mrp_user,1,0,0,0
7access_mrp_production,mrp.production user,model_mrp_production,mrp.group_mrp_user,1,1,1,18access_mrp_production,mrp.production user,model_mrp_production,mrp.group_mrp_user,1,1,1,1
8access_mrp_production_salesman,mrp.production salesman,model_mrp_production,base.group_sale_salesman,1,1,1,09access_mrp_production_salesman,mrp.production salesman,model_mrp_production,base.group_sale_salesman,1,1,1,0
9access_mrp_production_product_line_salesman,mrp.production.product.line salesman,model_mrp_production_product_line,base.group_sale_salesman,1,0,1,010access_mrp_production_product_line_salesman,mrp.production.product.line salesman,model_mrp_production_product_line,base.group_sale_salesman,1,0,1,0
@@ -14,6 +15,7 @@
14access_mrp_routing_manager,mrp.routing.manager,model_mrp_routing,mrp.group_mrp_manager,1,1,1,115access_mrp_routing_manager,mrp.routing.manager,model_mrp_routing,mrp.group_mrp_manager,1,1,1,1
15access_mrp_routing_workcenter_manager,mrp.routing.workcenter.manager,model_mrp_routing_workcenter,mrp.group_mrp_manager,1,1,1,116access_mrp_routing_workcenter_manager,mrp.routing.workcenter.manager,model_mrp_routing_workcenter,mrp.group_mrp_manager,1,1,1,1
16access_mrp_bom_manager,mrp.bom.manager,model_mrp_bom,mrp.group_mrp_manager,1,1,1,117access_mrp_bom_manager,mrp.bom.manager,model_mrp_bom,mrp.group_mrp_manager,1,1,1,1
18access_mrp_bom_line_manager,mrp.bom.line.manager,model_mrp_bom_line,mrp.group_mrp_manager,1,1,1,1
17access_stock_location_mrp_worker,stock.location mrp_worker,stock.model_stock_location,mrp.group_mrp_user,1,0,0,019access_stock_location_mrp_worker,stock.location mrp_worker,stock.model_stock_location,mrp.group_mrp_user,1,0,0,0
18access_stock_move_mrp_worker,stock.move mrp_worker,stock.model_stock_move,mrp.group_mrp_user,1,1,1,020access_stock_move_mrp_worker,stock.move mrp_worker,stock.model_stock_move,mrp.group_mrp_user,1,1,1,0
19access_stock_picking_mrp_worker,stock.picking mrp_worker,stock.model_stock_picking,mrp.group_mrp_user,1,1,1,121access_stock_picking_mrp_worker,stock.picking mrp_worker,stock.model_stock_picking,mrp.group_mrp_user,1,1,1,1
@@ -55,6 +57,8 @@
55access_report_workcenter_load_user,report.workcenter.load.user,model_report_workcenter_load,mrp.group_mrp_user,1,0,0,057access_report_workcenter_load_user,report.workcenter.load.user,model_report_workcenter_load,mrp.group_mrp_user,1,0,0,0
56access_mrp_bom_salesman,mrp.bom,model_mrp_bom,base.group_sale_salesman,1,0,0,058access_mrp_bom_salesman,mrp.bom,model_mrp_bom,base.group_sale_salesman,1,0,0,0
57access_mrp_bom_stockuser,mrp.bom,model_mrp_bom,stock.group_stock_user,1,0,0,059access_mrp_bom_stockuser,mrp.bom,model_mrp_bom,stock.group_stock_user,1,0,0,0
60access_mrp_bom_line_salesman,mrp.bom.line,model_mrp_bom_line,base.group_sale_salesman,1,0,0,0
61access_mrp_bom_line_stockuser,mrp.bom.line,model_mrp_bom_line,stock.group_stock_user,1,0,0,0
58access_product_uom_categ_mrp_manager,product.uom.categ mrp_manager,product.model_product_uom_categ,mrp.group_mrp_manager,1,1,1,162access_product_uom_categ_mrp_manager,product.uom.categ mrp_manager,product.model_product_uom_categ,mrp.group_mrp_manager,1,1,1,1
59access_product_uom_mrp_manager,product.uom mrp_manager,product.model_product_uom,mrp.group_mrp_manager,1,1,1,163access_product_uom_mrp_manager,product.uom mrp_manager,product.model_product_uom,mrp.group_mrp_manager,1,1,1,1
60access_product_ul_mrp_manager,product.ul mrp_manager,product.model_product_ul,mrp.group_mrp_manager,1,1,1,164access_product_ul_mrp_manager,product.ul mrp_manager,product.model_product_ul,mrp.group_mrp_manager,1,1,1,1
6165
=== modified file 'mrp/stock.py'
--- mrp/stock.py 2014-05-07 17:24:46 +0000
+++ mrp/stock.py 2014-05-26 16:10:21 +0000
@@ -55,13 +55,14 @@
55 user_company = self.pool.get('res.users').browse(cr, uid, uid, context=context).company_id.id55 user_company = self.pool.get('res.users').browse(cr, uid, uid, context=context).company_id.id
56 #doing the search as SUPERUSER because a user with the permission to write on a stock move should be able to explode it56 #doing the search as SUPERUSER because a user with the permission to write on a stock move should be able to explode it
57 #without giving him the right to read the boms.57 #without giving him the right to read the boms.
58 return self.pool.get('mrp.bom').search(cr, SUPERUSER_ID, [58 domain = [
59 ('product_id', '=', move.product_id.id),59 '|', ('product_id', '=', move.product_id.id),
60 ('bom_id', '=', False),60 '&', ('product_id', '=', False), ('product_tmpl_id.product_variant_ids', '=', move.product_id.id),
61 ('type', '=', 'phantom'),61 ('type', '=', 'phantom'),
62 '|', ('date_start', '=', False), ('date_start', '<=', time.strftime(DEFAULT_SERVER_DATETIME_FORMAT)),62 '|', ('date_start', '=', False), ('date_start', '<=', time.strftime(DEFAULT_SERVER_DATETIME_FORMAT)),
63 '|', ('date_stop', '=', False), ('date_stop', '>=', time.strftime(DEFAULT_SERVER_DATETIME_FORMAT)),63 '|', ('date_stop', '=', False), ('date_stop', '>=', time.strftime(DEFAULT_SERVER_DATETIME_FORMAT)),
64 ('company_id', '=', user_company)], context=context)64 ('company_id', '=', user_company)]
65 return self.pool.get('mrp.bom').search(cr, SUPERUSER_ID, domain, context=context)
6566
66 def _action_explode(self, cr, uid, move, context=None):67 def _action_explode(self, cr, uid, move, context=None):
67 """ Explodes pickings.68 """ Explodes pickings.
@@ -76,7 +77,7 @@
76 if bis:77 if bis:
77 factor = move.product_qty78 factor = move.product_qty
78 bom_point = bom_obj.browse(cr, SUPERUSER_ID, bis[0], context=context)79 bom_point = bom_obj.browse(cr, SUPERUSER_ID, bis[0], context=context)
79 res = bom_obj._bom_explode(cr, SUPERUSER_ID, bom_point, factor, [])80 res = bom_obj._bom_explode(cr, SUPERUSER_ID, bom_point, move.product_id, factor, [])
80 state = 'confirmed'81 state = 'confirmed'
81 if move.state == 'assigned':82 if move.state == 'assigned':
82 state = 'assigned'83 state = 'assigned'
8384
=== modified file 'mrp/test/bom_with_service_type_product.yml'
--- mrp/test/bom_with_service_type_product.yml 2014-02-05 09:34:11 +0000
+++ mrp/test/bom_with_service_type_product.yml 2014-05-26 16:10:21 +0000
@@ -4,17 +4,17 @@
4 !record {model: mrp.bom, id: mrp_bom_test1}:4 !record {model: mrp.bom, id: mrp_bom_test1}:
5 company_id: base.main_company5 company_id: base.main_company
6 name: PC Assemble SC2346 name: PC Assemble SC234
7 product_tmpl_id: product.product_product_3_product_template
7 product_id: product.product_product_38 product_id: product.product_product_3
9 product_uom: product.product_uom_unit
8 product_qty: 1.010 product_qty: 1.0
9 type: normal11 type: normal
10 bom_lines:12 bom_line_ids:
11 - company_id: base.main_company13 - product_id: product.product_product_2
12 name: On Site Assistance14 product_uom: product.product_uom_unit
13 product_id: product.product_product_2
14 product_qty: 1.015 product_qty: 1.0
15 - company_id: base.main_company16 - product_id: product.product_product_44
16 name: GrapWorks Software17 product_uom: product.product_uom_unit
17 product_id: product.product_product_44
18 product_qty: 1.018 product_qty: 1.0
19-19-
20 I make the production order using BoM having one service type product and one consumable product.20 I make the production order using BoM having one service type product and one consumable product.
2121
=== modified file 'mrp/test/order_demo.yml'
--- mrp/test/order_demo.yml 2014-04-04 16:17:13 +0000
+++ mrp/test/order_demo.yml 2014-05-26 16:10:21 +0000
@@ -7,11 +7,11 @@
7 I create Production Order of PC Assemble SC349 to produce 5.0 Unit.7 I create Production Order of PC Assemble SC349 to produce 5.0 Unit.
8-8-
9 !record {model: mrp.production, id: mrp_production_test1}:9 !record {model: mrp.production, id: mrp_production_test1}:
10 product_id: product.product_product_410 product_id: product.product_product_3
11 product_qty: 5.011 product_qty: 5.0
12 location_src_id: stock.stock_location_1412 location_src_id: stock.stock_location_14
13 location_dest_id: stock.stock_location_output13 location_dest_id: stock.stock_location_output
14 bom_id: mrp_bom_2414 bom_id: mrp_bom_9
15 routing_id: mrp.mrp_routing_115 routing_id: mrp.mrp_routing_1
16 16
17 17
1818
=== modified file 'mrp/views/report_mrpbomstructure.xml'
--- mrp/views/report_mrpbomstructure.xml 2014-02-24 10:34:53 +0000
+++ mrp/views/report_mrpbomstructure.xml 2014-05-26 16:10:21 +0000
@@ -27,10 +27,9 @@
27 </td>27 </td>
28 <td><span t-field="o.code"/></td>28 <td><span t-field="o.code"/></td>
29 </tr>29 </tr>
30 <tr t-foreach="get_children(o.bom_lines)" t-as="l">30 <tr t-foreach="get_children(o.bom_line_ids)" t-as="l">
31 <td>31 <td>
32 <span style="color: white;" t-esc="'... '*(l['level'])"/>32 <span style="color: white;" t-esc="'... '*(l['level'])"/>
33 - <span t-esc="l['name']"/>
34 </td>33 </td>
35 <td>34 <td>
36 [ <span t-esc="l['pcode']"/> ]35 [ <span t-esc="l['pcode']"/> ]
3736
=== modified file 'mrp/wizard/change_production_qty.py'
--- mrp/wizard/change_production_qty.py 2013-11-29 16:56:44 +0000
+++ mrp/wizard/change_production_qty.py 2014-05-26 16:10:21 +0000
@@ -78,7 +78,7 @@
78 bom_point = prod.bom_id78 bom_point = prod.bom_id
79 bom_id = prod.bom_id.id79 bom_id = prod.bom_id.id
80 if not bom_point:80 if not bom_point:
81 bom_id = bom_obj._bom_find(cr, uid, prod.product_id.id, prod.product_uom.id)81 bom_id = bom_obj._bom_find(cr, uid, prod.product_uom.id, product_id=prod.product_id.id)
82 if not bom_id:82 if not bom_id:
83 raise osv.except_osv(_('Error!'), _("Cannot find bill of material for this product."))83 raise osv.except_osv(_('Error!'), _("Cannot find bill of material for this product."))
84 prod_obj.write(cr, uid, [prod.id], {'bom_id': bom_id})84 prod_obj.write(cr, uid, [prod.id], {'bom_id': bom_id})
@@ -89,7 +89,7 @@
8989
90 factor = prod.product_qty * prod.product_uom.factor / bom_point.product_uom.factor90 factor = prod.product_qty * prod.product_uom.factor / bom_point.product_uom.factor
91 product_details, workcenter_details = \91 product_details, workcenter_details = \
92 bom_obj._bom_explode(cr, uid, bom_point, factor / bom_point.product_qty, [])92 bom_obj._bom_explode(cr, uid, bom_point, prod.product_id, factor / bom_point.product_qty, [])
93 for r in product_details:93 for r in product_details:
94 if r['product_id'] == move.product_id.id:94 if r['product_id'] == move.product_id.id:
95 move_obj.write(cr, uid, [move.id], {'product_uom_qty': r['product_qty']})95 move_obj.write(cr, uid, [move.id], {'product_uom_qty': r['product_qty']})
9696
=== modified file 'mrp_byproduct/test/mrp_byproduct.yml'
--- mrp_byproduct/test/mrp_byproduct.yml 2014-01-22 12:52:11 +0000
+++ mrp_byproduct/test/mrp_byproduct.yml 2014-05-26 16:10:21 +0000
@@ -4,7 +4,7 @@
4-4-
5 I add a sub product in Bill of material for product External Hard Disk.5 I add a sub product in Bill of material for product External Hard Disk.
6-6-
7 !record {model: mrp.bom, id: mrp.mrp_bom_24}:7 !record {model: mrp.bom, id: mrp.mrp_bom_9}:
8 product_id: product.product_product_288 product_id: product.product_product_28
9 name: External Hard Disk + Subproduct9 name: External Hard Disk + Subproduct
10 product_uom: product.product_uom_unit10 product_uom: product.product_uom_unit
@@ -20,7 +20,7 @@
20 product_id: product.product_product_2820 product_id: product.product_product_28
21 product_qty: 2.021 product_qty: 2.0
22 product_uom: product.product_uom_unit22 product_uom: product.product_uom_unit
23 bom_id: mrp.mrp_bom_2423 bom_id: mrp.mrp_bom_9
24 location_src_id: stock.stock_location_stock24 location_src_id: stock.stock_location_stock
25-25-
26 I compute the data of production order.26 I compute the data of production order.
2727
=== modified file 'point_of_sale/point_of_sale.py'
--- point_of_sale/point_of_sale.py 2014-05-08 14:39:40 +0000
+++ point_of_sale/point_of_sale.py 2014-05-26 16:10:21 +0000
@@ -1318,30 +1318,80 @@
1318 self.pool[m].write(cr,uid,[m_id],{'ean13':ean13})1318 self.pool[m].write(cr,uid,[m_id],{'ean13':ean13})
1319 return { 'type' : 'ir.actions.act_window_close' }1319 return { 'type' : 'ir.actions.act_window_close' }
13201320
1321class product_product(osv.osv):1321class pos_category(osv.osv):
1322 _inherit = 'product.product'1322 _name = "pos.category"
13231323 _description = "Public Category"
13241324 _order = "sequence, name"
1325 #def _get_small_image(self, cr, uid, ids, prop, unknow_none, context=None):1325
1326 # result = {}1326 _constraints = [
1327 # for obj in self.browse(cr, uid, ids, context=context):1327 (osv.osv._check_recursion, 'Error ! You cannot create recursive categories.', ['parent_id'])
1328 # if not obj.product_image:1328 ]
1329 # result[obj.id] = False1329
1330 # continue1330 def name_get(self, cr, uid, ids, context=None):
13311331 if not len(ids):
1332 # image_stream = io.BytesIO(obj.product_image.decode('base64'))1332 return []
1333 # img = Image.open(image_stream)1333 reads = self.read(cr, uid, ids, ['name','parent_id'], context=context)
1334 # img.thumbnail((120, 100), Image.ANTIALIAS)1334 res = []
1335 # img_stream = StringIO.StringIO()1335 for record in reads:
1336 # img.save(img_stream, "JPEG")1336 name = record['name']
1337 # result[obj.id] = img_stream.getvalue().encode('base64')1337 if record['parent_id']:
1338 # return result1338 name = record['parent_id'][1]+' / '+name
1339 res.append((record['id'], name))
1340 return res
1341
1342 def _name_get_fnc(self, cr, uid, ids, prop, unknow_none, context=None):
1343 res = self.name_get(cr, uid, ids, context=context)
1344 return dict(res)
1345
1346 def _get_image(self, cr, uid, ids, name, args, context=None):
1347 result = dict.fromkeys(ids, False)
1348 for obj in self.browse(cr, uid, ids, context=context):
1349 result[obj.id] = tools.image_get_resized_images(obj.image)
1350 return result
1351
1352 def _set_image(self, cr, uid, id, name, value, args, context=None):
1353 return self.write(cr, uid, [id], {'image': tools.image_resize_image_big(value)}, context=context)
1354
1355 _columns = {
1356 'name': fields.char('Name', required=True, translate=True),
1357 'complete_name': fields.function(_name_get_fnc, type="char", string='Name'),
1358 'parent_id': fields.many2one('product.public.category','Parent Category', select=True),
1359 'child_id': fields.one2many('product.public.category', 'parent_id', string='Children Categories'),
1360 'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of product categories."),
1361
1362 # NOTE: there is no 'default image', because by default we don't show thumbnails for categories. However if we have a thumbnail
1363 # for at least one category, then we display a default image on the other, so that the buttons have consistent styling.
1364 # In this case, the default image is set by the js code.
1365 # NOTE2: image: all image fields are base64 encoded and PIL-supported
1366 'image': fields.binary("Image",
1367 help="This field holds the image used as image for the cateogry, limited to 1024x1024px."),
1368 'image_medium': fields.function(_get_image, fnct_inv=_set_image,
1369 string="Medium-sized image", type="binary", multi="_get_image",
1370 store={
1371 'product.public.category': (lambda self, cr, uid, ids, c={}: ids, ['image'], 10),
1372 },
1373 help="Medium-sized image of the category. It is automatically "\
1374 "resized as a 128x128px image, with aspect ratio preserved. "\
1375 "Use this field in form views or some kanban views."),
1376 'image_small': fields.function(_get_image, fnct_inv=_set_image,
1377 string="Smal-sized image", type="binary", multi="_get_image",
1378 store={
1379 'product.public.category': (lambda self, cr, uid, ids, c={}: ids, ['image'], 10),
1380 },
1381 help="Small-sized image of the category. It is automatically "\
1382 "resized as a 64x64px image, with aspect ratio preserved. "\
1383 "Use this field anywhere a small image is required."),
1384 }
1385
1386class product_template(osv.osv):
1387 _inherit = 'product.template'
13391388
1340 _columns = {1389 _columns = {
1341 'income_pdt': fields.boolean('Point of Sale Cash In', help="Check if, this is a product you can use to put cash into a statement for the point of sale backend."),1390 'income_pdt': fields.boolean('Point of Sale Cash In', help="Check if, this is a product you can use to put cash into a statement for the point of sale backend."),
1342 'expense_pdt': fields.boolean('Point of Sale Cash Out', help="Check if, this is a product you can use to take cash from a statement for the point of sale backend, example: money lost, transfer to bank, etc."),1391 'expense_pdt': fields.boolean('Point of Sale Cash Out', help="Check if, this is a product you can use to take cash from a statement for the point of sale backend, example: money lost, transfer to bank, etc."),
1343 'available_in_pos': fields.boolean('Available in the Point of Sale', help='Check if you want this product to appear in the Point of Sale'), 1392 'available_in_pos': fields.boolean('Available in the Point of Sale', help='Check if you want this product to appear in the Point of Sale'),
1344 'to_weight' : fields.boolean('To Weigh', help="Check if the product should be weighted (mainly used with self check-out interface)."),1393 'to_weight' : fields.boolean('To Weigh', help="Check if the product should be weighted (mainly used with self check-out interface)."),
1394 'pos_categ_id': fields.many2one('pos.category','Point of Sale Category', help="Those categories are used to group similar products for point of sale."),
1345 }1395 }
13461396
1347 _defaults = {1397 _defaults = {
13481398
=== modified file 'point_of_sale/point_of_sale_demo.xml'
--- point_of_sale/point_of_sale_demo.xml 2014-01-27 17:21:21 +0000
+++ point_of_sale/point_of_sale_demo.xml 2014-05-26 16:10:21 +0000
@@ -39,145 +39,146 @@
39 <field name="journal_ids" eval="[(6, 0, [ref('account.cash_journal'), ref('account.bank_journal'), ref('account.check_journal')])]" />39 <field name="journal_ids" eval="[(6, 0, [ref('account.cash_journal'), ref('account.bank_journal'), ref('account.check_journal')])]" />
40 </record>40 </record>
4141
42 <!-- Resource: product.public.category -->42 <!-- Resource: pos.category -->
4343
44 <record id="product.computers" model="product.public.category">44 <record id="computers" model="pos.category">
45 <field name="name">Computers</field>
45 <field name="image" type="base64" file="point_of_sale/static/img/computer.png"/>46 <field name="image" type="base64" file="point_of_sale/static/img/computer.png"/>
46 </record>47 </record>
4748
48 <record id="beverage" model="product.public.category">49 <record id="beverage" model="pos.category">
49 <field name="name">Beverages</field>50 <field name="name">Beverages</field>
50 <field name="image" type="base64" file="point_of_sale/static/img/beverage-image.jpg"/>51 <field name="image" type="base64" file="point_of_sale/static/img/beverage-image.jpg"/>
51 </record>52 </record>
5253
53 <record id="water" model="product.public.category">54 <record id="water" model="pos.category">
54 <field name="parent_id" ref="beverage"/>55 <field name="parent_id" ref="beverage"/>
55 <field name="name">Water</field>56 <field name="name">Water</field>
56 <field name="image" type="base64" file="point_of_sale/static/img/water-image.jpg"/>57 <field name="image" type="base64" file="point_of_sale/static/img/water-image.jpg"/>
57 </record>58 </record>
58 <record id="plain_water" model="product.public.category">59 <record id="plain_water" model="pos.category">
59 <field name="parent_id" ref="water"/>60 <field name="parent_id" ref="water"/>
60 <field name="name">Plain Water</field>61 <field name="name">Plain Water</field>
61 <field name="image" type="base64" file="point_of_sale/static/img/plain_water-image.jpg"/>62 <field name="image" type="base64" file="point_of_sale/static/img/plain_water-image.jpg"/>
62 </record>63 </record>
63 <record id="sparkling_water" model="product.public.category">64 <record id="sparkling_water" model="pos.category">
64 <field name="parent_id" ref="water"/>65 <field name="parent_id" ref="water"/>
65 <field name="name">Sparkling Water</field>66 <field name="name">Sparkling Water</field>
66 <field name="image" type="base64" file="point_of_sale/static/img/sparkling_water-image.jpg"/>67 <field name="image" type="base64" file="point_of_sale/static/img/sparkling_water-image.jpg"/>
67 </record>68 </record>
68 <record id="soda" model="product.public.category">69 <record id="soda" model="pos.category">
69 <field name="parent_id" ref="beverage"/>70 <field name="parent_id" ref="beverage"/>
70 <field name="name">Soda</field>71 <field name="name">Soda</field>
71 <field name="image" type="base64" file="point_of_sale/static/img/soda-image.jpg"/>72 <field name="image" type="base64" file="point_of_sale/static/img/soda-image.jpg"/>
72 </record>73 </record>
73 <record id="coke" model="product.public.category">74 <record id="coke" model="pos.category">
74 <field name="parent_id" ref="soda"/>75 <field name="parent_id" ref="soda"/>
75 <field name="name">Coke</field>76 <field name="name">Coke</field>
76 <field name="image" type="base64" file="point_of_sale/static/img/coke-image.jpg"/>77 <field name="image" type="base64" file="point_of_sale/static/img/coke-image.jpg"/>
77 </record>78 </record>
78 <record id="soda_orange" model="product.public.category">79 <record id="soda_orange" model="pos.category">
79 <field name="parent_id" ref="soda"/>80 <field name="parent_id" ref="soda"/>
80 <field name="name">Orange</field>81 <field name="name">Orange</field>
81 <field name="image" type="base64" file="point_of_sale/static/img/soda_orange-image.jpg"/>82 <field name="image" type="base64" file="point_of_sale/static/img/soda_orange-image.jpg"/>
82 </record>83 </record>
83 <record id="beers" model="product.public.category">84 <record id="beers" model="pos.category">
84 <field name="parent_id" ref="beverage"/>85 <field name="parent_id" ref="beverage"/>
85 <field name="name">Beers</field>86 <field name="name">Beers</field>
86 <field name="image" type="base64" file="point_of_sale/static/img/beers-image.jpg"/>87 <field name="image" type="base64" file="point_of_sale/static/img/beers-image.jpg"/>
87 </record>88 </record>
88 <record id="pils" model="product.public.category">89 <record id="pils" model="pos.category">
89 <field name="parent_id" ref="beers"/>90 <field name="parent_id" ref="beers"/>
90 <field name="name">Pils</field>91 <field name="name">Pils</field>
91 <field name="image" type="base64" file="point_of_sale/static/img/pils-image.jpg"/>92 <field name="image" type="base64" file="point_of_sale/static/img/pils-image.jpg"/>
92 </record>93 </record>
93 <record id="fruity_beers" model="product.public.category">94 <record id="fruity_beers" model="pos.category">
94 <field name="parent_id" ref="beers"/>95 <field name="parent_id" ref="beers"/>
95 <field name="name">Fruity Beers</field>96 <field name="name">Fruity Beers</field>
96 <field name="image" type="base64" file="point_of_sale/static/img/fruity_beers-image.jpg"/>97 <field name="image" type="base64" file="point_of_sale/static/img/fruity_beers-image.jpg"/>
97 </record>98 </record>
98 <record id="special_beers" model="product.public.category">99 <record id="special_beers" model="pos.category">
99 <field name="parent_id" ref="beers"/>100 <field name="parent_id" ref="beers"/>
100 <field name="name">Special Beers</field>101 <field name="name">Special Beers</field>
101 <field name="image" type="base64" file="point_of_sale/static/img/special_beers-image.jpg"/>102 <field name="image" type="base64" file="point_of_sale/static/img/special_beers-image.jpg"/>
102 </record>103 </record>
103 <record id="food" model="product.public.category">104 <record id="food" model="pos.category">
104 <field name="name">Food</field>105 <field name="name">Food</field>
105 <field name="image" type="base64" file="point_of_sale/static/img/food-image.jpg"/>106 <field name="image" type="base64" file="point_of_sale/static/img/food-image.jpg"/>
106 </record>107 </record>
107 <record id="pizza" model="product.public.category">108 <record id="pizza" model="pos.category">
108 <field name="parent_id" ref="food"/>109 <field name="parent_id" ref="food"/>
109 <field name="name">Pizza</field>110 <field name="name">Pizza</field>
110 <field name="image" type="base64" file="point_of_sale/static/img/pizza-image.jpg"/>111 <field name="image" type="base64" file="point_of_sale/static/img/pizza-image.jpg"/>
111 </record>112 </record>
112 <record id="ice_cream" model="product.public.category">113 <record id="ice_cream" model="pos.category">
113 <field name="parent_id" ref="food"/>114 <field name="parent_id" ref="food"/>
114 <field name="name">Ice Cream</field>115 <field name="name">Ice Cream</field>
115 <field name="image" type="base64" file="point_of_sale/static/img/ice_cream-image.jpg"/>116 <field name="image" type="base64" file="point_of_sale/static/img/ice_cream-image.jpg"/>
116 </record>117 </record>
117 <record id="chips" model="product.public.category">118 <record id="chips" model="pos.category">
118 <field name="parent_id" ref="food"/>119 <field name="parent_id" ref="food"/>
119 <field name="name">Chips</field>120 <field name="name">Chips</field>
120 <field name="image" type="base64" file="point_of_sale/static/img/chips-image.jpg"/>121 <field name="image" type="base64" file="point_of_sale/static/img/chips-image.jpg"/>
121 </record>122 </record>
122 <record id="fruits" model="product.public.category">123 <record id="fruits" model="pos.category">
123 <field name="name">Fresh Fruits</field>124 <field name="name">Fresh Fruits</field>
124 <field name="image" type="base64" file="point_of_sale/static/img/fruits-image.jpg"/>125 <field name="image" type="base64" file="point_of_sale/static/img/fruits-image.jpg"/>
125 </record>126 </record>
126 <record id="oranges" model="product.public.category">127 <record id="oranges" model="pos.category">
127 <field name="parent_id" ref="fruits"/>128 <field name="parent_id" ref="fruits"/>
128 <field name="name">Oranges</field>129 <field name="name">Oranges</field>
129 <field name="image" type="base64" file="point_of_sale/static/img/oranges-image.jpg"/>130 <field name="image" type="base64" file="point_of_sale/static/img/oranges-image.jpg"/>
130 </record>131 </record>
131 <record id="pomme" model="product.public.category">132 <record id="pomme" model="pos.category">
132 <field name="parent_id" ref="fruits"/>133 <field name="parent_id" ref="fruits"/>
133 <field name="name">Apples</field>134 <field name="name">Apples</field>
134 <field name="image" type="base64" file="point_of_sale/static/img/pomme-image.jpg"/>135 <field name="image" type="base64" file="point_of_sale/static/img/pomme-image.jpg"/>
135 </record>136 </record>
136 <record id="autres_agrumes" model="product.public.category">137 <record id="autres_agrumes" model="pos.category">
137 <field name="parent_id" ref="fruits"/>138 <field name="parent_id" ref="fruits"/>
138 <field name="name">Other Citrus</field>139 <field name="name">Other Citrus</field>
139 <field name="image" type="base64" file="point_of_sale/static/img/autres_agrumes-image.jpg"/>140 <field name="image" type="base64" file="point_of_sale/static/img/autres_agrumes-image.jpg"/>
140 </record>141 </record>
141 <record id="poire" model="product.public.category">142 <record id="poire" model="pos.category">
142 <field name="parent_id" ref="fruits"/>143 <field name="parent_id" ref="fruits"/>
143 <field name="name">Pears</field>144 <field name="name">Pears</field>
144 <field name="image" type="base64" file="point_of_sale/static/img/poire-image.jpg"/>145 <field name="image" type="base64" file="point_of_sale/static/img/poire-image.jpg"/>
145 </record>146 </record>
146 <record id="rouges_noyau_fruits" model="product.public.category">147 <record id="rouges_noyau_fruits" model="pos.category">
147 <field name="parent_id" ref="fruits"/>148 <field name="parent_id" ref="fruits"/>
148 <field name="name">Berries</field>149 <field name="name">Berries</field>
149 <field name="image" type="base64" file="point_of_sale/static/img/rouges_noyau_fruits-image.jpg"/>150 <field name="image" type="base64" file="point_of_sale/static/img/rouges_noyau_fruits-image.jpg"/>
150 </record>151 </record>
151 <record id="raisins" model="product.public.category">152 <record id="raisins" model="pos.category">
152 <field name="parent_id" ref="fruits"/>153 <field name="parent_id" ref="fruits"/>
153 <field name="name">Grapes</field>154 <field name="name">Grapes</field>
154 <field name="image" type="base64" file="point_of_sale/static/img/raisins-image.jpg"/>155 <field name="image" type="base64" file="point_of_sale/static/img/raisins-image.jpg"/>
155 </record>156 </record>
156 <record id="legumes" model="product.public.category">157 <record id="legumes" model="pos.category">
157 <field name="name">Fresh vegetables</field>158 <field name="name">Fresh vegetables</field>
158 <field name="image" type="base64" file="point_of_sale/static/img/legumes-image.jpg"/>159 <field name="image" type="base64" file="point_of_sale/static/img/legumes-image.jpg"/>
159 </record>160 </record>
160 <record id="pommes_de_terre" model="product.public.category">161 <record id="pommes_de_terre" model="pos.category">
161 <field name="parent_id" ref="legumes"/>162 <field name="parent_id" ref="legumes"/>
162 <field name="name">Potatoes</field>163 <field name="name">Potatoes</field>
163 <field name="image" type="base64" file="point_of_sale/static/img/pommes_de_terre-image.jpg"/>164 <field name="image" type="base64" file="point_of_sale/static/img/pommes_de_terre-image.jpg"/>
164 </record>165 </record>
165 <record id="legumes_racine" model="product.public.category">166 <record id="legumes_racine" model="pos.category">
166 <field name="parent_id" ref="legumes"/>167 <field name="parent_id" ref="legumes"/>
167 <field name="name">Root vegetables</field>168 <field name="name">Root vegetables</field>
168 <field name="image" type="base64" file="point_of_sale/static/img/legumes_racine-image.jpg"/>169 <field name="image" type="base64" file="point_of_sale/static/img/legumes_racine-image.jpg"/>
169 </record>170 </record>
170 <record id="tomates" model="product.public.category">171 <record id="tomates" model="pos.category">
171 <field name="parent_id" ref="legumes"/>172 <field name="parent_id" ref="legumes"/>
172 <field name="name">Tomatos</field>173 <field name="name">Tomatos</field>
173 <field name="image" type="base64" file="point_of_sale/static/img/tomates-image.jpg"/>174 <field name="image" type="base64" file="point_of_sale/static/img/tomates-image.jpg"/>
174 </record>175 </record>
175 <record id="oignons_ail_echalotes" model="product.public.category">176 <record id="oignons_ail_echalotes" model="pos.category">
176 <field name="parent_id" ref="legumes"/>177 <field name="parent_id" ref="legumes"/>
177 <field name="name">Onions / Garlic / Shallots</field>178 <field name="name">Onions / Garlic / Shallots</field>
178 <field name="image" type="base64" file="point_of_sale/static/img/oignons_ail_echalotes-image.jpg"/>179 <field name="image" type="base64" file="point_of_sale/static/img/oignons_ail_echalotes-image.jpg"/>
179 </record>180 </record>
180 <record id="autres_legumes_frais" model="product.public.category">181 <record id="autres_legumes_frais" model="pos.category">
181 <field name="parent_id" ref="legumes"/>182 <field name="parent_id" ref="legumes"/>
182 <field name="name">Other fresh vegetables</field>183 <field name="name">Other fresh vegetables</field>
183 <field name="image" type="base64" file="point_of_sale/static/img/autres_legumes_frais-image.jpg"/>184 <field name="image" type="base64" file="point_of_sale/static/img/autres_legumes_frais-image.jpg"/>
@@ -191,7 +192,7 @@
191 <field name="name">Boni Oranges</field>192 <field name="name">Boni Oranges</field>
192 <field name="to_weight">True</field>193 <field name="to_weight">True</field>
193 <field name="ean13">2100002000003</field>194 <field name="ean13">2100002000003</field>
194 <field name="public_categ_id" ref="oranges"/>195 <field name="pos_categ_id" ref="oranges"/>
195 <field name="uom_id" ref="product.product_uom_kgm" />196 <field name="uom_id" ref="product.product_uom_kgm" />
196 <field name="uom_po_id" ref="product.product_uom_kgm" />197 <field name="uom_po_id" ref="product.product_uom_kgm" />
197 <field name="image" type="base64" file="point_of_sale/static/img/boni_orange-image.jpg"/>198 <field name="image" type="base64" file="point_of_sale/static/img/boni_orange-image.jpg"/>
@@ -200,7 +201,7 @@
200 <field name="available_in_pos">True</field>201 <field name="available_in_pos">True</field>
201 <field name="list_price">2.83</field>202 <field name="list_price">2.83</field>
202 <field name="name">Orange Butterfly</field>203 <field name="name">Orange Butterfly</field>
203 <field name="public_categ_id" ref="oranges"/>204 <field name="pos_categ_id" ref="oranges"/>
204 <field name="to_weight">True</field>205 <field name="to_weight">True</field>
205 <field name="uom_id" ref="product.product_uom_kgm" />206 <field name="uom_id" ref="product.product_uom_kgm" />
206 <field name="uom_po_id" ref="product.product_uom_kgm" />207 <field name="uom_po_id" ref="product.product_uom_kgm" />
@@ -213,7 +214,7 @@
213 <field name="name">Lemon</field>214 <field name="name">Lemon</field>
214 <field name="ean13">2301000000006</field>215 <field name="ean13">2301000000006</field>
215 <field name="to_weight">True</field>216 <field name="to_weight">True</field>
216 <field name="public_categ_id" ref="autres_agrumes"/>217 <field name="pos_categ_id" ref="autres_agrumes"/>
217 <field name="uom_id" ref="product.product_uom_kgm" />218 <field name="uom_id" ref="product.product_uom_kgm" />
218 <field name="uom_po_id" ref="product.product_uom_kgm" />219 <field name="uom_po_id" ref="product.product_uom_kgm" />
219 <field name="image" type="base64" file="point_of_sale/static/img/citron-image.jpg"/>220 <field name="image" type="base64" file="point_of_sale/static/img/citron-image.jpg"/>
@@ -223,7 +224,7 @@
223 <field name="list_price">3.19</field>224 <field name="list_price">3.19</field>
224 <field name="name">Stringers</field>225 <field name="name">Stringers</field>
225 <field name="to_weight">True</field>226 <field name="to_weight">True</field>
226 <field name="public_categ_id" ref="autres_agrumes"/>227 <field name="pos_categ_id" ref="autres_agrumes"/>
227 <field name="uom_id" ref="product.product_uom_kgm" />228 <field name="uom_id" ref="product.product_uom_kgm" />
228 <field name="uom_po_id" ref="product.product_uom_kgm" />229 <field name="uom_po_id" ref="product.product_uom_kgm" />
229 <field name="image" type="base64" file="point_of_sale/static/img/limon-image.jpg"/>230 <field name="image" type="base64" file="point_of_sale/static/img/limon-image.jpg"/>
@@ -233,7 +234,7 @@
233 <field name="list_price">1.98</field>234 <field name="list_price">1.98</field>
234 <field name="name">Red grapefruit</field>235 <field name="name">Red grapefruit</field>
235 <field name="to_weight">True</field>236 <field name="to_weight">True</field>
236 <field name="public_categ_id" ref="autres_agrumes"/>237 <field name="pos_categ_id" ref="autres_agrumes"/>
237 <field name="uom_id" ref="product.product_uom_kgm" />238 <field name="uom_id" ref="product.product_uom_kgm" />
238 <field name="uom_po_id" ref="product.product_uom_kgm" />239 <field name="uom_po_id" ref="product.product_uom_kgm" />
239 <field name="image" type="base64" file="point_of_sale/static/img/pamplemousse_rouge_pamplemousse-image.jpg"/>240 <field name="image" type="base64" file="point_of_sale/static/img/pamplemousse_rouge_pamplemousse-image.jpg"/>
@@ -244,7 +245,7 @@
244 <field name="list_price">2.09</field>245 <field name="list_price">2.09</field>
245 <field name="name">Granny Smith apples</field>246 <field name="name">Granny Smith apples</field>
246 <field name="to_weight">True</field>247 <field name="to_weight">True</field>
247 <field name="public_categ_id" ref="pomme"/>248 <field name="pos_categ_id" ref="pomme"/>
248 <field name="uom_id" ref="product.product_uom_kgm" />249 <field name="uom_id" ref="product.product_uom_kgm" />
249 <field name="uom_po_id" ref="product.product_uom_kgm" />250 <field name="uom_po_id" ref="product.product_uom_kgm" />
250 <field name="image" type="base64" file="point_of_sale/static/img/pomme_granny_smith-image.jpg"/>251 <field name="image" type="base64" file="point_of_sale/static/img/pomme_granny_smith-image.jpg"/>
@@ -254,7 +255,7 @@
254 <field name="list_price">1.10</field>255 <field name="list_price">1.10</field>
255 <field name="name">Jonagold apples</field>256 <field name="name">Jonagold apples</field>
256 <field name="to_weight">True</field>257 <field name="to_weight">True</field>
257 <field name="public_categ_id" ref="pomme"/>258 <field name="pos_categ_id" ref="pomme"/>
258 <field name="uom_id" ref="product.product_uom_kgm" />259 <field name="uom_id" ref="product.product_uom_kgm" />
259 <field name="uom_po_id" ref="product.product_uom_kgm" />260 <field name="uom_po_id" ref="product.product_uom_kgm" />
260 <field name="image" type="base64" file="point_of_sale/static/img/pomme_jonagold-image.jpg"/>261 <field name="image" type="base64" file="point_of_sale/static/img/pomme_jonagold-image.jpg"/>
@@ -264,7 +265,7 @@
264 <field name="list_price">1.69</field>265 <field name="list_price">1.69</field>
265 <field name="name">Golden Apples Perlim</field>266 <field name="name">Golden Apples Perlim</field>
266 <field name="to_weight">True</field>267 <field name="to_weight">True</field>
267 <field name="public_categ_id" ref="pomme"/>268 <field name="pos_categ_id" ref="pomme"/>
268 <field name="uom_id" ref="product.product_uom_kgm" />269 <field name="uom_id" ref="product.product_uom_kgm" />
269 <field name="uom_po_id" ref="product.product_uom_kgm" />270 <field name="uom_po_id" ref="product.product_uom_kgm" />
270 <field name="image" type="base64" file="point_of_sale/static/img/pomme_golden_perlim-image.jpg"/>271 <field name="image" type="base64" file="point_of_sale/static/img/pomme_golden_perlim-image.jpg"/>
@@ -275,7 +276,7 @@
275 <field name="list_price">1.70</field>276 <field name="list_price">1.70</field>
276 <field name="name">Conference pears</field>277 <field name="name">Conference pears</field>
277 <field name="to_weight">True</field>278 <field name="to_weight">True</field>
278 <field name="public_categ_id" ref="poire"/>279 <field name="pos_categ_id" ref="poire"/>
279 <field name="uom_id" ref="product.product_uom_kgm" />280 <field name="uom_id" ref="product.product_uom_kgm" />
280 <field name="uom_po_id" ref="product.product_uom_kgm" />281 <field name="uom_po_id" ref="product.product_uom_kgm" />
281 <field name="image" type="base64" file="point_of_sale/static/img/poire_conference-image.jpg"/>282 <field name="image" type="base64" file="point_of_sale/static/img/poire_conference-image.jpg"/>
@@ -286,7 +287,7 @@
286 <field name="list_price">5.70</field>287 <field name="list_price">5.70</field>
287 <field name="name">Peach</field>288 <field name="name">Peach</field>
288 <field name="to_weight">True</field>289 <field name="to_weight">True</field>
289 <field name="public_categ_id" ref="rouges_noyau_fruits"/>290 <field name="pos_categ_id" ref="rouges_noyau_fruits"/>
290 <field name="uom_id" ref="product.product_uom_kgm" />291 <field name="uom_id" ref="product.product_uom_kgm" />
291 <field name="uom_po_id" ref="product.product_uom_kgm" />292 <field name="uom_po_id" ref="product.product_uom_kgm" />
292 <field name="image" type="base64" file="point_of_sale/static/img/nectarine-image.jpg"/>293 <field name="image" type="base64" file="point_of_sale/static/img/nectarine-image.jpg"/>
@@ -297,7 +298,7 @@
297 <field name="name">Peaches</field>298 <field name="name">Peaches</field>
298 <field name="to_weight">True</field>299 <field name="to_weight">True</field>
299 <field name="ean13">2300001000008</field>300 <field name="ean13">2300001000008</field>
300 <field name="public_categ_id" ref="rouges_noyau_fruits"/>301 <field name="pos_categ_id" ref="rouges_noyau_fruits"/>
301 <field name="uom_id" ref="product.product_uom_kgm" />302 <field name="uom_id" ref="product.product_uom_kgm" />
302 <field name="uom_po_id" ref="product.product_uom_kgm" />303 <field name="uom_po_id" ref="product.product_uom_kgm" />
303 <field name="image" type="base64" file="point_of_sale/static/img/peche-image.jpg"/>304 <field name="image" type="base64" file="point_of_sale/static/img/peche-image.jpg"/>
@@ -308,7 +309,7 @@
308 <field name="list_price">4.80</field>309 <field name="list_price">4.80</field>
309 <field name="name">Black Grapes</field>310 <field name="name">Black Grapes</field>
310 <field name="to_weight">True</field>311 <field name="to_weight">True</field>
311 <field name="public_categ_id" ref="raisins"/>312 <field name="pos_categ_id" ref="raisins"/>
312 <field name="uom_id" ref="product.product_uom_kgm" />313 <field name="uom_id" ref="product.product_uom_kgm" />
313 <field name="uom_po_id" ref="product.product_uom_kgm" />314 <field name="uom_po_id" ref="product.product_uom_kgm" />
314 <field name="image" type="base64" file="point_of_sale/static/img/raisins_noir-image.jpg"/>315 <field name="image" type="base64" file="point_of_sale/static/img/raisins_noir-image.jpg"/>
@@ -319,7 +320,7 @@
319 <field name="list_price">1.39</field>320 <field name="list_price">1.39</field>
320 <field name="name">Potatoes</field>321 <field name="name">Potatoes</field>
321 <field name="to_weight">True</field>322 <field name="to_weight">True</field>
322 <field name="public_categ_id" ref="pommes_de_terre"/>323 <field name="pos_categ_id" ref="pommes_de_terre"/>
323 <field name="uom_id" ref="product.product_uom_kgm" />324 <field name="uom_id" ref="product.product_uom_kgm" />
324 <field name="uom_po_id" ref="product.product_uom_kgm" />325 <field name="uom_po_id" ref="product.product_uom_kgm" />
325 <field name="image" type="base64" file="point_of_sale/static/img/pomme_de_terre-image.jpg"/>326 <field name="image" type="base64" file="point_of_sale/static/img/pomme_de_terre-image.jpg"/>
@@ -330,7 +331,7 @@
330 <field name="list_price">2.20</field>331 <field name="list_price">2.20</field>
331 <field name="name">Extra Flandria chicory</field>332 <field name="name">Extra Flandria chicory</field>
332 <field name="to_weight">True</field>333 <field name="to_weight">True</field>
333 <field name="public_categ_id" ref="legumes_racine"/>334 <field name="pos_categ_id" ref="legumes_racine"/>
334 <field name="uom_id" ref="product.product_uom_kgm" />335 <field name="uom_id" ref="product.product_uom_kgm" />
335 <field name="uom_po_id" ref="product.product_uom_kgm" />336 <field name="uom_po_id" ref="product.product_uom_kgm" />
336 <field name="image" type="base64" file="point_of_sale/static/img/chicon_flandria_extra-image.jpg"/>337 <field name="image" type="base64" file="point_of_sale/static/img/chicon_flandria_extra-image.jpg"/>
@@ -340,7 +341,7 @@
340 <field name="list_price">0.90</field>341 <field name="list_price">0.90</field>
341 <field name="name">Carrots</field>342 <field name="name">Carrots</field>
342 <field name="to_weight">True</field>343 <field name="to_weight">True</field>
343 <field name="public_categ_id" ref="legumes_racine"/>344 <field name="pos_categ_id" ref="legumes_racine"/>
344 <field name="uom_id" ref="product.product_uom_kgm" />345 <field name="uom_id" ref="product.product_uom_kgm" />
345 <field name="uom_po_id" ref="product.product_uom_kgm" />346 <field name="uom_po_id" ref="product.product_uom_kgm" />
346 <field name="image" type="base64" file="point_of_sale/static/img/carotte-image.jpg"/>347 <field name="image" type="base64" file="point_of_sale/static/img/carotte-image.jpg"/>
@@ -350,7 +351,7 @@
350 <field name="list_price">2.10</field>351 <field name="list_price">2.10</field>
351 <field name="name">Fennel</field>352 <field name="name">Fennel</field>
352 <field name="to_weight">True</field>353 <field name="to_weight">True</field>
353 <field name="public_categ_id" ref="legumes_racine"/>354 <field name="pos_categ_id" ref="legumes_racine"/>
354 <field name="uom_id" ref="product.product_uom_kgm" />355 <field name="uom_id" ref="product.product_uom_kgm" />
355 <field name="uom_po_id" ref="product.product_uom_kgm" />356 <field name="uom_po_id" ref="product.product_uom_kgm" />
356 <field name="image" type="base64" file="point_of_sale/static/img/fenouil_fenouil-image.jpg"/>357 <field name="image" type="base64" file="point_of_sale/static/img/fenouil_fenouil-image.jpg"/>
@@ -361,7 +362,7 @@
361 <field name="list_price">1.90</field>362 <field name="list_price">1.90</field>
362 <field name="name">In Cluster Tomatoes</field>363 <field name="name">In Cluster Tomatoes</field>
363 <field name="to_weight">True</field>364 <field name="to_weight">True</field>
364 <field name="public_categ_id" ref="tomates"/>365 <field name="pos_categ_id" ref="tomates"/>
365 <field name="uom_id" ref="product.product_uom_kgm" />366 <field name="uom_id" ref="product.product_uom_kgm" />
366 <field name="uom_po_id" ref="product.product_uom_kgm" />367 <field name="uom_po_id" ref="product.product_uom_kgm" />
367 <field name="image" type="base64" file="point_of_sale/static/img/tomate_en_grappe-image.jpg"/>368 <field name="image" type="base64" file="point_of_sale/static/img/tomate_en_grappe-image.jpg"/>
@@ -373,7 +374,7 @@
373 <field name="name">Onions</field>374 <field name="name">Onions</field>
374 <field name="to_weight">True</field>375 <field name="to_weight">True</field>
375 <field name="ean13">2100001000004</field>376 <field name="ean13">2100001000004</field>
376 <field name="public_categ_id" ref="oignons_ail_echalotes"/>377 <field name="pos_categ_id" ref="oignons_ail_echalotes"/>
377 <field name="uom_id" ref="product.product_uom_kgm" />378 <field name="uom_id" ref="product.product_uom_kgm" />
378 <field name="uom_po_id" ref="product.product_uom_kgm" />379 <field name="uom_po_id" ref="product.product_uom_kgm" />
379 <field name="image" type="base64" file="point_of_sale/static/img/Onions-image.jpg"/>380 <field name="image" type="base64" file="point_of_sale/static/img/Onions-image.jpg"/>
@@ -384,7 +385,7 @@
384 <field name="list_price">3.10</field>385 <field name="list_price">3.10</field>
385 <field name="name">Red Pepper</field>386 <field name="name">Red Pepper</field>
386 <field name="to_weight">True</field>387 <field name="to_weight">True</field>
387 <field name="public_categ_id" ref="autres_legumes_frais"/>388 <field name="pos_categ_id" ref="autres_legumes_frais"/>
388 <field name="uom_id" ref="product.product_uom_kgm" />389 <field name="uom_id" ref="product.product_uom_kgm" />
389 <field name="uom_po_id" ref="product.product_uom_kgm" />390 <field name="uom_po_id" ref="product.product_uom_kgm" />
390 <field name="image" type="base64" file="point_of_sale/static/img/poivron_rouges-image.jpg"/>391 <field name="image" type="base64" file="point_of_sale/static/img/poivron_rouges-image.jpg"/>
@@ -394,7 +395,7 @@
394 <field name="list_price">3.00</field>395 <field name="list_price">3.00</field>
395 <field name="name">Green Peppers</field>396 <field name="name">Green Peppers</field>
396 <field name="to_weight">True</field>397 <field name="to_weight">True</field>
397 <field name="public_categ_id" ref="autres_legumes_frais"/>398 <field name="pos_categ_id" ref="autres_legumes_frais"/>
398 <field name="uom_id" ref="product.product_uom_kgm" />399 <field name="uom_id" ref="product.product_uom_kgm" />
399 <field name="uom_po_id" ref="product.product_uom_kgm" />400 <field name="uom_po_id" ref="product.product_uom_kgm" />
400 <field name="image" type="base64" file="point_of_sale/static/img/poivron_verts-image.jpg"/>401 <field name="image" type="base64" file="point_of_sale/static/img/poivron_verts-image.jpg"/>
@@ -404,7 +405,7 @@
404 <field name="list_price">2.70</field>405 <field name="list_price">2.70</field>
405 <field name="name">Yellow Peppers</field>406 <field name="name">Yellow Peppers</field>
406 <field name="to_weight">True</field>407 <field name="to_weight">True</field>
407 <field name="public_categ_id" ref="autres_legumes_frais"/>408 <field name="pos_categ_id" ref="autres_legumes_frais"/>
408 <field name="uom_id" ref="product.product_uom_kgm" />409 <field name="uom_id" ref="product.product_uom_kgm" />
409 <field name="uom_po_id" ref="product.product_uom_kgm" />410 <field name="uom_po_id" ref="product.product_uom_kgm" />
410 <field name="image" type="base64" file="point_of_sale/static/img/poivron_jaunes-image.jpg"/>411 <field name="image" type="base64" file="point_of_sale/static/img/poivron_jaunes-image.jpg"/>
@@ -414,7 +415,7 @@
414 <field name="list_price">2.29</field>415 <field name="list_price">2.29</field>
415 <field name="name">Leeks</field>416 <field name="name">Leeks</field>
416 <field name="to_weight">True</field>417 <field name="to_weight">True</field>
417 <field name="public_categ_id" ref="autres_legumes_frais"/>418 <field name="pos_categ_id" ref="autres_legumes_frais"/>
418 <field name="uom_id" ref="product.product_uom_kgm" />419 <field name="uom_id" ref="product.product_uom_kgm" />
419 <field name="uom_po_id" ref="product.product_uom_kgm" />420 <field name="uom_po_id" ref="product.product_uom_kgm" />
420 <field name="image" type="base64" file="point_of_sale/static/img/poireaux_poireaux-image.jpg"/>421 <field name="image" type="base64" file="point_of_sale/static/img/poireaux_poireaux-image.jpg"/>
@@ -424,7 +425,7 @@
424 <field name="list_price">1.20</field>425 <field name="list_price">1.20</field>
425 <field name="name">Zucchini</field>426 <field name="name">Zucchini</field>
426 <field name="to_weight">True</field>427 <field name="to_weight">True</field>
427 <field name="public_categ_id" ref="autres_legumes_frais"/>428 <field name="pos_categ_id" ref="autres_legumes_frais"/>
428 <field name="uom_id" ref="product.product_uom_kgm" />429 <field name="uom_id" ref="product.product_uom_kgm" />
429 <field name="uom_po_id" ref="product.product_uom_kgm" />430 <field name="uom_po_id" ref="product.product_uom_kgm" />
430 <field name="image" type="base64" file="point_of_sale/static/img/courgette-image.jpg"/>431 <field name="image" type="base64" file="point_of_sale/static/img/courgette-image.jpg"/>
@@ -435,21 +436,21 @@
435 <field name="list_price">1.49</field>436 <field name="list_price">1.49</field>
436 <field name="name">Coca-Cola Regular 1L</field>437 <field name="name">Coca-Cola Regular 1L</field>
437 <field name="ean13">5449000054227</field>438 <field name="ean13">5449000054227</field>
438 <field name="public_categ_id" ref="coke"/>439 <field name="pos_categ_id" ref="coke"/>
439 <field name="image" type="base64" file="point_of_sale/static/img/coca_regular_1l-image.jpg"/>440 <field name="image" type="base64" file="point_of_sale/static/img/coca_regular_1l-image.jpg"/>
440 </record>441 </record>
441 <record id="coca_regular_2l" model="product.product">442 <record id="coca_regular_2l" model="product.product">
442 <field name="available_in_pos">True</field>443 <field name="available_in_pos">True</field>
443 <field name="list_price">2.38</field>444 <field name="list_price">2.38</field>
444 <field name="name">Coca-Cola Regular 2L</field>445 <field name="name">Coca-Cola Regular 2L</field>
445 <field name="public_categ_id" ref="coke"/>446 <field name="pos_categ_id" ref="coke"/>
446 <field name="image" type="base64" file="point_of_sale/static/img/coca_regular_2l-image.jpg"/>447 <field name="image" type="base64" file="point_of_sale/static/img/coca_regular_2l-image.jpg"/>
447 </record>448 </record>
448 <record id="coca_regular_50cl" model="product.product">449 <record id="coca_regular_50cl" model="product.product">
449 <field name="available_in_pos">True</field>450 <field name="available_in_pos">True</field>
450 <field name="list_price">0.97</field>451 <field name="list_price">0.97</field>
451 <field name="name">Coca-Cola Regular 50cl</field>452 <field name="name">Coca-Cola Regular 50cl</field>
452 <field name="public_categ_id" ref="coke"/>453 <field name="pos_categ_id" ref="coke"/>
453 <field name="image" type="base64" file="point_of_sale/static/img/coca_regular_50cl-image.jpg"/>454 <field name="image" type="base64" file="point_of_sale/static/img/coca_regular_50cl-image.jpg"/>
454 </record>455 </record>
455 <record id="coca_regular_33cl" model="product.product">456 <record id="coca_regular_33cl" model="product.product">
@@ -457,7 +458,7 @@
457 <field name="list_price">0.51</field>458 <field name="list_price">0.51</field>
458 <field name="name">Coca-Cola Regular 33cl</field>459 <field name="name">Coca-Cola Regular 33cl</field>
459 <field name="ean13">5449000000996</field>460 <field name="ean13">5449000000996</field>
460 <field name="public_categ_id" ref="coke"/>461 <field name="pos_categ_id" ref="coke"/>
461 <field name="image" type="base64" file="point_of_sale/static/img/coca_regular_33cl-image.jpg"/>462 <field name="image" type="base64" file="point_of_sale/static/img/coca_regular_33cl-image.jpg"/>
462 </record>463 </record>
463464
@@ -465,35 +466,35 @@
465 <field name="available_in_pos">True</field>466 <field name="available_in_pos">True</field>
466 <field name="list_price">1.49</field>467 <field name="list_price">1.49</field>
467 <field name="name">Coca-Cola Light 1L</field>468 <field name="name">Coca-Cola Light 1L</field>
468 <field name="public_categ_id" ref="coke"/>469 <field name="pos_categ_id" ref="coke"/>
469 <field name="image" type="base64" file="point_of_sale/static/img/coca_light_1l-image.jpg"/>470 <field name="image" type="base64" file="point_of_sale/static/img/coca_light_1l-image.jpg"/>
470 </record>471 </record>
471 <record id="coca_light_2l" model="product.product">472 <record id="coca_light_2l" model="product.product">
472 <field name="available_in_pos">True</field>473 <field name="available_in_pos">True</field>
473 <field name="list_price">2.38</field>474 <field name="list_price">2.38</field>
474 <field name="name">Coca-Cola Light 2L</field>475 <field name="name">Coca-Cola Light 2L</field>
475 <field name="public_categ_id" ref="coke"/>476 <field name="pos_categ_id" ref="coke"/>
476 <field name="image" type="base64" file="point_of_sale/static/img/coca_light_2l-image.jpg"/>477 <field name="image" type="base64" file="point_of_sale/static/img/coca_light_2l-image.jpg"/>
477 </record>478 </record>
478 <record id="coca_light_50cl" model="product.product">479 <record id="coca_light_50cl" model="product.product">
479 <field name="available_in_pos">True</field>480 <field name="available_in_pos">True</field>
480 <field name="list_price">0.97</field>481 <field name="list_price">0.97</field>
481 <field name="name">Coca-Cola Light 50cl</field>482 <field name="name">Coca-Cola Light 50cl</field>
482 <field name="public_categ_id" ref="coke"/>483 <field name="pos_categ_id" ref="coke"/>
483 <field name="image" type="base64" file="point_of_sale/static/img/coca_light_50cl-image.jpg"/>484 <field name="image" type="base64" file="point_of_sale/static/img/coca_light_50cl-image.jpg"/>
484 </record>485 </record>
485 <record id="coca_light_33cl" model="product.product">486 <record id="coca_light_33cl" model="product.product">
486 <field name="available_in_pos">True</field>487 <field name="available_in_pos">True</field>
487 <field name="list_price">0.51</field>488 <field name="list_price">0.51</field>
488 <field name="name">Coca-Cola Light 33cl</field>489 <field name="name">Coca-Cola Light 33cl</field>
489 <field name="public_categ_id" ref="coke"/>490 <field name="pos_categ_id" ref="coke"/>
490 <field name="image" type="base64" file="point_of_sale/static/img/coca_light_33cl-image.jpg"/>491 <field name="image" type="base64" file="point_of_sale/static/img/coca_light_33cl-image.jpg"/>
491 </record>492 </record>
492 <record id="coca_light_decaf_33cl" model="product.product">493 <record id="coca_light_decaf_33cl" model="product.product">
493 <field name="available_in_pos">True</field>494 <field name="available_in_pos">True</field>
494 <field name="list_price">0.53</field>495 <field name="list_price">0.53</field>
495 <field name="name">Coca-Cola Light 33cl Decaf</field> 496 <field name="name">Coca-Cola Light 33cl Decaf</field>
496 <field name="public_categ_id" ref="coke"/>497 <field name="pos_categ_id" ref="coke"/>
497 <field name="image" type="base64" file="point_of_sale/static/img/coca_light_decaf_33cl-image.jpg"/>498 <field name="image" type="base64" file="point_of_sale/static/img/coca_light_decaf_33cl-image.jpg"/>
498 </record>499 </record>
499500
@@ -501,35 +502,35 @@
501 <field name="available_in_pos">True</field>502 <field name="available_in_pos">True</field>
502 <field name="list_price">1.49</field>503 <field name="list_price">1.49</field>
503 <field name="name">Coca-Cola Zero 1L</field>504 <field name="name">Coca-Cola Zero 1L</field>
504 <field name="public_categ_id" ref="coke"/>505 <field name="pos_categ_id" ref="coke"/>
505 <field name="image" type="base64" file="point_of_sale/static/img/coca_zero_1l-image.jpg"/>506 <field name="image" type="base64" file="point_of_sale/static/img/coca_zero_1l-image.jpg"/>
506 </record>507 </record>
507 <record id="coca_zero_2l" model="product.product">508 <record id="coca_zero_2l" model="product.product">
508 <field name="available_in_pos">True</field>509 <field name="available_in_pos">True</field>
509 <field name="list_price">2.38</field>510 <field name="list_price">2.38</field>
510 <field name="name">Coca-Cola Zero 2L</field>511 <field name="name">Coca-Cola Zero 2L</field>
511 <field name="public_categ_id" ref="coke"/>512 <field name="pos_categ_id" ref="coke"/>
512 <field name="image" type="base64" file="point_of_sale/static/img/coca_zero_2l-image.jpg"/>513 <field name="image" type="base64" file="point_of_sale/static/img/coca_zero_2l-image.jpg"/>
513 </record>514 </record>
514 <record id="coca_zero_50cl" model="product.product">515 <record id="coca_zero_50cl" model="product.product">
515 <field name="available_in_pos">True</field>516 <field name="available_in_pos">True</field>
516 <field name="list_price">0.97</field>517 <field name="list_price">0.97</field>
517 <field name="name">Coca-Cola Zero 50cl</field>518 <field name="name">Coca-Cola Zero 50cl</field>
518 <field name="public_categ_id" ref="coke"/>519 <field name="pos_categ_id" ref="coke"/>
519 <field name="image" type="base64" file="point_of_sale/static/img/coca_zero_50cl-image.jpg"/>520 <field name="image" type="base64" file="point_of_sale/static/img/coca_zero_50cl-image.jpg"/>
520 </record>521 </record>
521 <record id="coca_zero_33cl" model="product.product">522 <record id="coca_zero_33cl" model="product.product">
522 <field name="available_in_pos">True</field>523 <field name="available_in_pos">True</field>
523 <field name="list_price">0.51</field>524 <field name="list_price">0.51</field>
524 <field name="name">Coca-Cola Zero 33cl</field>525 <field name="name">Coca-Cola Zero 33cl</field>
525 <field name="public_categ_id" ref="coke"/>526 <field name="pos_categ_id" ref="coke"/>
526 <field name="image" type="base64" file="point_of_sale/static/img/coca_zero_33cl-image.jpg"/>527 <field name="image" type="base64" file="point_of_sale/static/img/coca_zero_33cl-image.jpg"/>
527 </record>528 </record>
528 <record id="coca_zero_decaf_33cl" model="product.product">529 <record id="coca_zero_decaf_33cl" model="product.product">
529 <field name="available_in_pos">True</field>530 <field name="available_in_pos">True</field>
530 <field name="list_price">0.67</field>531 <field name="list_price">0.67</field>
531 <field name="name">Coca-Cola Zero Decaf 33cl</field>532 <field name="name">Coca-Cola Zero Decaf 33cl</field>
532 <field name="public_categ_id" ref="coke"/>533 <field name="pos_categ_id" ref="coke"/>
533 <field name="image" type="base64" file="point_of_sale/static/img/coca_zero_decaf_33cl-image.jpg"/>534 <field name="image" type="base64" file="point_of_sale/static/img/coca_zero_decaf_33cl-image.jpg"/>
534 </record>535 </record>
535536
@@ -537,21 +538,21 @@
537 <field name="available_in_pos">True</field>538 <field name="available_in_pos">True</field>
538 <field name="list_price">2.83</field>539 <field name="list_price">2.83</field>
539 <field name="name">Coca-Cola Light Lemon 2L</field>540 <field name="name">Coca-Cola Light Lemon 2L</field>
540 <field name="public_categ_id" ref="coke"/>541 <field name="pos_categ_id" ref="coke"/>
541 <field name="image" type="base64" file="point_of_sale/static/img/coca_light_lemon_2l-image.jpg"/>542 <field name="image" type="base64" file="point_of_sale/static/img/coca_light_lemon_2l-image.jpg"/>
542 </record>543 </record>
543 <record id="coca_light_lemon_50cl" model="product.product">544 <record id="coca_light_lemon_50cl" model="product.product">
544 <field name="available_in_pos">True</field>545 <field name="available_in_pos">True</field>
545 <field name="list_price">1.16</field>546 <field name="list_price">1.16</field>
546 <field name="name">Coca-Cola Light Lemon 50cl</field>547 <field name="name">Coca-Cola Light Lemon 50cl</field>
547 <field name="public_categ_id" ref="coke"/>548 <field name="pos_categ_id" ref="coke"/>
548 <field name="image" type="base64" file="point_of_sale/static/img/coca_light_lemon_50cl-image.jpg"/>549 <field name="image" type="base64" file="point_of_sale/static/img/coca_light_lemon_50cl-image.jpg"/>
549 </record>550 </record>
550 <record id="coca_light_lemon_33cl" model="product.product">551 <record id="coca_light_lemon_33cl" model="product.product">
551 <field name="available_in_pos">True</field>552 <field name="available_in_pos">True</field>
552 <field name="list_price">0.53</field>553 <field name="list_price">0.53</field>
553 <field name="name">Coca-Cola Light Lemon 33cl</field>554 <field name="name">Coca-Cola Light Lemon 33cl</field>
554 <field name="public_categ_id" ref="coke"/>555 <field name="pos_categ_id" ref="coke"/>
555 <field name="image" type="base64" file="point_of_sale/static/img/coca_light_lemon_33cl-image.jpg"/>556 <field name="image" type="base64" file="point_of_sale/static/img/coca_light_lemon_33cl-image.jpg"/>
556 </record>557 </record>
557558
@@ -559,42 +560,42 @@
559 <field name="available_in_pos">True</field>560 <field name="available_in_pos">True</field>
560 <field name="list_price">1.70</field>561 <field name="list_price">1.70</field>
561 <field name="name">Pepsi 2L</field>562 <field name="name">Pepsi 2L</field>
562 <field name="public_categ_id" ref="coke"/>563 <field name="pos_categ_id" ref="coke"/>
563 <field name="image" type="base64" file="point_of_sale/static/img/pepsi_2l-image.jpg"/>564 <field name="image" type="base64" file="point_of_sale/static/img/pepsi_2l-image.jpg"/>
564 </record>565 </record>
565 <record id="pepsi_33cl" model="product.product">566 <record id="pepsi_33cl" model="product.product">
566 <field name="available_in_pos">True</field>567 <field name="available_in_pos">True</field>
567 <field name="list_price">0.43</field>568 <field name="list_price">0.43</field>
568 <field name="name">Pepsi 33cl</field>569 <field name="name">Pepsi 33cl</field>
569 <field name="public_categ_id" ref="coke"/>570 <field name="pos_categ_id" ref="coke"/>
570 <field name="image" type="base64" file="point_of_sale/static/img/pepsi_33cl-image.jpg"/>571 <field name="image" type="base64" file="point_of_sale/static/img/pepsi_33cl-image.jpg"/>
571 </record>572 </record>
572 <record id="pepsi_max_2l" model="product.product">573 <record id="pepsi_max_2l" model="product.product">
573 <field name="available_in_pos">True</field>574 <field name="available_in_pos">True</field>
574 <field name="list_price">1.71</field>575 <field name="list_price">1.71</field>
575 <field name="name">Pepsi Max 2L</field>576 <field name="name">Pepsi Max 2L</field>
576 <field name="public_categ_id" ref="coke"/>577 <field name="pos_categ_id" ref="coke"/>
577 <field name="image" type="base64" file="point_of_sale/static/img/pepsi_max_2l-image.jpg"/>578 <field name="image" type="base64" file="point_of_sale/static/img/pepsi_max_2l-image.jpg"/>
578 </record>579 </record>
579 <record id="pepsi_max_33cl" model="product.product">580 <record id="pepsi_max_33cl" model="product.product">
580 <field name="available_in_pos">True</field>581 <field name="available_in_pos">True</field>
581 <field name="list_price">0.40</field>582 <field name="list_price">0.40</field>
582 <field name="name">Pepsi Max 33cl</field>583 <field name="name">Pepsi Max 33cl</field>
583 <field name="public_categ_id" ref="coke"/>584 <field name="pos_categ_id" ref="coke"/>
584 <field name="image" type="base64" file="point_of_sale/static/img/pepsi_max_33cl-image.jpg"/>585 <field name="image" type="base64" file="point_of_sale/static/img/pepsi_max_33cl-image.jpg"/>
585 </record>586 </record>
586 <record id="pepsi_max_50cl" model="product.product">587 <record id="pepsi_max_50cl" model="product.product">
587 <field name="available_in_pos">True</field>588 <field name="available_in_pos">True</field>
588 <field name="list_price">0.61</field>589 <field name="list_price">0.61</field>
589 <field name="name">Pepsi Max 50cl</field>590 <field name="name">Pepsi Max 50cl</field>
590 <field name="public_categ_id" ref="coke"/>591 <field name="pos_categ_id" ref="coke"/>
591 <field name="image" type="base64" file="point_of_sale/static/img/pepsi_max_50cl-image.jpg"/>592 <field name="image" type="base64" file="point_of_sale/static/img/pepsi_max_50cl-image.jpg"/>
592 </record>593 </record>
593 <record id="pepsi_max_lemon_33cl" model="product.product">594 <record id="pepsi_max_lemon_33cl" model="product.product">
594 <field name="available_in_pos">True</field>595 <field name="available_in_pos">True</field>
595 <field name="list_price">0.40</field>596 <field name="list_price">0.40</field>
596 <field name="name">Pepsi Max Cool Lemon 33cl</field>597 <field name="name">Pepsi Max Cool Lemon 33cl</field>
597 <field name="public_categ_id" ref="coke"/>598 <field name="pos_categ_id" ref="coke"/>
598 <field name="image" type="base64" file="point_of_sale/static/img/pepsi_max_lemon_33cl-image.jpg"/>599 <field name="image" type="base64" file="point_of_sale/static/img/pepsi_max_lemon_33cl-image.jpg"/>
599 </record>600 </record>
600601
@@ -602,63 +603,63 @@
602 <field name="available_in_pos">True</field>603 <field name="available_in_pos">True</field>
603 <field name="list_price">0.75</field>604 <field name="list_price">0.75</field>
604 <field name="name">Spa Fruit and Orange 50cl</field>605 <field name="name">Spa Fruit and Orange 50cl</field>
605 <field name="public_categ_id" ref="soda_orange"/>606 <field name="pos_categ_id" ref="soda_orange"/>
606 <field name="image" type="base64" file="point_of_sale/static/img/spa_et_fruit_50cl-image.jpg"/>607 <field name="image" type="base64" file="point_of_sale/static/img/spa_et_fruit_50cl-image.jpg"/>
607 </record>608 </record>
608 <record id="orangina_33cl" model="product.product">609 <record id="orangina_33cl" model="product.product">
609 <field name="available_in_pos">True</field>610 <field name="available_in_pos">True</field>
610 <field name="list_price">0.72</field>611 <field name="list_price">0.72</field>
611 <field name="name">Orangina 33cl</field>612 <field name="name">Orangina 33cl</field>
612 <field name="public_categ_id" ref="soda_orange"/>613 <field name="pos_categ_id" ref="soda_orange"/>
613 <field name="image" type="base64" file="point_of_sale/static/img/orangina_33cl-image.jpg"/>614 <field name="image" type="base64" file="point_of_sale/static/img/orangina_33cl-image.jpg"/>
614 </record>615 </record>
615 <record id="orangina_1,5l" model="product.product">616 <record id="orangina_1,5l" model="product.product">
616 <field name="available_in_pos">True</field>617 <field name="available_in_pos">True</field>
617 <field name="list_price">2.42</field>618 <field name="list_price">2.42</field>
618 <field name="name">Orangina 1.5L</field>619 <field name="name">Orangina 1.5L</field>
619 <field name="public_categ_id" ref="soda_orange"/>620 <field name="pos_categ_id" ref="soda_orange"/>
620 <field name="image" type="base64" file="point_of_sale/static/img/orangina_1,5l-image.jpg"/>621 <field name="image" type="base64" file="point_of_sale/static/img/orangina_1,5l-image.jpg"/>
621 </record>622 </record>
622 <record id="fanta_orange_50cl" model="product.product">623 <record id="fanta_orange_50cl" model="product.product">
623 <field name="available_in_pos">True</field>624 <field name="available_in_pos">True</field>
624 <field name="list_price">0.98</field>625 <field name="list_price">0.98</field>
625 <field name="name">Fanta Orange 50cl</field>626 <field name="name">Fanta Orange 50cl</field>
626 <field name="public_categ_id" ref="soda_orange"/>627 <field name="pos_categ_id" ref="soda_orange"/>
627 <field name="image" type="base64" file="point_of_sale/static/img/fanta_orange_50cl-image.jpg"/>628 <field name="image" type="base64" file="point_of_sale/static/img/fanta_orange_50cl-image.jpg"/>
628 </record>629 </record>
629 <record id="fanta_orange_2l" model="product.product">630 <record id="fanta_orange_2l" model="product.product">
630 <field name="available_in_pos">True</field>631 <field name="available_in_pos">True</field>
631 <field name="list_price">2.28</field>632 <field name="list_price">2.28</field>
632 <field name="name">Fanta Orange 2L</field>633 <field name="name">Fanta Orange 2L</field>
633 <field name="public_categ_id" ref="soda_orange"/>634 <field name="pos_categ_id" ref="soda_orange"/>
634 <field name="image" type="base64" file="point_of_sale/static/img/fanta_orange_2l-image.jpg"/>635 <field name="image" type="base64" file="point_of_sale/static/img/fanta_orange_2l-image.jpg"/>
635 </record>636 </record>
636 <record id="fanta_orange_33cl" model="product.product">637 <record id="fanta_orange_33cl" model="product.product">
637 <field name="available_in_pos">True</field>638 <field name="available_in_pos">True</field>
638 <field name="list_price">0.51</field>639 <field name="list_price">0.51</field>
639 <field name="name">Fanta Orange 33cl</field>640 <field name="name">Fanta Orange 33cl</field>
640 <field name="public_categ_id" ref="soda_orange"/>641 <field name="pos_categ_id" ref="soda_orange"/>
641 <field name="image" type="base64" file="point_of_sale/static/img/fanta_orange_33cl-image.jpg"/>642 <field name="image" type="base64" file="point_of_sale/static/img/fanta_orange_33cl-image.jpg"/>
642 </record>643 </record>
643 <record id="fanta_orange_25cl" model="product.product">644 <record id="fanta_orange_25cl" model="product.product">
644 <field name="available_in_pos">True</field>645 <field name="available_in_pos">True</field>
645 <field name="list_price">0.84</field>646 <field name="list_price">0.84</field>
646 <field name="name">Fanta Orange 25cl</field>647 <field name="name">Fanta Orange 25cl</field>
647 <field name="public_categ_id" ref="soda_orange"/>648 <field name="pos_categ_id" ref="soda_orange"/>
648 <field name="image" type="base64" file="point_of_sale/static/img/fanta_orange_25cl-image.jpg"/>649 <field name="image" type="base64" file="point_of_sale/static/img/fanta_orange_25cl-image.jpg"/>
649 </record>650 </record>
650 <record id="fanta_zero_orange_1,5l" model="product.product">651 <record id="fanta_zero_orange_1,5l" model="product.product">
651 <field name="available_in_pos">True</field>652 <field name="available_in_pos">True</field>
652 <field name="list_price">2.08</field>653 <field name="list_price">2.08</field>
653 <field name="name">Fanta Orange Zero 1.5L</field>654 <field name="name">Fanta Orange Zero 1.5L</field>
654 <field name="public_categ_id" ref="soda_orange"/>655 <field name="pos_categ_id" ref="soda_orange"/>
655 <field name="image" type="base64" file="point_of_sale/static/img/fanta_zero_orange_1,5l-image.jpg"/>656 <field name="image" type="base64" file="point_of_sale/static/img/fanta_zero_orange_1,5l-image.jpg"/>
656 </record>657 </record>
657 <record id="fanta_zero_orange_33cl" model="product.product">658 <record id="fanta_zero_orange_33cl" model="product.product">
658 <field name="available_in_pos">True</field>659 <field name="available_in_pos">True</field>
659 <field name="list_price">0.53</field>660 <field name="list_price">0.53</field>
660 <field name="name">Fanta Zero Orange 33cl</field>661 <field name="name">Fanta Zero Orange 33cl</field>
661 <field name="public_categ_id" ref="soda_orange"/>662 <field name="pos_categ_id" ref="soda_orange"/>
662 <field name="image" type="base64" file="point_of_sale/static/img/fanta_zero_orange_33cl-image.jpg"/>663 <field name="image" type="base64" file="point_of_sale/static/img/fanta_zero_orange_33cl-image.jpg"/>
663 </record>664 </record>
664665
@@ -666,56 +667,56 @@
666 <field name="available_in_pos">True</field>667 <field name="available_in_pos">True</field>
667 <field name="list_price">0.52</field>668 <field name="list_price">0.52</field>
668 <field name="name">Evian 50cl</field>669 <field name="name">Evian 50cl</field>
669 <field name="public_categ_id" ref="plain_water"/>670 <field name="pos_categ_id" ref="plain_water"/>
670 <field name="image" type="base64" file="point_of_sale/static/img/evian_50cl-image.jpg"/>671 <field name="image" type="base64" file="point_of_sale/static/img/evian_50cl-image.jpg"/>
671 </record>672 </record>
672 <record id="evian_1l" model="product.product">673 <record id="evian_1l" model="product.product">
673 <field name="available_in_pos">True</field>674 <field name="available_in_pos">True</field>
674 <field name="list_price">0.70</field>675 <field name="list_price">0.70</field>
675 <field name="name">Evian 1L</field>676 <field name="name">Evian 1L</field>
676 <field name="public_categ_id" ref="plain_water"/>677 <field name="pos_categ_id" ref="plain_water"/>
677 <field name="image" type="base64" file="point_of_sale/static/img/evian_1l-image.jpg"/>678 <field name="image" type="base64" file="point_of_sale/static/img/evian_1l-image.jpg"/>
678 </record>679 </record>
679 <record id="evian_2l" model="product.product">680 <record id="evian_2l" model="product.product">
680 <field name="available_in_pos">True</field>681 <field name="available_in_pos">True</field>
681 <field name="list_price">1.26</field>682 <field name="list_price">1.26</field>
682 <field name="name">2L Evian</field>683 <field name="name">2L Evian</field>
683 <field name="public_categ_id" ref="plain_water"/>684 <field name="pos_categ_id" ref="plain_water"/>
684 <field name="image" type="base64" file="point_of_sale/static/img/evian_2l-image.jpg"/>685 <field name="image" type="base64" file="point_of_sale/static/img/evian_2l-image.jpg"/>
685 </record>686 </record>
686 <record id="spa_33cl" model="product.product">687 <record id="spa_33cl" model="product.product">
687 <field name="available_in_pos">True</field>688 <field name="available_in_pos">True</field>
688 <field name="list_price">0.40</field>689 <field name="list_price">0.40</field>
689 <field name="name">Spa Reine 33cl</field>690 <field name="name">Spa Reine 33cl</field>
690 <field name="public_categ_id" ref="plain_water"/>691 <field name="pos_categ_id" ref="plain_water"/>
691 <field name="image" type="base64" file="point_of_sale/static/img/spa_33cl-image.jpg"/>692 <field name="image" type="base64" file="point_of_sale/static/img/spa_33cl-image.jpg"/>
692 </record>693 </record>
693 <record id="spa_50cl" model="product.product">694 <record id="spa_50cl" model="product.product">
694 <field name="available_in_pos">True</field>695 <field name="available_in_pos">True</field>
695 <field name="list_price">0.46</field>696 <field name="list_price">0.46</field>
696 <field name="name">Spa Reine 50cl</field>697 <field name="name">Spa Reine 50cl</field>
697 <field name="public_categ_id" ref="plain_water"/>698 <field name="pos_categ_id" ref="plain_water"/>
698 <field name="image" type="base64" file="point_of_sale/static/img/spa_50cl-image.jpg"/>699 <field name="image" type="base64" file="point_of_sale/static/img/spa_50cl-image.jpg"/>
699 </record>700 </record>
700 <record id="spa_1l" model="product.product">701 <record id="spa_1l" model="product.product">
701 <field name="available_in_pos">True</field>702 <field name="available_in_pos">True</field>
702 <field name="list_price">0.65</field>703 <field name="list_price">0.65</field>
703 <field name="name">Spa Reine 1L</field>704 <field name="name">Spa Reine 1L</field>
704 <field name="public_categ_id" ref="plain_water"/>705 <field name="pos_categ_id" ref="plain_water"/>
705 <field name="image" type="base64" file="point_of_sale/static/img/spa_1l-image.jpg"/>706 <field name="image" type="base64" file="point_of_sale/static/img/spa_1l-image.jpg"/>
706 </record>707 </record>
707 <record id="spa_2l" model="product.product">708 <record id="spa_2l" model="product.product">
708 <field name="available_in_pos">True</field>709 <field name="available_in_pos">True</field>
709 <field name="list_price">1.30</field>710 <field name="list_price">1.30</field>
710 <field name="name">Spa Reine 2L</field>711 <field name="name">Spa Reine 2L</field>
711 <field name="public_categ_id" ref="plain_water"/>712 <field name="pos_categ_id" ref="plain_water"/>
712 <field name="image" type="base64" file="point_of_sale/static/img/spa_2l-image.jpg"/>713 <field name="image" type="base64" file="point_of_sale/static/img/spa_2l-image.jpg"/>
713 </record>714 </record>
714 <record id="chaudfontaine_33cl" model="product.product">715 <record id="chaudfontaine_33cl" model="product.product">
715 <field name="available_in_pos">True</field>716 <field name="available_in_pos">True</field>
716 <field name="list_price">0.34</field>717 <field name="list_price">0.34</field>
717 <field name="name">Chaudfontaine 33cl</field>718 <field name="name">Chaudfontaine 33cl</field>
718 <field name="public_categ_id" ref="plain_water"/>719 <field name="pos_categ_id" ref="plain_water"/>
719 <field name="image" type="base64" file="point_of_sale/static/img/chaudfontaine_33cl-image.jpg"/>720 <field name="image" type="base64" file="point_of_sale/static/img/chaudfontaine_33cl-image.jpg"/>
720 </record>721 </record>
721 <record id="chaudfontaine_50cl" model="product.product">722 <record id="chaudfontaine_50cl" model="product.product">
@@ -723,14 +724,14 @@
723 <field name="list_price">0.44</field>724 <field name="list_price">0.44</field>
724 <field name="ean13">5449000111715</field>725 <field name="ean13">5449000111715</field>
725 <field name="name">Chaudfontaine 50cl</field>726 <field name="name">Chaudfontaine 50cl</field>
726 <field name="public_categ_id" ref="plain_water"/>727 <field name="pos_categ_id" ref="plain_water"/>
727 <field name="image" type="base64" file="point_of_sale/static/img/chaudfontaine_50cl-image.jpg"/>728 <field name="image" type="base64" file="point_of_sale/static/img/chaudfontaine_50cl-image.jpg"/>
728 </record>729 </record>
729 <record id="chaudfontaine_1,5l" model="product.product">730 <record id="chaudfontaine_1,5l" model="product.product">
730 <field name="available_in_pos">True</field>731 <field name="available_in_pos">True</field>
731 <field name="list_price">0.86</field>732 <field name="list_price">0.86</field>
732 <field name="name">Chaudfontaine 1.5l</field>733 <field name="name">Chaudfontaine 1.5l</field>
733 <field name="public_categ_id" ref="plain_water"/>734 <field name="pos_categ_id" ref="plain_water"/>
734 <field name="image" type="base64" file="point_of_sale/static/img/chaudfontaine_1,5l-image.jpg"/>735 <field name="image" type="base64" file="point_of_sale/static/img/chaudfontaine_1,5l-image.jpg"/>
735 </record>736 </record>
736737
@@ -738,63 +739,63 @@
738 <field name="available_in_pos">True</field>739 <field name="available_in_pos">True</field>
739 <field name="list_price">0.38</field>740 <field name="list_price">0.38</field>
740 <field name="name">Spa Barisart 33cl</field>741 <field name="name">Spa Barisart 33cl</field>
741 <field name="public_categ_id" ref="sparkling_water"/>742 <field name="pos_categ_id" ref="sparkling_water"/>
742 <field name="image" type="base64" file="point_of_sale/static/img/spa_gazeuse_33cl-image.jpg"/>743 <field name="image" type="base64" file="point_of_sale/static/img/spa_gazeuse_33cl-image.jpg"/>
743 </record>744 </record>
744 <record id="spa_gazeuse_50cl" model="product.product">745 <record id="spa_gazeuse_50cl" model="product.product">
745 <field name="available_in_pos">True</field>746 <field name="available_in_pos">True</field>
746 <field name="list_price">0.49</field>747 <field name="list_price">0.49</field>
747 <field name="name">Spa Barisart 50cl</field>748 <field name="name">Spa Barisart 50cl</field>
748 <field name="public_categ_id" ref="sparkling_water"/>749 <field name="pos_categ_id" ref="sparkling_water"/>
749 <field name="image" type="base64" file="point_of_sale/static/img/spa_gazeuse_50cl-image.jpg"/>750 <field name="image" type="base64" file="point_of_sale/static/img/spa_gazeuse_50cl-image.jpg"/>
750 </record>751 </record>
751 <record id="spa_gazeuse_1,5l" model="product.product">752 <record id="spa_gazeuse_1,5l" model="product.product">
752 <field name="available_in_pos">True</field>753 <field name="available_in_pos">True</field>
753 <field name="list_price">1.00</field>754 <field name="list_price">1.00</field>
754 <field name="name">Spa Barisart 1.5l</field>755 <field name="name">Spa Barisart 1.5l</field>
755 <field name="public_categ_id" ref="sparkling_water"/>756 <field name="pos_categ_id" ref="sparkling_water"/>
756 <field name="image" type="base64" file="point_of_sale/static/img/spa_gazeuse_1,5l-image.jpg"/>757 <field name="image" type="base64" file="point_of_sale/static/img/spa_gazeuse_1,5l-image.jpg"/>
757 </record>758 </record>
758 <record id="chaudfontaine_petillante_33cl" model="product.product">759 <record id="chaudfontaine_petillante_33cl" model="product.product">
759 <field name="available_in_pos">True</field>760 <field name="available_in_pos">True</field>
760 <field name="list_price">0.41</field>761 <field name="list_price">0.41</field>
761 <field name="name">Chaudfontaine Petillante 33cl</field>762 <field name="name">Chaudfontaine Petillante 33cl</field>
762 <field name="public_categ_id" ref="sparkling_water"/>763 <field name="pos_categ_id" ref="sparkling_water"/>
763 <field name="image" type="base64" file="point_of_sale/static/img/chaudfontaine_petillante_33cl-image.jpg"/>764 <field name="image" type="base64" file="point_of_sale/static/img/chaudfontaine_petillante_33cl-image.jpg"/>
764 </record>765 </record>
765 <record id="chaudfontaine_petillante_50cl" model="product.product">766 <record id="chaudfontaine_petillante_50cl" model="product.product">
766 <field name="available_in_pos">True</field>767 <field name="available_in_pos">True</field>
767 <field name="list_price">0.57</field>768 <field name="list_price">0.57</field>
768 <field name="name">Chaudfontaine Petillante 50cl</field>769 <field name="name">Chaudfontaine Petillante 50cl</field>
769 <field name="public_categ_id" ref="sparkling_water"/>770 <field name="pos_categ_id" ref="sparkling_water"/>
770 <field name="image" type="base64" file="point_of_sale/static/img/chaudfontaine_petillante_50cl-image.jpg"/>771 <field name="image" type="base64" file="point_of_sale/static/img/chaudfontaine_petillante_50cl-image.jpg"/>
771 </record>772 </record>
772 <record id="chaudfontaine_petillante_1,5l" model="product.product">773 <record id="chaudfontaine_petillante_1,5l" model="product.product">
773 <field name="available_in_pos">True</field>774 <field name="available_in_pos">True</field>
774 <field name="list_price">0.98</field>775 <field name="list_price">0.98</field>
775 <field name="name">Chaudfontaine Petillante 1.5l</field>776 <field name="name">Chaudfontaine Petillante 1.5l</field>
776 <field name="public_categ_id" ref="sparkling_water"/>777 <field name="pos_categ_id" ref="sparkling_water"/>
777 <field name="image" type="base64" file="point_of_sale/static/img/chaudfontaine_petillante_1,5l-image.jpg"/>778 <field name="image" type="base64" file="point_of_sale/static/img/chaudfontaine_petillante_1,5l-image.jpg"/>
778 </record>779 </record>
779 <record id="perrier_50cl" model="product.product">780 <record id="perrier_50cl" model="product.product">
780 <field name="available_in_pos">True</field>781 <field name="available_in_pos">True</field>
781 <field name="list_price">0.71</field>782 <field name="list_price">0.71</field>
782 <field name="name">50cl Perrier</field>783 <field name="name">50cl Perrier</field>
783 <field name="public_categ_id" ref="sparkling_water"/>784 <field name="pos_categ_id" ref="sparkling_water"/>
784 <field name="image" type="base64" file="point_of_sale/static/img/perrier_50cl-image.jpg"/>785 <field name="image" type="base64" file="point_of_sale/static/img/perrier_50cl-image.jpg"/>
785 </record>786 </record>
786 <record id="perrier_1l" model="product.product">787 <record id="perrier_1l" model="product.product">
787 <field name="available_in_pos">True</field>788 <field name="available_in_pos">True</field>
788 <field name="list_price">0.96</field>789 <field name="list_price">0.96</field>
789 <field name="name">Perrier 1L</field>790 <field name="name">Perrier 1L</field>
790 <field name="public_categ_id" ref="sparkling_water"/>791 <field name="pos_categ_id" ref="sparkling_water"/>
791 <field name="image" type="base64" file="point_of_sale/static/img/perrier_1l-image.jpg"/>792 <field name="image" type="base64" file="point_of_sale/static/img/perrier_1l-image.jpg"/>
792 </record>793 </record>
793 <record id="san_pellegrino_1l" model="product.product">794 <record id="san_pellegrino_1l" model="product.product">
794 <field name="available_in_pos">True</field>795 <field name="available_in_pos">True</field>
795 <field name="list_price">0.98</field>796 <field name="list_price">0.98</field>
796 <field name="name">San Pellegrino 1L</field>797 <field name="name">San Pellegrino 1L</field>
797 <field name="public_categ_id" ref="sparkling_water"/>798 <field name="pos_categ_id" ref="sparkling_water"/>
798 <field name="image" type="base64" file="point_of_sale/static/img/san_pellegrino_1l-image.jpg"/>799 <field name="image" type="base64" file="point_of_sale/static/img/san_pellegrino_1l-image.jpg"/>
799 </record>800 </record>
800801
@@ -802,35 +803,35 @@
802 <field name="available_in_pos">True</field>803 <field name="available_in_pos">True</field>
803 <field name="list_price">1.19</field>804 <field name="list_price">1.19</field>
804 <field name="name">Stella Artois 50cl</field>805 <field name="name">Stella Artois 50cl</field>
805 <field name="public_categ_id" ref="pils"/>806 <field name="pos_categ_id" ref="pils"/>
806 <field name="image" type="base64" file="point_of_sale/static/img/stella_50cl-image.jpg"/>807 <field name="image" type="base64" file="point_of_sale/static/img/stella_50cl-image.jpg"/>
807 </record>808 </record>
808 <record id="stella_33cl" model="product.product">809 <record id="stella_33cl" model="product.product">
809 <field name="available_in_pos">True</field>810 <field name="available_in_pos">True</field>
810 <field name="list_price">0.82</field>811 <field name="list_price">0.82</field>
811 <field name="name">Stella Artois 33cl</field>812 <field name="name">Stella Artois 33cl</field>
812 <field name="public_categ_id" ref="pils"/>813 <field name="pos_categ_id" ref="pils"/>
813 <field name="image" type="base64" file="point_of_sale/static/img/stella_33cl-image.jpg"/>814 <field name="image" type="base64" file="point_of_sale/static/img/stella_33cl-image.jpg"/>
814 </record>815 </record>
815 <record id="maes_50cl" model="product.product">816 <record id="maes_50cl" model="product.product">
816 <field name="available_in_pos">True</field>817 <field name="available_in_pos">True</field>
817 <field name="list_price">0.95</field>818 <field name="list_price">0.95</field>
818 <field name="name">Maes 50cl</field>819 <field name="name">Maes 50cl</field>
819 <field name="public_categ_id" ref="pils"/>820 <field name="pos_categ_id" ref="pils"/>
820 <field name="image" type="base64" file="point_of_sale/static/img/maes_50cl-image.jpg"/>821 <field name="image" type="base64" file="point_of_sale/static/img/maes_50cl-image.jpg"/>
821 </record>822 </record>
822 <record id="maes_33cl" model="product.product">823 <record id="maes_33cl" model="product.product">
823 <field name="available_in_pos">True</field>824 <field name="available_in_pos">True</field>
824 <field name="list_price">0.77</field>825 <field name="list_price">0.77</field>
825 <field name="name">Maes 33cl</field>826 <field name="name">Maes 33cl</field>
826 <field name="public_categ_id" ref="pils"/>827 <field name="pos_categ_id" ref="pils"/>
827 <field name="image" type="base64" file="point_of_sale/static/img/maes_33cl-image.jpg"/>828 <field name="image" type="base64" file="point_of_sale/static/img/maes_33cl-image.jpg"/>
828 </record>829 </record>
829 <record id="jupiler_50cl" model="product.product">830 <record id="jupiler_50cl" model="product.product">
830 <field name="available_in_pos">True</field>831 <field name="available_in_pos">True</field>
831 <field name="list_price">0.97</field>832 <field name="list_price">0.97</field>
832 <field name="name">Jupiler 50cl</field>833 <field name="name">Jupiler 50cl</field>
833 <field name="public_categ_id" ref="pils"/>834 <field name="pos_categ_id" ref="pils"/>
834 <field name="image" type="base64" file="point_of_sale/static/img/jupiler_50cl-image.jpg"/>835 <field name="image" type="base64" file="point_of_sale/static/img/jupiler_50cl-image.jpg"/>
835 </record>836 </record>
836 <record id="jupiler_33cl" model="product.product">837 <record id="jupiler_33cl" model="product.product">
@@ -838,7 +839,7 @@
838 <field name="list_price">0.77</field>839 <field name="list_price">0.77</field>
839 <field name="ean13">5410228142027</field>840 <field name="ean13">5410228142027</field>
840 <field name="name">Jupiler 33cl</field>841 <field name="name">Jupiler 33cl</field>
841 <field name="public_categ_id" ref="pils"/>842 <field name="pos_categ_id" ref="pils"/>
842 <field name="image" type="base64" file="point_of_sale/static/img/jupiler_33cl-image.jpg"/>843 <field name="image" type="base64" file="point_of_sale/static/img/jupiler_33cl-image.jpg"/>
843 </record>844 </record>
844845
@@ -846,49 +847,49 @@
846 <field name="available_in_pos">True</field>847 <field name="available_in_pos">True</field>
847 <field name="list_price">2.53</field>848 <field name="list_price">2.53</field>
848 <field name="name">Boon Framboise 37.5cl</field>849 <field name="name">Boon Framboise 37.5cl</field>
849 <field name="public_categ_id" ref="fruity_beers"/>850 <field name="pos_categ_id" ref="fruity_beers"/>
850 <field name="image" type="base64" file="point_of_sale/static/img/boon_framboise_37,5cl-image.jpg"/>851 <field name="image" type="base64" file="point_of_sale/static/img/boon_framboise_37,5cl-image.jpg"/>
851 </record>852 </record>
852 <record id="timmermans_geuze_37,5cl" model="product.product">853 <record id="timmermans_geuze_37,5cl" model="product.product">
853 <field name="available_in_pos">True</field>854 <field name="available_in_pos">True</field>
854 <field name="list_price">1.54</field>855 <field name="list_price">1.54</field>
855 <field name="name">Timmermans Geuze 37.5cl</field>856 <field name="name">Timmermans Geuze 37.5cl</field>
856 <field name="public_categ_id" ref="fruity_beers"/>857 <field name="pos_categ_id" ref="fruity_beers"/>
857 <field name="image" type="base64" file="point_of_sale/static/img/timmermans_geuze_37,5cl-image.jpg"/>858 <field name="image" type="base64" file="point_of_sale/static/img/timmermans_geuze_37,5cl-image.jpg"/>
858 </record>859 </record>
859 <record id="timmermans_kriek_37,5cl" model="product.product">860 <record id="timmermans_kriek_37,5cl" model="product.product">
860 <field name="available_in_pos">True</field>861 <field name="available_in_pos">True</field>
861 <field name="list_price">1.7</field>862 <field name="list_price">1.7</field>
862 <field name="name">Timmermans Kriek 37.5cl</field>863 <field name="name">Timmermans Kriek 37.5cl</field>
863 <field name="public_categ_id" ref="fruity_beers"/>864 <field name="pos_categ_id" ref="fruity_beers"/>
864 <field name="image" type="base64" file="point_of_sale/static/img/timmermans_kriek_37,5cl-image.jpg"/>865 <field name="image" type="base64" file="point_of_sale/static/img/timmermans_kriek_37,5cl-image.jpg"/>
865 </record>866 </record>
866 <record id="timmermans_faro_37,5cl" model="product.product">867 <record id="timmermans_faro_37,5cl" model="product.product">
867 <field name="available_in_pos">True</field>868 <field name="available_in_pos">True</field>
868 <field name="list_price">1.56</field>869 <field name="list_price">1.56</field>
869 <field name="name">Timmermans Faro 37.5cl</field>870 <field name="name">Timmermans Faro 37.5cl</field>
870 <field name="public_categ_id" ref="fruity_beers"/>871 <field name="pos_categ_id" ref="fruity_beers"/>
871 <field name="image" type="base64" file="point_of_sale/static/img/timmermans_faro_37,5cl-image.jpg"/>872 <field name="image" type="base64" file="point_of_sale/static/img/timmermans_faro_37,5cl-image.jpg"/>
872 </record>873 </record>
873 <record id="lindemans_pecheresse_37,,5cl" model="product.product">874 <record id="lindemans_pecheresse_37,,5cl" model="product.product">
874 <field name="available_in_pos">True</field>875 <field name="available_in_pos">True</field>
875 <field name="list_price">1.94</field>876 <field name="list_price">1.94</field>
876 <field name="name">Lindemans sinful 37.5cl</field>877 <field name="name">Lindemans sinful 37.5cl</field>
877 <field name="public_categ_id" ref="fruity_beers"/>878 <field name="pos_categ_id" ref="fruity_beers"/>
878 <field name="image" type="base64" file="point_of_sale/static/img/lindemans_pecheresse_37,,5cl-image.jpg"/>879 <field name="image" type="base64" file="point_of_sale/static/img/lindemans_pecheresse_37,,5cl-image.jpg"/>
879 </record>880 </record>
880 <record id="lindemans_kriek_37,5cl" model="product.product">881 <record id="lindemans_kriek_37,5cl" model="product.product">
881 <field name="available_in_pos">True</field>882 <field name="available_in_pos">True</field>
882 <field name="list_price">1.51</field>883 <field name="list_price">1.51</field>
883 <field name="name">Lindemans Kriek 37.5cl</field>884 <field name="name">Lindemans Kriek 37.5cl</field>
884 <field name="public_categ_id" ref="fruity_beers"/>885 <field name="pos_categ_id" ref="fruity_beers"/>
885 <field name="image" type="base64" file="point_of_sale/static/img/lindemans_kriek_37,5cl-image.jpg"/>886 <field name="image" type="base64" file="point_of_sale/static/img/lindemans_kriek_37,5cl-image.jpg"/>
886 </record>887 </record>
887 <record id="grisette_cerise_25cl" model="product.product">888 <record id="grisette_cerise_25cl" model="product.product">
888 <field name="available_in_pos">True</field>889 <field name="available_in_pos">True</field>
889 <field name="list_price">1.04</field>890 <field name="list_price">1.04</field>
890 <field name="name">Grisette Cherry 25cl</field>891 <field name="name">Grisette Cherry 25cl</field>
891 <field name="public_categ_id" ref="fruity_beers"/>892 <field name="pos_categ_id" ref="fruity_beers"/>
892 <field name="image" type="base64" file="point_of_sale/static/img/grisette_cerise_25cl-image.jpg"/>893 <field name="image" type="base64" file="point_of_sale/static/img/grisette_cerise_25cl-image.jpg"/>
893 </record>894 </record>
894 <record id="belle_vue_kriek_25cl" model="product.product">895 <record id="belle_vue_kriek_25cl" model="product.product">
@@ -896,7 +897,7 @@
896 <field name="list_price">0.83</field>897 <field name="list_price">0.83</field>
897 <field name="name">Belle-Vue Kriek 25cl</field>898 <field name="name">Belle-Vue Kriek 25cl</field>
898 <field name='ean13'>5410228193449</field>899 <field name='ean13'>5410228193449</field>
899 <field name="public_categ_id" ref="fruity_beers"/>900 <field name="pos_categ_id" ref="fruity_beers"/>
900 <field name="image" type="base64" file="point_of_sale/static/img/belle_vue_kriek_25cl-image.jpg"/>901 <field name="image" type="base64" file="point_of_sale/static/img/belle_vue_kriek_25cl-image.jpg"/>
901 </record>902 </record>
902903
@@ -905,7 +906,7 @@
905 <field name="list_price">1.00</field>906 <field name="list_price">1.00</field>
906 <field name="name">Leffe Brune 33cl</field>907 <field name="name">Leffe Brune 33cl</field>
907 <field name='ean13'>5410228142164</field>908 <field name='ean13'>5410228142164</field>
908 <field name="public_categ_id" ref="special_beers"/>909 <field name="pos_categ_id" ref="special_beers"/>
909 <field name="image" type="base64" file="point_of_sale/static/img/leffe_brune_33cl-image.jpg"/>910 <field name="image" type="base64" file="point_of_sale/static/img/leffe_brune_33cl-image.jpg"/>
910 </record>911 </record>
911 <record id="leffe_blonde_33cl" model="product.product">912 <record id="leffe_blonde_33cl" model="product.product">
@@ -913,49 +914,49 @@
913 <field name="list_price">1.00</field>914 <field name="list_price">1.00</field>
914 <field name="name">Leffe Blonde 33cl</field>915 <field name="name">Leffe Blonde 33cl</field>
915 <field name='ean13'>5410228142218</field>916 <field name='ean13'>5410228142218</field>
916 <field name="public_categ_id" ref="special_beers"/>917 <field name="pos_categ_id" ref="special_beers"/>
917 <field name="image" type="base64" file="point_of_sale/static/img/leffe_blonde_33cl-image.jpg"/>918 <field name="image" type="base64" file="point_of_sale/static/img/leffe_blonde_33cl-image.jpg"/>
918 </record>919 </record>
919 <record id="leffe_9_33cl" model="product.product">920 <record id="leffe_9_33cl" model="product.product">
920 <field name="available_in_pos">True</field>921 <field name="available_in_pos">True</field>
921 <field name="list_price">1.16</field>922 <field name="list_price">1.16</field>
922 <field name="name">Leffe Brune "9" 33cl</field>923 <field name="name">Leffe Brune "9" 33cl</field>
923 <field name="public_categ_id" ref="special_beers"/>924 <field name="pos_categ_id" ref="special_beers"/>
924 <field name="image" type="base64" file="point_of_sale/static/img/leffe_9_33cl-image.jpg"/>925 <field name="image" type="base64" file="point_of_sale/static/img/leffe_9_33cl-image.jpg"/>
925 </record>926 </record>
926 <record id="orval_33cl" model="product.product">927 <record id="orval_33cl" model="product.product">
927 <field name="available_in_pos">True</field>928 <field name="available_in_pos">True</field>
928 <field name="list_price">1.59</field>929 <field name="list_price">1.59</field>
929 <field name="name">Orval 33cl</field>930 <field name="name">Orval 33cl</field>
930 <field name="public_categ_id" ref="special_beers"/>931 <field name="pos_categ_id" ref="special_beers"/>
931 <field name="image" type="base64" file="point_of_sale/static/img/orval_33cl-image.jpg"/>932 <field name="image" type="base64" file="point_of_sale/static/img/orval_33cl-image.jpg"/>
932 </record>933 </record>
933 <record id="rochefort_8_33cl" model="product.product">934 <record id="rochefort_8_33cl" model="product.product">
934 <field name="available_in_pos">True</field>935 <field name="available_in_pos">True</field>
935 <field name="list_price">1.75</field>936 <field name="list_price">1.75</field>
936 <field name="name">Rochefort "8" 33cl</field>937 <field name="name">Rochefort "8" 33cl</field>
937 <field name="public_categ_id" ref="special_beers"/>938 <field name="pos_categ_id" ref="special_beers"/>
938 <field name="image" type="base64" file="point_of_sale/static/img/rochefort_8_33cl-image.jpg"/>939 <field name="image" type="base64" file="point_of_sale/static/img/rochefort_8_33cl-image.jpg"/>
939 </record>940 </record>
940 <record id="chimay_bleu_33cl" model="product.product">941 <record id="chimay_bleu_33cl" model="product.product">
941 <field name="available_in_pos">True</field>942 <field name="available_in_pos">True</field>
942 <field name="list_price">1.46</field>943 <field name="list_price">1.46</field>
943 <field name="name">Chimay Bleu 33cl</field>944 <field name="name">Chimay Bleu 33cl</field>
944 <field name="public_categ_id" ref="special_beers"/>945 <field name="pos_categ_id" ref="special_beers"/>
945 <field name="image" type="base64" file="point_of_sale/static/img/chimay_bleu_33cl-image.jpg"/>946 <field name="image" type="base64" file="point_of_sale/static/img/chimay_bleu_33cl-image.jpg"/>
946 </record>947 </record>
947 <record id="chimay_bleu_75cl" model="product.product">948 <record id="chimay_bleu_75cl" model="product.product">
948 <field name="available_in_pos">True</field>949 <field name="available_in_pos">True</field>
949 <field name="list_price">3.57</field>950 <field name="list_price">3.57</field>
950 <field name="name">Chimay Bleu 75cl</field>951 <field name="name">Chimay Bleu 75cl</field>
951 <field name="public_categ_id" ref="special_beers"/>952 <field name="pos_categ_id" ref="special_beers"/>
952 <field name="image" type="base64" file="point_of_sale/static/img/chimay_bleu_75cl-image.jpg"/>953 <field name="image" type="base64" file="point_of_sale/static/img/chimay_bleu_75cl-image.jpg"/>
953 </record>954 </record>
954 <record id="chimay_rouge_33cl" model="product.product">955 <record id="chimay_rouge_33cl" model="product.product">
955 <field name="available_in_pos">True</field>956 <field name="available_in_pos">True</field>
956 <field name="list_price">1.02</field>957 <field name="list_price">1.02</field>
957 <field name="name">Chimay Red 33cl</field>958 <field name="name">Chimay Red 33cl</field>
958 <field name="public_categ_id" ref="special_beers"/>959 <field name="pos_categ_id" ref="special_beers"/>
959 <field name="image" type="base64" file="point_of_sale/static/img/chimay_rouge_33cl-image.jpg"/>960 <field name="image" type="base64" file="point_of_sale/static/img/chimay_rouge_33cl-image.jpg"/>
960 </record>961 </record>
961962
@@ -963,84 +964,84 @@
963 <field name="available_in_pos">True</field>964 <field name="available_in_pos">True</field>
964 <field name="list_price">2.86</field>965 <field name="list_price">2.86</field>
965 <field name="name">Dr. Oetker Ristorante Mozzarella</field>966 <field name="name">Dr. Oetker Ristorante Mozzarella</field>
966 <field name="public_categ_id" ref="pizza"/>967 <field name="pos_categ_id" ref="pizza"/>
967 <field name="image" type="base64" file="point_of_sale/static/img/oetker_mozzarella-image.jpg"/>968 <field name="image" type="base64" file="point_of_sale/static/img/oetker_mozzarella-image.jpg"/>
968 </record>969 </record>
969 <record id="oetker_bolognese" model="product.product">970 <record id="oetker_bolognese" model="product.product">
970 <field name="available_in_pos">True</field>971 <field name="available_in_pos">True</field>
971 <field name="list_price">2.86</field>972 <field name="list_price">2.86</field>
972 <field name="name">Dr. Oetker Ristorante Bolognese</field>973 <field name="name">Dr. Oetker Ristorante Bolognese</field>
973 <field name="public_categ_id" ref="pizza"/>974 <field name="pos_categ_id" ref="pizza"/>
974 <field name="image" type="base64" file="point_of_sale/static/img/oetker_bolognese-image.jpg"/>975 <field name="image" type="base64" file="point_of_sale/static/img/oetker_bolognese-image.jpg"/>
975 </record>976 </record>
976 <record id="oetker_funghi" model="product.product">977 <record id="oetker_funghi" model="product.product">
977 <field name="available_in_pos">True</field>978 <field name="available_in_pos">True</field>
978 <field name="list_price">2.86</field>979 <field name="list_price">2.86</field>
979 <field name="name">Dr. Oetker Ristorante Funghi</field>980 <field name="name">Dr. Oetker Ristorante Funghi</field>
980 <field name="public_categ_id" ref="pizza"/>981 <field name="pos_categ_id" ref="pizza"/>
981 <field name="image" type="base64" file="point_of_sale/static/img/oetker_funghi-image.jpg"/>982 <field name="image" type="base64" file="point_of_sale/static/img/oetker_funghi-image.jpg"/>
982 </record>983 </record>
983 <record id="oetker_hawaii" model="product.product">984 <record id="oetker_hawaii" model="product.product">
984 <field name="available_in_pos">True</field>985 <field name="available_in_pos">True</field>
985 <field name="list_price">2.86</field>986 <field name="list_price">2.86</field>
986 <field name="name">Dr. Oetker Ristorante Hawaii</field>987 <field name="name">Dr. Oetker Ristorante Hawaii</field>
987 <field name="public_categ_id" ref="pizza"/>988 <field name="pos_categ_id" ref="pizza"/>
988 <field name="image" type="base64" file="point_of_sale/static/img/oetker_hawaii-image.jpg"/>989 <field name="image" type="base64" file="point_of_sale/static/img/oetker_hawaii-image.jpg"/>
989 </record>990 </record>
990 <record id="oetker_pollo" model="product.product">991 <record id="oetker_pollo" model="product.product">
991 <field name="available_in_pos">True</field>992 <field name="available_in_pos">True</field>
992 <field name="list_price">2.86</field>993 <field name="list_price">2.86</field>
993 <field name="name">Dr. Oetker Ristorante Pollo</field>994 <field name="name">Dr. Oetker Ristorante Pollo</field>
994 <field name="public_categ_id" ref="pizza"/>995 <field name="pos_categ_id" ref="pizza"/>
995 <field name="image" type="base64" file="point_of_sale/static/img/oetker_pollo-image.jpg"/>996 <field name="image" type="base64" file="point_of_sale/static/img/oetker_pollo-image.jpg"/>
996 </record>997 </record>
997 <record id="oetker_prosciutto" model="product.product">998 <record id="oetker_prosciutto" model="product.product">
998 <field name="available_in_pos">True</field>999 <field name="available_in_pos">True</field>
999 <field name="list_price">2.86</field>1000 <field name="list_price">2.86</field>
1000 <field name="name">Dr. Oetker Ristorante Prosciutto</field>1001 <field name="name">Dr. Oetker Ristorante Prosciutto</field>
1001 <field name="public_categ_id" ref="pizza"/>1002 <field name="pos_categ_id" ref="pizza"/>
1002 <field name="image" type="base64" file="point_of_sale/static/img/oetker_prosciutto-image.jpg"/>1003 <field name="image" type="base64" file="point_of_sale/static/img/oetker_prosciutto-image.jpg"/>
1003 </record>1004 </record>
1004 <record id="oetker_4formaggi" model="product.product">1005 <record id="oetker_4formaggi" model="product.product">
1005 <field name="available_in_pos">True</field>1006 <field name="available_in_pos">True</field>
1006 <field name="list_price">2.86</field>1007 <field name="list_price">2.86</field>
1007 <field name="name">Dr. Oetker Ristorante Quattro Formaggi</field>1008 <field name="name">Dr. Oetker Ristorante Quattro Formaggi</field>
1008 <field name="public_categ_id" ref="pizza"/>1009 <field name="pos_categ_id" ref="pizza"/>
1009 <field name="image" type="base64" file="point_of_sale/static/img/oetker_4formaggi-image.jpg"/>1010 <field name="image" type="base64" file="point_of_sale/static/img/oetker_4formaggi-image.jpg"/>
1010 </record>1011 </record>
1011 <record id="oetker_speciale" model="product.product">1012 <record id="oetker_speciale" model="product.product">
1012 <field name="available_in_pos">True</field>1013 <field name="available_in_pos">True</field>
1013 <field name="list_price">2.86</field>1014 <field name="list_price">2.86</field>
1014 <field name="name">Dr. Oetker Ristorante Speciale</field>1015 <field name="name">Dr. Oetker Ristorante Speciale</field>
1015 <field name="public_categ_id" ref="pizza"/>1016 <field name="pos_categ_id" ref="pizza"/>
1016 <field name="image" type="base64" file="point_of_sale/static/img/oetker_speciale-image.jpg"/>1017 <field name="image" type="base64" file="point_of_sale/static/img/oetker_speciale-image.jpg"/>
1017 </record>1018 </record>
1018 <record id="oetker_spinaci" model="product.product">1019 <record id="oetker_spinaci" model="product.product">
1019 <field name="available_in_pos">True</field>1020 <field name="available_in_pos">True</field>
1020 <field name="list_price">2.86</field>1021 <field name="list_price">2.86</field>
1021 <field name="name">Dr. Oetker Ristorante Spinaci</field>1022 <field name="name">Dr. Oetker Ristorante Spinaci</field>
1022 <field name="public_categ_id" ref="pizza"/>1023 <field name="pos_categ_id" ref="pizza"/>
1023 <field name="image" type="base64" file="point_of_sale/static/img/oetker_spinaci-image.jpg"/>1024 <field name="image" type="base64" file="point_of_sale/static/img/oetker_spinaci-image.jpg"/>
1024 </record>1025 </record>
1025 <record id="oetker_tonno" model="product.product">1026 <record id="oetker_tonno" model="product.product">
1026 <field name="available_in_pos">True</field>1027 <field name="available_in_pos">True</field>
1027 <field name="list_price">2.86</field>1028 <field name="list_price">2.86</field>
1028 <field name="name">Dr. Oetker Ristorante Tonno</field>1029 <field name="name">Dr. Oetker Ristorante Tonno</field>
1029 <field name="public_categ_id" ref="pizza"/>1030 <field name="pos_categ_id" ref="pizza"/>
1030 <field name="image" type="base64" file="point_of_sale/static/img/oetker_tonno-image.jpg"/>1031 <field name="image" type="base64" file="point_of_sale/static/img/oetker_tonno-image.jpg"/>
1031 </record>1032 </record>
1032 <record id="oetker_vegetale" model="product.product">1033 <record id="oetker_vegetale" model="product.product">
1033 <field name="available_in_pos">True</field>1034 <field name="available_in_pos">True</field>
1034 <field name="list_price">2.86</field>1035 <field name="list_price">2.86</field>
1035 <field name="name">Dr. Oetker Ristorante Vegetable</field>1036 <field name="name">Dr. Oetker Ristorante Vegetable</field>
1036 <field name="public_categ_id" ref="pizza"/>1037 <field name="pos_categ_id" ref="pizza"/>
1037 <field name="image" type="base64" file="point_of_sale/static/img/oetker_vegetale-image.jpg"/>1038 <field name="image" type="base64" file="point_of_sale/static/img/oetker_vegetale-image.jpg"/>
1038 </record>1039 </record>
1039 <record id="oetker_margherita" model="product.product">1040 <record id="oetker_margherita" model="product.product">
1040 <field name="available_in_pos">True</field>1041 <field name="available_in_pos">True</field>
1041 <field name="list_price">2.67</field>1042 <field name="list_price">2.67</field>
1042 <field name="name">Dr. Oetker La Margherita</field>1043 <field name="name">Dr. Oetker La Margherita</field>
1043 <field name="public_categ_id" ref="pizza"/>1044 <field name="pos_categ_id" ref="pizza"/>
1044 <field name="image" type="base64" file="point_of_sale/static/img/oetker_margherita-image.jpg"/>1045 <field name="image" type="base64" file="point_of_sale/static/img/oetker_margherita-image.jpg"/>
1045 </record>1046 </record>
10461047
@@ -1048,42 +1049,42 @@
1048 <field name="available_in_pos">True</field>1049 <field name="available_in_pos">True</field>
1049 <field name="list_price">0.33</field>1050 <field name="list_price">0.33</field>
1050 <field name="name">Croky Paprika 45g</field>1051 <field name="name">Croky Paprika 45g</field>
1051 <field name="public_categ_id" ref="chips"/>1052 <field name="pos_categ_id" ref="chips"/>
1052 <field name="image" type="base64" file="point_of_sale/static/img/croky_paprika_45g-image.jpg"/>1053 <field name="image" type="base64" file="point_of_sale/static/img/croky_paprika_45g-image.jpg"/>
1053 </record>1054 </record>
1054 <record id="croky_naturel_45g" model="product.product">1055 <record id="croky_naturel_45g" model="product.product">
1055 <field name="available_in_pos">True</field>1056 <field name="available_in_pos">True</field>
1056 <field name="list_price">0.39</field>1057 <field name="list_price">0.39</field>
1057 <field name="name">Croky Natural 45g</field>1058 <field name="name">Croky Natural 45g</field>
1058 <field name="public_categ_id" ref="chips"/>1059 <field name="pos_categ_id" ref="chips"/>
1059 <field name="image" type="base64" file="point_of_sale/static/img/croky_naturel_45g-image.jpg"/>1060 <field name="image" type="base64" file="point_of_sale/static/img/croky_naturel_45g-image.jpg"/>
1060 </record>1061 </record>
1061 <record id="croky_bolognaise_250g" model="product.product">1062 <record id="croky_bolognaise_250g" model="product.product">
1062 <field name="available_in_pos">True</field>1063 <field name="available_in_pos">True</field>
1063 <field name="list_price">1.78</field>1064 <field name="list_price">1.78</field>
1064 <field name="name">Croky Bolognese 250g</field>1065 <field name="name">Croky Bolognese 250g</field>
1065 <field name="public_categ_id" ref="chips"/>1066 <field name="pos_categ_id" ref="chips"/>
1066 <field name="image" type="base64" file="point_of_sale/static/img/croky_bolognaise_250g-image.jpg"/>1067 <field name="image" type="base64" file="point_of_sale/static/img/croky_bolognaise_250g-image.jpg"/>
1067 </record>1068 </record>
1068 <record id="lays_pickles_250g" model="product.product">1069 <record id="lays_pickles_250g" model="product.product">
1069 <field name="available_in_pos">True</field>1070 <field name="available_in_pos">True</field>
1070 <field name="list_price">1.48</field>1071 <field name="list_price">1.48</field>
1071 <field name="name">250g Lays Pickels</field>1072 <field name="name">250g Lays Pickels</field>
1072 <field name="public_categ_id" ref="chips"/>1073 <field name="pos_categ_id" ref="chips"/>
1073 <field name="image" type="base64" file="point_of_sale/static/img/lays_pickles_250g-image.jpg"/>1074 <field name="image" type="base64" file="point_of_sale/static/img/lays_pickles_250g-image.jpg"/>
1074 </record>1075 </record>
1075 <record id="lays_ketchup_250g" model="product.product">1076 <record id="lays_ketchup_250g" model="product.product">
1076 <field name="available_in_pos">True</field>1077 <field name="available_in_pos">True</field>
1077 <field name="list_price">1.48</field>1078 <field name="list_price">1.48</field>
1078 <field name="name">Lays Ketchup 250g</field>1079 <field name="name">Lays Ketchup 250g</field>
1079 <field name="public_categ_id" ref="chips"/>1080 <field name="pos_categ_id" ref="chips"/>
1080 <field name="image" type="base64" file="point_of_sale/static/img/lays_ketchup_250g-image.jpg"/>1081 <field name="image" type="base64" file="point_of_sale/static/img/lays_ketchup_250g-image.jpg"/>
1081 </record>1082 </record>
1082 <record id="lays_poivre_sel_oven_150g" model="product.product">1083 <record id="lays_poivre_sel_oven_150g" model="product.product">
1083 <field name="available_in_pos">True</field>1084 <field name="available_in_pos">True</field>
1084 <field name="list_price">1.58</field>1085 <field name="list_price">1.58</field>
1085 <field name="name">Lays Salt and Pepper Oven Baked 150g</field>1086 <field name="name">Lays Salt and Pepper Oven Baked 150g</field>
1086 <field name="public_categ_id" ref="chips"/>1087 <field name="pos_categ_id" ref="chips"/>
1087 <field name="image" type="base64" file="point_of_sale/static/img/lays_poivre_sel_oven_150g-image.jpg"/>1088 <field name="image" type="base64" file="point_of_sale/static/img/lays_poivre_sel_oven_150g-image.jpg"/>
1088 </record>1089 </record>
10891090
@@ -1091,35 +1092,35 @@
1091 <field name="available_in_pos">True</field>1092 <field name="available_in_pos">True</field>
1092 <field name="list_price">1.54</field>1093 <field name="list_price">1.54</field>
1093 <field name="name">Oven Baked Lays Paprika 150g</field>1094 <field name="name">Oven Baked Lays Paprika 150g</field>
1094 <field name="public_categ_id" ref="chips"/>1095 <field name="pos_categ_id" ref="chips"/>
1095 <field name="image" type="base64" file="point_of_sale/static/img/lays_paprika_oven_150g-image.jpg"/>1096 <field name="image" type="base64" file="point_of_sale/static/img/lays_paprika_oven_150g-image.jpg"/>
1096 </record>1097 </record>
1097 <record id="lays_paprika_300g" model="product.product">1098 <record id="lays_paprika_300g" model="product.product">
1098 <field name="available_in_pos">True</field>1099 <field name="available_in_pos">True</field>
1099 <field name="list_price">1.55</field>1100 <field name="list_price">1.55</field>
1100 <field name="name">Lays Paprika XXL 300g</field>1101 <field name="name">Lays Paprika XXL 300g</field>
1101 <field name="public_categ_id" ref="chips"/>1102 <field name="pos_categ_id" ref="chips"/>
1102 <field name="image" type="base64" file="point_of_sale/static/img/lays_paprika_300g-image.jpg"/>1103 <field name="image" type="base64" file="point_of_sale/static/img/lays_paprika_300g-image.jpg"/>
1103 </record>1104 </record>
1104 <record id="lays_paprika_170g" model="product.product">1105 <record id="lays_paprika_170g" model="product.product">
1105 <field name="available_in_pos">True</field>1106 <field name="available_in_pos">True</field>
1106 <field name="list_price">1.48</field>1107 <field name="list_price">1.48</field>
1107 <field name="name">Lays Light Paprika 170g</field>1108 <field name="name">Lays Light Paprika 170g</field>
1108 <field name="public_categ_id" ref="chips"/>1109 <field name="pos_categ_id" ref="chips"/>
1109 <field name="image" type="base64" file="point_of_sale/static/img/lays_paprika_170g-image.jpg"/>1110 <field name="image" type="base64" file="point_of_sale/static/img/lays_paprika_170g-image.jpg"/>
1110 </record>1111 </record>
1111 <record id="lays_light_paprika_170g" model="product.product">1112 <record id="lays_light_paprika_170g" model="product.product">
1112 <field name="available_in_pos">True</field>1113 <field name="available_in_pos">True</field>
1113 <field name="list_price">1.48</field>1114 <field name="list_price">1.48</field>
1114 <field name="name">Lays Light Paprika 170g</field>1115 <field name="name">Lays Light Paprika 170g</field>
1115 <field name="public_categ_id" ref="chips"/>1116 <field name="pos_categ_id" ref="chips"/>
1116 <field name="image" type="base64" file="point_of_sale/static/img/lays_light_paprika_170g-image.jpg"/>1117 <field name="image" type="base64" file="point_of_sale/static/img/lays_light_paprika_170g-image.jpg"/>
1117 </record>1118 </record>
1118 <record id="lays_paprika_45g" model="product.product">1119 <record id="lays_paprika_45g" model="product.product">
1119 <field name="available_in_pos">True</field>1120 <field name="available_in_pos">True</field>
1120 <field name="list_price">0.39</field>1121 <field name="list_price">0.39</field>
1121 <field name="name">Lays Paprika 45g</field>1122 <field name="name">Lays Paprika 45g</field>
1122 <field name="public_categ_id" ref="chips"/>1123 <field name="pos_categ_id" ref="chips"/>
1123 <field name="image" type="base64" file="point_of_sale/static/img/lays_paprika_45g-image.jpg"/>1124 <field name="image" type="base64" file="point_of_sale/static/img/lays_paprika_45g-image.jpg"/>
1124 </record>1125 </record>
11251126
@@ -1127,35 +1128,35 @@
1127 <field name="available_in_pos">True</field>1128 <field name="available_in_pos">True</field>
1128 <field name="list_price">1.54</field>1129 <field name="list_price">1.54</field>
1129 <field name="name">Oven Baked Lays Natural 150g</field>1130 <field name="name">Oven Baked Lays Natural 150g</field>
1130 <field name="public_categ_id" ref="chips"/>1131 <field name="pos_categ_id" ref="chips"/>
1131 <field name="image" type="base64" file="point_of_sale/static/img/lays_naturel_oven_150g-image.jpg"/>1132 <field name="image" type="base64" file="point_of_sale/static/img/lays_naturel_oven_150g-image.jpg"/>
1132 </record>1133 </record>
1133 <record id="lays_naturel_300g" model="product.product">1134 <record id="lays_naturel_300g" model="product.product">
1134 <field name="available_in_pos">True</field>1135 <field name="available_in_pos">True</field>
1135 <field name="list_price">1.55</field>1136 <field name="list_price">1.55</field>
1136 <field name="name">Lays Natural XXL 300g</field>1137 <field name="name">Lays Natural XXL 300g</field>
1137 <field name="public_categ_id" ref="chips"/>1138 <field name="pos_categ_id" ref="chips"/>
1138 <field name="image" type="base64" file="point_of_sale/static/img/lays_naturel_300g-image.jpg"/>1139 <field name="image" type="base64" file="point_of_sale/static/img/lays_naturel_300g-image.jpg"/>
1139 </record>1140 </record>
1140 <record id="lays_naturel_170g" model="product.product">1141 <record id="lays_naturel_170g" model="product.product">
1141 <field name="available_in_pos">True</field>1142 <field name="available_in_pos">True</field>
1142 <field name="list_price">1.48</field>1143 <field name="list_price">1.48</field>
1143 <field name="name">Lays Natural Light 170g</field>1144 <field name="name">Lays Natural Light 170g</field>
1144 <field name="public_categ_id" ref="chips"/>1145 <field name="pos_categ_id" ref="chips"/>
1145 <field name="image" type="base64" file="point_of_sale/static/img/lays_naturel_170g-image.jpg"/>1146 <field name="image" type="base64" file="point_of_sale/static/img/lays_naturel_170g-image.jpg"/>
1146 </record>1147 </record>
1147 <record id="lays_light_naturel_170g" model="product.product">1148 <record id="lays_light_naturel_170g" model="product.product">
1148 <field name="available_in_pos">True</field>1149 <field name="available_in_pos">True</field>
1149 <field name="list_price">1.48</field>1150 <field name="list_price">1.48</field>
1150 <field name="name">Lays Natural Light 170g</field>1151 <field name="name">Lays Natural Light 170g</field>
1151 <field name="public_categ_id" ref="chips"/>1152 <field name="pos_categ_id" ref="chips"/>
1152 <field name="image" type="base64" file="point_of_sale/static/img/lays_light_naturel_170g-image.jpg"/>1153 <field name="image" type="base64" file="point_of_sale/static/img/lays_light_naturel_170g-image.jpg"/>
1153 </record>1154 </record>
1154 <record id="lays_naturel_45g" model="product.product">1155 <record id="lays_naturel_45g" model="product.product">
1155 <field name="available_in_pos">True</field>1156 <field name="available_in_pos">True</field>
1156 <field name="list_price">0.39</field>1157 <field name="list_price">0.39</field>
1157 <field name="name">Lays Natural 45g</field>1158 <field name="name">Lays Natural 45g</field>
1158 <field name="public_categ_id" ref="chips"/>1159 <field name="pos_categ_id" ref="chips"/>
1159 <field name="image" type="base64" file="point_of_sale/static/img/lays_naturel_45g-image.jpg"/>1160 <field name="image" type="base64" file="point_of_sale/static/img/lays_naturel_45g-image.jpg"/>
1160 </record>1161 </record>
11611162
@@ -1163,35 +1164,35 @@
1163 <field name="available_in_pos">True</field>1164 <field name="available_in_pos">True</field>
1164 <field name="list_price">7.60</field>1165 <field name="list_price">7.60</field>
1165 <field name="name">IJsboerke Chocolat 2.5L</field>1166 <field name="name">IJsboerke Chocolat 2.5L</field>
1166 <field name="public_categ_id" ref="ice_cream"/>1167 <field name="pos_categ_id" ref="ice_cream"/>
1167 <field name="image" type="base64" file="point_of_sale/static/img/ijsboerke_chocolat_2,5l-image.jpg"/>1168 <field name="image" type="base64" file="point_of_sale/static/img/ijsboerke_chocolat_2,5l-image.jpg"/>
1168 </record>1169 </record>
1169 <record id="ijsboerke_moka_2,5l" model="product.product">1170 <record id="ijsboerke_moka_2,5l" model="product.product">
1170 <field name="available_in_pos">True</field>1171 <field name="available_in_pos">True</field>
1171 <field name="list_price">7.60</field>1172 <field name="list_price">7.60</field>
1172 <field name="name">IJsboerke Mocha 2.5L</field>1173 <field name="name">IJsboerke Mocha 2.5L</field>
1173 <field name="public_categ_id" ref="ice_cream"/>1174 <field name="pos_categ_id" ref="ice_cream"/>
1174 <field name="image" type="base64" file="point_of_sale/static/img/ijsboerke_moka_2,5l-image.jpg"/>1175 <field name="image" type="base64" file="point_of_sale/static/img/ijsboerke_moka_2,5l-image.jpg"/>
1175 </record>1176 </record>
1176 <record id="ijsboerke_vanille_2,5l" model="product.product">1177 <record id="ijsboerke_vanille_2,5l" model="product.product">
1177 <field name="available_in_pos">True</field>1178 <field name="available_in_pos">True</field>
1178 <field name="list_price">7.40</field>1179 <field name="list_price">7.40</field>
1179 <field name="name">IJsboerke Vanilla 2.5L</field>1180 <field name="name">IJsboerke Vanilla 2.5L</field>
1180 <field name="public_categ_id" ref="ice_cream"/>1181 <field name="pos_categ_id" ref="ice_cream"/>
1181 <field name="image" type="base64" file="point_of_sale/static/img/ijsboerke_vanille_2,5l-image.jpg"/>1182 <field name="image" type="base64" file="point_of_sale/static/img/ijsboerke_vanille_2,5l-image.jpg"/>
1182 </record>1183 </record>
1183 <record id="ijsboerke_stracciatella_2,5l" model="product.product">1184 <record id="ijsboerke_stracciatella_2,5l" model="product.product">
1184 <field name="available_in_pos">True</field>1185 <field name="available_in_pos">True</field>
1185 <field name="list_price">8.40</field>1186 <field name="list_price">8.40</field>
1186 <field name="name">IJsboerke Stracciatella 2.5L</field>1187 <field name="name">IJsboerke Stracciatella 2.5L</field>
1187 <field name="public_categ_id" ref="ice_cream"/>1188 <field name="pos_categ_id" ref="ice_cream"/>
1188 <field name="image" type="base64" file="point_of_sale/static/img/ijsboerke_stracciatella_2,5l-image.jpg"/>1189 <field name="image" type="base64" file="point_of_sale/static/img/ijsboerke_stracciatella_2,5l-image.jpg"/>
1189 </record>1190 </record>
1190 <record id="ijsboerke_dame_blanche_2,5l" model="product.product">1191 <record id="ijsboerke_dame_blanche_2,5l" model="product.product">
1191 <field name="available_in_pos">True</field>1192 <field name="available_in_pos">True</field>
1192 <field name="list_price">7.60</field>1193 <field name="list_price">7.60</field>
1193 <field name="name">IJsboerke 2.5L White Lady</field>1194 <field name="name">IJsboerke 2.5L White Lady</field>
1194 <field name="public_categ_id" ref="ice_cream"/>1195 <field name="pos_categ_id" ref="ice_cream"/>
1195 <field name="image" type="base64" file="point_of_sale/static/img/ijsboerke_dame_blanche_2,5l-image.jpg"/>1196 <field name="image" type="base64" file="point_of_sale/static/img/ijsboerke_dame_blanche_2,5l-image.jpg"/>
1196 </record>1197 </record>
1197 1198
11981199
=== modified file 'point_of_sale/point_of_sale_view.xml'
--- point_of_sale/point_of_sale_view.xml 2014-05-07 18:29:17 +0000
+++ point_of_sale/point_of_sale_view.xml 2014-05-26 16:10:21 +0000
@@ -477,13 +477,68 @@
477477
478478
479479
480 <record id="product_normal_form_view" model="ir.ui.view">480 <!-- Product Public Categories -->
481 <field name="name">product.normal.form.inherit</field>481 <record id="product_pos_category_form_view" model="ir.ui.view">
482 <field name="model">product.product</field>482 <field name="name">pos.category.form</field>
483 <field name="inherit_id" ref="stock.view_normal_procurement_locations_form"/>483 <field name="model">pos.category</field>
484 <field name="arch" type="xml">484 <field name="arch" type="xml">
485 <group name="sale" position="inside">485 <form string="Pos Categories" version="7.0">
486 <sheet>
487 <field name="image_medium" widget='image' class="oe_avatar oe_right"/>
488 <div class="oe_left">
489 <group>
490 <field name="name"/>
491 <field name="parent_id"/>
492 <field name="sequence"/>
493 </group>
494 </div>
495 </sheet>
496 </form>
497 </field>
498 </record>
499 <record id="product_pos_category_tree_view" model="ir.ui.view">
500 <field name="name">pos.category.tree</field>
501 <field name="model">pos.category</field>
502 <field name="field_parent" eval="False"/>
503 <field name="arch" type="xml">
504 <tree string="Product Product Categories">
505 <field name="sequence" invisible="1"/>
506 <field name="complete_name"/>
507 </tree>
508 </field>
509 </record>
510 <record id="product_pos_category_action" model="ir.actions.act_window">
511 <field name="name">Pos Product Categories</field>
512 <field name="type">ir.actions.act_window</field>
513 <field name="res_model">pos.category</field>
514 <field name="view_type">form</field>
515 <field name="view_mode">tree,form</field>
516 <field name="view_id" eval="False"/>
517 <field name="help" type="html">
518 <p class="oe_view_nocontent_create">
519 Click to define a new category.
520 </p><p>
521 Categories are used to browse your products through the
522 touchscreen interface.
523 </p><p>
524 If you put a photo on the category, the layout of the
525 touchscreen interface will automatically. We suggest not to put
526 a photo on categories for small (1024x768) screens.
527 </p>
528 </field>
529 </record>
530 <menuitem action="product_pos_category_action" id="menu_product_pos_category" parent="menu_point_of_sale_product" sequence="0" />
531 <!-- END -->
532
533
534 <record id="product_template_form_view" model="ir.ui.view">
535 <field name="name">product.template.form.inherit</field>
536 <field name="model">product.template</field>
537 <field name="inherit_id" ref="product.product_template_form_view"/>
538 <field name="arch" type="xml">
539 <group name="website_and_pos" position="inside">
486 <group name="pos" string="Point of Sale">540 <group name="pos" string="Point of Sale">
541 <field name="pos_categ_id"/>
487 <field name="available_in_pos"/>542 <field name="available_in_pos"/>
488 <field name="to_weight" />543 <field name="to_weight" />
489 <field name="income_pdt"/>544 <field name="income_pdt"/>
@@ -495,9 +550,6 @@
495 </field>550 </field>
496 </field>551 </field>
497 </record>552 </record>
498
499 <!-- Categories tree view -->
500 <menuitem action="product.product_public_category_action" id="menu_product_public_category" parent="menu_point_of_sale_product" sequence="0" />
501 <!-- END -->553 <!-- END -->
502554
503 <menuitem name="Configuration" parent="menu_point_root"555 <menuitem name="Configuration" parent="menu_point_root"
504556
=== modified file 'point_of_sale/security/ir.model.access.csv'
--- point_of_sale/security/ir.model.access.csv 2014-02-03 17:30:00 +0000
+++ point_of_sale/security/ir.model.access.csv 2014-05-26 16:10:21 +0000
@@ -57,5 +57,5 @@
57access_pos_session_user,pos.session user,model_pos_session,group_pos_user,1,1,1,057access_pos_session_user,pos.session user,model_pos_session,group_pos_user,1,1,1,0
58access_pos_config_user,pos.config user,model_pos_config,group_pos_user,1,1,1,058access_pos_config_user,pos.config user,model_pos_config,group_pos_user,1,1,1,0
59access_ir_sequence_manager,ir.sequence manager,base.model_ir_sequence,group_pos_manager,1,1,1,159access_ir_sequence_manager,ir.sequence manager,base.model_ir_sequence,group_pos_manager,1,1,1,1
60access_product_category_pos_manager,product.public.category manager,product.model_product_public_category,group_pos_manager,1,1,1,160access_product_category_pos_manager,pos.category manager,model_pos_category,group_pos_manager,1,1,1,1
61access_product_category_pos_user,product.public.category user,product.model_product_public_category,group_pos_user,1,0,0,061access_product_category_pos_user,pos.category user,model_pos_category,group_pos_user,1,0,0,0
6262
=== modified file 'point_of_sale/static/src/js/db.js'
--- point_of_sale/static/src/js/db.js 2014-01-27 16:10:05 +0000
+++ point_of_sale/static/src/js/db.js 2014-05-26 16:10:21 +0000
@@ -145,7 +145,7 @@
145 for(var i = 0, len = products.length; i < len; i++){145 for(var i = 0, len = products.length; i < len; i++){
146 var product = products[i];146 var product = products[i];
147 var search_string = this._product_search_string(product);147 var search_string = this._product_search_string(product);
148 var categ_id = product.public_categ_id ? product.public_categ_id[0] : this.root_category_id;148 var categ_id = product.pos_categ_id ? product.pos_categ_id[0] : this.root_category_id;
149 if(!stored_categories[categ_id]){149 if(!stored_categories[categ_id]){
150 stored_categories[categ_id] = [];150 stored_categories[categ_id] = [];
151 }151 }
152152
=== modified file 'point_of_sale/static/src/js/models.js'
--- point_of_sale/static/src/js/models.js 2014-03-28 14:57:10 +0000
+++ point_of_sale/static/src/js/models.js 2014-05-26 16:10:21 +0000
@@ -208,13 +208,13 @@
208 }).then(function(packagings){208 }).then(function(packagings){
209 self.db.add_packagings(packagings);209 self.db.add_packagings(packagings);
210210
211 return self.fetch('product.public.category', ['id','name','parent_id','child_id','image'])211 return self.fetch('pos.category', ['id','name','parent_id','child_id','image'])
212 }).then(function(categories){212 }).then(function(categories){
213 self.db.add_categories(categories);213 self.db.add_categories(categories);
214214
215 return self.fetch(215 return self.fetch(
216 'product.product', 216 'product.product',
217 ['name', 'list_price','price','public_categ_id', 'taxes_id', 'ean13', 'default_code',217 ['name', 'list_price','price','pos_categ_id', 'taxes_id', 'ean13', 'default_code',
218 'to_weight', 'uom_id', 'uos_id', 'uos_coeff', 'mes_type', 'description_sale', 'description'],218 'to_weight', 'uom_id', 'uos_id', 'uos_coeff', 'mes_type', 'description_sale', 'description'],
219 [['sale_ok','=',true],['available_in_pos','=',true]],219 [['sale_ok','=',true],['available_in_pos','=',true]],
220 {pricelist: self.pricelist.id} // context for price220 {pricelist: self.pricelist.id} // context for price
221221
=== modified file 'point_of_sale/static/src/js/widgets.js'
--- point_of_sale/static/src/js/widgets.js 2014-04-25 12:22:20 +0000
+++ point_of_sale/static/src/js/widgets.js 2014-05-26 16:10:21 +0000
@@ -436,7 +436,7 @@
436 },436 },
437437
438 get_image_url: function(category){438 get_image_url: function(category){
439 return window.location.origin + '/web/binary/image?model=product.public.category&field=image_medium&id='+category.id;439 return window.location.origin + '/web/binary/image?model=pos.category&field=image_medium&id='+category.id;
440 },440 },
441441
442 render_category: function( category, with_image ){442 render_category: function( category, with_image ){
443443
=== modified file 'product/pricelist.py'
--- product/pricelist.py 2014-03-17 12:01:26 +0000
+++ product/pricelist.py 2014-05-26 16:10:21 +0000
@@ -188,10 +188,13 @@
188188
189 products = map(lambda x: x[0], products_by_qty_by_partner)189 products = map(lambda x: x[0], products_by_qty_by_partner)
190 currency_obj = self.pool.get('res.currency')190 currency_obj = self.pool.get('res.currency')
191 product_obj = self.pool.get('product.product')191 product_obj = self.pool.get('product.template')
192 product_uom_obj = self.pool.get('product.uom')192 product_uom_obj = self.pool.get('product.uom')
193 price_type_obj = self.pool.get('product.price.type')193 price_type_obj = self.pool.get('product.price.type')
194194
195 if not products:
196 return {}
197
195 version = False198 version = False
196 for v in pricelist.version_id:199 for v in pricelist.version_id:
197 if ((v.date_start is False) or (v.date_start <= date)) and ((v.date_end is False) or (v.date_end >= date)):200 if ((v.date_start is False) or (v.date_start <= date)) and ((v.date_end is False) or (v.date_end >= date)):
@@ -207,8 +210,13 @@
207 categ = categ.parent_id210 categ = categ.parent_id
208 categ_ids = categ_ids.keys()211 categ_ids = categ_ids.keys()
209212
210 prod_ids = [x.id for x in products]213 is_product_template = products[0]._name == "product.template"
211 prod_tmpl_ids = [x.product_tmpl_id.id for x in products]214 if is_product_template:
215 prod_tmpl_ids = [tmpl.id for tmpl in products]
216 prod_ids = [product.id for product in tmpl.product_variant_ids for tmpl in products]
217 else:
218 prod_ids = [product.id for product in products]
219 prod_tmpl_ids = [product.product_tmpl_id.id for product in products]
212220
213 # Load all rules221 # Load all rules
214 cr.execute(222 cr.execute(
@@ -234,10 +242,17 @@
234 for rule in items:242 for rule in items:
235 if rule.min_quantity and qty<rule.min_quantity:243 if rule.min_quantity and qty<rule.min_quantity:
236 continue244 continue
237 if rule.product_tmpl_id and product.product_tmpl_id.id<>rule.product_tmpl_id.id:245 if is_product_template:
238 continue246 if rule.product_tmpl_id and product.id<>rule.product_tmpl_id.id:
239 if rule.product_id and product.id<>rule.product_id.id:247 continue
240 continue248 if rule.product_id:
249 continue
250 else:
251 if rule.product_tmpl_id and product.product_tmpl_id.id<>rule.product_tmpl_id.id:
252 continue
253 if rule.product_id and product.id<>rule.product_id.id:
254 continue
255
241 if rule.categ_id:256 if rule.categ_id:
242 cat = product.categ_id257 cat = product.categ_id
243 while cat:258 while cat:
244259
=== modified file 'product/product.py'
--- product/product.py 2014-05-09 07:33:15 +0000
+++ product/product.py 2014-05-26 16:10:21 +0000
@@ -29,6 +29,7 @@
29from openerp.osv import osv, fields29from openerp.osv import osv, fields
30from openerp.tools.translate import _30from openerp.tools.translate import _
31from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT31from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT
32import psycopg2
3233
33import openerp.addons.decimal_precision as dp34import openerp.addons.decimal_precision as dp
3435
@@ -316,69 +317,78 @@
316 }317 }
317318
318319
319class product_public_category(osv.osv):320#----------------------------------------------------------
320 _name = "product.public.category"321# Attributes / Variants
321 _description = "Public Category"322#----------------------------------------------------------
322 _order = "sequence, name"323class product_attribute(osv.osv):
323324 _name = "product.attribute"
324 _constraints = [325 _description = "Product Attribute"
325 (osv.osv._check_recursion, 'Error ! You cannot create recursive categories.', ['parent_id'])326 _columns = {
326 ]327 'name': fields.char('Name', translate=True, required=True),
327328 'value_ids': fields.one2many('product.attribute.value', 'attribute_id', 'Values'),
328 def name_get(self, cr, uid, ids, context=None):329 }
329 if not len(ids):330
330 return []331class product_attribute_value(osv.osv):
331 reads = self.read(cr, uid, ids, ['name','parent_id'], context=context)332 _name = "product.attribute.value"
332 res = []333 _order = 'sequence'
333 for record in reads:334 def _get_price_extra(self, cr, uid, ids, name, args, context=None):
334 name = record['name']335 result = dict.fromkeys(ids, 0)
335 if record['parent_id']:336 if not context.get('active_id'):
336 name = record['parent_id'][1]+' / '+name337 return result
337 res.append((record['id'], name))338
338 return res
339
340 def _name_get_fnc(self, cr, uid, ids, prop, unknow_none, context=None):
341 res = self.name_get(cr, uid, ids, context=context)
342 return dict(res)
343
344 def _get_image(self, cr, uid, ids, name, args, context=None):
345 result = dict.fromkeys(ids, False)
346 for obj in self.browse(cr, uid, ids, context=context):339 for obj in self.browse(cr, uid, ids, context=context):
347 result[obj.id] = tools.image_get_resized_images(obj.image)340 for price_id in obj.price_ids:
341 if price_id.product_tmpl_id.id == context.get('active_id'):
342 result[obj.id] = price_id.price_extra
343 break
348 return result344 return result
349 345
350 def _set_image(self, cr, uid, id, name, value, args, context=None):346 def _set_price_extra(self, cr, uid, id, name, value, args, context=None):
351 return self.write(cr, uid, [id], {'image': tools.image_resize_image_big(value)}, context=context)347 if 'active_id' not in context:
352348 return None
353 _columns = {349 p_obj = self.pool['product.attribute.price']
354 'name': fields.char('Name', required=True, translate=True),350 p_ids = p_obj.search(cr, uid, [('value_id', '=', id), ('product_tmpl_id', '=', context['active_id'])], context=context)
355 'complete_name': fields.function(_name_get_fnc, type="char", string='Name'),351 if p_ids:
356 'parent_id': fields.many2one('product.public.category','Parent Category', select=True),352 p_obj.write(cr, uid, p_ids, {'price_extra': value}, context=context)
357 'child_id': fields.one2many('product.public.category', 'parent_id', string='Children Categories'),353 else:
358 'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of product categories."),354 p_obj.create(cr, uid, p_ids, {
359 355 'product_tmpl_id': context['active_id'],
360 # NOTE: there is no 'default image', because by default we don't show thumbnails for categories. However if we have a thumbnail356 'value_id': id,
361 # for at least one category, then we display a default image on the other, so that the buttons have consistent styling.357 'price_extra': value,
362 # In this case, the default image is set by the js code.358 }, context=context)
363 # NOTE2: image: all image fields are base64 encoded and PIL-supported359
364 'image': fields.binary("Image",360 _columns = {
365 help="This field holds the image used as image for the cateogry, limited to 1024x1024px."),361 'sequence': fields.integer('Sequence', help="Determine the display order"),
366 'image_medium': fields.function(_get_image, fnct_inv=_set_image,362 'name': fields.char('Value', translate=True, required=True),
367 string="Medium-sized image", type="binary", multi="_get_image",363 'attribute_id': fields.many2one('product.attribute', 'Attribute', required=True),
368 store={364 'product_ids': fields.many2many('product.product', id1='att_id', id2='prod_id', string='Variants', readonly=True),
369 'product.public.category': (lambda self, cr, uid, ids, c={}: ids, ['image'], 10),365 'price_extra': fields.function(_get_price_extra, type='float', string='Variant Price Extra',
370 },366 fnct_inv=_set_price_extra,
371 help="Medium-sized image of the category. It is automatically "\367 digits_compute=dp.get_precision('Product Price'),
372 "resized as a 128x128px image, with aspect ratio preserved. "\368 help="Price Extra: Extra price for the variant with this attribute value on sale price. eg. 200 price extra, 1000 + 200 = 1200."),
373 "Use this field in form views or some kanban views."),369 'price_ids': fields.one2many('product.attribute.price', 'value_id', string='Variant Prices', readonly=True),
374 'image_small': fields.function(_get_image, fnct_inv=_set_image,370 }
375 string="Smal-sized image", type="binary", multi="_get_image",371 _sql_constraints = [
376 store={372 ('value_company_uniq', 'unique (name,attribute_id)', 'This attribute value already exists !')
377 'product.public.category': (lambda self, cr, uid, ids, c={}: ids, ['image'], 10),373 ]
378 },374 _defaults = {
379 help="Small-sized image of the category. It is automatically "\375 'price_extra': lambda *a: 0.0,
380 "resized as a 64x64px image, with aspect ratio preserved. "\376 }
381 "Use this field anywhere a small image is required."),377
378class product_attribute_price(osv.osv):
379 _name = "product.attribute.price"
380 _columns = {
381 'product_tmpl_id': fields.many2one('product.template', 'Product Template', required=True),
382 'value_id': fields.many2one('product.attribute.value', 'Product Attribute Value', required=True),
383 'price_extra': fields.float('Price Extra', digits_compute=dp.get_precision('Product Price')),
384 }
385
386class product_attribute_line(osv.osv):
387 _name = "product.attribute.line"
388 _columns = {
389 'product_tmpl_id': fields.many2one('product.template', 'Product Template', required=True),
390 'attribute_id': fields.many2one('product.attribute', 'Attribute', required=True),
391 'value_ids': fields.many2many('product.attribute.value', id1='line_id', id2='val_id', string='Product Attribute Value'),
382 }392 }
383393
384394
@@ -399,6 +409,38 @@
399 def _set_image(self, cr, uid, id, name, value, args, context=None):409 def _set_image(self, cr, uid, id, name, value, args, context=None):
400 return self.write(cr, uid, [id], {'image': tools.image_resize_image_big(value)}, context=context)410 return self.write(cr, uid, [id], {'image': tools.image_resize_image_big(value)}, context=context)
401411
412 def _is_product_variant(self, cr, uid, ids, name, arg, context=None):
413 prod = self.pool.get('product.product')
414 res = dict.fromkeys(ids, False)
415 ctx = dict(context, active_test=True)
416 for product in self.browse(cr, uid, ids, context=context):
417 res[product.id] = prod.search(cr, uid, [('product_tmpl_id','=',product.id)], context=ctx, count=True) == 1
418 return res
419
420 def _product_template_price(self, cr, uid, ids, name, arg, context=None):
421 plobj = self.pool.get('product.pricelist')
422 res = {}
423 quantity = context.get('quantity') or 1.0
424 pricelist = context.get('pricelist', False)
425 partner = context.get('partner', False)
426 if pricelist:
427 # Support context pricelists specified as display_name or ID for compatibility
428 if isinstance(pricelist, basestring):
429 pricelist_ids = plobj.name_search(
430 cr, uid, pricelist, operator='=', context=context, limit=1)
431 pricelist = pricelist_ids[0][0] if pricelist_ids else pricelist
432
433 if isinstance(pricelist, (int, long)):
434 products = self.browse(cr, uid, ids, context=context)
435 qtys = map(lambda x: (x, quantity, partner), products)
436 pl = plobj.browse(cr, uid, pricelist, context=context)
437 price = plobj._price_get_multi(cr,uid, pl, qtys, context=context)
438 for id in ids:
439 res[id] = price.get(id, 0.0)
440 for id in ids:
441 res.setdefault(id, 0.0)
442 return res
443
402 def get_history_price(self, cr, uid, product_tmpl, company_id, date=None, context=None):444 def get_history_price(self, cr, uid, product_tmpl, company_id, date=None, context=None):
403 if context is None:445 if context is None:
404 context = {}446 context = {}
@@ -421,6 +463,12 @@
421 'company_id': company_id,463 'company_id': company_id,
422 }, context=context)464 }, context=context)
423465
466 def _get_product_variant_count(self, cr, uid, ids, name, arg, context=None):
467 res = {}
468 for product in self.browse(cr, uid, ids):
469 res[product.id] = len(product.product_variant_ids)
470 return res
471
424 _columns = {472 _columns = {
425 'name': fields.char('Name', required=True, translate=True, select=True),473 'name': fields.char('Name', required=True, translate=True, select=True),
426 'product_manager': fields.many2one('res.users','Product Manager'),474 'product_manager': fields.many2one('res.users','Product Manager'),
@@ -434,9 +482,10 @@
434 "This description will be copied to every Sale Order, Delivery Order and Customer Invoice/Refund"),482 "This description will be copied to every Sale Order, Delivery Order and Customer Invoice/Refund"),
435 'type': fields.selection([('consu', 'Consumable'),('service','Service')], 'Product Type', required=True, help="Consumable are product where you don't manage stock, a service is a non-material product provided by a company or an individual."), 483 'type': fields.selection([('consu', 'Consumable'),('service','Service')], 'Product Type', required=True, help="Consumable are product where you don't manage stock, a service is a non-material product provided by a company or an individual."),
436 'rental': fields.boolean('Can be Rent'),484 'rental': fields.boolean('Can be Rent'),
437 'categ_id': fields.many2one('product.category','Category', required=True, change_default=True, domain="[('type','=','normal')]" ,help="Select category for the current product"),485 'categ_id': fields.many2one('product.category','Internal Category', required=True, change_default=True, domain="[('type','=','normal')]" ,help="Select category for the current product"),
438 'public_categ_id': fields.many2one('product.public.category','Public Category', help="Those categories are used to group similar products for public sales (eg.: point of sale, e-commerce)."),486 'price': fields.function(_product_template_price, type='float', string='Price', digits_compute=dp.get_precision('Product Price')),
439 'list_price': fields.float('Sale Price', digits_compute=dp.get_precision('Product Price'), help="Base price to compute the customer price. Sometimes called the catalog price."),487 'list_price': fields.float('Sale Price', digits_compute=dp.get_precision('Product Price'), help="Base price to compute the customer price. Sometimes called the catalog price."),
488 'lst_price' : fields.related('list_price', type="float", string='Public Price', digits_compute=dp.get_precision('Product Price')),
440 'standard_price': fields.property(type = 'float', digits_compute=dp.get_precision('Product Price'), 489 'standard_price': fields.property(type = 'float', digits_compute=dp.get_precision('Product Price'),
441 help="Cost price of the product template used for standard stock valuation in accounting and used as a base price on purchase orders.", 490 help="Cost price of the product template used for standard stock valuation in accounting and used as a base price on purchase orders.",
442 groups="base.group_user", string="Cost Price"),491 groups="base.group_user", string="Cost Price"),
@@ -445,6 +494,7 @@
445 'weight_net': fields.float('Net Weight', digits_compute=dp.get_precision('Stock Weight'), help="The net weight in Kg."),494 'weight_net': fields.float('Net Weight', digits_compute=dp.get_precision('Stock Weight'), help="The net weight in Kg."),
446 'warranty': fields.float('Warranty'),495 'warranty': fields.float('Warranty'),
447 'sale_ok': fields.boolean('Can be Sold', help="Specify if the product can be selected in a sales order line."),496 'sale_ok': fields.boolean('Can be Sold', help="Specify if the product can be selected in a sales order line."),
497 'pricelist_id': fields.dummy(string='Pricelist', relation='product.pricelist', type='many2one'),
448 'state': fields.selection([('',''),498 'state': fields.selection([('',''),
449 ('draft', 'In Development'),499 ('draft', 'In Development'),
450 ('sellable','Normal'),500 ('sellable','Normal'),
@@ -458,13 +508,12 @@
458 help='Coefficient to convert default Unit of Measure to Unit of Sale\n'508 help='Coefficient to convert default Unit of Measure to Unit of Sale\n'
459 ' uos = uom * coeff'),509 ' uos = uom * coeff'),
460 'mes_type': fields.selection((('fixed', 'Fixed'), ('variable', 'Variable')), 'Measure Type'),510 'mes_type': fields.selection((('fixed', 'Fixed'), ('variable', 'Variable')), 'Measure Type'),
461 'seller_ids': fields.one2many('product.supplierinfo', 'product_tmpl_id', 'Supplier'),
462 'company_id': fields.many2one('res.company', 'Company', select=1),511 'company_id': fields.many2one('res.company', 'Company', select=1),
463 # image: all image fields are base64 encoded and PIL-supported512 # image: all image fields are base64 encoded and PIL-supported
464 'image': fields.binary("Image",513 'image': fields.binary("Image",
465 help="This field holds the image used as image for the product, limited to 1024x1024px."),514 help="This field holds the image used as image for the product, limited to 1024x1024px."),
466 'image_medium': fields.function(_get_image, fnct_inv=_set_image,515 'image_medium': fields.function(_get_image, fnct_inv=_set_image,
467 string="Medium-sized image", type="binary", multi="_get_image",516 string="Medium-sized image", type="binary", multi="_get_image",
468 store={517 store={
469 'product.template': (lambda self, cr, uid, ids, c={}: ids, ['image'], 10),518 'product.template': (lambda self, cr, uid, ids, c={}: ids, ['image'], 10),
470 },519 },
@@ -479,13 +528,64 @@
479 help="Small-sized image of the product. It is automatically "\528 help="Small-sized image of the product. It is automatically "\
480 "resized as a 64x64px image, with aspect ratio preserved. "\529 "resized as a 64x64px image, with aspect ratio preserved. "\
481 "Use this field anywhere a small image is required."),530 "Use this field anywhere a small image is required."),
482 'product_variant_ids': fields.one2many('product.product', 'product_tmpl_id', 'Product Variants', required=True),531
532 'packaging' : fields.one2many('product.packaging', 'product_id', 'Logistical Units',
533 help="Gives the different ways to package the same product. This has no impact on the picking order and is mainly used if you use the EDI module."),
534
535 'seller_ids': fields.one2many('product.supplierinfo', 'product_tmpl_id', 'Supplier'),
536 'seller_delay': fields.related('seller_ids','delay', type='integer', string='Supplier Lead Time',
537 help="This is the average delay in days between the purchase order confirmation and the reception of goods for this product and for the default supplier. It is used by the scheduler to order requests based on reordering delays."),
538 'seller_qty': fields.related('seller_ids','qty', type='float', string='Supplier Quantity',
539 help="This is minimum quantity to purchase from Main Supplier."),
540 'seller_id': fields.related('seller_ids','name', type='many2one', relation='res.partner', string='Main Supplier',
541 help="Main Supplier who has highest priority in Supplier List."),
542
543 'active': fields.boolean('Active', help="If unchecked, it will allow you to hide the product without removing it."),
544 'color': fields.integer('Color Index'),
545 'is_product_variant': fields.function( _is_product_variant, type='boolean', string='Only one product variant'),
546
547 'variant_ids': fields.one2many('product.attribute.line', 'product_tmpl_id', 'Product Variants'),
548 'product_variant_ids': fields.one2many('product.product', 'product_tmpl_id', 'Products', required=True),
549 'product_variant_count': fields.function( _get_product_variant_count, type='integer', string='Product Variant Number'),
550
551 # related to display product product information if is_product_variant
552 'ean13': fields.related('product_variant_ids', 'ean13', type='char', string='EAN13 Barcode'),
553 'default_code': fields.related('product_variant_ids', 'default_code', type='char', string='Internal Reference'),
483 }554 }
484555
556 def _price_get_list_price(self, product):
557 return 0.0
558
559 def _price_get(self, cr, uid, products, ptype='list_price', context=None):
560 if context is None:
561 context = {}
562
563 if 'currency_id' in context:
564 pricetype_obj = self.pool.get('product.price.type')
565 price_type_id = pricetype_obj.search(cr, uid, [('field','=',ptype)])[0]
566 price_type_currency_id = pricetype_obj.browse(cr,uid,price_type_id).currency_id.id
567
568 res = {}
569 product_uom_obj = self.pool.get('product.uom')
570 for product in products:
571 res[product.id] = product[ptype] or 0.0
572 if ptype == 'list_price':
573 res[product.id] += product._name == "product.product" and product.price_extra or 0.0
574 if 'uom' in context:
575 uom = product.uom_id or product.uos_id
576 res[product.id] = product_uom_obj._compute_price(cr, uid,
577 uom.id, res[product.id], context['uom'])
578 # Convert from price_type currency to asked one
579 if 'currency_id' in context:
580 # Take the price_type currency from the product field
581 # This is right cause a field cannot be in more than one currency
582 res[product.id] = self.pool.get('res.currency').compute(cr, uid, price_type_currency_id,
583 context['currency_id'], res[product.id],context=context)
584
585 return res
586
485 def _get_uom_id(self, cr, uid, *args):587 def _get_uom_id(self, cr, uid, *args):
486 cr.execute('select id from product_uom order by id limit 1')588 return self.pool["product.uom"].search(cr, uid, [], limit=1, order='id')[0]
487 res = cr.fetchone()
488 return res and res[0] or False
489589
490 def _default_category(self, cr, uid, context=None):590 def _default_category(self, cr, uid, context=None):
491 if context is None:591 if context is None:
@@ -505,9 +605,65 @@
505 return {'value': {'uom_po_id': uom_id}}605 return {'value': {'uom_po_id': uom_id}}
506 return {}606 return {}
507607
608 def create_variant_ids(self, cr, uid, ids, context=None):
609 product_obj = self.pool.get("product.product")
610 ctx = context and context.copy() or {}
611
612 if ctx.get("create_product_variant"):
613 return None
614
615 ctx.update(active_test=False, create_product_variant=True)
616
617 tmpl_ids = self.browse(cr, uid, ids, context=ctx)
618 for tmpl_id in tmpl_ids:
619
620 # list of values combination
621 all_variants = [[]]
622 for variant_id in tmpl_id.variant_ids:
623 if len(variant_id.value_ids) > 1:
624 temp_variants = []
625 for value_id in variant_id.value_ids:
626 for variant in all_variants:
627 temp_variants.append(variant + [int(value_id)])
628 all_variants = temp_variants
629
630 # check product
631 variants_active_ids = []
632 variants_inactive = []
633 for product_id in tmpl_id.product_variant_ids:
634 variants = map(int,product_id.variant_ids)
635 if variants in all_variants:
636 variants_active_ids.append(product_id.id)
637 all_variants.pop(all_variants.index(variants))
638 # TODO all write in same time
639 if product_id.active:
640 product_id.write({'active': True}, context=ctx)
641 else:
642 variants_inactive.append(product_id)
643
644 # create new product
645 for variant_ids in all_variants:
646 values = {
647 'product_tmpl_id': tmpl_id.id,
648 'variant_ids': [(6, 0, variant_ids)]
649 }
650 id = product_obj.create(cr, uid, values, context=ctx)
651 variants_active_ids.append(id)
652
653 # unlink or inactive product
654 for variant_id in map(int,variants_inactive):
655 try:
656 with cr.savepoint():
657 product_obj.unlink(cr, uid, [variant_id], context=ctx)
658 except (psycopg2.Error, osv.except_osv):
659 product_obj.write(cr, uid, [variant_id], {'active': False}, context=ctx)
660 pass
661 return True
662
508 def create(self, cr, uid, vals, context=None):663 def create(self, cr, uid, vals, context=None):
509 ''' Store the initial standard price in order to be able to retrieve the cost of a product template for a given date'''664 ''' Store the initial standard price in order to be able to retrieve the cost of a product template for a given date'''
510 product_template_id = super(product_template, self).create(cr, uid, vals, context=context)665 product_template_id = super(product_template, self).create(cr, uid, vals, context=context)
666 self.create_variant_ids(cr, uid, [product_template_id], context=context)
511 self._set_standard_price(cr, uid, product_template_id, vals.get('standard_price', 0.0), context=context)667 self._set_standard_price(cr, uid, product_template_id, vals.get('standard_price', 0.0), context=context)
512 return product_template_id668 return product_template_id
513669
@@ -524,7 +680,15 @@
524 if 'standard_price' in vals:680 if 'standard_price' in vals:
525 for prod_template_id in ids:681 for prod_template_id in ids:
526 self._set_standard_price(cr, uid, prod_template_id, vals['standard_price'], context=context)682 self._set_standard_price(cr, uid, prod_template_id, vals['standard_price'], context=context)
527 return super(product_template, self).write(cr, uid, ids, vals, context=context)683 if 'active' in vals:
684 product_ids = []
685 for product in self.browse(cr, uid, ids, context=context):
686 product_ids = map(int, product.product_variant_ids)
687 self.write(cr, uid, product_ids, {'active': vals.get('active')}, context=context)
688 res = super(product_template, self).write(cr, uid, ids, vals, context=context)
689 if 'variant_ids' in vals:
690 self.create_variant_ids(cr, uid, ids, context=context)
691 return res
528692
529 def copy(self, cr, uid, id, default=None, context=None):693 def copy(self, cr, uid, id, default=None, context=None):
530 if default is None:694 if default is None:
@@ -544,6 +708,7 @@
544 'mes_type': 'fixed',708 'mes_type': 'fixed',
545 'categ_id' : _default_category,709 'categ_id' : _default_category,
546 'type' : 'consu',710 'type' : 'consu',
711 'active': lambda *a: 1,
547 }712 }
548713
549 def _check_uom(self, cursor, user, ids, context=None):714 def _check_uom(self, cursor, user, ids, context=None):
@@ -579,6 +744,32 @@
579 _inherit = ['mail.thread']744 _inherit = ['mail.thread']
580 _order = 'default_code,name_template'745 _order = 'default_code,name_template'
581746
747 def _product_price(self, cr, uid, ids, name, arg, context=None):
748 plobj = self.pool.get('product.pricelist')
749 res = {}
750 if context is None:
751 context = {}
752 quantity = context.get('quantity') or 1.0
753 pricelist = context.get('pricelist', False)
754 partner = context.get('partner', False)
755 if pricelist:
756 # Support context pricelists specified as display_name or ID for compatibility
757 if isinstance(pricelist, basestring):
758 pricelist_ids = plobj.name_search(
759 cr, uid, pricelist, operator='=', context=context, limit=1)
760 pricelist = pricelist_ids[0][0] if pricelist_ids else pricelist
761
762 if isinstance(pricelist, (int, long)):
763 products = self.browse(cr, uid, ids, context=context)
764 qtys = map(lambda x: (x, quantity, partner), products)
765 pl = plobj.browse(cr, uid, pricelist, context=context)
766 price = plobj._price_get_multi(cr,uid, pl, qtys, context=context)
767 for id in ids:
768 res[id] = price.get(id, 0.0)
769 for id in ids:
770 res.setdefault(id, 0.0)
771 return res
772
582 def view_header_get(self, cr, uid, view_id, view_type, context=None):773 def view_header_get(self, cr, uid, view_id, view_type, context=None):
583 if context is None:774 if context is None:
584 context = {}775 context = {}
@@ -587,37 +778,11 @@
587 return _('Products: ') + self.pool.get('product.category').browse(cr, uid, context['categ_id'], context=context).name778 return _('Products: ') + self.pool.get('product.category').browse(cr, uid, context['categ_id'], context=context).name
588 return res779 return res
589780
590 def _product_price(self, cr, uid, ids, name, arg, context=None):
591 plobj = self.pool.get('product.pricelist')
592 res = {}
593 if context is None:
594 context = {}
595 quantity = context.get('quantity') or 1.0
596 pricelist = context.get('pricelist', False)
597 partner = context.get('partner', False)
598 if pricelist:
599 # Support context pricelists specified as display_name or ID for compatibility
600 if isinstance(pricelist, basestring):
601 pricelist_ids = plobj.name_search(
602 cr, uid, pricelist, operator='=', context=context, limit=1)
603 pricelist = pricelist_ids[0][0] if pricelist_ids else pricelist
604
605 if isinstance(pricelist, (int, long)):
606 products = self.browse(cr, uid, ids, context=context)
607 qtys = map(lambda x: (x, quantity, partner), products)
608 pl = plobj.browse(cr, uid, pricelist, context=context)
609 price = plobj._price_get_multi(cr,uid, pl, qtys, context=context)
610 for id in ids:
611 res[id] = price.get(id, 0.0)
612 for id in ids:
613 res.setdefault(id, 0.0)
614 return res
615
616 def _product_lst_price(self, cr, uid, ids, name, arg, context=None):781 def _product_lst_price(self, cr, uid, ids, name, arg, context=None):
617 res = {}782 res = {}
618 product_uom_obj = self.pool.get('product.uom')783 product_uom_obj = self.pool.get('product.uom')
619 for id in ids:784 res = dict.fromkeys(ids, 0.0)
620 res.setdefault(id, 0.0)785
621 for product in self.browse(cr, uid, ids, context=context):786 for product in self.browse(cr, uid, ids, context=context):
622 if 'uom' in context:787 if 'uom' in context:
623 uom = product.uos_id or product.uom_id788 uom = product.uos_id or product.uom_id
@@ -625,20 +790,17 @@
625 uom.id, product.list_price, context['uom'])790 uom.id, product.list_price, context['uom'])
626 else:791 else:
627 res[product.id] = product.list_price792 res[product.id] = product.list_price
628 res[product.id] = (res[product.id] or 0.0) * (product.price_margin or 1.0) + product.price_extra793 price_extra = 0.0
794 for variant_id in product.variant_ids:
795 price_extra += variant_id.price_extra
796 res[product.id] = (res[product.id] or 0.0) + price_extra
629 return res797 return res
630798
631 def _save_product_lst_price(self, cr, uid, product_id, field_name, field_value, arg, context=None):
632 field_value = field_value or 0.0
633 product = self.browse(cr, uid, product_id, context=context)
634 list_price = (field_value - product.price_extra) / (product.price_margin or 1.0)
635 return self.write(cr, uid, [product_id], {'list_price': list_price}, context=context)
636
637 def _get_partner_code_name(self, cr, uid, ids, product, partner_id, context=None):799 def _get_partner_code_name(self, cr, uid, ids, product, partner_id, context=None):
638 for supinfo in product.seller_ids:800 for supinfo in product.seller_ids:
639 if supinfo.name.id == partner_id:801 if supinfo.name.id == partner_id:
640 return {'code': supinfo.product_code or product.default_code, 'name': supinfo.product_name or product.name, 'variants': ''}802 return {'code': supinfo.product_code or product.default_code, 'name': supinfo.product_name or product.name}
641 res = {'code': product.default_code, 'name': product.name, 'variants': product.variants}803 res = {'code': product.default_code, 'name': product.name}
642 return res804 return res
643805
644 def _product_code(self, cr, uid, ids, name, arg, context=None):806 def _product_code(self, cr, uid, ids, name, arg, context=None):
@@ -655,48 +817,15 @@
655 context = {}817 context = {}
656 for p in self.browse(cr, uid, ids, context=context):818 for p in self.browse(cr, uid, ids, context=context):
657 data = self._get_partner_code_name(cr, uid, [], p, context.get('partner_id', None), context=context)819 data = self._get_partner_code_name(cr, uid, [], p, context.get('partner_id', None), context=context)
658 if not data['variants']:
659 data['variants'] = p.variants
660 if not data['code']:820 if not data['code']:
661 data['code'] = p.code821 data['code'] = p.code
662 if not data['name']:822 if not data['name']:
663 data['name'] = p.name823 data['name'] = p.name
664 res[p.id] = (data['code'] and ('['+data['code']+'] ') or '') + \824 res[p.id] = (data['code'] and ('['+data['code']+'] ') or '') + (data['name'] or '')
665 (data['name'] or '') + (data['variants'] and (' - '+data['variants']) or '')825 return res
666 return res826
667827 def _is_product_variant(self, cr, uid, ids, name, arg, context=None):
668 def _is_only_child(self, cr, uid, ids, name, arg, context=None):828 return dict.fromkeys(ids, True)
669 res = dict.fromkeys(ids, True)
670 for product in self.browse(cr, uid, ids, context=context):
671 if product.product_tmpl_id and len(product.product_tmpl_id.product_variant_ids) > 1:
672 res[product.id] = False
673 return res
674
675 def _get_main_product_supplier(self, cr, uid, product, context=None):
676 """Determines the main (best) product supplier for ``product``,
677 returning the corresponding ``supplierinfo`` record, or False
678 if none were found. The default strategy is to select the
679 supplier with the highest priority (i.e. smallest sequence).
680
681 :param browse_record product: product to supply
682 :rtype: product.supplierinfo browse_record or False
683 """
684 sellers = [(seller_info.sequence, seller_info)
685 for seller_info in product.seller_ids or []
686 if seller_info and isinstance(seller_info.sequence, (int, long))]
687 return sellers and sellers[0][1] or False
688
689 def _calc_seller(self, cr, uid, ids, fields, arg, context=None):
690 result = {}
691 for product in self.browse(cr, uid, ids, context=context):
692 main_supplier = self._get_main_product_supplier(cr, uid, product, context=context)
693 result[product.id] = {
694 'seller_info_id': main_supplier and main_supplier.id or False,
695 'seller_delay': main_supplier.delay if main_supplier else 1,
696 'seller_qty': main_supplier and main_supplier.qty or 0.0,
697 'seller_id': main_supplier and main_supplier.name.id or False
698 }
699 return result
700829
701 def _get_name_template_ids(self, cr, uid, ids, context=None):830 def _get_name_template_ids(self, cr, uid, ids, context=None):
702 result = set()831 result = set()
@@ -705,39 +834,69 @@
705 result.add(el)834 result.add(el)
706 return list(result)835 return list(result)
707836
837 def _get_image_variant(self, cr, uid, ids, name, args, context=None):
838 result = dict.fromkeys(ids, False)
839 for obj in self.browse(cr, uid, ids, context=context):
840 result[obj.id] = obj.image_variant or getattr(obj.product_tmpl_id, name)
841 return result
842
843 def _set_image_variant(self, cr, uid, id, name, value, args, context=None):
844 image = tools.image_resize_image_big(value)
845 res = self.write(cr, uid, [id], {'image_variant': image}, context=context)
846 product = self.browse(cr, uid, id, context=context)
847 if not product.product_tmpl_id.image:
848 product.write({'image_variant': None}, context=context)
849 product.product_tmpl_id.write({'image': image}, context=context)
850 return res
851
852 def _get_price_extra(self, cr, uid, ids, name, args, context=None):
853 result = dict.fromkeys(ids, False)
854 for product in self.browse(cr, uid, ids, context=context):
855 price_extra = 0.0
856 for variant_id in product.variant_ids:
857 for price_id in variant_id.price_ids:
858 if price_id.product_tmpl_id.id == product.product_tmpl_id.id:
859 price_extra += price_id.price_extra
860 result[product.id] = price_extra
861 return result
862
708 _columns = {863 _columns = {
709 'price': fields.function(_product_price, fnct_inv=_save_product_lst_price, type='float', string='Price', digits_compute=dp.get_precision('Product Price')),864 'price': fields.function(_product_price, type='float', string='Price', digits_compute=dp.get_precision('Product Price')),
710 'lst_price' : fields.function(_product_lst_price, fnct_inv=_save_product_lst_price, type='float', string='Public Price', digits_compute=dp.get_precision('Product Price')),865 'price_extra': fields.function(_get_price_extra, type='float', string='Sum of Variant Price Extra'),
866 'lst_price': fields.function(_product_lst_price, type='float', string='Public Price', digits_compute=dp.get_precision('Product Price')),
711 'code': fields.function(_product_code, type='char', string='Internal Reference'),867 'code': fields.function(_product_code, type='char', string='Internal Reference'),
712 'partner_ref' : fields.function(_product_partner_ref, type='char', string='Customer ref'),868 'partner_ref' : fields.function(_product_partner_ref, type='char', string='Customer ref'),
713 'default_code' : fields.char('Internal Reference', select=True),869 'default_code' : fields.char('Internal Reference', select=True),
714 'active': fields.boolean('Active', help="If unchecked, it will allow you to hide the product without removing it."),870 'active': fields.boolean('Active', help="If unchecked, it will allow you to hide the product without removing it."),
715 'variants': fields.char('Variants', translate=True),
716 'product_tmpl_id': fields.many2one('product.template', 'Product Template', required=True, ondelete="cascade", select=True),871 'product_tmpl_id': fields.many2one('product.template', 'Product Template', required=True, ondelete="cascade", select=True),
717 'is_only_child': fields.function(
718 _is_only_child, type='boolean', string='Sole child of the parent template'),
719 'ean13': fields.char('EAN13 Barcode', size=13, help="International Article Number used for product identification."),872 'ean13': fields.char('EAN13 Barcode', size=13, help="International Article Number used for product identification."),
873 'is_product_variant': fields.function( _is_product_variant, type='boolean', string='Only one product variant'),
720 'packaging': fields.one2many('product.packaging', 'product_id', 'Packaging', help="Gives the different ways to package the same product. This has no impact on the picking order and is mainly used if you use the EDI module."),874 'packaging': fields.one2many('product.packaging', 'product_id', 'Packaging', help="Gives the different ways to package the same product. This has no impact on the picking order and is mainly used if you use the EDI module."),
721 'price_extra': fields.float('Variant Price Extra', digits_compute=dp.get_precision('Product Price'), help="Price Extra: Extra price for the variant on sale price. eg. 200 price extra, 1000 + 200 = 1200."),
722 'price_margin': fields.float('Variant Price Margin', digits_compute=dp.get_precision('Product Price'), help="Price Margin: Margin in percentage amount on sale price for the variant. eg. 10 price margin, 1000 * 1.1 = 1100."),
723 'pricelist_id': fields.dummy(string='Pricelist', relation='product.pricelist', type='many2one'),
724 'name_template': fields.related('product_tmpl_id', 'name', string="Template Name", type='char', store={875 'name_template': fields.related('product_tmpl_id', 'name', string="Template Name", type='char', store={
725 'product.template': (_get_name_template_ids, ['name'], 10),876 'product.template': (_get_name_template_ids, ['name'], 10),
726 'product.product': (lambda self, cr, uid, ids, c=None: ids, [], 10),877 'product.product': (lambda self, cr, uid, ids, c=None: ids, [], 10),
727 }, select=True),878 }, select=True),
728 'color': fields.integer('Color Index'),879 'variant_ids': fields.many2many('product.attribute.value', id1='prod_id', id2='att_id', string='Variants', readonly=True),
729 'seller_info_id': fields.function(_calc_seller, type='many2one', relation="product.supplierinfo", string="Supplier Info", multi="seller_info"),880
730 'seller_delay': fields.function(_calc_seller, type='integer', string='Supplier Lead Time', multi="seller_info", help="This is the average delay in days between the purchase order confirmation and the reception of goods for this product and for the default supplier. It is used by the scheduler to order requests based on reordering delays."),881 # image: all image fields are base64 encoded and PIL-supported
731 'seller_qty': fields.function(_calc_seller, type='float', string='Supplier Quantity', multi="seller_info", help="This is minimum quantity to purchase from Main Supplier."),882 'image_variant': fields.binary("Variant Image",
732 'seller_id': fields.function(_calc_seller, type='many2one', relation="res.partner", string='Main Supplier', help="Main Supplier who has highest priority in Supplier List.", multi="seller_info"),883 help="This field holds the image used as image for the product variant, limited to 1024x1024px."),
884
885 'image': fields.function(_get_image_variant, fnct_inv=_set_image_variant,
886 string="Big-sized image", type="binary",
887 help="Image of the product variant (Big-sized image of product template if false). It is automatically "\
888 "resized as a 1024x1024px image, with aspect ratio preserved."),
889 'image_small': fields.function(_get_image_variant, fnct_inv=_set_image_variant,
890 string="Small-sized image", type="binary",
891 help="Image of the product variant (Small-sized image of product template if false)."),
892 'image_medium': fields.function(_get_image_variant, fnct_inv=_set_image_variant,
893 string="Medium-sized image", type="binary",
894 help="Image of the product variant (Medium-sized image of product template if false)."),
733 }895 }
734896
735 _defaults = {897 _defaults = {
736 'active': lambda *a: 1,898 'active': lambda *a: 1,
737 'price_extra': lambda *a: 0.0,
738 'price_margin': lambda *a: 1.0,
739 'color': 0,899 'color': 0,
740 'is_only_child': True,
741 }900 }
742901
743 def unlink(self, cr, uid, ids, context=None):902 def unlink(self, cr, uid, ids, context=None):
@@ -767,8 +926,9 @@
767926
768 def _check_ean_key(self, cr, uid, ids, context=None):927 def _check_ean_key(self, cr, uid, ids, context=None):
769 for product in self.read(cr, uid, ids, ['ean13'], context=context):928 for product in self.read(cr, uid, ids, ['ean13'], context=context):
770 res = check_ean(product['ean13'])929 if not check_ean(product['ean13']):
771 return res930 return False
931 return True
772932
773 _constraints = [(_check_ean_key, 'You provided an invalid "EAN13 Barcode" reference. You may use the "Internal Reference" field instead.', ['ean13'])]933 _constraints = [(_check_ean_key, 'You provided an invalid "EAN13 Barcode" reference. You may use the "Internal Reference" field instead.', ['ean13'])]
774934
@@ -782,13 +942,12 @@
782 ids = [ids]942 ids = [ids]
783 if not len(ids):943 if not len(ids):
784 return []944 return []
945
785 def _name_get(d):946 def _name_get(d):
786 name = d.get('name','')947 name = d.get('name','')
787 code = d.get('default_code',False)948 code = d.get('default_code',False)
788 if code:949 if code:
789 name = '[%s] %s' % (code,name)950 name = '[%s] %s' % (code,name)
790 if d.get('variants'):
791 name = name + ' - %s' % (d['variants'],)
792 return (d['id'], name)951 return (d['id'], name)
793952
794 partner_id = context.get('partner_id', False)953 partner_id = context.get('partner_id', False)
@@ -800,6 +959,8 @@
800959
801 result = []960 result = []
802 for product in self.browse(cr, SUPERUSER_ID, ids, context=context):961 for product in self.browse(cr, SUPERUSER_ID, ids, context=context):
962 variant = ", ".join([v.name for v in product.variant_ids])
963 name = variant and "%s (%s)" % (product.name, variant) or product.name
803 sellers = []964 sellers = []
804 if partner_id:965 if partner_id:
805 sellers = filter(lambda x: x.name.id == partner_id, product.seller_ids)966 sellers = filter(lambda x: x.name.id == partner_id, product.seller_ids)
@@ -807,17 +968,15 @@
807 for s in sellers:968 for s in sellers:
808 mydict = {969 mydict = {
809 'id': product.id,970 'id': product.id,
810 'name': s.product_name or product.name,971 'name': s.product_name or name,
811 'default_code': s.product_code or product.default_code,972 'default_code': s.product_code or product.default_code,
812 'variants': product.variants
813 }973 }
814 result.append(_name_get(mydict))974 result.append(_name_get(mydict))
815 else:975 else:
816 mydict = {976 mydict = {
817 'id': product.id,977 'id': product.id,
818 'name': product.name,978 'name': name,
819 'default_code': product.default_code,979 'default_code': product.default_code,
820 'variants': product.variants
821 }980 }
822 result.append(_name_get(mydict))981 result.append(_name_get(mydict))
823 return result982 return result
@@ -855,44 +1014,7 @@
855 #1014 #
856 def price_get(self, cr, uid, ids, ptype='list_price', context=None):1015 def price_get(self, cr, uid, ids, ptype='list_price', context=None):
857 products = self.browse(cr, uid, ids, context=context)1016 products = self.browse(cr, uid, ids, context=context)
858 return self._price_get(cr, uid, products, ptype=ptype, context=context)1017 return self.pool.get("product.template")._price_get(cr, uid, products, ptype=ptype, context=context)
859
860 def _price_get(self, cr, uid, products, ptype='list_price', context=None):
861 if context is None:
862 context = {}
863
864 if 'currency_id' in context:
865 pricetype_obj = self.pool.get('product.price.type')
866 price_type_id = pricetype_obj.search(cr, uid, [('field','=',ptype)])[0]
867 price_type_currency_id = pricetype_obj.browse(cr,uid,price_type_id).currency_id.id
868
869 res = {}
870 # standard_price field can only be seen by users in base.group_user
871 # Thus, in order to compute the sale price from the cost price for users not in this group
872 # We fetch the standard price as the superuser
873 for product in products:
874 if ptype != 'standard_price':
875 res[product.id] = product[ptype] or 0.0
876 else:
877 res[product.id] = self.read(cr, SUPERUSER_ID, product.id, [ptype], context=context)[ptype] or 0.0
878
879 product_uom_obj = self.pool.get('product.uom')
880 for product in products:
881 if ptype == 'list_price':
882 res[product.id] = (res[product.id] * (product.price_margin or 1.0)) + \
883 product.price_extra
884 if 'uom' in context:
885 uom = product.uom_id or product.uos_id
886 res[product.id] = product_uom_obj._compute_price(cr, uid,
887 uom.id, res[product.id], context['uom'])
888 # Convert from price_type currency to asked one
889 if 'currency_id' in context:
890 # Take the price_type currency from the product field
891 # This is right cause a field cannot be in more than one currency
892 res[product.id] = self.pool.get('res.currency').compute(cr, uid, price_type_currency_id,
893 context['currency_id'], res[product.id],context=context)
894
895 return res
8961018
897 def copy(self, cr, uid, id, default=None, context=None):1019 def copy(self, cr, uid, id, default=None, context=None):
898 context = context or {}1020 context = context or {}
@@ -952,8 +1074,9 @@
9521074
953 def _check_ean_key(self, cr, uid, ids, context=None):1075 def _check_ean_key(self, cr, uid, ids, context=None):
954 for pack in self.browse(cr, uid, ids, context=context):1076 for pack in self.browse(cr, uid, ids, context=context):
955 res = check_ean(pack.ean)1077 if not check_ean(pack.ean):
956 return res1078 return False
1079 return True
9571080
958 _constraints = [(_check_ean_key, 'Error: Invalid ean code', ['ean'])]1081 _constraints = [(_check_ean_key, 'Error: Invalid ean code', ['ean'])]
9591082
9601083
=== modified file 'product/product_data.xml'
--- product/product_data.xml 2014-05-02 13:03:52 +0000
+++ product/product_data.xml 2014-05-26 16:10:21 +0000
@@ -255,10 +255,5 @@
255 <field name="type">service</field>255 <field name="type">service</field>
256 <field name="sale_ok" eval="False"/>256 <field name="sale_ok" eval="False"/>
257 </record>257 </record>
258
259 <!-- Product Public Categories -->
260 <record id="categ_others" model="product.public.category">
261 <field name="name">Others</field>
262 </record>
263 </data>258 </data>
264</openerp>259</openerp>
265260
=== modified file 'product/product_demo.xml'
--- product/product_demo.xml 2014-01-28 12:53:40 +0000
+++ product/product_demo.xml 2014-05-26 16:10:21 +0000
@@ -56,127 +56,6 @@
56 <field name="type">box</field>56 <field name="type">box</field>
57 </record>57 </record>
5858
59
60 <!-- product.public.category -->
61
62 <record id="computers" model="product.public.category">
63 <field name="name">Computers</field>
64 </record>
65
66 <record id="Components" model="product.public.category">
67 <field name="parent_id" ref="computers"/>
68 <field name="name">Components</field>
69 </record>
70
71 <record id="case" model="product.public.category">
72 <field name="parent_id" ref="Components"/>
73 <field name="name">Case</field>
74 </record>
75 <record id="HDD" model="product.public.category">
76 <field name="parent_id" ref="Components"/>
77 <field name="name">Hard Drive</field>
78 </record>
79 <record id="motherboard" model="product.public.category">
80 <field name="parent_id" ref="Components"/>
81 <field name="name">Motherboard</field>
82 </record>
83 <record id="graphics_card" model="product.public.category">
84 <field name="parent_id" ref="Components"/>
85 <field name="name">Graphics Card</field>
86 </record>
87 <record id="Memory" model="product.public.category">
88 <field name="parent_id" ref="Components"/>
89 <field name="name">Memory</field>
90 </record>
91 <record id="processor" model="product.public.category">
92 <field name="parent_id" ref="Components"/>
93 <field name="name">Processor</field>
94 </record>
95 <record id="video_acquisition" model="product.public.category">
96 <field name="parent_id" ref="Components"/>
97 <field name="name">Video Acquisition</field>
98 </record>
99
100 <record id="devices" model="product.public.category">
101 <field name="parent_id" ref="computers"/>
102 <field name="name">Devices</field>
103 </record>
104
105 <record id="Screen" model="product.public.category">
106 <field name="parent_id" ref="devices"/>
107 <field name="name">Screen</field>
108 </record>
109 <record id="Pen_Drive" model="product.public.category">
110 <field name="parent_id" ref="devices"/>
111 <field name="name">Pen Drive</field>
112 </record>
113 <record id="External_Hard_Drive" model="product.public.category">
114 <field name="parent_id" ref="devices"/>
115 <field name="name">External Hard Drive</field>
116 </record>
117 <record id="Keyboard_Mouse" model="product.public.category">
118 <field name="parent_id" ref="devices"/>
119 <field name="name">Keyboard / Mouse</field>
120 </record>
121 <record id="printer" model="product.public.category">
122 <field name="parent_id" ref="devices"/>
123 <field name="name">Printer</field>
124 </record>
125 <record id="Speakers" model="product.public.category">
126 <field name="parent_id" ref="devices"/>
127 <field name="name">Speakers</field>
128 </record>
129 <record id="Headset" model="product.public.category">
130 <field name="parent_id" ref="devices"/>
131 <field name="name">Headset</field>
132 </record>
133 <record id="Software" model="product.public.category">
134 <field name="parent_id" ref="devices"/>
135 <field name="name">Software</field>
136 </record>
137
138 <record id="laptops" model="product.public.category">
139 <field name="parent_id" ref="computers"/>
140 <field name="name">Laptops</field>
141 </record>
142
143 <record id="sub_computers" model="product.public.category">
144 <field name="parent_id" ref="computers"/>
145 <field name="name">Computers</field>
146 </record>
147
148 <record id="Computer_all_in_one" model="product.public.category">
149 <field name="parent_id" ref="sub_computers"/>
150 <field name="name">Computer all-in-one</field>
151 </record>
152 <record id="server" model="product.public.category">
153 <field name="parent_id" ref="sub_computers"/>
154 <field name="name">Server</field>
155 </record>
156
157 <record id="network" model="product.public.category">
158 <field name="parent_id" ref="computers"/>
159 <field name="name">Network</field>
160 </record>
161
162 <record id="Switch" model="product.public.category">
163 <field name="parent_id" ref="network"/>
164 <field name="name">Switch</field>
165 </record>
166 <record id="Modem_Router" model="product.public.category">
167 <field name="parent_id" ref="network"/>
168 <field name="name">Modem &amp; Router</field>
169 </record>
170 <record id="Switch" model="product.public.category">
171 <field name="parent_id" ref="network"/>
172 <field name="name">Switch</field>
173 </record>
174
175 <record id="services" model="product.public.category">
176 <field name="parent_id" ref="computers"/>
177 <field name="name">Services</field>
178 </record>
179
180 <!-- Apple Products -->59 <!-- Apple Products -->
181 <record id="apple" model="product.category">60 <record id="apple" model="product.category">
182 <field name="name">Apple Products</field>61 <field name="name">Apple Products</field>
@@ -210,10 +89,9 @@
210 <field name="sale_ok" eval="True"/>89 <field name="sale_ok" eval="True"/>
211 </record>90 </record>
21291
213 <record id="product_template_1" model="product.template">92 <record id="product_product_1" model="product.product">
214 <field name="name">On Site Monitoring</field>93 <field name="name">On Site Monitoring</field>
215 <field name="categ_id" ref="product_category_5"/>94 <field name="categ_id" ref="product_category_5"/>
216 <field name="public_categ_id" ref="services"/>
217 <field name="standard_price">20.5</field>95 <field name="standard_price">20.5</field>
218 <field name="list_price">30.75</field>96 <field name="list_price">30.75</field>
219 <field name="type">service</field>97 <field name="type">service</field>
@@ -222,15 +100,11 @@
222 <field name="description">This type of service include basic monitoring of products.</field>100 <field name="description">This type of service include basic monitoring of products.</field>
223 <field name="description_sale">This type of service include basic monitoring of products.</field>101 <field name="description_sale">This type of service include basic monitoring of products.</field>
224 </record>102 </record>
225 <record id="product_product_1" model="product.product">103
226 <field name="product_tmpl_id" ref="product_template_1"/>104
227 </record>105 <record id="product_product_2" model="product.product">
228
229
230 <record id="product_template_2" model="product.template">
231 <field name="name">On Site Assistance</field>106 <field name="name">On Site Assistance</field>
232 <field name="categ_id" ref="product_category_5"/>107 <field name="categ_id" ref="product_category_5"/>
233 <field name="public_categ_id" ref="services"/>
234 <field name="standard_price">25.5</field>108 <field name="standard_price">25.5</field>
235 <field name="list_price">38.25</field>109 <field name="list_price">38.25</field>
236 <field name="type">service</field>110 <field name="type">service</field>
@@ -238,15 +112,11 @@
238 <field name="uom_po_id" ref="product_uom_hour"/>112 <field name="uom_po_id" ref="product_uom_hour"/>
239 <field name="description">This type of service include assistance for security questions, system configuration requirements, implementation or special needs.</field>113 <field name="description">This type of service include assistance for security questions, system configuration requirements, implementation or special needs.</field>
240 </record>114 </record>
241 <record id="product_product_2" model="product.product">115
242 <field name="product_tmpl_id" ref="product_template_2"/>116
243 </record>117 <record id="product_product_3" model="product.product">
244
245
246 <record id="product_template_3" model="product.template">
247 <field name="name">PC Assemble SC234</field>118 <field name="name">PC Assemble SC234</field>
248 <field name="categ_id" ref="product_category_4"/>119 <field name="categ_id" ref="product_category_4"/>
249 <field name="public_categ_id" ref="Computer_all_in_one"/>
250 <field name="list_price">450.0</field>120 <field name="list_price">450.0</field>
251 <field name="standard_price">300.0</field>121 <field name="standard_price">300.0</field>
252 <field name="type">consu</field>122 <field name="type">consu</field>
@@ -256,17 +126,13 @@
256Processor AMD 8-Core126Processor AMD 8-Core
257512MB RAM127512MB RAM
258HDD SH-1</field>128HDD SH-1</field>
259 </record>
260 <record id="product_product_3" model="product.product">
261 <field name="product_tmpl_id" ref="product_template_3"/>
262 <field name="default_code">PCSC234</field>129 <field name="default_code">PCSC234</field>
263 </record>130 </record>
264131
265132
266 <record id="product_template_4" model="product.template">133 <record id="product_product_4" model="product.product">
267 <field name="name">iPad Retina Display</field>134 <field name="name">iPad Retina Display</field>
268 <field name="categ_id" ref="ipad"/>135 <field name="categ_id" ref="ipad"/>
269 <field name="public_categ_id" ref="Computer_all_in_one"/>
270 <field name="standard_price">500.0</field>136 <field name="standard_price">500.0</field>
271 <field name="list_price">750.0</field>137 <field name="list_price">750.0</field>
272 <field name="type">consu</field>138 <field name="type">consu</field>
@@ -275,17 +141,13 @@
275 <field name="description_sale">7.9‑inch (diagonal) LED-backlit, 128Gb141 <field name="description_sale">7.9‑inch (diagonal) LED-backlit, 128Gb
276Dual-core A5 with quad-core graphics142Dual-core A5 with quad-core graphics
277FaceTime HD Camera, 1.2 MP Photos</field>143FaceTime HD Camera, 1.2 MP Photos</field>
278 </record>
279 <record id="product_product_4" model="product.product">
280 <field name="product_tmpl_id" ref="product_template_4"/>
281 <field name="default_code">A2323</field>144 <field name="default_code">A2323</field>
282 </record>145 </record>
283146
284147
285 <record id="product_template_5" model="product.template">148 <record id="product_product_5" model="product.product">
286 <field name="name">Bose Mini Bluetooth Speaker</field>149 <field name="name">Bose Mini Bluetooth Speaker</field>
287 <field name="categ_id" ref="accessories"/>150 <field name="categ_id" ref="accessories"/>
288 <field name="public_categ_id" ref="Speakers"/>
289 <field name="standard_price">600.0</field>151 <field name="standard_price">600.0</field>
290 <field name="list_price">147.0</field>152 <field name="list_price">147.0</field>
291 <field name="type">consu</field>153 <field name="type">consu</field>
@@ -293,44 +155,33 @@
293 <field name="uom_po_id" ref="product_uom_unit"/>155 <field name="uom_po_id" ref="product_uom_unit"/>
294 <field name="description">Custom computer assembled on order based on customer's requirement.</field>156 <field name="description">Custom computer assembled on order based on customer's requirement.</field>
295 <field name="description_sale">Bose's smallest portable Bluetooth speaker</field>157 <field name="description_sale">Bose's smallest portable Bluetooth speaker</field>
296 </record>
297 <record id="product_product_5" model="product.product">
298 <field name="product_tmpl_id" ref="product_template_5"/>
299 <field name="default_code">B3423</field>158 <field name="default_code">B3423</field>
300 </record>159 </record>
301160
302161
303 <record id="product_template_6" model="product.template">162 <record id="product_product_6" model="product.product">
304 <field name="name">iPad Mini</field>163 <field name="name">iPad Mini</field>
305 <field name="categ_id" ref="ipad"/>164 <field name="categ_id" ref="ipad"/>
306 <field name="public_categ_id" ref="Screen"/>
307 <field name="standard_price">800.0</field>165 <field name="standard_price">800.0</field>
308 <field name="list_price">320.0</field>166 <field name="list_price">320.0</field>
309 <field name="type">consu</field>167 <field name="type">consu</field>
310 <field name="uom_id" ref="product_uom_unit"/>168 <field name="uom_id" ref="product_uom_unit"/>
311 <field name="uom_po_id" ref="product_uom_unit"/>169 <field name="uom_po_id" ref="product_uom_unit"/>
312 </record>
313 <record id="product_product_6" model="product.product">
314 <field name="product_tmpl_id" ref="product_template_6"/>
315 <field name="default_code">A1232</field>170 <field name="default_code">A1232</field>
316 </record>171 </record>
317172
318 <record id="product_template_7" model="product.template">173 <record id="product_product_7" model="product.product">
319 <field name="name">Apple In-Ear Headphones</field>174 <field name="name">Apple In-Ear Headphones</field>
320 <field name="categ_id" ref="accessories"/>175 <field name="categ_id" ref="accessories"/>
321 <field name="public_categ_id" ref="Screen"/>
322 <field name="standard_price">70.0</field>176 <field name="standard_price">70.0</field>
323 <field name="list_price">79.0</field>177 <field name="list_price">79.0</field>
324 <field name="type">consu</field>178 <field name="type">consu</field>
325 <field name="uom_id" ref="product_uom_unit"/>179 <field name="uom_id" ref="product_uom_unit"/>
326 <field name="uom_po_id" ref="product_uom_unit"/>180 <field name="uom_po_id" ref="product_uom_unit"/>
327 </record>
328 <record id="product_product_7" model="product.product">
329 <field name="product_tmpl_id" ref="product_template_7"/>
330 <field name="default_code">A8767</field>181 <field name="default_code">A8767</field>
331 </record>182 </record>
332183
333 <record id="product_template_8" model="product.template">184 <record id="product_product_8" model="product.product">
334 <field name="name">iMac</field>185 <field name="name">iMac</field>
335 <field name="categ_id" ref="imac"/>186 <field name="categ_id" ref="imac"/>
336 <field name="standard_price">1299.0</field>187 <field name="standard_price">1299.0</field>
@@ -338,272 +189,227 @@
338 <field name="type">consu</field>189 <field name="type">consu</field>
339 <field name="uom_id" ref="product_uom_unit"/>190 <field name="uom_id" ref="product_uom_unit"/>
340 <field name="uom_po_id" ref="product_uom_unit"/>191 <field name="uom_po_id" ref="product_uom_unit"/>
341 </record>
342 <record id="product_product_8" model="product.product">
343 <field name="product_tmpl_id" ref="product_template_8"/>
344 <field name="default_code">A1090</field>192 <field name="default_code">A1090</field>
345 </record>193 </record>
346194
347 <record id="product_template_9" model="product.template">195 <record id="product_product_9" model="product.product">
348 <field name="name">Apple Wireless Keyboard</field>196 <field name="name">Apple Wireless Keyboard</field>
349 <field name="categ_id" ref="accessories"/>197 <field name="categ_id" ref="accessories"/>
350 <field name="public_categ_id" ref="Keyboard_Mouse"/>
351 <field name="standard_price">10.0</field>198 <field name="standard_price">10.0</field>
352 <field name="list_price">47.0</field>199 <field name="list_price">47.0</field>
353 <field name="type">consu</field>200 <field name="type">consu</field>
354 <field name="uom_id" ref="product_uom_unit"/>201 <field name="uom_id" ref="product_uom_unit"/>
355 <field name="uom_po_id" ref="product_uom_unit"/>202 <field name="uom_po_id" ref="product_uom_unit"/>
356 </record>
357 <record id="product_product_9" model="product.product">
358 <field name="product_tmpl_id" ref="product_template_9"/>
359 <field name="default_code">AK789</field>203 <field name="default_code">AK789</field>
360 </record>204 </record>
361205
362 <record id="product_template_10" model="product.template">206 <record id="product_product_10" model="product.product">
363 <field name="name">Mouse, Optical</field>207 <field name="name">Mouse, Optical</field>
364 <field name="categ_id" ref="product_category_8"/>208 <field name="categ_id" ref="product_category_8"/>
365 <field name="public_categ_id" ref="Keyboard_Mouse"/>
366 <field name="standard_price">12.50</field>209 <field name="standard_price">12.50</field>
367 <field name="list_price">14</field>210 <field name="list_price">14</field>
368 <field name="type">consu</field>211 <field name="type">consu</field>
369 <field name="uom_id" ref="product_uom_unit"/>212 <field name="uom_id" ref="product_uom_unit"/>
370 <field name="uom_po_id" ref="product_uom_unit"/>213 <field name="uom_po_id" ref="product_uom_unit"/>
371 </record>
372 <record id="product_product_10" model="product.product">
373 <field name="product_tmpl_id" ref="product_template_10"/>
374 <field name="default_code">M-Opt</field>214 <field name="default_code">M-Opt</field>
375 </record>215 </record>
376216
377 <record id="product_template_11" model="product.template">217 <!-- -->
378 <field name="name">iPod</field>218
379 <field name="categ_id" ref="ipod"/>219 <record id="product_attribute_1" model="product.attribute">
380 <field name="public_categ_id" ref="Keyboard_Mouse"/>220 <field name="name">Memory</field>
381 <field name="standard_price">14</field>221 </record>
382 <field name="list_price">16.50</field>222 <record id="product_attribute_value_1" model="product.attribute.value">
383 <field name="type">consu</field>223 <field name="name">16 Go</field>
384 <field name="uom_id" ref="product_uom_unit"/>224 <field name="attribute_id" ref="product_attribute_1"/>
385 <field name="uom_po_id" ref="product_uom_unit"/>225 </record>
386 </record>226 <record id="product_attribute_value_2" model="product.attribute.value">
227 <field name="name">32 Go</field>
228 <field name="attribute_id" ref="product_attribute_1"/>
229 </record>
230
387 <record id="product_product_11" model="product.product">231 <record id="product_product_11" model="product.product">
388 <field name="name">iPod</field>232 <field name="name">iPod</field>
389 <field name="variants">16 Gb</field>
390 <field name="default_code">A6678</field>
391 <field name="categ_id" ref="ipod"/>233 <field name="categ_id" ref="ipod"/>
392 <field name="public_categ_id" ref="Keyboard_Mouse"/>
393 <field name="standard_price">14</field>234 <field name="standard_price">14</field>
394 <field name="list_price">16.50</field>235 <field name="list_price">16.50</field>
395 <field name="type">consu</field>236 <field name="type">consu</field>
396 <field name="uom_id" ref="product_uom_unit"/>237 <field name="uom_id" ref="product_uom_unit"/>
397 <field name="uom_po_id" ref="product_uom_unit"/>238 <field name="uom_po_id" ref="product_uom_unit"/>
398 <field name="product_tmpl_id" ref="product_template_11"/>
399 <field name="default_code">A6678</field>239 <field name="default_code">A6678</field>
400 </record>240 <field name="variant_ids" eval="[(6,0,[ref('product.product_attribute_value_1')])]"/>
401 <record id="product_product_11_b" model="product.product">241 </record>
402 <field name="variants">32 Gb</field>242 <record id="product_product_11b" model="product.product">
403 <field name="price_extra">12</field>243 <field name="default_code">A6679</field>
404 <field name="product_tmpl_id" ref="product_template_11"/>244 <field name="product_tmpl_id" ref="product_product_11_product_template"/>
405 </record>245 <field name="variant_ids" eval="[(6,0,[ref('product.product_attribute_value_2')])]"/>
406246 </record>
407 <record id="product_template_12" model="product.template">247
248 <record id="product_attribute_line_1" model="product.attribute.line">
249 <field name="product_tmpl_id" ref="product_product_11_product_template"/>
250 <field name="attribute_id" ref="product_attribute_1"/>
251 <field name="value_ids" eval="[(6,0,[ref('product.product_attribute_value_1'), ref('product.product_attribute_value_2')])]"/>
252 </record>
253
254 <record id="product_product_11_product_template" model="product.template">
255 <field name="variant_ids" eval="[(6,0,[ref('product.product_attribute_line_1')])]"/>
256 </record>
257
258 <record id="product_attribute_price_1" model="product.attribute.price">
259 <field name="product_tmpl_id" ref="product_product_11_product_template"/>
260 <field name="value_id" ref="product_attribute_value_2"/>
261 <field name="price_extra">6.40</field>
262 </record>
263
264 <!-- -->
265
266 <record id="product_product_12" model="product.product">
408 <field name="name">Mouse, Wireless</field>267 <field name="name">Mouse, Wireless</field>
409 <field name="categ_id" ref="product_category_8"/>268 <field name="categ_id" ref="product_category_8"/>
410 <field name="public_categ_id" ref="Keyboard_Mouse"/>
411 <field name="standard_price">18</field>269 <field name="standard_price">18</field>
412 <field name="list_price">12.50</field>270 <field name="list_price">12.50</field>
413 <field name="type">consu</field>271 <field name="type">consu</field>
414 <field name="uom_id" ref="product_uom_unit"/>272 <field name="uom_id" ref="product_uom_unit"/>
415 <field name="uom_po_id" ref="product_uom_unit"/>273 <field name="uom_po_id" ref="product_uom_unit"/>
416 </record>
417 <record id="product_product_12" model="product.product">
418 <field name="product_tmpl_id" ref="product_template_12"/>
419 <field name="default_code">M-Wir</field>274 <field name="default_code">M-Wir</field>
420 </record>275 </record>
421276
422 <record id="product_template_13" model="product.template">277 <record id="product_product_13" model="product.product">
423 <field name="name">RAM SR5</field>278 <field name="name">RAM SR5</field>
424 <field name="categ_id" ref="product_category_8"/>279 <field name="categ_id" ref="product_category_8"/>
425 <field name="public_categ_id" ref="Memory"/>
426 <field name="standard_price">78.0</field>280 <field name="standard_price">78.0</field>
427 <field name="list_price">85.0</field>281 <field name="list_price">85.0</field>
428 <field name="type">consu</field>282 <field name="type">consu</field>
429 <field name="uom_id" ref="product_uom_unit"/>283 <field name="uom_id" ref="product_uom_unit"/>
430 <field name="uom_po_id" ref="product_uom_unit"/>284 <field name="uom_po_id" ref="product_uom_unit"/>
431 </record>
432 <record id="product_product_13" model="product.product">
433 <field name="product_tmpl_id" ref="product_template_13"/>
434 <field name="default_code">RAM-SR5</field>285 <field name="default_code">RAM-SR5</field>
435 </record>286 </record>
436287
437 <record id="product_template_14" model="product.template">288 <record id="product_product_14" model="product.product">
438 <field name="name">RAM SR2</field>289 <field name="name">RAM SR2</field>
439 <field name="categ_id" ref="product_category_8"/>290 <field name="categ_id" ref="product_category_8"/>
440 <field name="public_categ_id" ref="Memory"/>
441 <field name="standard_price">87.0</field>291 <field name="standard_price">87.0</field>
442 <field name="list_price">95.0</field>292 <field name="list_price">95.0</field>
443 <field name="type">consu</field>293 <field name="type">consu</field>
444 <field name="uom_id" ref="product_uom_unit"/>294 <field name="uom_id" ref="product_uom_unit"/>
445 <field name="uom_po_id" ref="product_uom_unit"/>295 <field name="uom_po_id" ref="product_uom_unit"/>
446 </record>
447 <record id="product_product_14" model="product.product">
448 <field name="product_tmpl_id" ref="product_template_14"/>
449 <field name="default_code">RAM-SR2</field>296 <field name="default_code">RAM-SR2</field>
450 </record>297 </record>
451298
452 <record id="product_template_15" model="product.template">299 <record id="product_product_15" model="product.product">
453 <field name="name">RAM SR3</field>300 <field name="name">RAM SR3</field>
454 <field name="categ_id" ref="product_category_8"/>301 <field name="categ_id" ref="product_category_8"/>
455 <field name="public_categ_id" ref="Memory"/>
456 <field name="standard_price">80.0</field>302 <field name="standard_price">80.0</field>
457 <field name="list_price">85.0</field>303 <field name="list_price">85.0</field>
458 <field name="type">consu</field>304 <field name="type">consu</field>
459 <field name="uom_id" ref="product_uom_unit"/>305 <field name="uom_id" ref="product_uom_unit"/>
460 <field name="uom_po_id" ref="product_uom_unit"/>306 <field name="uom_po_id" ref="product_uom_unit"/>
461 </record>
462 <record id="product_product_15" model="product.product">
463 <field name="product_tmpl_id" ref="product_template_15"/>
464 <field name="default_code">RAM-SR3</field>307 <field name="default_code">RAM-SR3</field>
465 </record>308 </record>
466309
467 <record id="product_template_16" model="product.template">310 <record id="product_product_16" model="product.product">
468 <field name="name">Computer Case</field>311 <field name="name">Computer Case</field>
469 <field name="categ_id" ref="product_category_8"/>312 <field name="categ_id" ref="product_category_8"/>
470 <field name="public_categ_id" ref="case"/>
471 <field name="standard_price">20.0</field>313 <field name="standard_price">20.0</field>
472 <field name="list_price">25.0</field>314 <field name="list_price">25.0</field>
473 <field name="type">consu</field>315 <field name="type">consu</field>
474 <field name="uom_id" ref="product_uom_unit"/>316 <field name="uom_id" ref="product_uom_unit"/>
475 <field name="uom_po_id" ref="product_uom_unit"/>317 <field name="uom_po_id" ref="product_uom_unit"/>
476 </record>
477 <record id="product_product_16" model="product.product">
478 <field name="product_tmpl_id" ref="product_template_16"/>
479 <field name="default_code">C-Case</field>318 <field name="default_code">C-Case</field>
480 </record>319 </record>
481320
482 <record id="product_template_17" model="product.template">321 <record id="product_product_17" model="product.product">
483 <field name="name">HDD SH-1</field>322 <field name="name">HDD SH-1</field>
484 <field name="categ_id" ref="product_category_8"/>323 <field name="categ_id" ref="product_category_8"/>
485 <field name="public_categ_id" ref="HDD"/>
486 <field name="standard_price">860.0</field>324 <field name="standard_price">860.0</field>
487 <field name="list_price">975.0</field>325 <field name="list_price">975.0</field>
488 <field name="type">consu</field>326 <field name="type">consu</field>
489 <field name="uom_id" ref="product_uom_unit"/>327 <field name="uom_id" ref="product_uom_unit"/>
490 <field name="uom_po_id" ref="product_uom_unit"/>328 <field name="uom_po_id" ref="product_uom_unit"/>
491 </record>
492 <record id="product_product_17" model="product.product">
493 <field name="product_tmpl_id" ref="product_template_17"/>
494 <field name="default_code">HDD-SH1</field>329 <field name="default_code">HDD-SH1</field>
495 </record>330 </record>
496331
497 <record id="product_template_18" model="product.template">332 <record id="product_product_18" model="product.product">
498 <field name="name">HDD SH-2</field>333 <field name="name">HDD SH-2</field>
499 <field name="categ_id" ref="product_category_8"/>334 <field name="categ_id" ref="product_category_8"/>
500 <field name="public_categ_id" ref="HDD"/>
501 <field name="standard_price">1020.0</field>335 <field name="standard_price">1020.0</field>
502 <field name="list_price">1150.0</field>336 <field name="list_price">1150.0</field>
503 <field name="type">consu</field>337 <field name="type">consu</field>
504 <field name="uom_id" ref="product_uom_unit"/>338 <field name="uom_id" ref="product_uom_unit"/>
505 <field name="uom_po_id" ref="product_uom_unit"/>339 <field name="uom_po_id" ref="product_uom_unit"/>
506 </record>
507 <record id="product_product_18" model="product.product">
508 <field name="product_tmpl_id" ref="product_template_18"/>
509 <field name="default_code">HDD-SH2</field>340 <field name="default_code">HDD-SH2</field>
510 </record>341 </record>
511342
512 <record id="product_template_19" model="product.template">343 <record id="product_product_19" model="product.product">
513 <field name="name">HDD on Demand</field>344 <field name="name">HDD on Demand</field>
514 <field name="categ_id" ref="product_category_8"/>345 <field name="categ_id" ref="product_category_8"/>
515 <field name="public_categ_id" ref="HDD"/>
516 <field name="standard_price">1100.0</field>346 <field name="standard_price">1100.0</field>
517 <field name="list_price">1250.0</field>347 <field name="list_price">1250.0</field>
518 <field name="type">consu</field>348 <field name="type">consu</field>
519 <field name="uom_id" ref="product_uom_unit"/>349 <field name="uom_id" ref="product_uom_unit"/>
520 <field name="uom_po_id" ref="product_uom_unit"/>350 <field name="uom_po_id" ref="product_uom_unit"/>
521 <field name="description">On demand hard-disk having capacity based on requirement.</field>351 <field name="description">On demand hard-disk having capacity based on requirement.</field>
522 </record>
523 <record id="product_product_19" model="product.product">
524 <field name="product_tmpl_id" ref="product_template_19"/>
525 <field name="default_code">HDD-DEM</field>352 <field name="default_code">HDD-DEM</field>
526 </record>353 </record>
527354
528 <record id="product_template_20" model="product.template">355 <record id="product_product_20" model="product.product">
529 <field name="name">Motherboard I9P57</field>356 <field name="name">Motherboard I9P57</field>
530 <field name="categ_id" ref="product_category_8"/>357 <field name="categ_id" ref="product_category_8"/>
531 <field name="public_categ_id" ref="motherboard"/>
532 <field name="standard_price">1700.0</field>358 <field name="standard_price">1700.0</field>
533 <field name="list_price">1950.0</field>359 <field name="list_price">1950.0</field>
534 <field name="type">consu</field>360 <field name="type">consu</field>
535 <field name="uom_id" ref="product_uom_unit"/>361 <field name="uom_id" ref="product_uom_unit"/>
536 <field name="uom_po_id" ref="product_uom_unit"/>362 <field name="uom_po_id" ref="product_uom_unit"/>
537 </record>
538 <record id="product_product_20" model="product.product">
539 <field name="product_tmpl_id" ref="product_template_20"/>
540 <field name="default_code">MBi9</field>363 <field name="default_code">MBi9</field>
541 </record>364 </record>
542365
543 <record id="product_template_21" model="product.template">366 <record id="product_product_21" model="product.product">
544 <field name="name">Motherboard A20Z7</field>367 <field name="name">Motherboard A20Z7</field>
545 <field name="categ_id" ref="product_category_8"/>368 <field name="categ_id" ref="product_category_8"/>
546 <field name="public_categ_id" ref="motherboard"/>
547 <field name="standard_price">1790.0</field>369 <field name="standard_price">1790.0</field>
548 <field name="list_price">2000.0</field>370 <field name="list_price">2000.0</field>
549 <field name="type">consu</field>371 <field name="type">consu</field>
550 <field name="uom_id" ref="product_uom_unit"/>372 <field name="uom_id" ref="product_uom_unit"/>
551 <field name="uom_po_id" ref="product_uom_unit"/>373 <field name="uom_po_id" ref="product_uom_unit"/>
552 </record>
553 <record id="product_product_21" model="product.product">
554 <field name="product_tmpl_id" ref="product_template_21"/>
555 <field name="default_code">MBa20</field>374 <field name="default_code">MBa20</field>
556 </record>375 </record>
557376
558 <record id="product_template_22" model="product.template">377 <record id="product_product_22" model="product.product">
559 <field name="name">Processor Core i5 2.70 Ghz</field>378 <field name="name">Processor Core i5 2.70 Ghz</field>
560 <field name="categ_id" ref="product_category_8"/>379 <field name="categ_id" ref="product_category_8"/>
561 <field name="public_categ_id" ref="processor"/>
562 <field name="standard_price">2010.0</field>380 <field name="standard_price">2010.0</field>
563 <field name="list_price">2100.0</field>381 <field name="list_price">2100.0</field>
564 <field name="type">consu</field>382 <field name="type">consu</field>
565 <field name="uom_id" ref="product_uom_unit"/>383 <field name="uom_id" ref="product_uom_unit"/>
566 <field name="uom_po_id" ref="product_uom_unit"/>384 <field name="uom_po_id" ref="product_uom_unit"/>
567 </record>
568 <record id="product_product_22" model="product.product">
569 <field name="product_tmpl_id" ref="product_template_22"/>
570 <field name="default_code">CPUi5</field>385 <field name="default_code">CPUi5</field>
571 </record>386 </record>
572387
573 <record id="product_template_23" model="product.template">388 <record id="product_product_23" model="product.product">
574 <field name="name">Processor AMD 8-Core</field>389 <field name="name">Processor AMD 8-Core</field>
575 <field name="categ_id" ref="product_category_8"/>390 <field name="categ_id" ref="product_category_8"/>
576 <field name="public_categ_id" ref="processor"/>
577 <field name="standard_price">1910.0</field>391 <field name="standard_price">1910.0</field>
578 <field name="list_price">1980.0</field>392 <field name="list_price">1980.0</field>
579 <field name="type">consu</field>393 <field name="type">consu</field>
580 <field name="uom_id" ref="product_uom_unit"/>394 <field name="uom_id" ref="product_uom_unit"/>
581 <field name="uom_po_id" ref="product_uom_unit"/>395 <field name="uom_po_id" ref="product_uom_unit"/>
582 </record>
583 <record id="product_product_23" model="product.product">
584 <field name="product_tmpl_id" ref="product_template_23"/>
585 <field name="default_code">CPUa8</field>396 <field name="default_code">CPUa8</field>
586 </record>397 </record>
587398
588 <record id="product_template_24" model="product.template">399 <record id="product_product_24" model="product.product">
589 <field name="name">Graphics Card</field>400 <field name="name">Graphics Card</field>
590 <field name="categ_id" ref="product_category_8"/>401 <field name="categ_id" ref="product_category_8"/>
591 <field name="public_categ_id" ref="graphics_card"/>
592 <field name="standard_price">876.0</field>402 <field name="standard_price">876.0</field>
593 <field name="list_price">885.0</field>403 <field name="list_price">885.0</field>
594 <field name="type">consu</field>404 <field name="type">consu</field>
595 <field name="uom_id" ref="product_uom_unit"/>405 <field name="uom_id" ref="product_uom_unit"/>
596 <field name="uom_po_id" ref="product_uom_unit"/>406 <field name="uom_po_id" ref="product_uom_unit"/>
597 </record>
598 <record id="product_product_24" model="product.product">
599 <field name="product_tmpl_id" ref="product_template_24"/>
600 <field name="default_code">CARD</field>407 <field name="default_code">CARD</field>
601 </record>408 </record>
602409
603 <record id="product_template_25" model="product.template">410 <record id="product_product_25" model="product.product">
604 <field name="name">Laptop E5023</field>411 <field name="name">Laptop E5023</field>
605 <field name="categ_id" ref="product_category_4"/>412 <field name="categ_id" ref="product_category_4"/>
606 <field name="public_categ_id" ref="laptops"/>
607 <field name="standard_price">2870.0</field>413 <field name="standard_price">2870.0</field>
608 <field name="list_price">2950.0</field>414 <field name="list_price">2950.0</field>
609 <field name="type">consu</field>415 <field name="type">consu</field>
@@ -613,16 +419,12 @@
6134GB RAM4194GB RAM
614Standard-1294P Processor420Standard-1294P Processor
615QWERTY keyboard</field>421QWERTY keyboard</field>
616 </record>
617 <record id="product_product_25" model="product.product">
618 <field name="product_tmpl_id" ref="product_template_25"/>
619 <field name="default_code">LAP-E5</field>422 <field name="default_code">LAP-E5</field>
620 </record>423 </record>
621424
622 <record id="product_template_26" model="product.template">425 <record id="product_product_26" model="product.product">
623 <field name="name">Laptop S3450</field>426 <field name="name">Laptop S3450</field>
624 <field name="categ_id" ref="product_category_4"/>427 <field name="categ_id" ref="product_category_4"/>
625 <field name="public_categ_id" ref="laptops"/>
626 <field name="standard_price">3000.0</field>428 <field name="standard_price">3000.0</field>
627 <field name="list_price">3245.0</field>429 <field name="list_price">3245.0</field>
628 <field name="type">consu</field>430 <field name="type">consu</field>
@@ -632,141 +434,106 @@
6326GB RAM4346GB RAM
633Hi-Speed 234Q Processor435Hi-Speed 234Q Processor
634QWERTY keyboard</field>436QWERTY keyboard</field>
635 </record>
636 <record id="product_product_26" model="product.product">
637 <field name="product_tmpl_id" ref="product_template_26"/>
638 <field name="default_code">LAP-S3</field>437 <field name="default_code">LAP-S3</field>
639 </record>438 </record>
640439
641 <record id="product_template_27" model="product.template">440 <record id="product_product_27" model="product.product">
642 <field name="name">Laptop Customized</field>441 <field name="name">Laptop Customized</field>
643 <field name="categ_id" ref="product_category_4"/>442 <field name="categ_id" ref="product_category_4"/>
644 <field name="public_categ_id" ref="laptops"/>
645 <field name="standard_price">3300.0</field>443 <field name="standard_price">3300.0</field>
646 <field name="list_price">3645.0</field>444 <field name="list_price">3645.0</field>
647 <field name="type">consu</field>445 <field name="type">consu</field>
648 <field name="uom_id" ref="product_uom_unit"/>446 <field name="uom_id" ref="product_uom_unit"/>
649 <field name="uom_po_id" ref="product_uom_unit"/>447 <field name="uom_po_id" ref="product_uom_unit"/>
650 <field name="description">Custom Laptop based on customer's requirement.</field>448 <field name="description">Custom Laptop based on customer's requirement.</field>
651 </record>
652 <record id="product_product_27" model="product.product">
653 <field name="product_tmpl_id" ref="product_template_27"/>
654 <field name="default_code">LAP-CUS</field>449 <field name="default_code">LAP-CUS</field>
655 </record>450 </record>
656451
657 <record id="product_template_28" model="product.template">452 <record id="product_product_28" model="product.product">
658 <field name="name">External Hard disk</field>453 <field name="name">External Hard disk</field>
659 <field name="categ_id" ref="product_category_6"/>454 <field name="categ_id" ref="product_category_6"/>
660 <field name="public_categ_id" ref="External_Hard_Drive"/>
661 <field name="standard_price">390.0</field>455 <field name="standard_price">390.0</field>
662 <field name="list_price">405.0</field>456 <field name="list_price">405.0</field>
663 <field name="type">consu</field>457 <field name="type">consu</field>
664 <field name="uom_id" ref="product_uom_unit"/>458 <field name="uom_id" ref="product_uom_unit"/>
665 <field name="uom_po_id" ref="product_uom_unit"/>459 <field name="uom_po_id" ref="product_uom_unit"/>
666 </record>
667 <record id="product_product_28" model="product.product">
668 <field name="product_tmpl_id" ref="product_template_28"/>
669 <field name="default_code">EXT-HDD</field>460 <field name="default_code">EXT-HDD</field>
670 </record>461 </record>
671462
672463
673 <record id="product_template_29" model="product.template">464 <record id="product_product_29" model="product.product">
674 <field name="name">Pen drive, SP-2</field>465 <field name="name">Pen drive, SP-2</field>
675 <field name="categ_id" ref="product_category_7"/>466 <field name="categ_id" ref="product_category_7"/>
676 <field name="public_categ_id" ref="Pen_Drive"/>
677 <field name="standard_price">90.0</field>467 <field name="standard_price">90.0</field>
678 <field name="list_price">100.0</field>468 <field name="list_price">100.0</field>
679 <field name="type">consu</field>469 <field name="type">consu</field>
680 <field name="uom_id" ref="product_uom_unit"/>470 <field name="uom_id" ref="product_uom_unit"/>
681 <field name="uom_po_id" ref="product_uom_unit"/>471 <field name="uom_po_id" ref="product_uom_unit"/>
682 </record>
683 <record id="product_product_29" model="product.product">
684 <field name="product_tmpl_id" ref="product_template_29"/>
685 <field name="default_code">PD-SP2</field>472 <field name="default_code">PD-SP2</field>
686 </record>473 </record>
687474
688475
689 <record id="product_template_30" model="product.template">476 <record id="product_product_30" model="product.product">
690 <field name="name">Pen drive, SP-4</field>477 <field name="name">Pen drive, SP-4</field>
691 <field name="categ_id" ref="product_category_7"/>478 <field name="categ_id" ref="product_category_7"/>
692 <field name="public_categ_id" ref="Pen_Drive"/>
693 <field name="standard_price">126.0</field>479 <field name="standard_price">126.0</field>
694 <field name="list_price">145.0</field>480 <field name="list_price">145.0</field>
695 <field name="type">consu</field>481 <field name="type">consu</field>
696 <field name="uom_id" ref="product_uom_unit"/>482 <field name="uom_id" ref="product_uom_unit"/>
697 <field name="uom_po_id" ref="product_uom_unit"/>483 <field name="uom_po_id" ref="product_uom_unit"/>
698 </record>
699 <record id="product_product_30" model="product.product">
700 <field name="product_tmpl_id" ref="product_template_30"/>
701 <field name="default_code">PD-SP4</field>484 <field name="default_code">PD-SP4</field>
702 </record>485 </record>
703486
704 <record id="product_template_31" model="product.template">487 <record id="product_product_31" model="product.product">
705 <field name="name">Multimedia Speakers</field>488 <field name="name">Multimedia Speakers</field>
706 <field name="categ_id" ref="product_category_7"/>489 <field name="categ_id" ref="product_category_7"/>
707 <field name="public_categ_id" ref="Speakers"/>
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches

to all changes: