Actualización masiva de precios en contratos

Gustavo Orrillo
- 25/08/2022 - 2 min. de lectura

Como muchos sabemos el módulo contract de OCA es sensacional. Es uno de los mejores módulos community que tiene Odoo. Ahora, la gente que desarrolló el módulo no puede prever la realidad argentina (como le sucede a la mayoría de los mortales y académicos) y no pudieron prever la necesidad de aumentar los precios de forma mensual (anda a saber porque).

Es por ello que desarrollamos el módulo contract_update_prices. Este módulo agrega un item de menú con las líneas de contrato.

 

En esta vista uno puede filtrar por cliente, nombre del contrato y por sobre todo precio unitario.


Una vez seleccionados los contratos, uno puede clickear en "Acción > Actualizar precios"


Esto mostrará un wizard con un solo campo; nuevo precio. Este campo pide el nuevo precio. Una vez ingresado el precio, se procede a actualizar los precios de las líneas de contratos.


Este módulo es una base. No es la solución final porque cuando uno trabaja con contratos, uno trabaja con cientos o miles de contratos. Y cuando se actualizan los precios, los mismos se hace en forma segmentada. A un segmento de clientes se aplica un nuevo precio, a otro se aplica otro precio. Y muchas veces ese aumento es por medio de porcentuales, en lugar de aplicar un monto X de aumento, se lo aumenta por un porcentaje Y. Es por ello que indicamos que este módulo es una base.

Notas técnicas

Por una parte se agrega un nuevo menú con las líneas de contratos, ya que vamos a necesitar invocar un wizard para actualizar los precios. También agregamos una vista de búsqueda para hacer más facil la vida del usuario.

<record model="ir.ui.view" id="view_search_contract_line">  <!-- vistas busqueda -->
    <field name="name">view.search.contract.line</field>
    <field name="model">contract.line</field>
    <field name="arch" type="xml">
        <search>
            <field name="contract_id"/> 
            <field name="partner_id"/> 
            <field name="product_id"/> 
            <field name="price_unit"/
        </search>
    </field>
</record>
<record model="ir.ui.view" id="view_tree_contract_line">  <!-- vistas Tree-->
    <field name="name">view.tree.contract.line</field>
    <field name="model">contract.line</field>
    <field name="arch" type="xml">
        <tree>
            <field name="name"/> 
            <field name="contract_id"/> 
            <field name="partner_id"/> 
            <field name="product_id"/> 
            <field name="state"/> 
            <field name="quantity"/>
            <field name="price_unit"/>
        </tree>
    </field>
</record>
<record id="action_view_contract_lines" model="ir.actions.act_window">
    <field name="name">Lineas de contrato</field>
    <field name="res_model">contract.line</field>
    <field name="view_id" ref="view_tree_contract_line"></field>
</record>
<menuitem id="menu_contract_line" 
    name="Lineas de contrato"
    parent="account.menu_finance_receivables"
    sequence="115"
    action="action_view_contract_lines"/>

Por otra parte necesitamos definir la acción relacionada con la línea de contrato, para invocar el wizard. Eso lo hacemos actualizando el modelo act_window con el modelo de wizard a invocar y el modelo relacionado (en este caso contract.line) 

<record id="update_contracts_wizard_action" model="ir.actions.act_window">
    <field name="name">Actualizar contratos</field>
    <field name="res_model" >update.contracts.wizard</field>
    <field name="view_mode">form</field>
    <field name="binding_model_id" ref="contract.model_contract_line"></field>
    <field name="target">new</field>
    <field name="binding_view_types">list</field>
</record>

Por último, al confirmarse el wizard se recorren las líneas seleccionadas por medio del campo active_ids en el contexto, y filtrando dichas líneas seleccionadas por aquellos contratos que se encuentran en progreso:

def btn_confirm(self):
    active_ids = self.env.context.get('active_ids',[])
    for line in self.env['contract.line'].browse(active_ids).filtered(lambda l: l.state == 'in-progress'):
        line.price_unit = self.new_price
Acerca de:

Gustavo Orrillo

Passionate about programming, he has implemented Odoo for different types of businesses since 2010. In Moldeo Interactive he is a founding Partner and Programmer; In addition to writing on the Blog about different topics related to the developments he makes.