Consejos de programación: restricciones y excepciones
OpenERP ofrece un mecanismo estándar para añadir restricciones a los registros. Este mecanismo se utiliza, por ejemplo, en account.move.line para garantizar que no se utilice ninguna cuenta de tipo view en un apunte contable. A primera vista, esta funcionalidad parece útil, pero la experiencia demuestra que el mecanismo actual de restricciones presenta graves problemas de usabilidad.
El motivo es bastante sencillo. Si consideramos el ejemplo de account.move.line, puede ocurrir que el usuario rellene un extracto bancario muy extenso y, cuando termine, intente confirmarlo. Es en ese momento cuando se crean los asientos contables y, si solo uno de ellos utiliza una cuenta de tipo view, el usuario recibirá siempre el mismo mensaje: «No se puede crear un apunte contable en una cuenta de tipo vista». Perfecto. Pero ¿cuál de las 100 líneas del extracto es la incorrecta?
Algo parecido sucede cuando los desarrolladores no tienen en cuenta este problema al generar excepciones. Por ejemplo, si una de las 100 líneas del extracto bancario ya está conciliada, el usuario recibirá el informativo mensaje: Ya conciliado.
Estos aspectos son muy importantes en entornos de producción y hemos tenido que realizar varios cambios para mejorar las excepciones, especialmente en los módulos de contabilidad. Un mensaje sencillo como «El apunte contable %s, con un débito de %.2f y un crédito de %.2f, ya ha sido conciliado» resuelve el problema y puede evitar muchos quebraderos de cabeza a los usuarios de OpenERP.
Hay que tener en cuenta que, si el registro acaba de crearse, es posible que el usuario no pueda localizar el registro problemático, porque la reversión de la transacción puede eliminarlo. Por este motivo, siempre es recomendable proporcionar tanta información como sea posible.
Por otro lado, como los mensajes estándar de las restricciones no permiten incluir toda la información necesaria, lo mejor es utilizar el mecanismo de restricciones pero generar una excepción informativa desde la función de restricción, en lugar de dejar que OpenERP muestre al usuario el mensaje estándar.