Commits

Igor Támara committed d223060

Adición de funcionalidad de reclasificación de cuentas, se añade al menú cierre de año

Comments (0)

Files changed (5)

src/cuenta_php_files/balanceprueba.php

     case -1:
       $cadena="Año $anio detallado";
       $final=toma_cadena("SELECT id from periodoscontables WHERE nombre='Cancela $anio'");
-      $query="SELECT coalesce(saldos.id , mov.id) AS id , coalesce(saldos.oficial||' '||saldos.nombre, mov.oficial||' '||mov.nombre) AS cuenta , haganumero(saldos.inicial) AS inicial , haganumero(mov.debe) AS debe , haganumero(mov.haber) AS haber , coalesce(saldos.signo,mov.signo) AS final FROM (SELECT ti.oficial, ti.id , sum(sal.inicial) AS inicial , ti.naturaleza AS signo , ti.descripcion AS nombre FROM (SELECT ti.oficial,(sum(s.debito)-sum(s.credito))*ti.naturaleza AS inicial FROM saldos s, tiposcuenta ti WHERE s.idtiposcuenta= ti.id AND s.idperiodo=$psaldos GROUP BY ti.oficial, ti.naturaleza , ti.descripcion ORDER BY ti.oficial) AS SAL , tiposcuenta ti WHERE sal.oficial = ti.oficial GROUP BY ti.oficial, ti.id , ti.naturaleza , ti.descripcion ORDER BY text(ti.oficial)) AS saldos FULL OUTER JOIN (SELECT ti.oficial AS oficial, ti.id, sum(val.debe) AS debe , sum(val.haber) AS haber , ti.naturaleza AS signo , ti.descripcion AS nombre FROM (SELECT coalesce(debe.cuenta,haber.cuenta) AS cuenta,haganumero(debe.debe) AS debe,haganumero(haber.haber) AS haber FROM (SELECT ti.oficial AS cuenta, SUM(tc.valor) AS debe FROM tiposcuenta ti, transaccionescuenta tc , transacciones t WHERE tc.idestado=1 AND t.idestado=1 AND ti.id=tc.idcuenta AND tc.signo=1 AND t.id=tc.idtransaccion AND t.idperiodo>$psaldos AND t.idperiodo<$final GROUP BY ti.oficial ORDER BY ti.oficial) AS debe FULL OUTER JOIN (SELECT ti.oficial AS cuenta , SUM(tc.valor) AS haber FROM tiposcuenta ti, transaccionescuenta tc , transacciones t WHERE t.idestado=1 AND tc.idestado=1 AND ti.id=tc.idcuenta AND tc.signo=-1 AND t.id=tc.idtransaccion AND t.idperiodo>$psaldos AND t.idperiodo<$final GROUP BY ti.oficial ORDER BY ti.oficial) AS HABER ON (debe.cuenta=haber.cuenta)) AS val , tiposcuenta ti WHERE val.cuenta = ti.oficial GROUP BY ti.oficial, ti.id , ti.naturaleza , ti.descripcion) AS mov ON (saldos.id=mov.id) ORDER BY text(coalesce(saldos.oficial,mov.oficial));
-";
+      $query="SELECT coalesce(saldos.id , mov.id) AS id , coalesce(saldos.oficial||' '||saldos.nombre, mov.oficial||' '||mov.nombre) AS cuenta , haganumero(saldos.inicial) AS inicial , haganumero(mov.debe) AS debe , haganumero(mov.haber) AS haber , coalesce(saldos.signo,mov.signo) AS final FROM (SELECT ti.oficial, ti.id , sum(sal.inicial) AS inicial , ti.naturaleza AS signo , ti.descripcion AS nombre FROM (SELECT ti.oficial,(sum(s.debito)-sum(s.credito))*ti.naturaleza AS inicial FROM saldos s, tiposcuenta ti WHERE s.idtiposcuenta= ti.id AND s.idperiodo=$psaldos GROUP BY ti.oficial, ti.naturaleza , ti.descripcion ORDER BY ti.oficial) AS SAL , tiposcuenta ti WHERE sal.oficial = ti.oficial GROUP BY ti.oficial, ti.id , ti.naturaleza , ti.descripcion ORDER BY text(ti.oficial)) AS saldos FULL OUTER JOIN (SELECT ti.oficial AS oficial, ti.id, sum(val.debe) AS debe , sum(val.haber) AS haber , ti.naturaleza AS signo , ti.descripcion AS nombre FROM (SELECT coalesce(debe.cuenta,haber.cuenta) AS cuenta,haganumero(debe.debe) AS debe,haganumero(haber.haber) AS haber FROM (SELECT ti.oficial AS cuenta, SUM(tc.valor) AS debe FROM tiposcuenta ti, transaccionescuenta tc , transacciones t WHERE tc.idestado=1 AND t.idestado=1 AND ti.id=tc.idcuenta AND tc.signo=1 AND t.id=tc.idtransaccion AND t.idperiodo>$psaldos AND t.idperiodo<$final GROUP BY ti.oficial ORDER BY ti.oficial) AS debe FULL OUTER JOIN (SELECT ti.oficial AS cuenta , SUM(tc.valor) AS haber FROM tiposcuenta ti, transaccionescuenta tc , transacciones t WHERE t.idestado=1 AND tc.idestado=1 AND ti.id=tc.idcuenta AND tc.signo=-1 AND t.id=tc.idtransaccion AND t.idperiodo>$psaldos AND t.idperiodo<$final GROUP BY ti.oficial ORDER BY ti.oficial) AS HABER ON (debe.cuenta=haber.cuenta)) AS val , tiposcuenta ti WHERE val.cuenta = ti.oficial GROUP BY ti.oficial, ti.id , ti.naturaleza , ti.descripcion) AS mov ON (saldos.id=mov.id) ORDER BY text(coalesce(saldos.oficial,mov.oficial));";
       $adicional='[ <a href="balanceprueba.php?periodo=0">Resumido</a> ]';
       break;
     default:

