Source

gestiona / src / cuenta_php_files / cerrarperiodo.php

Full commit
<?php
#
# @author Igor Támara
# Public domain. No warranties. http://structio.sourceforge.net/gestiona

session_start();
session_name("usuario");
include ("funciones.php");

function unecad($arr,$une) {
  /**

  **/
  $res=$une;
  foreach($arr as $key => $data) {
    $res.=$key.$une;
  }
  return $res;
}
function filtra($switch,$muta,$titulo="",$enlace="",$permitidos) {
  /**
   @switch Especifica si se filtran cuentas
   @muta Consulta en la base de datos
   @titulo aparece en la tabla
   @enlace descriptivo de cuentas...
   @permitidos contiene aquellas cuentas que se han marcado para entrar en el ajuste
  **/
  //print $muta;
  $c=conectarse();
  $res=pg_query($muta);
  $n=pg_num_fields($res);
  $cant=pg_num_rows($res);
  print "<h3>".$titulo."</h3>";
  if ($cant==0) {
    print "<p>No hay registros para mostrar";
    desconectarse($c);
    return;
  }
  print "<table border=\"1\">
<tr>";
  $i=1;
  while($i<$n) {
    print "<th>".str_replace("_"," ",pg_field_name($res,$i)."</th>");
    $i++;
  }
  print "</tr>
<tr>";
  $i=0;
  while($i<$cant) {
    $elemento=pg_fetch_row($res,$i);
    if ($switch==1 || ($switch==2&&isset($permitidos[$elemento[0]]))) {
      $urlreal=sprintf($enlace,$elemento[0]);
      print '<tr><td><input type="checkbox" name="permitidos['.$elemento[0].']" checked><a href="'.$urlreal.'">'.$elemento[1].'</a><input type="hidden" name="filtrados['.$elemento[0].']" value="'.$elemento[2].'"></td>
';
      $j=2;
      while ($j<$n) {
	print "<td>".$elemento[$j]."</td>";
	$j++;
      }
      print '</tr>
';
    }
    $i++;
  }
  print "</table>";
  desconectarse($c);
}
if(headergestiona()==1) {
  print "<h2>Cierre de período</h2>";
  if (!isset($_POST["cierra"])) {
    if (session_is_registered('periodocierra')) {
      session_unregister('periodocierra');
    }
    print "
   <form action=\"cerrarperiodo.php\" method=\"post\">
<p>Año a Cerrar :
<select name=\"periodocierra\">";
    option("SELECT DISTINCT to_char(fechafin,'YYYY') AS valor,to_char(fechafin,'YYYY') AS opcion FROM periodoscontables ORDER BY valor;",toma_cadena("SELECT valor FROM variables WHERE nombre='periodoactual';"));
    print "
</select>
      <input name=\"cierra\" value=\"1\" type=\"hidden\">
      <input type=\"submit\" value=\"Cerrar\" name=\"envio\">
   </form>";
print "<p>Cerrar un año significa :
<dl>
<dt>Estabilizar saldos de estudiantes</dt>
<dd>Volver cero ciertos saldos a favor o en contra de estudiantes. 
Se deberá especificar el valor máximo para cerrar estas cuentas. </dd>
<dt>Hacer ajustes al peso</dt>
<dd>Encontrar cuentas en las cuáles hay algunos saldos que pueden estar en centavos, hasta un tope
especificado por usted.</dd>
<dt>Calcular Ingreso o pérdida</dt>
<dd>Se totalizan todas las subcuentas que comienzan por 4 y 5, presentándose la diferencia y 
eligiendo la cuenta en la cuál irá la ganancia o la pérdida para el año en cuestión.</dd>
<dt>Cálculo de Saldos</dt>
<dd>Se calculan los saldos para todas las cuentas, se cierran y se preparan para el período siguiente</dd>
</dl>";
  }
  else if (array_key_exists("cierra",$_POST) || session_is_registered("periodocierra")) {
    $cierra=$_POST["cierra"];
    if (isset($_SESSION["periodocierra"])) {
      $periodocierra=$_SESSION["periodocierra"];
    }
    if ($_POST["cierra"]==2 && strcmp($_POST["envio"],"Siguiente")==0)
      $cierra=3;
    switch($cierra) {
    case 1:
      //Estabilización de estudiantes
      if (!isset($_POST["valor_condona"])) {
	print "<p>La cuenta donde llevamos anticipo de matrícula para estudiantes del siguiente año en 133095";
	$valor_condona=9000;
      }
      else {
	$valor_condona=$_POST["valor_condona"];
      }
      if (isset($_POST["periodocierra"])) {
	$periodocierra=$_POST["periodocierra"];
	session_register("periodocierra");
      }
      print "<h3>Estabilizar saldos de ".$periodocierra."</h3>";
      print "<p>En este paso moveremos saldos pequeños de cuentas 13 y 27 para cruzar montos inferiores";
      print "
<form action=\"cerrarperiodo.php\" method=\"post\">
<input name=\"valor_condona\" value=\"".$valor_condona."\">
      <input name=\"cierra\" value=\"1\" type=\"hidden\">
      <input type=\"submit\" value=\"Recalcular\" name=\"envio\">
</form>
";
      print "
<form action=\"cerrarperiodo.php\" method=\"post\">
      <input name=\"cierra\" value=\"2\" type=\"hidden\">
      <input type=\"hidden\" name=\"valor_condona\" value=\"$valor_condona\">
      <input type=\"submit\" value=\"Continuar\" name=\"envio\">
</form>
";
      $q="SELECT ti.id, e.codigoestudiante||' '||nombre(d.nombres,d.apellido1,d.apellido2) AS nombre_estudiante,SUM(tc.valor*tc.signo) AS adeudado,c.nombre AS curso FROM transaccionescuenta tc, tiposcuenta ti, datospersonales d, estudiantes e, cursos c, matriculas m, transacciones t  WHERE ti.id=tc.idcuenta AND ti.oficial like '130505%' AND ti.oficial-1305050000000=e.codigoestudiante AND e.id=d.id AND c.id=m.curso AND c.periodo=".$periodocierra." AND m.estudiante=e.id AND tc.idtransaccion=t.id  AND t.idestado=1  GROUP BY ti.oficial,ti.id, d.nombres , d.apellido1, d.apellido2,c.nombre,c.orden,m.costopension, e.codigoestudiante HAVING @SUM(tc.valor*tc.signo)<".$valor_condona." AND SUM(tc.valor*tc.signo)<>0 ORDER BY text(ti.oficial),adeudado DESC, c.orden,d.apellido1,d.apellido2,d.nombres";
      filtra(1,$q,"Estudiantes con desbalance inferior a $$valor_condona en 130505","describetrans.php?muestra=2&id=%s");
      $q="SELECT ti.id, e.codigoestudiante||' '||nombre(d.nombres,d.apellido1,d.apellido2) AS nombre_estudiante,SUM(tc.valor*tc.signo) AS adeudado,c.nombre AS curso FROM transaccionescuenta tc, tiposcuenta ti, datospersonales d, estudiantes e, cursos c, matriculas m, transacciones t  WHERE ti.id=tc.idcuenta AND ti.oficial like '270545%' AND ti.oficial-2705450000000=e.codigoestudiante AND e.id=d.id AND c.id=m.curso AND c.periodo=".$periodocierra." AND m.estudiante=e.id AND tc.idtransaccion=t.id  AND t.idestado=1  GROUP BY ti.id, d.nombres , d.apellido1, d.apellido2,c.nombre,c.orden,m.costopension, e.codigoestudiante HAVING @SUM(tc.valor*tc.signo)<".$valor_condona." AND SUM(tc.valor*tc.signo)<>0 ORDER BY adeudado DESC, c.orden,d.apellido1,d.apellido2,d.nombres";
      filtra(1,$q,"Estudiantes con desbalance inferior a $$valor_condona en 270545","pensionestudiante.php?pagorapido=2&idestudiante=%s");
print "
";
      break;
    case 2:
      //Ajuste al peso
      session_register('valor_estudiante');
      print "<p>Elija las cuentas que desea saldar, filtrando por el monto.";
      if (!isset($_POST["valor_ajuste"])) {
	$valor_ajuste=10000;
      }
      else {
	$valor_ajuste=$_POST["valor_ajuste"];
      }
      print "
<form action=\"cerrarperiodo.php\" method=\"post\">
<input type=\"hidden\" name=\"valor_condona\" value=\"$valor_condona\">
<input name=\"valor_ajuste\" value=\"$valor_ajuste\">
      <input name=\"cierra\" value=\"2\" type=\"hidden\">
      <input type=\"submit\" value=\"Siguiente\" name=\"envio\">
      <input type=\"submit\" value=\"Recalcular\" name=\"envio\">
";
      $q="SELECT  ti.id,ti.oficial||' '||ti.descripcion AS cuenta ,sum(tc.valor*tc.signo) AS saldo FROM tiposcuenta ti, transaccionescuenta tc, transacciones t, periodoscontables pc WHERE t.id=tc.idtransaccion AND t.idestado=1 AND tc.idestado=1 AND t.idperiodo<pc.id AND pc.nombre='Cancela ".$_SESSION["periodocierra"]."' AND ti.id=tc.idcuenta AND (ti.oficial LIKE '1%' OR ti.oficial LIKE '2%') GROUP BY ti.oficial,ti.descripcion,ti.id HAVING sum(tc.valor*tc.signo)<> 0 AND @sum(tc.valor*tc.signo)<".$valor_ajuste." ORDER BY text(ti.oficial)";
      $switch=1;
      $permitidos="";
      if (isset($_POST["permitidos"])) {
	$switch=2;
	$permitidos=$_POST["permitidos"];
      }
      filtra($switch,$q,"Ajustes con cuantía menor a $valor_ajuste","describetrans.php?muestra=2&id=%s",$permitidos);
      print "</form>";
      break;
    case 3:
      //Usualmente se coloca el 30 de Diciembre del año en curso
      //Imprimir la cantidad de cuentas que se afectaron con el ajuste al peso.
      if(!isset($_POST["valor_ajuste"])) {
	print "No puede continuar debido a falta de información en ajuste al peso";
	break;
      }
      $_SESSION["valor_ajuste"]=$_POST["valor_ajuste"];
      if(isset($_POST["permitidos"])) {
          $_SESSION["permitidos"]=$_POST["permitidos"];
      }
      print "
<form action=\"cerrarperiodo.php\" method=\"post\">";
      print "Cuando se cierre el período, quedará almacenado en la cuenta:";
      $digs="3705".toma_cadena("SELECT substr(text(max(oficial)+1),5) FROM tiposcuenta WHERE oficial::text LIKE '3705%'");
      $describir="Pérdida o ganancia ".$_SESSION["periodocierra"];
      print "
      <input name=\"digitos\" value=\"$digs\" size=\"8\">
      <input name=\"descripcion\" value=\"$describir\">
      <input name=\"cierra\" value=\"4\" type=\"hidden\">
      <input type=\"hidden\" name=\"valor_condona\" value=\"$valor_condona\">
      <input type=\"hidden\" name=\"valor_ajuste\" value=\"$valor_ajuste\">
      <input type=\"submit\" value=\"Finalizar\" name=\"envio\">
</form>";
      $q="SELECT SUM(tc.valor*tc.signo) FROM periodoscontables pc, transaccionescuenta tc, tiposcuenta  ti, transacciones t WHERE tc.idcuenta=ti.id AND t.id=tc.idtransaccion AND (ti.oficial::text like '4%' OR ti.oficial::text LIKE '5%') AND t.idperiodo=pc.id AND pc.fechaini>'31/12/".($_SESSION["periodocierra"]-1)."' AND pc.fechafin<'01/01/".($_SESSION["periodocierra"]+1)."' AND t.idestado=1 AND tc.idestado=1";
      $final=toma_cadena($q); 
      if ($final<0) {
	print "<p>En este período se han generado excedentes por un valor de <b>".apesos(-$final)."</b>, salvo ajuste al peso.";
      }
      else {
	print "<p>En este período hubo pérdida por valor de <b>".apesos($final)."</b>, salvo ajuste al peso.";
      }
      imprimetabla("Cierre de períodos anteriores","describetrans.php?muestra=2&id=%d&&fechaini=01/01/2000&fechafin=".toma_cadena("SELECT date('now')"),"SELECT id,oficial||' '||descripcion AS cierre_anterior FROM tiposcuenta WHERE oficial::text LIKE '3705%' AND oficial>3800");
 break;
   case 4:
      if(isset($_SESSION["permitidos"])) {
        //Se hace ajuste al peso a 30 de Diciembre del año que se cierra
       $q="SELECT ajustarpeso(".$_SESSION["periodocierra"].",".$_SESSION["valor_ajuste"].",".toma_cadena("SELECT iddatospersonales FROM datospersonalesusuario WHERE login='".$_SESSION["usuario"]."'").",'30-12-".$_SESSION["periodocierra"]."','".unecad($_SESSION["permitidos"],",")."');";
       toma_cadena($q);
      }
      #Se adiciona la cuenta para registro de pérdida o ganancia.
      $q="INSERT INTO tiposcuenta(oficial,descripcion,hijade,naturaleza) SELECT ".$_POST["digitos"].",'".$_POST["descripcion"]."',id,naturaleza FROM tiposcuenta WHERE oficial=3705";
      toma_cadena($q);
      #Se calcula pérdida o ganancia y se adiciona a la base de datos
     $q="SELECT cierreperiodo(".$_SESSION["periodocierra"].",'".$_POST["digitos"]."',".toma_cadena("SELECT iddatospersonales FROM datospersonalesusuario WHERE login='".$_SESSION["usuario"]."'").")";
      toma_cadena($q);
      #Se cierran los períodos contables
      $q="UPDATE periodoscontables SET idestado = 2 WHERE nombre like '%".$_SESSION["periodocierra"]."'";
      toma_cadena($q);
      #Se calculan los saldos para el período
      $q="SELECT saldosparaperiodo(".$_SESSION["periodocierra"].")";
      toma_cadena($q);
      #Se actualizan periodoactual y periodosiguiente
      $q="UPDATE variables SET valor=".($_SESSION["periodocierra"]+1)." WHERE nombre='periodoactual'";
      toma_cadena($q);
      $q="UPDATE variables SET valor=".($_SESSION["periodocierra"]+1)." WHERE nombre='periodosiguiente'";
      toma_cadena($q);
      //Se coloca siguiente el mismo, porque es posible que se matriculen más estudiantes de forma tardía.
      if(isset($_SESSION["permitidos"])) {
         print "<p>Se hizo el <a href=\"describetrans.php?muestra=1&id=".toma_cadena("SELECT max(id) FROM transacciones WHERE descripcion='Ajustes al peso ".$_SESSION["periodocierra"]."'")."\">ajuste al peso</a>.";
     }
      print "<p>Se hizo el <a href=\"describetrans.php?muestra=1&id=".toma_cadena("SELECT max(id) FROM transacciones WHERE descripcion='Cierre del período ".$_SESSION["periodocierra"]."'")."\">cierre del período</a>.";
      print "<p>El período actual es ahora ".($_SESSION["periodocierra"]+1).", consulte el <a href=\"balanceprueba.php?periodo=0\">balance anual</a>, también puede <a href=\"configura.php\">Cambiar de año</a> para comparar los balances del año anterior y el actual."; //Finalmente, podría proceder a <a href=\"pensiones.php?causar=1\">causar</a> las pensiones.";
      $_SESSION["anio"]+=1;
      break;
    }
  }
}
else {
  print "</td><td bgcolor=#FFFFFF valign=top>Usuario no registrado <i>(Login o contraseña inválidos)</i><br>";
  print "Por favor intente de nuevo <a href=\"index.php\">inicio</a>";
  session_destroy();
  
  
}
require "footer.php";
?>