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