src/cuenta_php_files/describetrans.php

       formafecha("describetrans.php",$fechaini,$fechafin,array("muestra"=>9,"id"=>$id));
       $codigo=toma_cadena("SELECT oficial FROM tiposcuenta WHERE id=$id");
       $query="SELECT ti.id||'&fechaini=$fechaini&fechafin=$fechafin' , ti.oficial||' '||ti.descripcion AS cuenta, sum(tc.valor) AS debe, tc.signo AS haber FROM transaccionescuenta tc , transacciones t, tiposcuenta ti  WHERE t.idestado=1 AND tc.idestado=1 AND date_le('$fechaini',t.fecha) AND date_le(t.fecha,'$fechafin') AND t.id=tc.idtransaccion AND tc.idcuenta=ti.id AND ti.oficial::text LIKE '$codigo%'::text GROUP BY ti.id, ti.oficial,ti.descripcion, tc.signo ORDER BY ti.oficial,ti.descripcion, tc.signo DESC";
-      imprimetablacuenta("Movimientos de la cuenta ".toma_cadena("SELECT '\"'||descripcion||'\" ['||oficial||']' FROM tiposcuenta WHERE id=$id")." y sus subcuentas","describetrans.php?muestra=2&id=%s",$query);
+      imprimetablacuenta("Movimientos de la cuenta ".toma_cadena("SELECT '\"'||descripcion||'\" ['||oficial||']' FROM tiposcuenta WHERE id=$id")." y sus subcuentas","describetrans.php?muestra=2&id=%s",$query,toma_cadena("SELECT saldodecuenta($id,'$fechaini')"),toma_cadena("SELECT naturaleza FROM tiposcuenta WHERE id=$id"));
       formafecha("describetrans.php",$fechaini,$fechafin,array("muestra"=>9,"id"=>$id));
       break;
     case 10:

