private function guardar_regiva()
 {
     $asiento = new asiento();
     $ejercicio = new ejercicio();
     $subcuenta = new subcuenta();
     $eje0 = $ejercicio->get_by_fecha($_POST['desde'], TRUE);
     if ($eje0) {
         $continuar = TRUE;
         $saldo = 0;
         /// guardamos el asiento
         $asiento->codejercicio = $eje0->codejercicio;
         $asiento->concepto = 'REGULARIZACIÓN IVA ' . $_POST['periodo'];
         $asiento->fecha = $_POST['hasta'];
         $asiento->editable = FALSE;
         if (!$asiento->save()) {
             $this->new_error_msg('Imposible guardar el asiento.');
             $continuar = FALSE;
         }
         /// obtenemos el IVA soportado
         $scta_ivasop = $subcuenta->get_cuentaesp('IVASOP', $eje0->codejercicio);
         if ($scta_ivasop) {
             $par0 = new partida();
             $par0->idasiento = $asiento->idasiento;
             $par0->concepto = $asiento->concepto;
             $par0->coddivisa = $scta_ivasop->coddivisa;
             $par0->tasaconv = $scta_ivasop->tasaconv();
             $par0->codsubcuenta = $scta_ivasop->codsubcuenta;
             $par0->idsubcuenta = $scta_ivasop->idsubcuenta;
             $tot_sop = $par0->totales_from_subcuenta_fechas($scta_ivasop->idsubcuenta, $_POST['desde'], $_POST['hasta']);
             /// invertimos el debe y el haber
             $par0->debe = $tot_sop['haber'];
             $par0->haber = $tot_sop['debe'];
             $saldo += $tot_sop['haber'] - $tot_sop['debe'];
             if (!$par0->save()) {
                 $this->new_error_msg('Error al guardar la partida de la subcuenta de IVA soportado.');
                 $continuar = FALSE;
             }
         } else {
             $this->new_error_msg('Subcuenta de IVA soportado no encontrada.');
             $continuar = FALSE;
         }
         /// obtenemos el IVA repercutido
         $scta_ivarep = $subcuenta->get_cuentaesp('IVAREP', $eje0->codejercicio);
         if ($scta_ivarep) {
             $par1 = new partida();
             $par1->idasiento = $asiento->idasiento;
             $par1->concepto = $asiento->concepto;
             $par1->coddivisa = $scta_ivarep->coddivisa;
             $par1->tasaconv = $scta_ivarep->tasaconv();
             $par1->codsubcuenta = $scta_ivarep->codsubcuenta;
             $par1->idsubcuenta = $scta_ivarep->idsubcuenta;
             $tot_rep = $par1->totales_from_subcuenta_fechas($scta_ivarep->idsubcuenta, $_POST['desde'], $_POST['hasta']);
             /// invertimos el debe y el haber
             $par1->debe = $tot_rep['haber'];
             $par1->haber = $tot_rep['debe'];
             $saldo += $tot_rep['haber'] - $tot_rep['debe'];
             if (!$par1->save()) {
                 $this->new_error_msg('Error al guardar la partida de la subcuenta de IVA repercutido.');
                 $continuar = FALSE;
             }
         } else {
             $this->new_error_msg('Subcuenta de IVA repercutido no encontrada.');
             $continuar = FALSE;
         }
         if ($continuar) {
             if ($saldo > 0) {
                 $scta_ivaacr = $subcuenta->get_cuentaesp('IVAACR', $eje0->codejercicio);
                 if ($scta_ivaacr) {
                     $par2 = new partida();
                     $par2->idasiento = $asiento->idasiento;
                     $par2->concepto = $asiento->concepto;
                     $par2->coddivisa = $scta_ivaacr->coddivisa;
                     $par2->tasaconv = $scta_ivaacr->tasaconv();
                     $par2->codsubcuenta = $scta_ivaacr->codsubcuenta;
                     $par2->idsubcuenta = $scta_ivaacr->idsubcuenta;
                     $par2->debe = 0;
                     $par2->haber = $saldo;
                     if (!$par2->save()) {
                         $this->new_error_msg('Error al guardar la partida de la subcuenta de acreedor por IVA.');
                         $continuar = FALSE;
                     }
                 } else {
                     $this->new_error_msg('No se encuentra la subcuenta acreedora por IVA.');
                 }
             } else {
                 if ($saldo < 0) {
                     $scta_ivadeu = $subcuenta->get_cuentaesp('IVADEU', $eje0->codejercicio);
                     if ($scta_ivadeu) {
                         $par2 = new partida();
                         $par2->idasiento = $asiento->idasiento;
                         $par2->concepto = $asiento->concepto;
                         $par2->coddivisa = $scta_ivadeu->coddivisa;
                         $par2->tasaconv = $scta_ivadeu->tasaconv();
                         $par2->codsubcuenta = $scta_ivadeu->codsubcuenta;
                         $par2->idsubcuenta = $scta_ivadeu->idsubcuenta;
                         $par2->debe = abs($saldo);
                         $par2->haber = 0;
                         if (!$par2->save()) {
                             $this->new_error_msg('Error al guardar la partida de la subcuenta deudora por IVA.');
                             $continuar = FALSE;
                         }
                     } else {
                         $this->new_error_msg('No se encuentra la subcuenta deudora por IVA.');
                     }
                 }
             }
         } else {
             $this->new_error_msg('Error al leer las subcuentas.');
         }
         if ($continuar) {
             $this->regiva = new regularizacion_iva();
             $this->regiva->codejercicio = $eje0->codejercicio;
             $this->regiva->fechaasiento = $asiento->fecha;
             $this->regiva->fechafin = $_POST['hasta'];
             $this->regiva->fechainicio = $_POST['desde'];
             $this->regiva->idasiento = $asiento->idasiento;
             $this->regiva->periodo = $_POST['periodo'];
             if ($this->regiva->save()) {
                 $this->new_message('<a href="#" onclick="full_regiva(\'' . $this->regiva->idregiva . '\')">Regularización</a>
               guardada correctamente.');
             } else {
                 if ($asiento->delete()) {
                     $this->new_error_msg('Error al guardar la regularización. Se ha eliminado el asiento.');
                 } else {
                     $this->new_error_msg('Error al guardar la regularización. No se ha podido eliminar el asiento.');
                 }
             }
         }
     } else {
         $this->new_error_msg('El ejercicio está cerrado.');
     }
 }
 /**
  * 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)
 {
     $cuenta = new cuenta();
     $partida = new partida();
     /// metemos todo en una lista
     $auxlist = array();
     $offset = 0;
     $cuentas = $cuenta->all_from_ejercicio($eje->codejercicio, $offset);
     while (count($cuentas) > 0) {
         foreach ($cuentas as $c) {
             $subcuentas = $c->get_subcuentas();
             $debe = 0;
             $haber = 0;
             foreach ($subcuentas as $sc) {
                 $auxt = $partida->totales_from_subcuenta_fechas($sc->idsubcuenta, $fechaini, $fechafin, $excluir);
                 $debe += $auxt['debe'];
                 $haber += $auxt['haber'];
             }
             if ($debe != 0 or $haber != 0) {
                 $auxlist[] = array('cuenta' => TRUE, 'codigo' => $c->codcuenta, 'descripcion' => $c->descripcion, 'debe' => $debe, 'haber' => $haber, 'saldo' => $debe - $haber);
                 foreach ($subcuentas as $sc) {
                     $auxt = $partida->totales_from_subcuenta_fechas($sc->idsubcuenta, $fechaini, $fechafin, $excluir);
                     if ($auxt['debe'] != 0 or $auxt['haber'] != 0) {
                         $auxlist[] = array('cuenta' => FALSE, 'codigo' => $sc->codsubcuenta, 'descripcion' => $sc->descripcion, 'debe' => $auxt['debe'], 'haber' => $auxt['haber'], 'saldo' => $auxt['saldo']);
                     }
                 }
             }
             $offset++;
         }
         $cuentas = $cuenta->all_from_ejercicio($eje->codejercicio, $offset);
     }
     /// a partir de la lista generamos el documento
     $linea = 0;
     $tdebe = 0;
     $thaber = 0;
     while ($linea < count($auxlist)) {
         if ($linea > 0 or $np) {
             $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('subcuenta' => '<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($auxlist))); $i++) {
             if ($auxlist[$i]['cuenta']) {
                 $a = '<b>';
                 $b = '</b>';
             } else {
                 $a = $b = '';
                 $tdebe += $auxlist[$i]['debe'];
                 $thaber += $auxlist[$i]['haber'];
             }
             $pdf_doc->add_table_row(array('subcuenta' => $a . $auxlist[$i]['codigo'] . $b, 'descripcion' => $a . substr($auxlist[$i]['descripcion'], 0, 50) . $b, 'debe' => $a . $this->show_numero($auxlist[$i]['debe']) . $b, 'haber' => $a . $this->show_numero($auxlist[$i]['haber']) . $b, 'saldo' => $a . $this->show_numero($auxlist[$i]['saldo']) . $b));
         }
         $linea += 48;
         /// añadimos las sumas de la línea actual
         $pdf_doc->add_table_row(array('subcuenta' => '', 'descripcion' => '<b>Suma y sigue</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));
     }
 }