diff --git a/addons/purchase/data/purchase_demo.xml b/addons/purchase/data/purchase_demo.xml index 43d840bbaeb515f0fc207429eb7c57966888cca3..2283fd287787a2e3af39b6e86144652168435b2e 100644 --- a/addons/purchase/data/purchase_demo.xml +++ b/addons/purchase/data/purchase_demo.xml @@ -19,21 +19,21 @@ 'price_unit': 79.80, 'product_qty': 15.0, 'product_uom': ref('uom.product_uom_unit'), - 'date_planned': time.strftime('%Y-%m-%d')}), + 'date_planned': DateTime.today() + relativedelta(days=3)}), (0, 0, { 'product_id': ref('product.product_product_25'), 'name': obj().env.ref('product.product_product_25').partner_ref, 'price_unit': 2868.70, 'product_qty': 5.0, 'product_uom': ref('uom.product_uom_unit'), - 'date_planned': time.strftime('%Y-%m-%d')}), + 'date_planned': DateTime.today() + relativedelta(days=3)}), (0, 0, { 'product_id': ref('product.product_product_27'), 'name': obj().env.ref('product.product_product_27').partner_ref, 'price_unit': 3297.20, 'product_qty': 4.0, 'product_uom': ref('uom.product_uom_unit'), - 'date_planned': time.strftime('%Y-%m-%d')}) + 'date_planned': DateTime.today() + relativedelta(days=3)}) ]"/> </record> @@ -48,14 +48,14 @@ 'price_unit': 132.50, 'product_qty': 20.0, 'product_uom': ref('uom.product_uom_unit'), - 'date_planned': time.strftime('%Y-%m-%d')}), + 'date_planned': DateTime.today() + relativedelta(days=1)}), (0, 0, { 'product_id': ref('product.product_delivery_01'), 'name': obj().env.ref('product.product_delivery_01').partner_ref, 'price_unit': 89.0, 'product_qty': 5.0, 'product_uom': ref('uom.product_uom_unit'), - 'date_planned': time.strftime('%Y-%m-%d')}), + 'date_planned': DateTime.today() + relativedelta(days=1)}), ]"/> </record> @@ -70,7 +70,7 @@ 'price_unit': 25.50, 'product_qty': 10.0, 'product_uom': ref('uom.product_uom_hour'), - 'date_planned': time.strftime('%Y-%m-%d')}), + 'date_planned': DateTime.today() + relativedelta(days=1)}), ]"/> </record> @@ -85,21 +85,21 @@ 'price_unit': 85.50, 'product_qty': 6.0, 'product_uom': ref('uom.product_uom_unit'), - 'date_planned': time.strftime('%Y-%m-%d')}), + 'date_planned': DateTime.today() + relativedelta(days=5)}), (0, 0, { 'product_id': ref('product.product_product_20'), 'name': obj().env.ref('product.product_product_20').partner_ref, 'price_unit': 1690.0, 'product_qty': 5.0, 'product_uom': ref('uom.product_uom_unit'), - 'date_planned': time.strftime('%Y-%m-%d')}), + 'date_planned': DateTime.today() + relativedelta(days=5)}), (0, 0, { 'product_id': ref('product.product_product_6'), 'name': obj().env.ref('product.product_product_6').partner_ref, 'price_unit': 800.0, 'product_qty': 7.0, 'product_uom': ref('uom.product_uom_unit'), - 'date_planned': time.strftime('%Y-%m-%d')}) + 'date_planned': DateTime.today() + relativedelta(days=5)}) ]"/> </record> @@ -114,14 +114,14 @@ 'price_unit': 2010.0, 'product_qty': 3.0, 'product_uom': ref('uom.product_uom_unit'), - 'date_planned': time.strftime('%Y-%m-%d')}), + 'date_planned': DateTime.today()}), (0, 0, { 'product_id': ref('product.product_product_24'), 'name': obj().env.ref('product.product_product_24').partner_ref, 'price_unit': 876.0, 'product_qty': 3.0, 'product_uom': ref('uom.product_uom_unit'), - 'date_planned': time.strftime('%Y-%m-%d')}), + 'date_planned': DateTime.today()}), ]"/> </record> @@ -136,21 +136,21 @@ 'price_unit': 58.0, 'product_qty': 9.0, 'product_uom': ref('uom.product_uom_unit'), - 'date_planned': time.strftime('%Y-%m-%d')}), + 'date_planned': DateTime.today()}), (0, 0, { 'product_id': ref('product.product_delivery_01'), 'name': obj().env.ref('product.product_delivery_01').partner_ref, 'price_unit': 65.0, 'product_qty': 3.0, 'product_uom': ref('uom.product_uom_unit'), - 'date_planned': time.strftime('%Y-%m-%d')}), + 'date_planned': DateTime.today()}), (0, 0, { 'product_id': ref('product.consu_delivery_01'), 'name': obj().env.ref('product.consu_delivery_01').partner_ref, 'price_unit': 154.5, 'product_qty': 4.0, 'product_uom': ref('uom.product_uom_unit'), - 'date_planned': time.strftime('%Y-%m-%d')}), + 'date_planned': DateTime.today()}), ]"/> </record> @@ -165,14 +165,14 @@ 'price_unit': 13.5, 'product_qty': 5.0, 'product_uom': ref('uom.product_uom_unit'), - 'date_planned': time.strftime('%Y-%m-%d')}), + 'date_planned': DateTime.today()}), (0, 0, { 'product_id': ref('product.product_delivery_02'), 'name': obj().env.ref('product.product_delivery_02').partner_ref, 'price_unit': 38.0, 'product_qty': 15.0, 'product_uom': ref('uom.product_uom_unit'), - 'date_planned': time.strftime('%Y-%m-%d')}), + 'date_planned': DateTime.today()}), ]"/> </record> diff --git a/addons/purchase/models/purchase.py b/addons/purchase/models/purchase.py index fb68ccdec72d1247d66b57f077fce2ab167e57ef..a0d1386ffc558754f52288392d5f3dc394fdbc16 100644 --- a/addons/purchase/models/purchase.py +++ b/addons/purchase/models/purchase.py @@ -85,7 +85,7 @@ class PurchaseOrder(models.Model): "delivery order sent by your vendor.") date_order = fields.Datetime('Order Date', required=True, states=READONLY_STATES, index=True, copy=False, default=fields.Datetime.now,\ help="Depicts the date where the Quotation should be validated and converted into a purchase order.") - date_approve = fields.Date('Confirmation Date', readonly=1, index=True, copy=False) + date_approve = fields.Datetime('Confirmation Date', readonly=1, index=True, copy=False) partner_id = fields.Many2one('res.partner', string='Vendor', required=True, states=READONLY_STATES, change_default=True, tracking=True, help="You can find a vendor by its Name, TIN, Email or Internal Reference.") dest_address_id = fields.Many2one('res.partner', string='Drop Ship Address', states=READONLY_STATES, help="Put an address if you want to deliver directly from the vendor to the customer. " @@ -125,6 +125,7 @@ class PurchaseOrder(models.Model): product_id = fields.Many2one('product.product', related='order_line.product_id', string='Product', readonly=False) user_id = fields.Many2one('res.users', string='Purchase Representative', index=True, tracking=True, default=lambda self: self.env.user) company_id = fields.Many2one('res.company', 'Company', required=True, index=True, states=READONLY_STATES, default=lambda self: self.env.company.id) + currency_rate = fields.Float("Currency Rate", compute='_compute_currency_rate', compute_sudo=True, store=True, readonly=True, help='Ratio between the purchase order currency and the company currency') def _compute_access_url(self): super(PurchaseOrder, self)._compute_access_url() @@ -140,6 +141,11 @@ class PurchaseOrder(models.Model): purchase_order_ids = self._search(expression.AND([domain, args]), limit=limit, access_rights_uid=name_get_uid) return self.browse(purchase_order_ids).name_get() + @api.depends('date_order', 'currency_id', 'company_id', 'company_id.currency_id') + def _compute_currency_rate(self): + for order in self: + order.currency_rate = self.env['res.currency']._get_conversion_rate(order.company_id.currency_id, order.currency_id, order.company_id, order.date_order) + @api.multi @api.depends('name', 'partner_ref') def name_get(self): diff --git a/addons/purchase/report/purchase_report.py b/addons/purchase/report/purchase_report.py index 28c25cecacacc236b64e056f922c44448d9857f2..d3a04e7d06efa9316f84f293c43c48aa3b2c5451 100644 --- a/addons/purchase/report/purchase_report.py +++ b/addons/purchase/report/purchase_report.py @@ -25,18 +25,15 @@ class PurchaseReport(models.Model): ], 'Order Status', readonly=True) product_id = fields.Many2one('product.product', 'Product', readonly=True) partner_id = fields.Many2one('res.partner', 'Vendor', readonly=True) - date_approve = fields.Date('Date Approved', readonly=True) + date_approve = fields.Datetime('Confirmation Date', readonly=True) product_uom = fields.Many2one('uom.uom', 'Reference Unit of Measure', required=True) company_id = fields.Many2one('res.company', 'Company', readonly=True) currency_id = fields.Many2one('res.currency', 'Currency', readonly=True) user_id = fields.Many2one('res.users', 'Purchase Representative', readonly=True) - delay = fields.Float('Days to Validate', digits=(16, 2), readonly=True) - delay_pass = fields.Float('Days to Deliver', digits=(16, 2), readonly=True) - unit_quantity = fields.Float('Product Quantity', readonly=True, oldname='quantity') - price_total = fields.Float('Total Price', readonly=True) - price_average = fields.Float('Average Price', readonly=True, group_operator="avg") - negociation = fields.Float('Purchase-Standard Price', readonly=True, group_operator="avg") - price_standard = fields.Float('Products Value', readonly=True, group_operator="sum") + delay = fields.Float('Days to Confirm', digits=(16, 2), readonly=True) + delay_pass = fields.Float('Days to Receive', digits=(16, 2), readonly=True) + price_total = fields.Float('Total', readonly=True) + price_average = fields.Float('Average Cost', readonly=True, group_operator="avg") nbr_lines = fields.Integer('# of Lines', readonly=True, oldname='nbr') category_id = fields.Many2one('product.category', 'Product Category', readonly=True) product_tmpl_id = fields.Many2one('product.template', 'Product Template', readonly=True) @@ -46,6 +43,12 @@ class PurchaseReport(models.Model): commercial_partner_id = fields.Many2one('res.partner', 'Commercial Entity', readonly=True) weight = fields.Float('Gross Weight', readonly=True) volume = fields.Float('Volume', readonly=True) + order_id = fields.Many2one('purchase.order', 'Order', readonly=True) + untaxed_total = fields.Float('Untaxed Total', readonly=True) + qty_ordered = fields.Float('Qty Ordered', readonly=True) + qty_received = fields.Float('Qty Received', readonly=True) + qty_billed = fields.Float('Qty Billed', readonly=True) + qty_to_be_billed = fields.Float('Qty to be Billed', readonly=True) @api.model_cr def init(self): @@ -61,80 +64,83 @@ class PurchaseReport(models.Model): select_str = """ WITH currency_rate as (%s) SELECT + po.id as order_id, min(l.id) as id, - s.date_order as date_order, - s.state, - s.date_approve, - s.dest_address_id, - s.partner_id as partner_id, - s.user_id as user_id, - s.company_id as company_id, - s.fiscal_position_id as fiscal_position_id, + po.date_order as date_order, + po.state, + po.date_approve, + po.dest_address_id, + po.partner_id as partner_id, + po.user_id as user_id, + po.company_id as company_id, + po.fiscal_position_id as fiscal_position_id, l.product_id, p.product_tmpl_id, t.categ_id as category_id, - s.currency_id, + po.currency_id, t.uom_id as product_uom, - sum(l.product_qty/u.factor*u2.factor) as unit_quantity, - extract(epoch from age(s.date_approve,s.date_order))/(24*60*60)::decimal(16,2) as delay, - extract(epoch from age(l.date_planned,s.date_order))/(24*60*60)::decimal(16,2) as delay_pass, + extract(epoch from age(po.date_approve,po.date_order))/(24*60*60)::decimal(16,2) as delay, + extract(epoch from age(l.date_planned,po.date_order))/(24*60*60)::decimal(16,2) as delay_pass, count(*) as nbr_lines, - sum(l.price_unit / COALESCE(NULLIF(cr.rate, 0), 1.0) * l.product_qty)::decimal(16,2) as price_total, - avg(100.0 * (l.price_unit / COALESCE(NULLIF(cr.rate, 0),1.0) * l.product_qty) / NULLIF(ip.value_float*l.product_qty/u.factor*u2.factor, 0.0))::decimal(16,2) as negociation, - sum(ip.value_float*l.product_qty/u.factor*u2.factor)::decimal(16,2) as price_standard, - (sum(l.product_qty * l.price_unit / COALESCE(NULLIF(cr.rate, 0), 1.0))/NULLIF(sum(l.product_qty/u.factor*u2.factor),0.0))::decimal(16,2) as price_average, + sum(l.price_total / COALESCE(po.currency_rate, 1.0))::decimal(16,2) as price_total, + (sum(l.product_qty * l.price_unit / COALESCE(po.currency_rate, 1.0))/NULLIF(sum(l.product_qty/line_uom.factor*product_uom.factor),0.0))::decimal(16,2) as price_average, partner.country_id as country_id, partner.commercial_partner_id as commercial_partner_id, analytic_account.id as account_analytic_id, - sum(p.weight * l.product_qty/u.factor*u2.factor) as weight, - sum(p.volume * l.product_qty/u.factor*u2.factor) as volume + sum(p.weight * l.product_qty/line_uom.factor*product_uom.factor) as weight, + sum(p.volume * l.product_qty/line_uom.factor*product_uom.factor) as volume, + sum(l.price_subtotal / COALESCE(po.currency_rate, 1.0))::decimal(16,2) as untaxed_total, + sum(l.product_qty / line_uom.factor * product_uom.factor) as qty_ordered, + sum(l.qty_received / line_uom.factor * product_uom.factor) as qty_received, + sum(l.qty_invoiced / line_uom.factor * product_uom.factor) as qty_billed, + sum(l.product_qty / line_uom.factor * product_uom.factor) - sum(l.qty_received / line_uom.factor * product_uom.factor) as qty_to_be_billed """ % self.env['res.currency']._select_companies_rates() return select_str def _from(self): from_str = """ purchase_order_line l - join purchase_order s on (l.order_id=s.id) - join res_partner partner on s.partner_id = partner.id + join purchase_order po on (l.order_id=po.id) + join res_partner partner on po.partner_id = partner.id left join product_product p on (l.product_id=p.id) left join product_template t on (p.product_tmpl_id=t.id) - LEFT JOIN ir_property ip ON (ip.name='standard_price' AND ip.res_id=CONCAT('product.product,',p.id) AND ip.company_id=s.company_id) - left join uom_uom u on (u.id=l.product_uom) - left join uom_uom u2 on (u2.id=t.uom_id) + left join uom_uom line_uom on (line_uom.id=l.product_uom) + left join uom_uom product_uom on (product_uom.id=t.uom_id) left join account_analytic_account analytic_account on (l.account_analytic_id = analytic_account.id) - left join currency_rate cr on (cr.currency_id = s.currency_id and - cr.company_id = s.company_id and - cr.date_start <= coalesce(s.date_order, now()) and - (cr.date_end is null or cr.date_end > coalesce(s.date_order, now()))) + left join currency_rate cr on (cr.currency_id = po.currency_id and + cr.company_id = po.company_id and + cr.date_start <= coalesce(po.date_order, now()) and + (cr.date_end is null or cr.date_end > coalesce(po.date_order, now()))) """ return from_str def _group_by(self): group_by_str = """ GROUP BY - s.company_id, - s.user_id, - s.partner_id, - u.factor, - s.currency_id, + po.company_id, + po.user_id, + po.partner_id, + line_uom.factor, + po.currency_id, l.price_unit, - s.date_approve, + po.date_approve, l.date_planned, l.product_uom, - s.dest_address_id, - s.fiscal_position_id, + po.dest_address_id, + po.fiscal_position_id, l.product_id, p.product_tmpl_id, t.categ_id, - s.date_order, - s.state, - u.uom_type, - u.category_id, + po.date_order, + po.state, + line_uom.uom_type, + line_uom.category_id, t.uom_id, - u.id, - u2.factor, + line_uom.id, + product_uom.factor, partner.country_id, partner.commercial_partner_id, - analytic_account.id + analytic_account.id, + po.id """ return group_by_str diff --git a/addons/purchase/report/purchase_report_views.xml b/addons/purchase/report/purchase_report_views.xml index f4cc05af27fefb892fdcc4b7e95bec29e2f674b7..bc15d2c589c20a59d0e56162324a9049664f1df9 100644 --- a/addons/purchase/report/purchase_report_views.xml +++ b/addons/purchase/report/purchase_report_views.xml @@ -4,12 +4,11 @@ <field name="name">product.month.pivot</field> <field name="model">purchase.report</field> <field name="arch" type="xml"> - <pivot string="Purchase Orders Statistics" disable_linking="True"> - <field name="partner_id" type="row"/> - <field name="date_order" interval="month" type="col"/> + <pivot string="Purchase Analysis" disable_linking="True" display_quantity="true"> + <field name="category_id" type="row"/> + <field name="order_id" type="measure"/> + <field name="untaxed_total" type="measure"/> <field name="price_total" type="measure"/> - <field name="unit_quantity" type="measure"/> - <field name="price_average" type="measure"/> </pivot> </field> </record> @@ -17,10 +16,9 @@ <field name="name">product.month.graph</field> <field name="model">purchase.report</field> <field name="arch" type="xml"> - <graph string="Purchase Orders Statistics"> - <field name="partner_id" type="row"/> - <field name="date_order" interval="month" type="col"/> - <field name="price_average" type="measure"/> + <graph string="Purchase Orders Statistics" type="line"> + <field name="date_approve" interval="day" type="col"/> + <field name="untaxed_total" type="measure"/> </graph> </field> </record> @@ -31,7 +29,6 @@ <field name="model_id">purchase.report</field> <field name="domain">[('state','!=','cancel')]</field> <field name="user_id" eval="False"/> - <field name="context">{'group_by': ['category_id'], 'col_group_by': ['date_order:month'], 'measures': ['unit_quantity']}</field> </record> <record id="filter_purchase_order_price_per_supplier" model="ir.filters"> <field name="name">Price Per Vendor</field> @@ -54,8 +51,8 @@ <field name="model">purchase.report</field> <field name="arch" type="xml"> <search string="Purchase Orders"> - <filter string="Quotations" name="quotes" domain="[('state','=','draft')]"/> - <filter string="Orders" name="orders" domain="[('state','!=','draft'),('state','!=','cancel')]"/> + <filter string="Requests for Quotation" name="quotes" domain="[('state','=','draft')]"/> + <filter string="Purchase Orders" name="orders" domain="[('state','!=','draft'),('state','!=','cancel')]"/> <field name="partner_id"/> <field name="product_id"/> <group expand="0" string="Extended Filters"> @@ -69,12 +66,13 @@ <filter string="Vendor" name="group_partner_id" context="{'group_by':'partner_id'}"/> <filter string="Vendor Country" name="country_id" context="{'group_by':'country_id'}"/> <filter string="Purchase Representative" name="user_id" context="{'group_by':'user_id'}"/> + <filter string="Product" name="group_product_id" context="{'group_by':'product_id'}"/> <filter string="Product Category" name="group_category_id" context="{'group_by':'category_id'}"/> - <filter string="Fiscal Position" name="fiscal_position" context="{'group_by':'fiscal_position_id'}" help="Purchase Order Fiscal Position"/> <filter string="Status" name="status" context="{'group_by':'state'}"/> <filter string="Company" name="company" context="{'group_by':'company_id'}" groups="base.group_multi_company"/> <separator/> <filter string="Order Date" name="order_month" context="{'group_by': 'date_order:month'}"/> + <filter string="Confirmation Date" name="group_date_approve_month" context="{'group_by': 'date_approve:month'}"/> </group> </search> </field> @@ -90,7 +88,8 @@ <field name="target">current</field> </record> - <menuitem id="purchase_report" name="Reporting" parent="purchase.menu_purchase_root" sequence="99" - groups="purchase.group_purchase_manager" action="action_purchase_order_report_all"/> + <menuitem id="purchase_report" name="Reporting" parent="purchase.menu_purchase_root" sequence="99"/> + + <menuitem id="menu_report_purchase" name="Purchase" action="action_purchase_order_report_all" parent="purchase_report" sequence="1" groups="purchase.group_purchase_manager"/> </odoo> diff --git a/addons/purchase/tests/__init__.py b/addons/purchase/tests/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..d8e61f341b9bd210271471e5771d75c9587c9858 --- /dev/null +++ b/addons/purchase/tests/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import test_purchase_order_report diff --git a/addons/purchase/tests/test_purchase_order_report.py b/addons/purchase/tests/test_purchase_order_report.py new file mode 100644 index 0000000000000000000000000000000000000000..24750e71d6046e4816a822f0d349cdd20436932a --- /dev/null +++ b/addons/purchase/tests/test_purchase_order_report.py @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from datetime import datetime +from odoo.tests import common, Form, tagged + + +@tagged('post_install', '-at_install') +class TestPurchaseOrderReport(common.TransactionCase): + def setUp(self): + super(TestPurchaseOrderReport, self).setUp() + + self.partner_id = self.env.ref('base.res_partner_1') + self.product1 = self.env.ref('product.product_product_8') + self.product2 = self.env.ref('product.product_product_11') + self.PurchaseReport = self.env['purchase.report'] + + # Create a new company and set CoA + self.company_id = self.env['res.company'].create({'name': 'new_company'}) + self.env.user.company_id = self.company_id + self.env.ref('l10n_generic_coa.configurable_chart_template').load_for_current_company(False, False) + + def test_00_purchase_order_report(self): + uom_dozen = self.env.ref('uom.product_uom_dozen') + + eur_currency = self.env.ref('base.EUR') + self.company_id.currency_id = self.env.ref('base.USD').id + + self.env['res.currency.rate'].search([]).unlink() + self.env['res.currency.rate'].create({ + 'name': datetime.today(), + 'rate': 2.0, + 'currency_id': eur_currency.id, + }) + po = self.env['purchase.order'].create({ + 'partner_id': self.partner_id.id, + 'currency_id': eur_currency.id, + 'order_line': [ + (0, 0, { + 'name': self.product1.name, + 'product_id': self.product1.id, + 'product_qty': 1.0, + 'product_uom': uom_dozen.id, + 'price_unit': 100.0, + 'date_planned': datetime.today(), + }), + (0, 0, { + 'name': self.product2.name, + 'product_id': self.product2.id, + 'product_qty': 1.0, + 'product_uom': uom_dozen.id, + 'price_unit': 200.0, + 'date_planned': datetime.today(), + }), + ], + }) + po.button_confirm() + + f = Form(self.env['account.invoice']) + f.partner_id = po.partner_id + f.purchase_id = po + invoice = f.save() + invoice.action_invoice_open() + + res_product1 = self.PurchaseReport.search([ + ('order_id', '=', po.id), ('product_id', '=', self.product1.id)]) + + # check that report will convert dozen to unit or not + self.assertEquals(res_product1.qty_ordered, 12.0, 'UoM conversion is not working') + # report should show in company currency (amount/rate) = (100/2) + self.assertEquals(res_product1.price_total, 50.0, 'Currency conversion is not working') + + res_product2 = self.PurchaseReport.search([ + ('order_id', '=', po.id), ('product_id', '=', self.product2.id)]) + + # Check that repost should show 6 unit of product + self.assertEquals(res_product2.qty_ordered, 12.0, 'UoM conversion is not working') + # report should show in company currency (amount/rate) = (200/2) + self.assertEquals(res_product2.price_total, 100.0, 'Currency conversion is not working') diff --git a/addons/purchase/views/purchase_views.xml b/addons/purchase/views/purchase_views.xml index ea23fb1ea0a4cf64562b17d3f9c427f6bedf1f61..edaa5693f3f17a6370ecc4e310b0decbd708ff0b 100644 --- a/addons/purchase/views/purchase_views.xml +++ b/addons/purchase/views/purchase_views.xml @@ -175,7 +175,8 @@ <field name="currency_id" groups="base.group_multi_currency"/> </group> <group> - <field name="date_order"/> + <field name="date_order" attrs="{'invisible': [('state','=','purchase')]}"/> + <field name="date_approve" attrs="{'invisible': [('state','!=','purchase')]}"/> <field name="origin" attrs="{'invisible': [('origin','=',False)]}"/> <field name="company_id" groups="base.group_multi_company" options="{'no_create': True}"/> </group> @@ -374,7 +375,8 @@ <tree decoration-bf="message_unread==True" decoration-muted="state=='cancel'" decoration-info="state in ('wait','confirmed')" string="Purchase Order"> <field name="message_unread" invisible="1"/> <field name="name" string="Reference"/> - <field name="date_order" /> + <field name="date_order" invisible="not context.get('quotation_only', False)"/> + <field name="date_approve" invisible="context.get('quotation_only', False)"/> <field name="partner_id"/> <field name="company_id" groups="base.group_multi_company" options="{'no_create': True}"/> <field name="date_planned" invisible="context.get('quotation_only', False)"/> @@ -420,6 +422,7 @@ <field name="res_model">purchase.order</field> <field name="view_mode">tree,kanban,form,pivot,graph,calendar,activity</field> <field name="search_view_id" ref="view_purchase_order_filter"/> + <field name="context">{'quotation_only': True}</field> <field name="help" type="html"> <p class="o_view_nocontent_smiling_face"> Create a request for quotation diff --git a/addons/purchase_stock/report/purchase_report.py b/addons/purchase_stock/report/purchase_report.py index defb1a6c1671affa8989ef82b200eef796502a14..46254cadca97ea0d0ded6b7083e5477dc4d076a4 100644 --- a/addons/purchase_stock/report/purchase_report.py +++ b/addons/purchase_stock/report/purchase_report.py @@ -13,7 +13,7 @@ class PurchaseReport(models.Model): return super(PurchaseReport, self)._select() + ", spt.warehouse_id as picking_type_id" def _from(self): - return super(PurchaseReport, self)._from() + " left join stock_picking_type spt on (spt.id=s.picking_type_id)" + return super(PurchaseReport, self)._from() + " left join stock_picking_type spt on (spt.id=po.picking_type_id)" def _group_by(self): return super(PurchaseReport, self)._group_by() + ", spt.warehouse_id"