src/cuenta_php_files/funciones.php

   $cant=pg_num_rows($res);
   print "<h3>".$titulo."</h3>
 ";
-  if ($cant==0) {
+  if ($cant==0 && $saldo==0) {
     $msj = "No hay registros para mostrar";
     muestra_mensaje('close.png', $msj);
     desconectarse($c);
     $i++;
   }
   print "<th>Saldo</th></tr>
-<tr><th colspan=4 align=\"right\">".apesos(intval($saldo))."</th></tr>
+<tr><td class=\"seccion\">Inicial</td>";
+  if ($signo*$saldo<0)
+    print "<th align=\"right\">$0<th align=\"right\">".apesos(abs($saldo));
+  else 
+    print "<th align=\"right\">".apesos(abs($saldo))."<th align=\"right\">$0";
+print "<th align=\"right\">".apesos(intval($saldo))."</th></tr>
 <tr>";
   $i=0;
   $debe=0;
 ';
     $i++;
   }
-  if ($debe>0||$haber>0) {
-   print "<td class=\"seccion\">Total del movimiento</td><td align=\"right\">".apesos(intval($debe))."</td><td align=\"right\">".apesos(intval($haber))."</td><th align=\"right\">".apesos(intval($saldo))."</th></tr>";
-  }
+  if ($debe==0 && $haber==0)
+    {
+      print "<tr><td colspan=\"4\" align=\"center\">Sin movimientos</td></tr>";
+    }
+ print "<tr><td class=\"seccion\">Total del movimiento</td><th align=\"right\">".apesos(intval($debe))."</th><th align=\"right\">".apesos(intval($haber))."</th><th align=\"right\">".apesos(intval($saldo))."</th></tr>";
+
   print "</table>
 ";
   desconectarse($c);
     print '<tr><td></td><td><a class="menu" href="menucomprobante.php?adiciona=1" title="Adicionar modelo de comprobante">Adicionar</a></td></td>';
     print '<tr><td></td><td><a class="menu" href="menucomprobante.php?adicionacuentas=1" title="Modificar un modelo de comprobante">Modificar</a></td></td>';
     
+    print '<tr><td colspan=2 class="seccion">Ajustes</td></tr>';
+    print '<tr><td></td><td><a class="menu" href="reclasificar.php" title="Mover saldos">Reclasificar</a></td></td>';
+    print '<tr><td></td><td><a class="menu" href="cerrarperiodo.php" title="Cierre de Año">Cerrar año</a></td></td>';
 
     print '<tr><td colspan=2 class="seccion" title="Reportes fiscales">Fiscal</td></tr>';
     print '<tr><td></td><td><a class="menu" href="fiscales.php" title="Consultar Retención en la Fuente">Retefuente</a></td></td>';

src/cuenta_php_files/reclasificar.php

