lunes, 23 de marzo de 2015

Validation Before Delete a Parent Account

Para que el sistema detenga al usuario que intenta eliminar una cuenta contable padre que contiene una o varias cuentas contables hijas, se debe primero crear un mensaje de error llamado "NoEliminarCtaPadre" en la pantalla "Mensaje" con el usuario System Administrator a como se muestra en la siguiente imagen:



















El siguiente paso es aplicar la validación copiando la clase original "MElementValue.java" del proyecto original "adempiere360lts" a nuestro proyecto personalizado "EmpresaCustomization" en el paquete "org.compiere.model", y agregar a esta clase el siguiente nuevo método:



...
    @Override
    protected boolean afterSave (boolean newRecord, boolean success)
    {
        ...

        return success;
    }    //    afterSave
   
    /**
     *     Executed before Delete operation.
     *    @return true if record can be deleted
     */
    @Override
    protected boolean beforeDelete ()
    {
        StringBuilder sql = new StringBuilder();
       
        sql.append("SELECT COALESCE((SELECT 1");
        sql.append(" FROM C_ElementValue ev");
        sql.append(" WHERE ev.AD_Client_ID = " + getAD_Client_ID());
        sql.append("     AND ev.IsSummary = 'Y'");
        sql.append("    AND EXISTS");
        sql.append("    (");
        sql.append("        SELECT");
        sql.append("            1");
        sql.append("        FROM AD_TreeNode tn");
        sql.append("        WHERE tn.AD_Client_ID = ev.AD_Client_ID");
        sql.append("            AND tn.AD_Tree_ID = ");
        sql.append("            (");
        sql.append("                SELECT");
        sql.append("                    t.AD_Tree_ID");
        sql.append("                FROM AD_Tree t");
        sql.append("                WHERE t.TreeType = 'EV'");
        sql.append("                    AND t.AD_Client_ID = ev.AD_Client_ID");
        sql.append("            )");
        sql.append("            AND tn.Parent_ID = ev.C_ElementValue_ID");
        sql.append("    )");
        sql.append("     AND ev.C_ElementValue_ID = " + this.getC_ElementValue_ID());
        sql.append("), 0);");
       
        // System.out.println(sql.toString());
       
        int k = DB.getSQLValue(null, sql.toString());
       
        if(k == 1)
        {
            // log.saveError("Error", Msg.getMsg(getCtx(), "No se puede eliminar esta cuenta porque tiene hijos"));
            throw new AdempiereException("@NoEliminarCtaPadre@");
        }
       
        return true;
    }     //    beforeDelete

   
    @Override
    protected boolean afterDelete (boolean success)
    {
        ...
        return success;
    }    //    afterDelete
...

Finalmente, aplicar el nuevo "customization.jar" al sistema ADempiere como se indica en este otro post.

Podemos observar como valida el sistema tanto en Escritorio como en web una vez aplicado el customization en el proyecto instalado, ver los resultados en la siguiente imagen:


"Porque Jehová da la sabiduría, y de su boca viene el conocimiento y la inteligencia." Proverbios 2:6




No hay comentarios:

Publicar un comentario