diff --git a/product_sale_price_from_pricelist/__init__.py b/product_sale_price_from_pricelist/__init__.py
new file mode 100644
index 0000000..0650744
--- /dev/null
+++ b/product_sale_price_from_pricelist/__init__.py
@@ -0,0 +1 @@
+from . import models
diff --git a/product_sale_price_from_pricelist/__manifest__.py b/product_sale_price_from_pricelist/__manifest__.py
new file mode 100644
index 0000000..66ed993
--- /dev/null
+++ b/product_sale_price_from_pricelist/__manifest__.py
@@ -0,0 +1,25 @@
+{
+ "name": "Product Sale Price from Pricelist",
+ "version": "16.0.1.0.0",
+ "category": "product",
+ "summary": "Set sale price from pricelist based on last purchase price",
+ "description": """
+ Set sale price from pricelist based on last purchase price
+ """,
+ "author": "Criptomart",
+ "website": "https://criptomart.net",
+ "license": "AGPL-3",
+ "depends": [
+ "product_get_price_helper",
+ "sale",
+ "purchase",
+ "account",
+ "stock_account",
+ "product_template_tags",
+ ],
+ "data": [
+ "views/actions.xml",
+ "views/product_view.xml",
+ ],
+ "installable": True,
+}
diff --git a/product_sale_price_from_pricelist/data/report_paperformat.xml b/product_sale_price_from_pricelist/data/report_paperformat.xml
new file mode 100644
index 0000000..03e74be
--- /dev/null
+++ b/product_sale_price_from_pricelist/data/report_paperformat.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ Barcodes stickers format
+
+ A4
+ 0
+ 0
+ Portrait
+ 10
+ 5
+ 8
+ 8
+
+ 0
+ 75
+
+
+
diff --git a/product_sale_price_from_pricelist/i18n/es.po b/product_sale_price_from_pricelist/i18n/es.po
new file mode 100644
index 0000000..6236c2d
--- /dev/null
+++ b/product_sale_price_from_pricelist/i18n/es.po
@@ -0,0 +1,317 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * product_laosa
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 12.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-03-26 09:31+0000\n"
+"PO-Revision-Date: 2024-03-26 10:32+0100\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.4.2\n"
+
+#. module: product_laosa
+#: model:ir.model.fields,field_description:product_laosa.field_product_product__list_price_automatic
+#: model:ir.model.fields,field_description:product_laosa.field_product_template__list_price_automatic
+msgid "Automatic Sale Price"
+msgstr "Precio de venta automático"
+
+#. module: product_laosa
+#: model:ir.model.fields,help:product_laosa.field_product_product__list_price_automatic
+#: model:ir.model.fields,help:product_laosa.field_product_template__list_price_automatic
+msgid "Automatic computation of the PVP from the cost price and the rate defined in the configuration."
+msgstr "Cálculo automático del PVP a partir del precio de coste y la tarifa definida en la configuración."
+
+#. module: product_laosa
+#: model:ir.model.fields,help:product_laosa.field_product_pricelist_item__base
+msgid ""
+"Base price for computation.\n"
+"Public Price: The base price will be the Sale/public Price.\n"
+"Cost Price : The base price will be the cost price.\n"
+"Other Pricelist : Computation of the base price based on another Pricelist."
+msgstr ""
+"Precio base de cálculo.\n"
+"Precio Público: El precio base será el Precio Público / Venta.\n"
+"Precio de costo: El precio base será el precio de costo.\n"
+"Otra lista de precios: cálculo del precio base basado en otra lista de precios."
+
+#. module: product_laosa
+#: model:ir.model.fields,field_description:product_laosa.field_product_pricelist_item__base
+msgid "Based on"
+msgstr "Basado en"
+
+#. module: product_laosa
+#: model:ir.model.fields,help:product_laosa.field_product_product__last_purchase_price_compute_type
+#: model:ir.model.fields,help:product_laosa.field_product_template__last_purchase_price_compute_type
+msgid ""
+"Choose whether discounts should influence the calculation of the last purchase price. Select Never update for manual configuration of cost and sale prices.\n"
+"\n"
+"* Without discounts: does not take into account discounts when updating the last purchase price.\n"
+"* First discount: take into account only first discount when updating the last purchase price.\n"
+"* Triple discount: take into account all discounts when updating the last purchase price. Needs \"Purchase Triple Discount\" OCA module.\n"
+"* Manual update: Select this for manual configuration of cost and sale price. The sales price will not be calculated automatically."
+msgstr ""
+"Elija si los descuentos deben influir en la actualización del último precio de compra. Seleccione No actualizar nunca para la configuración manual de los precios de coste y venta.\n"
+"\n"
+"* Sin descuentos: no tiene en cuenta ningún descuento al actualizar el último precio de compra.\n"
+"* Primer descuento: tiene en cuenta sólo el primer descuento al actualizar el último precio de compra.\n"
+"* Triple descuento: tiene en cuenta todos los descuentos al actualizar el último precio de compra. Necesita el módulo OCA \"Purchase Triple Discount\".\n"
+"* Actualización manual: configuración manual del precio de coste y de venta. El precio de venta no se calculará automáticamente."
+
+#. module: product_laosa
+#: model:ir.model,name:product_laosa.model_res_company
+msgid "Companies"
+msgstr "Compañías"
+
+#. module: product_laosa
+#: model:ir.model,name:product_laosa.model_res_config_settings
+msgid "Config Settings"
+msgstr "Opciones de Configuración"
+
+#. module: product_laosa
+#: model:ir.model.fields,field_description:product_laosa.field_product_packaging__qty
+msgid "Contained Quantity"
+msgstr "Cantidad contenida"
+
+#. module: product_laosa
+#: selection:product.pricelist.item,base:0
+msgid "Cost"
+msgstr "Coste"
+
+#. module: product_laosa
+#: selection:product.pricelist.item,base:0
+msgid "Cost Price Tax Included"
+msgstr "Precio de coste con impuesto incluido"
+
+#. module: product_laosa
+#: model_terms:ir.ui.view,arch_db:product_laosa.res_config_settings_view_form_pricelists
+msgid "Default pricelists for Coops"
+msgstr "Tarifas por defecto para cooperativas"
+
+#. module: product_laosa
+#: selection:product.template,last_purchase_price_compute_type:0
+msgid "Double discount"
+msgstr "Doble descuento"
+
+#. module: product_laosa
+#: selection:product.template,last_purchase_price_compute_type:0
+msgid "First discount"
+msgstr "Primer descuento"
+
+#. module: product_laosa
+#: model:ir.model.fields,field_description:product_laosa.field_product_product__last_print_label_date
+#: model:ir.model.fields,field_description:product_laosa.field_product_template__last_print_label_date
+msgid "Last Print Label Date"
+msgstr "Fecha de la última impresión de la etiqueta"
+
+#. module: product_laosa
+#: model:ir.model.fields,field_description:product_laosa.field_product_product__last_purchase_price
+#: model:ir.model.fields,field_description:product_laosa.field_product_template__last_purchase_price
+#: model_terms:ir.ui.view,arch_db:product_laosa.product_view_inherit_list_price_auto
+#: selection:product.pricelist.item,base:0
+msgid "Last purchase price"
+msgstr "Último precio de compra"
+
+#. module: product_laosa
+#: model:ir.model.fields,field_description:product_laosa.field_product_product__last_purchase_price_compute_type
+#: model:ir.model.fields,field_description:product_laosa.field_product_template__last_purchase_price_compute_type
+msgid "Last purchase price calculation type"
+msgstr "Cálculo de último precio de compra"
+
+#. module: product_laosa
+#: model:ir.model.fields,field_description:product_laosa.field_product_product__list_price_updated
+#: model:ir.model.fields,field_description:product_laosa.field_product_template__list_price_updated
+msgid "Last purchase price updated"
+msgstr "Último precio de compra actualizado"
+
+#. module: product_laosa
+#: model:ir.model.fields,field_description:product_laosa.field_product_template_tag__image
+msgid "Logo"
+msgstr "Logo"
+
+#. module: product_laosa
+#: selection:product.template,last_purchase_price_compute_type:0
+msgid "Manual update"
+msgstr "Actualización manual"
+
+#. module: product_laosa
+#: model:ir.model.fields,field_description:product_laosa.field_product_product__name_wordpress
+#: model:ir.model.fields,field_description:product_laosa.field_product_template__name_wordpress
+msgid "Name for WordPress"
+msgstr "Nombre para WordPress"
+
+#. module: product_laosa
+#: code:addons/product_laosa/models/product_template.py:55
+#, python-format
+msgid "Not found a valid pricelist to compute sale price. Check configuration in General Settings."
+msgstr "No se ha encontrado una lista de precios válida para calcular el precio de venta. Compruebe la configuración en los Ajustes Generales."
+
+#. module: product_laosa
+#: selection:product.pricelist.item,base:0
+msgid "Other Pricelist"
+msgstr "Otra tarifa"
+
+#. module: product_laosa
+#: model:ir.model.fields,help:product_laosa.field_product_product__list_price
+#: model:ir.model.fields,help:product_laosa.field_product_template__list_price
+msgid "Price calculated according to the configured pricelist, including VAT."
+msgstr "Precio calculado según la tarifa configurada, incluyendo el IVA."
+
+#. module: product_laosa
+#: model:ir.model,name:product_laosa.model_product_pricelist
+msgid "Pricelist"
+msgstr "Tarifa"
+
+#. module: product_laosa
+#: model:ir.model,name:product_laosa.model_product_pricelist_item
+msgid "Pricelist Item"
+msgstr "Elemento de tarifa"
+
+#. module: product_laosa
+#: model:ir.model.fields,field_description:product_laosa.field_res_config_settings__product_pricelist_automatic
+msgid "Pricelist applied to automatic calculation of sales price"
+msgstr "Tarifa aplicada al cálculo automático del precio de venta"
+
+#. module: product_laosa
+#: model:ir.model.fields,field_description:product_laosa.field_res_company__product_pricelist_automatic
+msgid "Pricelist applied to the automatic selling price"
+msgstr "Tarifa aplicada al PVP automáticamente"
+
+#. module: product_laosa
+#: model:ir.model,name:product_laosa.model_product_product
+msgid "Product"
+msgstr "Producto"
+
+#. module: product_laosa
+#: model:ir.model,name:product_laosa.model_product_packaging
+msgid "Product Packaging"
+msgstr "Empaquetado del producto"
+
+#. module: product_laosa
+#: model:ir.model,name:product_laosa.model_product_template_tag
+msgid "Product Tag"
+msgstr "Etiqueta de producto"
+
+#. module: product_laosa
+#: model:ir.model,name:product_laosa.model_product_template
+msgid "Product Template"
+msgstr "Plantilla de producto"
+
+#. module: product_laosa
+#: model_terms:ir.ui.view,arch_db:product_laosa.view_product_search_form_inherit_tags
+msgid "Products that have changed their sales price and no label has been printed."
+msgstr "Productos que han cambiado su PVP y no se ha impreso su etiqueta."
+
+#. module: product_laosa
+#: model_terms:ir.ui.view,arch_db:product_laosa.view_product_search_form_inherit_updated
+msgid "Products that have recently changed their cost price and have not updated their selling price."
+msgstr "Productos que han cambiado recientemente su precio de coste y no han actualizado su PVP."
+
+#. module: product_laosa
+#: selection:product.pricelist.item,base:0
+msgid "Public Price"
+msgstr "Precio público"
+
+#. module: product_laosa
+#: model:ir.model.fields,field_description:product_laosa.field_product_product__is_wordpress_public
+#: model:ir.model.fields,field_description:product_laosa.field_product_template__is_wordpress_public
+msgid "Publish on WordPress"
+msgstr "Publicar en WordPress"
+
+#. module: product_laosa
+#: model:ir.model.fields,help:product_laosa.field_res_company__product_pricelist_automatic
+#: model:ir.model.fields,help:product_laosa.field_res_config_settings__product_pricelist_automatic
+msgid "Rate that applies to all products that update the selling price automatically."
+msgstr "Tarifa que se aplica a todos los productos que actualizan el precio de venta automáticamente."
+
+#. module: product_laosa
+#: model:ir.model,name:product_laosa.model_ir_actions_report
+msgid "Report Action"
+msgstr "Reportar la acción"
+
+#. module: product_laosa
+#: model:ir.model.fields,field_description:product_laosa.field_product_product__list_price
+#: model:ir.model.fields,field_description:product_laosa.field_product_template__list_price
+msgid "Sale price with VAT"
+msgstr "PVP con impuestos"
+
+#. module: product_laosa
+#: model_terms:ir.ui.view,arch_db:product_laosa.product_view_inherit_list_price_auto
+msgid "Sale price."
+msgstr "PVP"
+
+#. module: product_laosa
+#: model:ir.model.fields,field_description:product_laosa.field_product_template_tag__sequence
+msgid "Sequence"
+msgstr "Secuencia"
+
+#. module: product_laosa
+#: model:ir.model,name:product_laosa.model_stock_move
+msgid "Stock Move"
+msgstr "Movimiento de stock"
+
+#. module: product_laosa
+#: model:ir.model.fields,help:product_laosa.field_product_product__list_price_updated
+#: model:ir.model.fields,help:product_laosa.field_product_template__list_price_updated
+msgid "The last cost price has been updated and you need to update the selling price in the database, shelves and scales."
+msgstr "Se ha actualizado el último precio de coste y hay que actualizar el PVP en la base de datos, lineales y las balanzas."
+
+#. module: product_laosa
+#: model:ir.model.fields,help:product_laosa.field_product_product__last_purchase_price
+#: model:ir.model.fields,help:product_laosa.field_product_template__last_purchase_price
+msgid "The last price at which the product was purchased. It is used as the base price field for calculating the product sale price."
+msgstr "El último precio al que se compró el producto. Se utiliza como campo de precio base para calcular el precio de venta del producto."
+
+#. module: product_laosa
+#: model:ir.model.fields,help:product_laosa.field_product_product__to_print
+#: model:ir.model.fields,help:product_laosa.field_product_template__to_print
+msgid "The sale price has been updated on this product and needs to be updated on the shelf."
+msgstr "El PVP ha sido actualizado en este producto y necesita ser actualizado en el lineal."
+
+#. module: product_laosa
+#: model:ir.model.fields,help:product_laosa.field_product_packaging__qty
+msgid "The total number of products you can have per pallet or box."
+msgstr "El numero total de productos que puede tener por palé o caja."
+
+#. module: product_laosa
+#: model_terms:ir.ui.view,arch_db:product_laosa.view_product_search_form_inherit_tags
+msgid "To print"
+msgstr "Para imprimir"
+
+#. module: product_laosa
+#: model:ir.model.fields,field_description:product_laosa.field_product_product__to_print
+#: model:ir.model.fields,field_description:product_laosa.field_product_template__to_print
+msgid "To print label"
+msgstr "Pendiente de imprimir etiqueta"
+
+#. module: product_laosa
+#: model_terms:ir.ui.view,arch_db:product_laosa.view_product_search_form_inherit_updated
+msgid "To update sales price"
+msgstr "Pendiente de actualizar PVP"
+
+#. module: product_laosa
+#: selection:product.template,last_purchase_price_compute_type:0
+msgid "Triple discount"
+msgstr "Triple decuento"
+
+#. module: product_laosa
+#: model:ir.actions.server,name:product_laosa.action_product_calculate_theoritical_price
+msgid "Update Sales Price"
+msgstr "Actualizar PVP"
+
+#. module: product_laosa
+#: selection:product.template,last_purchase_price_compute_type:0
+msgid "Without discounts"
+msgstr "Sin descuentos"
+
+#. module: product_laosa
+#: model_terms:ir.ui.view,arch_db:product_laosa.product_view_inherit_wordpress_laosa
+msgid "WordPress"
+msgstr "WordPress"
diff --git a/product_sale_price_from_pricelist/i18n/product_sale_price_from_pricelist.pot b/product_sale_price_from_pricelist/i18n/product_sale_price_from_pricelist.pot
new file mode 100644
index 0000000..58eb8da
--- /dev/null
+++ b/product_sale_price_from_pricelist/i18n/product_sale_price_from_pricelist.pot
@@ -0,0 +1,304 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * product_laosa
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 12.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-03-26 09:39+0000\n"
+"PO-Revision-Date: 2024-03-26 09:39+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: product_laosa
+#: model:ir.model.fields,field_description:product_laosa.field_product_product__list_price_automatic
+#: model:ir.model.fields,field_description:product_laosa.field_product_template__list_price_automatic
+msgid "Automatic Sale Price"
+msgstr ""
+
+#. module: product_laosa
+#: model:ir.model.fields,help:product_laosa.field_product_product__list_price_automatic
+#: model:ir.model.fields,help:product_laosa.field_product_template__list_price_automatic
+msgid "Automatic computation of the PVP from the cost price and the rate defined in the configuration."
+msgstr ""
+
+#. module: product_laosa
+#: model:ir.model.fields,help:product_laosa.field_product_pricelist_item__base
+msgid "Base price for computation.\n"
+"Public Price: The base price will be the Sale/public Price.\n"
+"Cost Price : The base price will be the cost price.\n"
+"Other Pricelist : Computation of the base price based on another Pricelist."
+msgstr ""
+
+#. module: product_laosa
+#: model:ir.model.fields,field_description:product_laosa.field_product_pricelist_item__base
+msgid "Based on"
+msgstr ""
+
+#. module: product_laosa
+#: model:ir.model.fields,help:product_laosa.field_product_product__last_purchase_price_compute_type
+#: model:ir.model.fields,help:product_laosa.field_product_template__last_purchase_price_compute_type
+msgid "Choose whether discounts should influence the calculation of the last purchase price. Select Never update for manual configuration of cost and sale prices.\n"
+"\n"
+"* Without discounts: does not take into account discounts when updating the last purchase price.\n"
+"* First discount: take into account only first discount when updating the last purchase price.\n"
+"* Triple discount: take into account all discounts when updating the last purchase price. Needs \"Purchase Triple Discount\" OCA module.\n"
+"* Manual update: Select this for manual configuration of cost and sale price. The sales price will not be calculated automatically."
+msgstr ""
+
+#. module: product_laosa
+#: model:ir.model,name:product_laosa.model_res_company
+msgid "Companies"
+msgstr ""
+
+#. module: product_laosa
+#: model:ir.model,name:product_laosa.model_res_config_settings
+msgid "Config Settings"
+msgstr ""
+
+#. module: product_laosa
+#: model:ir.model.fields,field_description:product_laosa.field_product_packaging__qty
+msgid "Contained Quantity"
+msgstr ""
+
+#. module: product_laosa
+#: selection:product.pricelist.item,base:0
+msgid "Cost"
+msgstr ""
+
+#. module: product_laosa
+#: selection:product.pricelist.item,base:0
+msgid "Cost Price Tax Included"
+msgstr ""
+
+#. module: product_laosa
+#: model_terms:ir.ui.view,arch_db:product_laosa.res_config_settings_view_form_pricelists
+msgid "Default pricelists for Coops"
+msgstr ""
+
+#. module: product_laosa
+#: selection:product.template,last_purchase_price_compute_type:0
+msgid "Double discount"
+msgstr ""
+
+#. module: product_laosa
+#: selection:product.template,last_purchase_price_compute_type:0
+msgid "First discount"
+msgstr ""
+
+#. module: product_laosa
+#: model:ir.model.fields,field_description:product_laosa.field_product_product__last_print_label_date
+#: model:ir.model.fields,field_description:product_laosa.field_product_template__last_print_label_date
+msgid "Last Print Label Date"
+msgstr ""
+
+#. module: product_laosa
+#: model:ir.model.fields,field_description:product_laosa.field_product_product__last_purchase_price
+#: model:ir.model.fields,field_description:product_laosa.field_product_template__last_purchase_price
+#: model_terms:ir.ui.view,arch_db:product_laosa.product_view_inherit_list_price_auto
+#: selection:product.pricelist.item,base:0
+msgid "Last purchase price"
+msgstr ""
+
+#. module: product_laosa
+#: model:ir.model.fields,field_description:product_laosa.field_product_product__last_purchase_price_compute_type
+#: model:ir.model.fields,field_description:product_laosa.field_product_template__last_purchase_price_compute_type
+msgid "Last purchase price calculation type"
+msgstr ""
+
+#. module: product_laosa
+#: model:ir.model.fields,field_description:product_laosa.field_product_product__list_price_updated
+#: model:ir.model.fields,field_description:product_laosa.field_product_template__list_price_updated
+msgid "Last purchase price updated"
+msgstr ""
+
+#. module: product_laosa
+#: model:ir.model.fields,field_description:product_laosa.field_product_template_tag__image
+msgid "Logo"
+msgstr ""
+
+#. module: product_laosa
+#: selection:product.template,last_purchase_price_compute_type:0
+msgid "Manual update"
+msgstr ""
+
+#. module: product_laosa
+#: model:ir.model.fields,field_description:product_laosa.field_product_product__name_wordpress
+#: model:ir.model.fields,field_description:product_laosa.field_product_template__name_wordpress
+msgid "Name for WordPress"
+msgstr ""
+
+#. module: product_laosa
+#: code:addons/product_laosa/models/product_template.py:55
+#, python-format
+msgid "Not found a valid pricelist to compute sale price. Check configuration in General Settings."
+msgstr ""
+
+#. module: product_laosa
+#: selection:product.pricelist.item,base:0
+msgid "Other Pricelist"
+msgstr ""
+
+#. module: product_laosa
+#: model:ir.model.fields,help:product_laosa.field_product_product__list_price
+#: model:ir.model.fields,help:product_laosa.field_product_template__list_price
+msgid "Price calculated according to the configured pricelist, including VAT."
+msgstr ""
+
+#. module: product_laosa
+#: model:ir.model,name:product_laosa.model_product_pricelist
+msgid "Pricelist"
+msgstr ""
+
+#. module: product_laosa
+#: model:ir.model,name:product_laosa.model_product_pricelist_item
+msgid "Pricelist Item"
+msgstr ""
+
+#. module: product_laosa
+#: model:ir.model.fields,field_description:product_laosa.field_res_config_settings__product_pricelist_automatic
+msgid "Pricelist applied to automatic calculation of sales price"
+msgstr ""
+
+#. module: product_laosa
+#: model:ir.model.fields,field_description:product_laosa.field_res_company__product_pricelist_automatic
+msgid "Pricelist applied to the automatic selling price"
+msgstr ""
+
+#. module: product_laosa
+#: model:ir.model,name:product_laosa.model_product_product
+msgid "Product"
+msgstr ""
+
+#. module: product_laosa
+#: model:ir.model,name:product_laosa.model_product_packaging
+msgid "Product Packaging"
+msgstr ""
+
+#. module: product_laosa
+#: model:ir.model,name:product_laosa.model_product_template_tag
+msgid "Product Tag"
+msgstr ""
+
+#. module: product_laosa
+#: model:ir.model,name:product_laosa.model_product_template
+msgid "Product Template"
+msgstr ""
+
+#. module: product_laosa
+#: model_terms:ir.ui.view,arch_db:product_laosa.view_product_search_form_inherit_tags
+msgid "Products that have changed their sales price and no label has been printed."
+msgstr ""
+
+#. module: product_laosa
+#: model_terms:ir.ui.view,arch_db:product_laosa.view_product_search_form_inherit_updated
+msgid "Products that have recently changed their cost price and have not updated their selling price."
+msgstr ""
+
+#. module: product_laosa
+#: selection:product.pricelist.item,base:0
+msgid "Public Price"
+msgstr ""
+
+#. module: product_laosa
+#: model:ir.model.fields,field_description:product_laosa.field_product_product__is_wordpress_public
+#: model:ir.model.fields,field_description:product_laosa.field_product_template__is_wordpress_public
+msgid "Publish on WordPress"
+msgstr ""
+
+#. module: product_laosa
+#: model:ir.model.fields,help:product_laosa.field_res_company__product_pricelist_automatic
+#: model:ir.model.fields,help:product_laosa.field_res_config_settings__product_pricelist_automatic
+msgid "Rate that applies to all products that update the selling price automatically."
+msgstr ""
+
+#. module: product_laosa
+#: model:ir.model,name:product_laosa.model_ir_actions_report
+msgid "Report Action"
+msgstr ""
+
+#. module: product_laosa
+#: model:ir.model.fields,field_description:product_laosa.field_product_product__list_price
+#: model:ir.model.fields,field_description:product_laosa.field_product_template__list_price
+msgid "Sale price with VAT"
+msgstr ""
+
+#. module: product_laosa
+#: model_terms:ir.ui.view,arch_db:product_laosa.product_view_inherit_list_price_auto
+msgid "Sale price."
+msgstr ""
+
+#. module: product_laosa
+#: model:ir.model.fields,field_description:product_laosa.field_product_template_tag__sequence
+msgid "Sequence"
+msgstr ""
+
+#. module: product_laosa
+#: model:ir.model,name:product_laosa.model_stock_move
+msgid "Stock Move"
+msgstr ""
+
+#. module: product_laosa
+#: model:ir.model.fields,help:product_laosa.field_product_product__list_price_updated
+#: model:ir.model.fields,help:product_laosa.field_product_template__list_price_updated
+msgid "The last cost price has been updated and you need to update the selling price in the database, shelves and scales."
+msgstr ""
+
+#. module: product_laosa
+#: model:ir.model.fields,help:product_laosa.field_product_product__last_purchase_price
+#: model:ir.model.fields,help:product_laosa.field_product_template__last_purchase_price
+msgid "The last price at which the product was purchased. It is used as the base price field for calculating the product sale price."
+msgstr ""
+
+#. module: product_laosa
+#: model:ir.model.fields,help:product_laosa.field_product_product__to_print
+#: model:ir.model.fields,help:product_laosa.field_product_template__to_print
+msgid "The sale price has been updated on this product and needs to be updated on the shelf."
+msgstr ""
+
+#. module: product_laosa
+#: model:ir.model.fields,help:product_laosa.field_product_packaging__qty
+msgid "The total number of products you can have per pallet or box."
+msgstr ""
+
+#. module: product_laosa
+#: model_terms:ir.ui.view,arch_db:product_laosa.view_product_search_form_inherit_tags
+msgid "To print"
+msgstr ""
+
+#. module: product_laosa
+#: model:ir.model.fields,field_description:product_laosa.field_product_product__to_print
+#: model:ir.model.fields,field_description:product_laosa.field_product_template__to_print
+msgid "To print label"
+msgstr ""
+
+#. module: product_laosa
+#: model_terms:ir.ui.view,arch_db:product_laosa.view_product_search_form_inherit_updated
+msgid "To update sales price"
+msgstr ""
+
+#. module: product_laosa
+#: selection:product.template,last_purchase_price_compute_type:0
+msgid "Triple discount"
+msgstr ""
+
+#. module: product_laosa
+#: model:ir.actions.server,name:product_laosa.action_product_calculate_theoritical_price
+msgid "Update Sales Price"
+msgstr ""
+
+#. module: product_laosa
+#: selection:product.template,last_purchase_price_compute_type:0
+msgid "Without discounts"
+msgstr ""
+
+#. module: product_laosa
+#: model_terms:ir.ui.view,arch_db:product_laosa.product_view_inherit_wordpress_laosa
+msgid "WordPress"
+msgstr ""
+
diff --git a/product_sale_price_from_pricelist/models/__init__.py b/product_sale_price_from_pricelist/models/__init__.py
new file mode 100644
index 0000000..8d222ed
--- /dev/null
+++ b/product_sale_price_from_pricelist/models/__init__.py
@@ -0,0 +1,5 @@
+from . import product_pricelist
+from . import product_pricelist_item
+from . import product_template
+from . import res_config
+from . import stock_move
diff --git a/product_sale_price_from_pricelist/models/product_pricelist.py b/product_sale_price_from_pricelist/models/product_pricelist.py
new file mode 100644
index 0000000..e5d8c95
--- /dev/null
+++ b/product_sale_price_from_pricelist/models/product_pricelist.py
@@ -0,0 +1,30 @@
+# Copyright (C) 2020: Criptomart (https://criptomart.net)
+# @author Santi Noreña ()
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+# import logging
+
+from odoo import api, models
+
+# _logger = logging.getLogger(__name__)
+
+
+class ProductPricelist(models.Model):
+ _inherit = "product.pricelist"
+
+ def _compute_price_rule(self, products, qty, uom=None, date=False, **kwargs):
+ ProductPricelistItem = self.env["product.pricelist.item"]
+ ProductProduct = self.env["product.product"]
+ res = super()._compute_price_rule(products, date=date, qty=1)
+ new_res = res.copy()
+ item_id = []
+ for product_id, values in res.items():
+ if values[1]:
+ item_id = values[1]
+ if item_id:
+ item = ProductPricelistItem.browse(item_id)
+ if item.base == "last_purchase_price":
+ price = ProductProduct.browse(product_id).last_purchase_price
+ price = (price - (price * (item.price_discount / 100))) or 0.0
+ new_res[product_id] = (price, item_id)
+ return new_res
diff --git a/product_sale_price_from_pricelist/models/product_pricelist_item.py b/product_sale_price_from_pricelist/models/product_pricelist_item.py
new file mode 100644
index 0000000..2c574e1
--- /dev/null
+++ b/product_sale_price_from_pricelist/models/product_pricelist_item.py
@@ -0,0 +1,14 @@
+# Copyright (C) 2020: Criptomart (https://criptomart.net)
+# @author Santi Noreña ()
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+from odoo import fields, models
+
+
+class ProductPricelistItem(models.Model):
+ _inherit = "product.pricelist.item"
+
+ base = fields.Selection(
+ selection_add=[("last_purchase_price", "Last purchase price")],
+ ondelete={"last_purchase_price": "set default"},
+ )
diff --git a/product_sale_price_from_pricelist/models/product_template.py b/product_sale_price_from_pricelist/models/product_template.py
new file mode 100644
index 0000000..7ec4504
--- /dev/null
+++ b/product_sale_price_from_pricelist/models/product_template.py
@@ -0,0 +1,90 @@
+# Copyright (C) 2020: Criptomart (https://criptomart.net)
+# @author Santi Noreña ()
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+import logging
+
+from odoo import exceptions, models, fields, api, _
+from odoo.exceptions import UserError
+
+_logger = logging.getLogger(__name__)
+
+
+class ProductTemplate(models.Model):
+ _inherit = "product.template"
+
+ last_purchase_price_updated = fields.Boolean(
+ string="Last purchase price updated",
+ help="The last purchase price has been updated and you need to update the selling price in the database, shelves and scales.",
+ default=False,
+ company_dependent=True,
+ )
+ list_price_theoritical = fields.Float(
+ "Theoritical price",
+ readonly=True,
+ company_dependent=True,
+ )
+ last_purchase_price = fields.Float(
+ string="Last purchase price",
+ help="The last price at which the product was purchased. It is used as the base price field for calculating the product sale price.",
+ readonly=True,
+ digits="Product Price",
+ company_dependent=True,
+ )
+ last_purchase_price_compute_type = fields.Selection(
+ [
+ ("without_discounts", "Without discounts"),
+ ("with_discount", "First discount"),
+ ("with_two_discounts", "Double discount"),
+ ("with_three_discounts", "Triple discount"),
+ ("manual_update", "Manual update"),
+ ],
+ string="Last purchase price calculation type",
+ help="Choose whether discounts should influence the calculation of the last purchase price. Select Never update for manual configuration of cost and sale prices.\n"
+ "\n* Without discounts: does not take into account discounts when updating the last purchase price.\n"
+ "* First discount: take into account only first discount when updating the last purchase price.\n"
+ '* Triple discount: take into account all discounts when updating the last purchase price. Needs "Purchase Triple Discount" OCA module.\n'
+ "* Manual update: Select this for manual configuration of cost and sale price. The sales price will not be calculated automatically.",
+ default="without_discounts",
+ required=True,
+ company_dependent=True,
+ )
+
+ def _compute_theoritical_price(self):
+ pricelist_obj = self.env["product.pricelist"]
+ pricelist_id = (
+ self.env["ir.config_parameter"]
+ .sudo()
+ .get_param("product_sale_price_from_pricelist.product_pricelist_automatic")
+ or False
+ )
+ pricelist = pricelist_obj.browse(int(pricelist_id))
+ if pricelist:
+ for template in self:
+ _logger.debug(("company: %s" % self.env.company))
+ _logger.debug("compute pre price : %s" % template.last_purchase_price)
+
+ if (
+ template.name
+ and template.id
+ and template.product_variant_id
+ and template.last_purchase_price_compute_type != "manual_update"
+ ):
+ partial_price = template.product_variant_id._get_price(
+ qty=1, pricelist=pricelist
+ )
+ _logger.debug("partial price : %s" % partial_price)
+ template.list_price_theoritical = partial_price["value"]
+ template.last_purchase_price_updated = True
+ _logger.debug("final price : %s" % template.list_price_theoritical)
+ else:
+ raise UserError(
+ _(
+ "Not found a valid pricelist to compute sale price. Check configuration in General Settings."
+ )
+ )
+
+ def action_update_list_price(self):
+ for template in self:
+ template.list_price = template.list_price_theoritical
+ template.last_purchase_price_updated = False
diff --git a/product_sale_price_from_pricelist/models/res_config.py b/product_sale_price_from_pricelist/models/res_config.py
new file mode 100644
index 0000000..699d53c
--- /dev/null
+++ b/product_sale_price_from_pricelist/models/res_config.py
@@ -0,0 +1,11 @@
+from odoo import models, fields, api
+
+
+class ResConfigSettings(models.TransientModel):
+ _inherit = "res.config.settings"
+
+ product_pricelist_automatic = fields.Many2one(
+ comodel_name="product.pricelist",
+ string="Pricelist applied to automatic calculation of sales price",
+ config_parameter="product_sale_price_from_pricelist.product_pricelist_automatic",
+ )
diff --git a/product_sale_price_from_pricelist/models/stock_move.py b/product_sale_price_from_pricelist/models/stock_move.py
new file mode 100644
index 0000000..34c8c2b
--- /dev/null
+++ b/product_sale_price_from_pricelist/models/stock_move.py
@@ -0,0 +1,65 @@
+# Copyright 2016-2019 Akretion (http://www.akretion.com/)
+# Copyright 2020 Criptomart
+# @author: Alexis de Lattre
+# @author Santi Noreña ()
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+import logging
+import math
+
+from odoo import exceptions, models, fields, api, _
+from odoo.tools import float_is_zero, float_round, float_compare
+
+_logger = logging.getLogger(__name__)
+
+
+class StockMove(models.Model):
+ _inherit = "stock.move"
+
+ def product_price_update_before_done(self):
+ super(StockMove, self).product_price_update_before_done()
+ for move in self.filtered(lambda move: move.location_id.usage == "supplier"):
+ if (
+ move.product_id.last_purchase_price_compute_type
+ == "with_three_discounts"
+ ):
+ price_updated = float_round(
+ move.purchase_line_id.price_subtotal
+ / move.purchase_line_id.product_qty,
+ precision_digits=2,
+ )
+ elif move.product_id.last_purchase_price_compute_type == "with_discount":
+ price_updated = float_round(
+ move.purchase_line_id.price_unit
+ * (1 - move.purchase_line_id.discount / 100),
+ precision_digits=2,
+ )
+ elif (
+ move.product_id.last_purchase_price_compute_type == "with_two_discounts"
+ ):
+ price_updated = float_round(
+ move.purchase_line_id.price_unit
+ * (1 - move.purchase_line_id.discount / 100)
+ * (1 - move.purchase_line_id.discount2 / 100),
+ precision_digits=2,
+ )
+ else:
+ price_updated = move.purchase_line_id.price_unit
+
+ if float_compare(
+ move.product_id.last_purchase_price, price_updated, precision_digits=2
+ ) and not float_is_zero(move.quantity_done, precision_digits=3):
+ _logger.info(
+ "Update last_purchase_price: %s for product %s Previous price: %s"
+ % (
+ price_updated,
+ move.product_id.default_code,
+ move.product_id.last_purchase_price,
+ )
+ )
+ move.product_id.with_company(move.company_id).last_purchase_price = (
+ price_updated
+ )
+ move.product_id.with_company(
+ move.company_id
+ ).product_tmpl_id._compute_theoritical_price()
diff --git a/product_sale_price_from_pricelist/views/actions.xml b/product_sale_price_from_pricelist/views/actions.xml
new file mode 100644
index 0000000..4a4a372
--- /dev/null
+++ b/product_sale_price_from_pricelist/views/actions.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+ Update Sales Price
+
+
+ code
+
+ records.action_update_list_price()
+
+
+
+
+
diff --git a/product_sale_price_from_pricelist/views/product_view.xml b/product_sale_price_from_pricelist/views/product_view.xml
new file mode 100644
index 0000000..3db44de
--- /dev/null
+++ b/product_sale_price_from_pricelist/views/product_view.xml
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+ product.list.price.automatic.form
+ product.template
+ form
+
+
+
+
+
+
+
+
+
+ {'readonly':[('last_purchase_price_compute_type','!=','manual_update')]}
+
+
+
+
+
+
+
+
+
+
+
+
+ product.print.supermarket.res.config.settings.form
+ res.config.settings
+
+
+
+
+
+
+
+
+
+
+
+ view.product.search.form.inherit.updated
+ product.template
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file