+<?php
+# 
+# @author Igor Támara
+# Public domain. No warranties. http://structio.sourceforge.net/gestiona
+
+session_start();
+session_name("usuario");
+include ("funciones.php");
+
+if(headergestiona()==1) {
+  $anio=$_SESSION["anio"];
+  $psaldos=toma_cadena("SELECT anterior FROM periodoscontables WHERE nombre='Enero $anio'");
+  $final=toma_cadena("SELECT id from periodoscontables WHERE nombre='Cancela $anio'");
+  $fechaini="$anio/01/01";
+  $fechafin="$anio/12/31";
+  print "<h2>Saldo de cuentas</h2>";
+  if (!isset($_POST["step"])) {
+    print "<p>Este proceso se aplica a final de año para agrupar valores en una cuenta y saldar cuentas, revise el <a href=\"balanceprueba.php?periodo=-1\">balance de prueba anual detallado</a> para verificar.";
+    print "
+  <form action=\"reclasificar.php\" method=\"post\">
+<table>
+<tr>
+<td>Cuenta a cruzar
+<td><input name=\"cuentacontra\">
+</tr>
+<tr>
+<td>Prefijo de Cuentas a saldar
+<td><input name=\"padresub\">
+</tr>
+</table>
+<input type=\"submit\" value=\"Verificar\">
+<input type=\"hidden\" name=\"step\" value=\"1\">
+</form>
+";
+  }
+  else {
+    $step=$_POST["step"];
+    $padresub=$_POST["padresub"];
+    $cuentacontra=$_POST["cuentacontra"]; 
+    $res=toma_cadena("SELECT count(*) from tiposcuenta WHERE oficial::text LIKE '".$padresub."%' AND oficial<>'$padresub'");
+    if ($res==0){
+      print "<p>No hay subcuentas en $padresub ";
+      break;
+    }
+    $res=toma_cadena("SELECT count(*) from tiposcuenta WHERE oficial=$padresub");
+    if ($res==0){
+      print "<p>Por favor elija una cuenta de contrapartida válida ";
+      break;
+    }
+    switch($step){
+    case 1:
+      $query="SELECT coalesce(saldos.id , mov.id) AS id , coalesce(saldos.oficial||' '||saldos.nombre, mov.oficial||' '||mov.nombre) AS cuenta , haganumero(saldos.inicial) AS inicial , haganumero(mov.debe) AS debe , haganumero(mov.haber) AS haber , coalesce(saldos.signo,mov.signo) AS final FROM (SELECT ti.oficial, ti.id , sum(sal.inicial) AS inicial , ti.naturaleza AS signo , ti.descripcion AS nombre FROM (SELECT ti.oficial,(sum(s.debito)-sum(s.credito))*ti.naturaleza AS inicial FROM saldos s, tiposcuenta ti WHERE s.idtiposcuenta= ti.id AND s.idperiodo=$psaldos GROUP BY ti.oficial, ti.naturaleza , ti.descripcion ORDER BY ti.oficial) AS SAL , tiposcuenta ti WHERE sal.oficial = ti.oficial AND ti.oficial::text LIKE '".$cuentacontra."%' AND ti.oficial<>$cuentacontra GROUP BY ti.oficial, ti.id , ti.naturaleza , ti.descripcion ORDER BY text(ti.oficial)) AS saldos FULL OUTER JOIN (SELECT ti.oficial AS oficial, ti.id, sum(val.debe) AS debe , sum(val.haber) AS haber , ti.naturaleza AS signo , ti.descripcion AS nombre FROM (SELECT coalesce(debe.cuenta,haber.cuenta) AS cuenta,haganumero(debe.debe) AS debe,haganumero(haber.haber) AS haber FROM (SELECT ti.oficial AS cuenta, SUM(tc.valor) AS debe FROM tiposcuenta ti, transaccionescuenta tc , transacciones t WHERE tc.idestado=1 AND t.idestado=1 AND ti.id=tc.idcuenta AND tc.signo=1 AND t.id=tc.idtransaccion AND t.idperiodo>$psaldos AND t.idperiodo<$final  AND ti.oficial::text LIKE '".$cuentacontra."%' AND ti.oficial<>$cuentacontra GROUP BY ti.oficial ORDER BY ti.oficial) AS debe FULL OUTER JOIN (SELECT ti.oficial AS cuenta , SUM(tc.valor) AS haber FROM tiposcuenta ti, transaccionescuenta tc , transacciones t WHERE t.idestado=1 AND tc.idestado=1 AND ti.id=tc.idcuenta AND tc.signo=-1 AND t.id=tc.idtransaccion AND t.idperiodo>$psaldos AND t.idperiodo<$final  AND ti.oficial::text LIKE '".$cuentacontra."% AND ti.oficial<>$cuentacontra' GROUP BY ti.oficial ORDER BY ti.oficial) AS HABER ON (debe.cuenta=haber.cuenta)) AS val , tiposcuenta ti WHERE val.cuenta = ti.oficial  AND ti.oficial::text LIKE '".$cuentacontra."%' AND ti.oficial<>$cuentacontra GROUP BY ti.oficial, ti.id , ti.naturaleza , ti.descripcion) AS mov ON (saldos.id=mov.id) WHERE coalesce(saldos.inicial,0) +(coalesce(mov.debe,0)-coalesce(mov.haber,0))*coalesce(saldos.signo,mov.signo,1)<>0  ORDER BY text(coalesce(saldos.oficial,mov.oficial));";
+      $cad=imprimetablabalanceprueba("Subcuentas a saldar","describetrans.php?muestra=9&fechaini=$fechaini&fechafin=$fechafin&id=%s",$query,$adicional);
+print "<h3>Frente a la cuenta $cuentacontra</h3>
+<form action=\"reclasificar.php\" method=\"post\">
+<input type=\"submit\" value=\"Aplicar\" />
+<input type=\"hidden\" name=\"padresub\" value=\"".$padresub."\" />
+<input type=\"hidden\" name=\"cuentacontra\" value=\"".$cuentacontra."\" />
+<input type=\"hidden\" name=\"step\" value=\"2\" />
+</form>";
+      break;
+    case 2:
+      $q="SELECT iddatospersonales FROM datospersonalesusuario WHERE login='".$_SESSION["usuario"]."'";
+      $idusuario=toma_cadena($q);
+      $q="SELECT reclasifica('$padresub','$cuentacontra',$anio,4,$idusuario);";
+      $result=toma_cadena($q);
+      switch($result)
+	{
+	case -1:
+	  logthis("No existía la contrapartida. Error en Reclasificar");
+	  break;
+	case -2:
+	    logthis("Es imposible que el año no exista, es el actual. Error en Reclasificar");
+	    break;
+	case -3:
+	    logthis("No existía diciembre del año en cuestión, es el actual. Error en Reclasificar");
+	    break;
+	case -4:
+	    logthis("Revisar procedimiento almacenado reclasifica(text,text,int4,int4,int4) RETURNS integer AS");
+	    break;
+	default:
+	    print "<p>Transacción exitosa, por favor <a href=\"describetrans.php?muestra=18\">revise la transacción</a> o <a href=\"reclasificar.php\">reclasifique</a> otras cuentas ";
+	    break;
+      }
+      break;
+    }
+
+  }
+}
+require "footer.php";
+?>

