/**
  * Devuelve la subcuenta asignada al proveedor para el ejercicio $eje,
  * si no hay una subcuenta asignada, intenta crearla.  Si falla devuelve FALSE.
  * @param type $eje
  * @return subcuenta
  */
 public function get_subcuenta($eje)
 {
     $subcuenta = FALSE;
     foreach ($this->get_subcuentas() as $s) {
         if ($s->codejercicio == $eje) {
             $subcuenta = $s;
             break;
         }
     }
     if (!$subcuenta) {
         /// intentamos crear la subcuenta y asociarla
         $continuar = TRUE;
         $cuenta = new cuenta();
         if ($this->acreedor) {
             $cpro = $cuenta->get_cuentaesp('ACREED', $eje);
             if (!$cpro) {
                 $cpro = $cuenta->get_by_codigo('410', $eje);
             }
         } else {
             $cpro = $cuenta->get_cuentaesp('PROVEE', $eje);
         }
         if ($cpro) {
             $subc0 = $cpro->new_subcuenta($this->codproveedor);
             $subc0->descripcion = $this->razonsocial;
             if (!$subc0->save()) {
                 $this->new_error_msg('Imposible crear la subcuenta para el proveedor ' . $this->codproveedor);
                 $continuar = FALSE;
             }
             if ($continuar) {
                 $scpro = new subcuenta_proveedor();
                 $scpro->codejercicio = $eje;
                 $scpro->codproveedor = $this->codproveedor;
                 $scpro->codsubcuenta = $subc0->codsubcuenta;
                 $scpro->idsubcuenta = $subc0->idsubcuenta;
                 if ($scpro->save()) {
                     $subcuenta = $subc0;
                 } else {
                     $this->new_error_msg('Imposible asociar la subcuenta para el proveedor ' . $this->codproveedor);
                 }
             }
         } else {
             $this->new_error_msg('No se encuentra ninguna cuenta especial para proveedores.');
         }
     }
     return $subcuenta;
 }
 protected function process()
 {
     $this->codejercicio = $this->empresa->codejercicio;
     $this->ejercicio = new ejercicio();
     $grupo0 = new grupo_epigrafes();
     $epi0 = new epigrafe();
     $this->super_epigrafes = array();
     /// ¿El usuario tiene permiso para eliminar en esta página?
     $this->allow_delete = $this->user->allow_delete_on(__CLASS__);
     if (isset($_POST['ngrupo'])) {
         $this->epigrafe = FALSE;
         $this->grupo = $grupo0->get_by_codigo($_GET['ngrupo'], $_POST['ejercicio']);
         if (!$this->grupo) {
             $this->grupo = new grupo_epigrafes();
             $this->grupo->codejercicio = $_POST['ejercicio'];
             $this->grupo->codgrupo = $_POST['ngrupo'];
             $this->grupo->descripcion = $_POST['descripcion'];
             if ($this->grupo->save()) {
                 header('Location: ' . $this->grupo->url());
             } else {
                 $this->new_error_msg('Error al guardar el grupo.');
                 $this->grupo = FALSE;
             }
         }
     } else {
         if (isset($_GET['grupo'])) {
             $this->epigrafe = FALSE;
             $this->grupo = $grupo0->get($_GET['grupo']);
             if ($this->grupo and isset($_POST['descripcion'])) {
                 $this->grupo->descripcion = $_POST['descripcion'];
                 if ($this->grupo->save()) {
                     $this->new_message('Grupo modificado correctamente.');
                 } else {
                     $this->new_error_msg('Error al modificar el grupo.');
                 }
             }
         } else {
             if (isset($_GET['deleteg'])) {
                 $grupo1 = $grupo0->get($_GET['deleteg']);
                 if ($grupo1) {
                     if ($grupo1->delete()) {
                         $this->new_message('Grupo eliminado correctamente.');
                     } else {
                         $this->new_error_msg('Error al eliminar el grupo.');
                     }
                 } else {
                     $this->new_error_msg('Grupo no encontrado.');
                 }
                 $this->grupo = FALSE;
                 $this->epigrafe = FALSE;
             } else {
                 if (isset($_POST['nepigrafe'])) {
                     $this->epigrafe = $epi0->get_by_codigo($_POST['nepigrafe'], $_POST['ejercicio']);
                     if (!$this->epigrafe) {
                         $this->epigrafe = new epigrafe();
                         $this->epigrafe->codejercicio = $_POST['ejercicio'];
                         $this->epigrafe->codepigrafe = $_POST['nepigrafe'];
                         if (isset($_POST['idpadre'])) {
                             $this->epigrafe->idpadre = $_POST['idpadre'];
                         } else {
                             $this->epigrafe->codgrupo = $_POST['codgrupo'];
                             $this->epigrafe->idgrupo = $_POST['idgrupo'];
                             $this->grupo = $grupo0->get($_POST['idgrupo']);
                         }
                         $this->epigrafe->descripcion = $_POST['descripcion'];
                         if ($this->epigrafe->save()) {
                             header('Location: ' . $this->epigrafe->url());
                         } else {
                             $this->new_error_msg('Error al guardar el epígrafe.');
                         }
                     }
                 } else {
                     if (isset($_GET['epi'])) {
                         $this->grupo = FALSE;
                         $this->epigrafe = $epi0->get($_GET['epi']);
                         if ($this->ejercicio and isset($_POST['descripcion'])) {
                             $this->epigrafe->descripcion = $_POST['descripcion'];
                             if ($this->epigrafe->save()) {
                                 $this->new_message('Epígrafe modificado correctamente.');
                             } else {
                                 $this->new_error_msg('Error al modificar el epígrafe.');
                             }
                         }
                     } else {
                         if (isset($_GET['deletee'])) {
                             $epi1 = $epi0->get($_GET['deletee']);
                             if ($epi1) {
                                 $this->grupo = $grupo0->get($epi1->idgrupo);
                                 if ($epi1->delete()) {
                                     $this->new_message('Epígrafe eliminado correctamente.');
                                 } else {
                                     $this->new_error_msg('Error al eliminar el epígrafe.');
                                 }
                             } else {
                                 $this->new_error_msg('Epígrafe no encontrado.');
                                 $this->grupo = FALSE;
                             }
                         } else {
                             if (isset($_POST['ncuenta'])) {
                                 $this->grupo = FALSE;
                                 $this->epigrafe = FALSE;
                                 $cuenta0 = new cuenta();
                                 $cuenta1 = $cuenta0->get_by_codigo($_POST['ncuenta'], $_POST['ejercicio']);
                                 if ($cuenta1) {
                                     header('Location: ' . $cuenta1->url());
                                 } else {
                                     $cuenta1 = new cuenta();
                                     $cuenta1->codcuenta = $_POST['ncuenta'];
                                     $cuenta1->codejercicio = $_POST['ejercicio'];
                                     $cuenta1->codepigrafe = $_POST['codepigrafe'];
                                     $cuenta1->descripcion = $_POST['descripcion'];
                                     $cuenta1->idepigrafe = $_POST['idepigrafe'];
                                     if ($cuenta1->save()) {
                                         header('Location: ' . $cuenta1->url());
                                     } else {
                                         $this->new_error_msg('Error al guardar la cuenta.');
                                     }
                                     $this->epigrafe = $epi0->get($_POST['idepigrafe']);
                                 }
                             } else {
                                 if (isset($_GET['deletec'])) {
                                     $this->grupo = FALSE;
                                     $this->epigrafe = FALSE;
                                     $cuenta0 = new cuenta();
                                     $cuenta1 = $cuenta0->get($_GET['deletec']);
                                     if ($cuenta1) {
                                         $this->epigrafe = $epi0->get($cuenta1->idepigrafe);
                                         if ($cuenta1->delete()) {
                                             $this->new_message('Cuenta eliminada correctamente.');
                                         } else {
                                             $this->new_error_msg('Error al eliminar la cuenta.');
                                         }
                                     } else {
                                         $this->new_error_msg('Cuenta no encontrada.');
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
         }
     }
     if ($this->grupo) {
         $this->ppage = $this->page->get($this->page->name);
         $this->page->title = 'Grupo: ' . $this->grupo->codgrupo;
         $this->resultados = $this->grupo->get_epigrafes();
     } else {
         if ($this->epigrafe) {
             /// configuramos la página previa
             $this->ppage = $this->page->get($this->page->name);
             if (!is_null($this->epigrafe->idgrupo)) {
                 $this->ppage->title = 'Grupo: ' . $this->epigrafe->codgrupo;
                 $this->ppage->extra_url = '&grupo=' . $this->epigrafe->idgrupo;
             } else {
                 if (!is_null($this->epigrafe->idpadre)) {
                     $this->ppage->title = 'Padre';
                     $this->ppage->extra_url = '&epi=' . $this->epigrafe->idpadre;
                 }
             }
             $this->page->title = 'Epigrafe: ' . $this->epigrafe->codepigrafe;
             $this->resultados = $this->epigrafe->get_cuentas();
         } else {
             if (isset($_POST['ejercicio'])) {
                 $this->codejercicio = $_POST['ejercicio'];
                 $this->grupo = FALSE;
                 $this->epigrafe = FALSE;
                 $this->resultados = $grupo0->all_from_ejercicio($this->codejercicio);
                 $this->super_epigrafes = $epi0->super_from_ejercicio($this->codejercicio);
             } else {
                 $this->grupo = FALSE;
                 $this->epigrafe = FALSE;
                 $this->resultados = $grupo0->all_from_ejercicio($this->empresa->codejercicio);
                 $this->super_epigrafes = $epi0->super_from_ejercicio($this->empresa->codejercicio);
             }
         }
     }
 }
 private function cerrar_ejercicio()
 {
     $this->new_message('Cerrando ejercicio...');
     $asiento = new asiento();
     $continuar = TRUE;
     if (isset($this->ejercicio->idasientopyg)) {
         $aspyg = $asiento->get($this->ejercicio->idasientopyg);
         if ($aspyg) {
             if (!$aspyg->delete()) {
                 $this->new_error_msg('Imposible eliminar el asiento de pérdidas y ganancias.');
                 $continuar = FALSE;
             }
         } else {
             $this->ejercicio->save();
         }
         /// al guardar ya comprueba los asientos especiales
     }
     if (isset($this->ejercicio->idasientocierre)) {
         $asc = $asiento->get($this->ejercicio->idasientocierre);
         if ($asc) {
             if (!$asc->delete()) {
                 $this->new_error_msg('Imposible eliminar el asiento de cierre.');
                 $continuar = FALSE;
             }
         } else {
             $this->ejercicio->save();
         }
         /// al guardar ya comprueba los asientos especiales
     }
     $siguiente_ejercicio = $this->ejercicio->get_by_fecha(Date('d-m-Y', strtotime($this->ejercicio->fechafin) + 24 * 3600));
     if (isset($siguiente_ejercicio->idasientoapertura)) {
         $asap = $asiento->get($siguiente_ejercicio->idasientoapertura);
         if ($asap) {
             if (!$asap->delete()) {
                 $this->new_error_msg('Imposible eliminar el asiento de apertura.');
                 $continuar = FALSE;
             }
         } else {
             $this->ejercicio->save();
         }
         /// al guardar ya comprueba los asientos especiales
     }
     if ($continuar) {
         $asiento_pyg = new asiento();
         $asiento_pyg->codejercicio = $this->ejercicio->codejercicio;
         $asiento_pyg->concepto = 'Regularización ejercicio ' . $this->ejercicio->nombre;
         $asiento_pyg->editable = FALSE;
         $asiento_pyg->fecha = $this->ejercicio->fechafin;
         if (!$asiento_pyg->save()) {
             $continuar = FALSE;
         }
     }
     if ($continuar) {
         $asiento_cierre = new asiento();
         $asiento_cierre->codejercicio = $this->ejercicio->codejercicio;
         $asiento_cierre->concepto = 'Asiento de cierre del ejercicio ' . $this->ejercicio->nombre;
         $asiento_cierre->editable = FALSE;
         $asiento_cierre->fecha = $this->ejercicio->fechafin;
         if (!$asiento_cierre->save()) {
             $continuar = FALSE;
         }
     }
     if ($continuar) {
         $asiento_apertura = new asiento();
         $asiento_apertura->codejercicio = $siguiente_ejercicio->codejercicio;
         $asiento_apertura->concepto = 'Asiento de apertura del ejercicio ' . $siguiente_ejercicio->nombre;
         $asiento_apertura->editable = FALSE;
         $asiento_apertura->fecha = $siguiente_ejercicio->fechainicio;
         if (!$asiento_apertura->save()) {
             $continuar = FALSE;
         }
     }
     if ($continuar) {
         /// actualizamos los saldos de las subcuentas:
         $subcuenta = new subcuenta();
         foreach ($subcuenta->all_from_ejercicio($this->ejercicio->codejercicio) as $sc) {
             $sc->save();
         }
         /*
          * Abonamos y cargamos los saldos de las cuentas de los grupos 6 y 7,
          * la diferencia la enviamos a la cuenta 129.
          */
         $diferencia = 0;
         foreach ($subcuenta->all_from_ejercicio($this->ejercicio->codejercicio) as $sc) {
             if (in_array(substr($sc->codcuenta, 0, 1), array('6', '7')) and $sc->tiene_saldo()) {
                 $ppyg = new partida();
                 $ppyg->idasiento = $asiento_pyg->idasiento;
                 $ppyg->concepto = $asiento_pyg->concepto;
                 $ppyg->idsubcuenta = $sc->idsubcuenta;
                 $ppyg->codsubcuenta = $sc->codsubcuenta;
                 if ($sc->saldo < 0) {
                     $ppyg->debe = abs($sc->saldo);
                 } else {
                     $ppyg->haber = $sc->saldo;
                 }
                 $diferencia += $ppyg->debe - $ppyg->haber;
                 $ppyg->coddivisa = $sc->coddivisa;
                 if (!$ppyg->save()) {
                     $continuar = FALSE;
                 }
             }
         }
         $cuenta = new cuenta();
         $cuenta_pyg = $cuenta->get_by_codigo('129', $this->ejercicio->codejercicio);
         if ($cuenta_pyg) {
             $subcuenta_pyg = FALSE;
             foreach ($cuenta_pyg->get_subcuentas() as $sc) {
                 $subcuenta_pyg = $sc;
                 break;
             }
             if ($subcuenta_pyg) {
                 $ppyg = new partida();
                 $ppyg->idasiento = $asiento_pyg->idasiento;
                 $ppyg->concepto = $asiento_pyg->concepto;
                 $ppyg->idsubcuenta = $subcuenta_pyg->idsubcuenta;
                 $ppyg->codsubcuenta = $subcuenta_pyg->codsubcuenta;
                 $ppyg->haber = $diferencia;
                 $ppyg->coddivisa = $sc->coddivisa;
                 if (!$ppyg->save()) {
                     $continuar = FALSE;
                 }
             } else {
                 $this->new_error_msg('No se encuentra una subcuenta para la cuenta 129.');
                 $continuar = FALSE;
             }
         } else {
             $this->new_error_msg('No se encuentra la cuenta 129.');
             $continuar = FALSE;
         }
         /*
          * Generamos los asientos de cierre y apertura
          */
         foreach ($subcuenta->all_from_ejercicio($this->ejercicio->codejercicio) as $sc) {
             if ($sc->tiene_saldo()) {
                 $pac = new partida();
                 $pac->idasiento = $asiento_cierre->idasiento;
                 $pac->concepto = $asiento_cierre->concepto;
                 $pac->idsubcuenta = $sc->idsubcuenta;
                 $pac->codsubcuenta = $sc->codsubcuenta;
                 if ($sc->saldo < 0) {
                     $pac->debe = abs($sc->saldo);
                 } else {
                     $pac->haber = $sc->saldo;
                 }
                 $pac->coddivisa = $sc->coddivisa;
                 if (!$pac->save()) {
                     $continuar = FALSE;
                 }
                 if ($sc->codcuenta == '129') {
                     $nsc = $subcuenta->get_by_codigo('1200000000', $siguiente_ejercicio->codejercicio, TRUE);
                 } else {
                     $nsc = $subcuenta->get_by_codigo($sc->codsubcuenta, $siguiente_ejercicio->codejercicio, TRUE);
                 }
                 if ($nsc) {
                     $paa = new partida();
                     $paa->idasiento = $asiento_apertura->idasiento;
                     $paa->concepto = $asiento_apertura->concepto;
                     $paa->idsubcuenta = $nsc->idsubcuenta;
                     $paa->codsubcuenta = $nsc->codsubcuenta;
                     if ($sc->saldo > 0) {
                         $paa->debe = round($sc->saldo, FS_NF0);
                     } else {
                         $paa->haber = round(abs($sc->saldo), FS_NF0);
                     }
                     $paa->coddivisa = $nsc->coddivisa;
                     if (!$paa->save()) {
                         $continuar = FALSE;
                     }
                 } else {
                     $continuar = FALSE;
                 }
             }
         }
         /// comprobamos los nuevos asientos
         $total = 0;
         foreach ($asiento_pyg->get_partidas() as $part) {
             $total += $part->debe - $part->haber;
         }
         if (abs($total) >= 0.01) {
             $continuar = FALSE;
             $this->new_error_msg('Asiento de pérdidas y ganancias descuadrado.');
         }
         $total = 0;
         foreach ($asiento_cierre->get_partidas() as $part) {
             $total += $part->debe - $part->haber;
         }
         if (abs($total) >= 0.01) {
             $continuar = FALSE;
             $this->new_error_msg('Asiento de cierre descuadrado.');
         }
         $total = 0;
         foreach ($asiento_apertura->get_partidas() as $part) {
             $total += $part->debe - $part->haber;
         }
         if (abs($total) >= 0.01) {
             $subcuenta_redondeo = $subcuenta->get_by_codigo('6780000000', $asiento_apertura->codejercicio);
             if ($subcuenta) {
                 $npaa = new partida();
                 $npaa->idasiento = $asiento_apertura->idasiento;
                 $npaa->concepto = $asiento_apertura->concepto;
                 $npaa->idsubcuenta = $subcuenta_redondeo->idsubcuenta;
                 $npaa->codsubcuenta = $subcuenta_redondeo->codsubcuenta;
                 $npaa->coddivisa = $subcuenta_redondeo->coddivisa;
                 if ($total > 0) {
                     $npaa->haber = $total;
                 } else {
                     $npaa->debe = $total;
                 }
                 $npaa->save();
             } else {
                 $continuar = FALSE;
                 $this->new_error_msg('Asiento de apertura descuadrado.');
             }
         }
         /// cerramos el ejercicio
         if ($continuar) {
             $this->ejercicio->estado = 'CERRADO';
             $this->ejercicio->idasientopyg = $asiento_pyg->idasiento;
             $this->ejercicio->idasientocierre = $asiento_cierre->idasiento;
             if ($this->ejercicio->save()) {
                 $this->new_message('Ejercicio cerrado correctamente.');
             } else {
                 $this->new_error_msg('Error al cerrar el ejercicio.');
             }
             $siguiente_ejercicio->idasientoapertura = $asiento_apertura->idasiento;
             if (!$siguiente_ejercicio->save()) {
                 $this->new_error_msg('Error al modificar el siguiente ejercicio.');
             }
         } else {
             $this->new_error_msg('Error al generar los asientos.');
             if ($asiento_pyg->delete()) {
                 $this->new_message('Asiento de pérdidas y ganancias eliminado.');
             } else {
                 $this->new_error_msg('Imposible eliminar el asiento de pérdidas y ganancias.');
             }
             if ($asiento_cierre->delete()) {
                 $this->new_message('Asiento de cierre eliminado.');
             } else {
                 $this->new_error_msg('Imposible eliminar el asiento de cierre.');
             }
             if ($asiento_apertura->delete()) {
                 $this->new_message('Asiento de apertura eliminado.');
             } else {
                 $this->new_error_msg('Imposible eliminar el asiento de apertura.');
             }
         }
     }
 }
 public function get_by_codigo($cod, $codejercicio, $crear = FALSE)
 {
     $sql = "SELECT * FROM " . $this->table_name . " WHERE codsubcuenta = " . $this->var2str($cod) . " AND codejercicio = " . $this->var2str($codejercicio) . ";";
     $subc = $this->db->select($sql);
     if ($subc) {
         return new \subcuenta($subc[0]);
     } else {
         if ($crear) {
             /// buscamos la subcuenta equivalente en otro ejercicio
             $subc = $this->db->select("SELECT * FROM " . $this->table_name . " WHERE codsubcuenta = " . $this->var2str($cod) . ";");
             if ($subc) {
                 $old_sc = new \subcuenta($subc[0]);
                 /// buscamos la cuenta equivalente es ESTE ejercicio
                 $cuenta = new \cuenta();
                 $new_c = $cuenta->get_by_codigo($old_sc->codcuenta, $codejercicio);
                 if ($new_c) {
                     $new_sc = new \subcuenta();
                     $new_sc->codcuenta = $new_c->codcuenta;
                     $new_sc->coddivisa = $old_sc->coddivisa;
                     $new_sc->codejercicio = $codejercicio;
                     $new_sc->codimpuesto = $old_sc->codimpuesto;
                     $new_sc->codsubcuenta = $old_sc->codsubcuenta;
                     $new_sc->descripcion = $old_sc->descripcion;
                     $new_sc->idcuenta = $new_c->idcuenta;
                     $new_sc->iva = $old_sc->iva;
                     $new_sc->recargo = $old_sc->recargo;
                     if ($new_sc->save()) {
                         return $new_sc;
                     } else {
                         return FALSE;
                     }
                 } else {
                     $this->new_error_msg('No se ha encontrado la cuenta equivalente a ' . $old_sc->codcuenta . ' en el ejercicio ' . $codejercicio . ' <a href="index.php?page=contabilidad_ejercicio&cod=' . $codejercicio . '">¿Has importado el plan contable?</a>');
                     return FALSE;
                 }
             } else {
                 $this->new_error_msg('No se ha encontrado ninguna subcuenta equivalente a ' . $cod . ' para copiar.');
                 return FALSE;
             }
         } else {
             return FALSE;
         }
     }
 }
 public function get_by_codigo($cod, $ejercicio, $crear = FALSE)
 {
     $subc = $this->db->select("SELECT * FROM " . $this->table_name . " WHERE codsubcuenta = " . $this->var2str($cod) . " AND codejercicio = " . $this->var2str($ejercicio) . ";");
     if ($subc) {
         return new subcuenta($subc[0]);
     } else {
         if ($crear) {
             /// buscamos la subcuenta equivalente en otro ejercicio
             $subc = $this->db->select("SELECT * FROM " . $this->table_name . " WHERE codsubcuenta = " . $this->var2str($cod) . ";");
             if ($subc) {
                 $old_sc = new subcuenta($subc[0]);
                 /// buscamos la cuenta equivalente es ESTE ejercicio
                 $cuenta = new cuenta();
                 $new_c = $cuenta->get_by_codigo($old_sc->codcuenta, $ejercicio);
                 if ($new_c) {
                     $new_sc = new subcuenta();
                     $new_sc->codcuenta = $new_c->codcuenta;
                     $new_sc->coddivisa = $old_sc->coddivisa;
                     $new_sc->codejercicio = $ejercicio;
                     $new_sc->codimpuesto = $old_sc->codimpuesto;
                     $new_sc->codsubcuenta = $old_sc->codsubcuenta;
                     $new_sc->descripcion = $old_sc->descripcion;
                     $new_sc->idcuenta = $new_c->idcuenta;
                     $new_sc->iva = $old_sc->iva;
                     $new_sc->alias = $old_alias->alias;
                     $new_sc->recargo = $old_sc->recargo;
                     if ($new_sc->save()) {
                         return $new_sc;
                     } else {
                         return FALSE;
                     }
                 } else {
                     $this->new_error_msg('No se ha encontrado la cuenta equivalente a ' . $old_sc->codcuenta . ' en el ejercicio ' . $ejercicio . '.');
                     return FALSE;
                 }
             } else {
                 $this->new_error_msg('No se ha encontrado ninguna subcuenta equivalente a ' . $cod . ' para copiar.');
                 return FALSE;
             }
         } else {
             return FALSE;
         }
     }
 }
 /**
  * Función auxiliar para generar el balance de sumas y saldos de un ejercicio y unas fechas concretas.
  * Este informe muestra los saldos (distintos de cero) de cada cuenta y subcuenta
  * por periodos, pero siempre excluyendo los asientos de cierre y pérdidas y ganancias.
  */
 public function sumas_y_saldos(&$pdf_doc, &$eje, $titulo, $fechaini, $fechafin, $excluir = FALSE, $np = TRUE)
 {
     $ge0 = new grupo_epigrafes();
     $epi0 = new epigrafe();
     $cuenta0 = new cuenta();
     $subcuenta0 = new subcuenta();
     $lineas = array();
     $sql = "SELECT p.codsubcuenta, SUM(p.debe) as debe, SUM(p.haber) as haber" . " FROM co_partidas p, co_asientos a WHERE p.idasiento = a.idasiento" . " AND a.codejercicio = " . $this->empresa->var2str($eje->codejercicio) . " AND a.fecha >= " . $this->empresa->var2str($fechaini) . " AND fecha <= " . $this->empresa->var2str($fechafin);
     if ($excluir) {
         foreach ($excluir as $exc) {
             $sql .= " AND p.idasiento != " . $this->empresa->var2str($exc);
         }
     }
     $sql .= " GROUP BY p.codsubcuenta ORDER BY codsubcuenta ASC;";
     $data = $this->db->select($sql);
     if ($data) {
         $grupos = $ge0->all_from_ejercicio($eje->codejercicio);
         $epigrafes = $epi0->all_from_ejercicio($eje->codejercicio);
         for ($i = 1; $i < 10; $i++) {
             $debe = 0;
             $haber = 0;
             foreach ($data as $d) {
                 if (substr($d['codsubcuenta'], 0, 1) == (string) $i) {
                     $debe += floatval($d['debe']);
                     $haber += floatval($d['haber']);
                 }
             }
             /// añadimos el grupo
             foreach ($grupos as $ge) {
                 if ($ge->codgrupo == $i) {
                     $lineas[] = array('cuenta' => $i, 'descripcion' => $ge->descripcion, 'debe' => $debe, 'haber' => $haber);
                     break;
                 }
             }
             for ($j = 0; $j < 10; $j++) {
                 $debe = 0;
                 $haber = 0;
                 foreach ($data as $d) {
                     if (substr($d['codsubcuenta'], 0, 2) == (string) $i . $j) {
                         $debe += floatval($d['debe']);
                         $haber += floatval($d['haber']);
                     }
                 }
                 /// añadimos el epígrafe
                 foreach ($epigrafes as $ep) {
                     if ($ep->codepigrafe == (string) $i . $j) {
                         $lineas[] = array('cuenta' => $i . $j, 'descripcion' => $ep->descripcion, 'debe' => $debe, 'haber' => $haber);
                         break;
                     }
                 }
                 for ($k = 0; $k < 10; $k++) {
                     $debe = 0;
                     $haber = 0;
                     foreach ($data as $d) {
                         if (substr($d['codsubcuenta'], 0, 3) == (string) $i . $j . $k) {
                             $debe += floatval($d['debe']);
                             $haber += floatval($d['haber']);
                         }
                     }
                     /// añadimos la cuenta
                     if ($debe != 0 or $haber != 0) {
                         $cuenta = $cuenta0->get_by_codigo($i . $j . $k, $eje->codejercicio);
                         if ($cuenta) {
                             $lineas[] = array('cuenta' => $i . $j . $k, 'descripcion' => $cuenta->descripcion, 'debe' => $debe, 'haber' => $haber);
                         } else {
                             $lineas[] = array('cuenta' => $i . $j . $k, 'descripcion' => '-', 'debe' => $debe, 'haber' => $haber);
                         }
                     }
                     /// añadimos las subcuentas
                     foreach ($data as $d) {
                         if (substr($d['codsubcuenta'], 0, 3) == (string) $i . $j . $k) {
                             $desc = '';
                             $subc = $subcuenta0->get_by_codigo($d['codsubcuenta'], $eje->codejercicio);
                             if ($subc) {
                                 $desc = $subc->descripcion;
                             }
                             $lineas[] = array('cuenta' => $d['codsubcuenta'], 'descripcion' => $desc, 'debe' => floatval($d['debe']), 'haber' => floatval($d['haber']));
                         }
                     }
                 }
             }
         }
     }
     /// a partir de la lista generamos el documento
     $linea = 0;
     $tdebe = 0;
     $thaber = 0;
     while ($linea < count($lineas)) {
         if ($linea > 0) {
             $pdf_doc->pdf->ezNewPage();
         }
         $pdf_doc->pdf->ezText($this->empresa->nombre . " - Balance de sumas y saldos " . $eje->year() . ' ' . $titulo . ".\n\n", 12);
         /// Creamos la tabla con las lineas
         $pdf_doc->new_table();
         $pdf_doc->add_table_header(array('cuenta' => '<b>Cuenta</b>', 'descripcion' => '<b>Descripción</b>', 'debe' => '<b>Debe</b>', 'haber' => '<b>Haber</b>', 'saldo' => '<b>Saldo</b>'));
         for ($i = $linea; $i < min(array($linea + 48, count($lineas))); $i++) {
             if (strlen($lineas[$i]['cuenta']) == 1) {
                 $a = '<b>';
                 $b = '</b>';
                 $tdebe += $lineas[$i]['debe'];
                 $thaber += $lineas[$i]['haber'];
             } else {
                 if (strlen($lineas[$i]['cuenta']) == 2) {
                     $a = $b = '';
                 } else {
                     $a = '<i>';
                     $b = '</i>';
                 }
             }
             $pdf_doc->add_table_row(array('cuenta' => $a . $lineas[$i]['cuenta'] . $b, 'descripcion' => $a . substr($lineas[$i]['descripcion'], 0, 50) . $b, 'debe' => $a . $this->show_numero($lineas[$i]['debe']) . $b, 'haber' => $a . $this->show_numero($lineas[$i]['haber']) . $b, 'saldo' => $a . $this->show_numero(floatval($lineas[$i]['debe']) - floatval($lineas[$i]['haber'])) . $b));
         }
         $linea += 48;
         /// añadimos las sumas de la línea actual
         $desc = 'Suma y sigue';
         if ($linea >= count($lineas)) {
             $desc = 'Totales';
         }
         $pdf_doc->add_table_row(array('cuenta' => '', 'descripcion' => '<b>' . $desc . '</b>', 'debe' => '<b>' . $this->show_numero($tdebe) . '</b>', 'haber' => '<b>' . $this->show_numero($thaber) . '</b>', 'saldo' => '<b>' . $this->show_numero($tdebe - $thaber) . '</b>'));
         $pdf_doc->save_table(array('fontSize' => 9, 'cols' => array('debe' => array('justification' => 'right'), 'haber' => array('justification' => 'right'), 'saldo' => array('justification' => 'right')), 'width' => 540, 'shaded' => 0));
     }
 }