Files
odoo_source/addons/sale/controllers/catalog.py
T
Horacio Tellezandchevalierv 216fa84fbe [ADD] sale: add a products catalog view on the sale order
Currently, Fields Sales are struggling to create quotations or sale
orders directly from the customer place. One of the issues is that it
is not easy to quickly add products to the SO. Products must be added
one by one and, in mobile, it requires completing a form with
quantities, ... for each new line.  

This commit introduces a catalog view that allows users to select
products in a faster and easier way than before, both in desktop and
mobile view.

Task - 3062080

closes odoo/odoo#106382

Related: odoo/enterprise#37915
Signed-off-by: Victor Feyens (vfe) <vfe@odoo.com>
Co-authored-by: chevalierv <vcr@odoo.com>
2023-05-12 20:51:51 +02:00

99 lines
4.1 KiB
Python

# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo.http import request, route, Controller
from odoo.tools import groupby
class CatalogController(Controller):
@route('/sales/catalog/sale_order_lines_info', auth='user', type='json')
def sale_product_catalog_get_sale_order_lines_info(self, order_id, product_ids):
""" Returns products information to be shown in the catalog.
:param int order_id: The sale order, as a `sale.order` id.
:param list product_ids: The products currently displayed in the product catalog, as a list
of `product.product` ids.
:rtype: dict
:return: A dict with the following structure:
{
'productId': int
'quantity': float (optional)
'price': float
'readOnly': bool (optional)
}
"""
order = request.env['sale.order'].browse(order_id)
sale_order_line_info = dict()
for product, lines in groupby(
order.order_line.filtered(lambda line: not line.display_type),
lambda line: line.product_id
):
if(product.id not in product_ids):
continue
if (len(lines) > 1) or lines[0].product_uom != product.uom_id:
price_unit = order.pricelist_id._get_product_price(
product=product,
quantity=1.0,
currency=order.currency_id,
date=order.date_order,
)
sale_order_line_info[product.id] = dict(
readOnly=True,
price=price_unit,
)
else:
line = lines[0]
sale_order_line_info[product.id] = dict(
quantity=line.product_uom_qty,
price=line.price_unit,
)
product_ids.remove(product.id)
sale_order_line_info.update({
id: dict(price=price) for id, price in order.pricelist_id._get_products_price(
quantity=1.0,
products=request.env['product.product'].browse(product_ids),
currency=order.currency_id,
date=order.date_order,
).items()
})
return sale_order_line_info
@route('/sales/catalog/update_sale_order_line_info', auth='user', type='json')
def sale_product_catalog_update_sale_order_line_info(self, order_id, product_id, quantity):
""" Update sale order line information on a given sale order for a given product.
:param int order_id: The sale order, as a `sale.order` id.
:param int product_id: The product, as a `product.product` id.
:param float quantity: The quantity selected in the product catalog.
:return: The unit price price of the product, based on the pricelist of the sale order and
the quantity selected.
:rtype: float
"""
sol = request.env['sale.order.line'].search([
('order_id', '=', order_id), ('product_id', '=', product_id),
])
if sol:
if quantity != 0:
sol.product_uom_qty = quantity
elif sol.order_id.state in ['draft', 'sent']:
price_unit = sol.order_id.pricelist_id._get_product_price(
product=sol.product_id,
quantity=1.0,
currency=sol.order_id.currency_id,
date=sol.order_id.date_order,
)
sol.unlink()
return price_unit
else:
sol.product_uom_qty = 0
elif quantity > 0:
order = request.env['sale.order'].browse(order_id)
sol = request.env['sale.order.line'].create({
'order_id': order.id,
'product_id': product_id,
'product_uom_qty': quantity,
'sequence': ((order.order_line and order.order_line[-1].sequence + 1) or 10), # put it at the end of the order
})
return sol.price_unit