fix_views_14_extended/create_ProductPricelistItem.py

128 lines
4.1 KiB
Python

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)