2018-01-16 06:58:15 +01:00
|
|
|
# -*- coding: utf-8 -*-
|
2018-01-16 11:34:37 +01:00
|
|
|
# Part of Odoo, Flectra. See LICENSE file for full copyright and licensing details.
|
2018-01-16 06:58:15 +01:00
|
|
|
|
2018-01-16 11:34:37 +01:00
|
|
|
from flectra import api, models
|
|
|
|
from flectra.tools import float_round
|
2018-01-16 06:58:15 +01:00
|
|
|
|
|
|
|
|
|
|
|
class report_product_pricelist(models.AbstractModel):
|
|
|
|
_name = 'report.product.report_pricelist'
|
|
|
|
|
|
|
|
@api.model
|
|
|
|
def get_report_values(self, docids, data=None):
|
|
|
|
data = data if data is not None else {}
|
|
|
|
pricelist = self.env['product.pricelist'].browse(data.get('form', {}).get('price_list', False))
|
|
|
|
products = self.env['product.product'].browse(data.get('ids', data.get('active_ids')))
|
|
|
|
quantities = self._get_quantity(data)
|
|
|
|
return {
|
|
|
|
'doc_ids': data.get('ids', data.get('active_ids')),
|
|
|
|
'doc_model': 'hr.contribution.register',
|
|
|
|
'docs': products,
|
|
|
|
'data': dict(
|
|
|
|
data,
|
|
|
|
pricelist=pricelist,
|
|
|
|
quantities=quantities,
|
|
|
|
categories_data=self._get_categories(pricelist, products, quantities)
|
|
|
|
),
|
|
|
|
}
|
|
|
|
|
|
|
|
def _get_quantity(self, data):
|
|
|
|
return sorted([data['form'][key] for key in data['form'] if key.startswith('qty') and data['form'][key]])
|
|
|
|
|
|
|
|
def _get_categories(self, pricelist, products, quantities):
|
|
|
|
categ_data = []
|
|
|
|
categories = self.env['product.category']
|
|
|
|
for product in products:
|
|
|
|
categories |= product.categ_id
|
|
|
|
|
|
|
|
for category in categories:
|
|
|
|
categ_products = products.filtered(lambda product: product.categ_id == category)
|
|
|
|
prices = {}
|
|
|
|
for categ_product in categ_products:
|
|
|
|
prices[categ_product.id] = dict.fromkeys(quantities, 0.0)
|
|
|
|
for quantity in quantities:
|
|
|
|
prices[categ_product.id][quantity] = self._get_price(pricelist, categ_product, quantity)
|
|
|
|
categ_data.append({
|
|
|
|
'category': category,
|
|
|
|
'products': categ_products,
|
|
|
|
'prices': prices,
|
|
|
|
})
|
|
|
|
return categ_data
|
|
|
|
|
|
|
|
def _get_price(self, pricelist, product, qty):
|
|
|
|
sale_price_digits = self.env['decimal.precision'].precision_get('Product Price')
|
|
|
|
price = pricelist.get_product_price(product, qty, False)
|
|
|
|
if not price:
|
|
|
|
price = product.list_price
|
|
|
|
return float_round(price, precision_digits=sale_price_digits)
|