/**
  *
  *Genera una nueva cuenta contable en el sistema
  *
  * @param abonos_aumentan bool si abonos aumentan es igual a 1 significa que en los movimientos los abonos aumentantaran
  * @param cargos_aumentan bool Si es igual 1 significa que en los movimientos cuando se cargue a esta cuenta los cargos aumentaran
  * @param clasificacion enum `Activo Circulante`,`Activo Fijo`,`Activo Diferido`,`Pasivo Circulante`,`Pasivo Largo Plazo`,`Capital Contable`,`Ingresos`,`Egresos`
  * @param es_cuenta_mayor bool Indica si la cuenta es de mayor
  * @param es_cuenta_orden bool si la cuenta no se contemplara en los estados financieros
  * @param naturaleza enum `Acreedora`,`Deudora`
  * @param nombre_cuenta string El nombre de la cuenta
  * @param tipo_cuenta enum `Balance`,`Estado de Resultados`
  * @param id_cuenta_padre int id de la cuenta de la que depende
  **/
 public static function NuevaCuenta($abonos_aumentan, $cargos_aumentan, $clasificacion, $es_cuenta_mayor, $es_cuenta_orden, $id_catalogo_cuentas, $naturaleza, $nombre_cuenta, $tipo_cuenta, $id_cuenta_padre = "")
 {
     if ($es_cuenta_orden == 1 && $es_cuenta_mayor == 1) {
         throw new BusinessLogicException("Una cuenta de Mayor no puede ser de Orden");
     }
     if ($tipo_cuenta == "Balance" && $naturaleza == "Deudora" && ($clasificacion != "Activo Circulante" && $clasificacion != "Activo Fijo" && $clasificacion != "Activo Diferido")) {
         throw new BusinessLogicException("Clasificacion incorrecta para la cuenta de tipo Balance y Naturaleza Deudora");
     }
     if ($tipo_cuenta == "Balance" && $naturaleza == "Acreedora" && ($clasificacion != "Pasivo Circulante" && $clasificacion != "Pasivo Largo Plazo" && $clasificacion != "Capital Contable")) {
         throw new BusinessLogicException("Clasificacion incorrecta para la cuenta de tipo Balance y Naturaleza Acreedora");
     }
     if ($tipo_cuenta == "Estado de Resultados" && $naturaleza == "Acreedora" && $clasificacion != "Ingresos") {
         throw new BusinessLogicException("Clasificacion incorrecta para la cuenta de tipo Estado de Resultados y Naturaleza Acreedora");
     }
     if ($tipo_cuenta == "Estado de Resultados" && $naturaleza == "Deudora" && $clasificacion != "Egresos") {
         throw new BusinessLogicException("Clasificacion incorrecta para la cuenta de tipo Estado de Resultados y Naturaleza Deudora");
     }
     $cuenta_buscar = new CuentaContable();
     $cuenta_buscar->setNombreCuenta($nombre_cuenta);
     $cuenta_buscar->setIdCatalogoCuentas($id_catalogo_cuentas);
     $cc2 = CuentaContableDAO::search($cuenta_buscar);
     if (count($cc2) > 0) {
         Logger::log("!!!!!!Ya existe una cuenta con el nombre " . $nombre_cuenta);
         throw new BusinessLogicException(" Ya existe una cuenta con el nombre " . $nombre_cuenta);
     }
     $clave = self::NuevaClaveCuentaContable($id_catalogo_cuentas, $id_cuenta_padre, $clasificacion);
     $nivel = 1;
     $consecutivo = 1;
     if ($id_cuenta_padre != "") {
         $detalle_c = CuentaContableDAO::getByPK($id_cuenta_padre);
         if (is_null($detalle_c)) {
             throw new BusinessLogicException("La cuenta con id " . $id_cuenta_padre . " no existe");
         }
         $nivel = $detalle_c->getNivel() + 1;
         $subcuentas = self::BuscarCuenta($id_catalogo_cuentas, "", "", "", "", "", "", "", $id_cuenta_padre, "", "", "", "");
         if (count($subcuentas["resultados"]) > 0) {
             $consecutivo = $subcuentas["resultados"][count($subcuentas["resultados"]) - 1]->getConsecutivoEnNivel() + 1;
         }
     } else {
         $cuentas_clasifi = self::BuscarCuenta($id_catalogo_cuentas, "", $clasificacion, "", "", "", "", "", "", "", $nivel = 1, "", "");
         if (count($cuentas_clasifi["resultados"]) > 0) {
             $consecutivo = $cuentas_clasifi["resultados"][count($cuentas_clasifi["resultados"]) - 1]->getConsecutivoEnNivel() + 1;
         }
     }
     if ($nivel == 1 && $id_cuenta_padre != "") {
         throw new BusinessLogicException("Las cuentas de Nivel 1 no deben tener cuentas padre");
     }
     $nueva_cuenta = new CuentaContable();
     $nueva_cuenta->setClave($clave);
     $nueva_cuenta->setNivel($nivel);
     $nueva_cuenta->setConsecutivoEnNivel($consecutivo);
     $nueva_cuenta->setNombreCuenta($nombre_cuenta);
     $nueva_cuenta->setTipoCuenta($tipo_cuenta);
     $nueva_cuenta->setNaturaleza($naturaleza);
     $nueva_cuenta->setClasificacion($clasificacion);
     $nueva_cuenta->setAfectable(1);
     $nueva_cuenta->setActiva(1);
     $nueva_cuenta->setAbonosAumentan($abonos_aumentan);
     $nueva_cuenta->setCargosAumentan($cargos_aumentan);
     if ($tipo_cuenta == "Estado de Resultados" && $naturaleza == "Acreedora") {
         $nueva_cuenta->setAbonosAumentan(1);
         $nueva_cuenta->setCargosAumentan(0);
     }
     if ($tipo_cuenta == "Estado de Resultados" && $naturaleza == "Deudora") {
         $nueva_cuenta->setAbonosAumentan(0);
         $nueva_cuenta->setCargosAumentan(1);
     }
     if ($tipo_cuenta == "Balance" && $naturaleza == "Acreedora") {
         $nueva_cuenta->setAbonosAumentan(1);
         $nueva_cuenta->setCargosAumentan(0);
     }
     if ($tipo_cuenta == "Balance" && $naturaleza == "Deudora") {
         $nueva_cuenta->setAbonosAumentan(0);
         $nueva_cuenta->setCargosAumentan(1);
     }
     $nueva_cuenta->setEsCuentaOrden($es_cuenta_orden);
     $nueva_cuenta->setEsCuentaMayor($es_cuenta_mayor);
     if ($id_cuenta_padre != "") {
         $nueva_cuenta->setIdCuentaPadre($id_cuenta_padre);
     }
     $nueva_cuenta->setIdCatalogoCuentas($id_catalogo_cuentas);
     DAO::transBegin();
     try {
         CuentaContableDAO::save($nueva_cuenta);
         if ($id_cuenta_padre != "") {
             $cuenta_padre_afec = CuentaContableDAO::getByPK($id_cuenta_padre);
             if ($cuenta_padre_afec->getAfectable() == true) {
                 $cuenta_padre_afec->setAfectable(false);
                 CuentaContableDAO::save($cuenta_padre_afec);
             }
         }
     } catch (Exception $e) {
         DAO::transRollback();
         Logger::error("Desde Controller) No se ha podido guardar la nueva cuenta: " . $e);
         if ($e->getCode() == 901) {
             throw new Exception("No se ha podido guardar la nueva cuenta|: " . $e->getMessage(), 901);
         }
         throw new Exception("No se ha podido guardar la nueva cuenta", 901);
     }
     DAO::transEnd();
     return array("status" => "ok", "id_cuenta_contable" => $nueva_cuenta->getIdCuentaContable());
 }