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.');
             }
         }
     }
 }
 /**
  * @param asiento $asiento
  * @param divisa $divisa
  */
 public static function cargar_partidas(asiento $asiento, divisa $divisa)
 {
     $partidas = $asiento->get_partidas();
     if (is_array($partidas) && !empty($partidas)) {
         foreach ($partidas as $partida) {
             self::add_partida($asiento, $divisa, $partida->codsubcuenta, array('debe' => $partida->debe, 'haber' => $partida->haber, 'comprobante' => $partida->comprobante));
         }
     }
 }
Ejemplo n.º 3
0
 /**
  * Comprueba la validez de un asiento contable
  * @param asiento $asiento
  * @return boolean
  */
 private function check_asiento($asiento)
 {
     $ok = FALSE;
     $debe = 0;
     $haber = 0;
     foreach ($asiento->get_partidas() as $lin) {
         $debe += $lin->debe;
         $haber += $lin->haber;
     }
     if (abs($debe - $haber) < 0.01) {
         $ok = TRUE;
     }
     return $ok;
 }