commit a5d608b6a3efd6216c45aed45a55c1f45ba48de4 Author: wdgaravito Date: Thu Feb 27 22:38:12 2025 +0000 Upload script for creating items in price lists diff --git a/create_ProductPricelistItem.py b/create_ProductPricelistItem.py new file mode 100644 index 0000000..b55cb02 --- /dev/null +++ b/create_ProductPricelistItem.py @@ -0,0 +1,127 @@ +import os +import sys +import json +import odooly +import re + + + + +'''Cuando la Dirección de Ventas informa que el precio de un producto no se visualiza en la lista de precios, +a pesar de estar actualizado en la hoja de cálculo 'Precios de Venta para Odoo', +utilizo este script para actualizar los precios. Posteriormente, +es necesario ejecutar la tarea programada (ir_cron) de actualización de precios.''' + + + + + + +'''Agregamos los id's de las sucursales a las que no queremos actualizar el precio. +Por lo general no hay una lista de precios para Buenaventura, +por lo que se excluye de la actualización''' + + + +branch_exceptions = [6] + +'''Relacionamos el id del producto a actualizar.''' +id_product = 1216 + +''' relacionamos el precio por kilo del producto para la lista Canal''' +Price = 3950 + +'''Por tipo de lista ingresamos el margen para canal siempre es 0''' +pricelist_types = { + 'channel': {'margin': 0.00, 'code': 'CN',}, + 'commercial': {'margin': 0.05, 'code': 'CM',}, + 'counter': {'margin': 0.1, 'code': 'MD',}, + } + + + + + + +def calc_price(margin, weight): + price = Price + result = price/(1-margin) + return result*weight + +def main(odoo): + pp = odoo.env['product.pricelist'] + ppi = odoo.env['product.pricelist.item'] + hb = odoo.env['hr.branch'] + cop = odoo.env['res.currency'].get('base.COP') + + patron = r"(.*?) - Lista" + + product_id = odoo.env['product.product'].get(id_product) + weight = product_id.weight + cod_item = product_id.default_code + + for pricelist_type in pricelist_types: + + cod_pricelist=pricelist_types[pricelist_type]['code'] + pricelists_ids = pp.search([('pricelist_type','=',pricelist_type)]) + for pricelist in pricelists_ids: + id = pricelist.id + branchName = re.search(patron, pricelist.name) + branch_id = hb.search([('name', '=', branchName.group(1))]) + + if not branch_id or branch_id.id[0] in branch_exceptions: + continue + else: + cod_branch = branch_id.code[0].lower() + + ppi_extid = (f'agofer_listaprecios_item.' + f'{cod_branch}_{cod_pricelist}_{cod_item}') + product_item_id = ppi.get(ppi_extid) + price = calc_price(pricelist_types[pricelist_type]['margin'], weight) + if product_item_id: + values = { + 'applied_on': '0_product_variant', + 'base': 'list_price', + 'base_pricelist_id': False, + 'categ_id': False, + 'compute_price': 'fixed', + 'date_end': False, + 'date_start': False, + 'fixed_price': price, + 'min_quantity': 0.0, + 'percent_price': 0.0, + 'price_discount': 0.0, + 'price_max_margin': 0.0, + 'price_min_margin': 0.0, + 'price_round': 0.0, + 'price_surcharge': price, + } + product_item_id.write(values) + else: + values = { + 'product_id': product_id, + 'pricelist_id': id, + 'applied_on': '0_product_variant', + 'currency_id': cop.id, + 'compute_price': 'fixed', + 'min_quantity': 0.0, + 'percent_price': 0.0, + 'price_discount': 0.0, + 'price_max_margin': 0.0, + 'price_min_margin': 0.0, + 'price_round': 0.0, + 'fixed_price': price, + 'price_surcharge': price, + 'date_end': False, + 'date_start': False, + 'base_pricelist_id': False, + 'categ_id': False, + } + result = ppi.create(values) + result._set_external_id(ppi_extid) + + +if __name__ == "__main__": + odooly.Client._config_file = os.path.expanduser('odooly.ini') + odoo = odooly.Client.from_config('erp_production') + main(odoo)