src/sql/creacionfunciones.sql

 $$
 LANGUAGE plpgsql;
 
+
+-- Recibe la cuenta cuyas subcuentas van a ser canceladas, la cuenta
+-- en la cual se va a colocar el saldo de la cancelación de subcuentas,
+-- el año para el cual se va a hacer la cancelación
+-- el id del tercero al cual va a quedar asignada la transacción
+-- el id del usuario que efectuó la operación
+-- SELECT reclasifica('130505','130505',2010,13);
+CREATE OR REPLACE FUNCTION reclasifica(text,text,int4,int4,int4) RETURNS integer AS
+'
+padre=args[0]
+contra=args[1]
+anio=args[2]
+idtercero=args[3]
+idusuario=args[4]
+try:
+  psaldos=plpy.execute("SELECT id FROM periodoscontables WHERE nombre=''Cancela %d''" %(anio-1))[0]["id"]
+except:
+  #No existIa el año en cuestión para hacer la reclasificacion
+  return -2
+pfinal=plpy.execute("SELECT id FROM periodoscontables WHERE nombre=''Cancela %d''" %anio)[0]["id"]
+try:
+  res=plpy.execute("SELECT id,naturaleza FROM tiposcuenta WHERE oficial=''%s''" % contra)
+  idcontra=res[0]["id"]
+  natcontra=res[0]["naturaleza"]
+except:
+  #No existIa la cuenta de contrapartida
+  return -1
+try:
+  res=plpy.execute("SELECT id,fechaini FROM periodoscontables WHERE nombre=''Diciembre %d''" % anio)
+  idperiodo=res[0]["id"]
+  fecha=res[0]["fechaini"]
+except:
+  #No existía Diciembre del período en el que se colocará la reclasificación de cuentas
+  return -3
+#Búsqueda del id de la transaccion
+nronotai=1+plpy.execute("SELECT ultimatransaccion(id) from tiposcomprobante where abrevia=''NI''")[0]["ultimatransaccion"]
+tiponota=plpy.execute("SELECT id FROM tiposcomprobante WHERE abrevia=''NI''")[0]["id"]
+plpy.execute("INSERT INTO transacciones(idcomprobante,fecha,descripcion,tipotercero,idtercero,idestado,idusuario,fecharegistro,idperiodo,idtipocomprobante) VALUES (%d,''%d-12-30'',''Reclasificación de subcuentas de %s frente a %s en %d'',%d, %d,%d,%d,date(''now''),%d,%d)" % (nronotai,anio,padre,contra,anio,4,idtercero,1,idusuario,idperiodo,tiponota))
+try:
+  idtrans=plpy.execute("SELECT max(id) from transacciones WHERE idtipocomprobante=%d AND descripcion=''Reclasificación de subcuentas de %s frente a %s en %d''" % (tiponota,padre,contra,anio))[0]["max"]
+except:
+  #No se hizo la inserción de la transacción
+  return -4
+
+q="SELECT coalesce(sal.id,mov.id) AS id, coalesce(sal.oficial,mov.oficial) AS cuenta, coalesce(sal.naturaleza,mov.naturaleza,1) AS nat,coalesce(sal.inicial,0) AS ini,coalesce(mov.per,0) AS movi, coalesce(sal.inicial,0)+coalesce(mov.per,0)*coalesce(sal.naturaleza,mov.naturaleza,1) AS fin FROM (SELECT ti.id,ti.naturaleza, ti.oficial,(sum(s.debito)-sum(s.credito))*ti.naturaleza AS inicial FROM saldos s, tiposcuenta ti WHERE s.idtiposcuenta= ti.id AND s.idperiodo=%(psaldos)d AND text(ti.oficial) like ''%(padre)s'' AND char_length(text(ti.oficial))>char_length(''%(padre)s'') GROUP BY ti.oficial, ti.naturaleza , ti.descripcion,ti.id ORDER BY ti.oficial) AS sal FULL OUTER JOIN (SELECT ti.id,ti.naturaleza,ti.oficial , SUM(tc.valor*tc.signo) AS per FROM tiposcuenta ti, transaccionescuenta tc , transacciones t WHERE t.idestado=1 AND tc.idestado=1 AND ti.id=tc.idcuenta  AND t.id=tc.idtransaccion AND t.idperiodo>%(psaldos)d AND t.idperiodo<%(pfinal)d AND text(ti.oficial) LIKE ''%(padre)s'' AND char_length(text(ti.oficial))>char_length(''%(padre)s'') GROUP BY ti.oficial,ti.id,ti.naturaleza ORDER BY ti.oficial) AS mov ON sal.oficial=mov.oficial"
+res=plpy.execute(q % {"psaldos":psaldos , "pfinal":pfinal , "padre":padre+"%"})
+trans=""
+regs=1
+saldo=0.0
+for i in res :
+  if i["fin"]!=0:
+    saldo+=i["fin"]*i["nat"]
+    if i["fin"]*i["nat"]<0:
+      trans="%s,,%d,0" % (i["cuenta"],abs(i["fin"]))
+    else:
+      trans="%s,,0,%d" % (i["cuenta"],abs(i["fin"]))
+    plpy.execute("SELECT registratransacciones(''%s'',%d);" % (trans,idtrans))
+    regs+=1
+if saldo>0:
+   trans="%s,,%d,0" %(contra,abs(saldo))
+else:
+   trans="%s,,0,%d" % (contra,abs(saldo))
+plpy.execute("SELECT registratransacciones(''%s'',%d);" % (trans,idtrans))
+return regs
+'
+LANGUAGE plpythonu;
+
+
 COMMIT;
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.