Calcular días hábiles en PHP

Iniciado por tomasvreal28, 28 Noviembre 2015, 17:53 PM

0 Miembros y 1 Visitante están viendo este tema.

tomasvreal28

Buenas espero que me puedan ayudar
estoy queriendo sumar 10 días hábiles (Lunes a Viernes) y sin contar feriados
a partir de una fecha
Lo que hecho es sumarle 10 días pero no quiero que cuente los sábados ni domingos y tampoco los feriados

Por ejemplo estos son algunos feriados

2015-12-08     2015-12-25     2016-01-01    


Código (php) [Seleccionar]
<?php

require_once('conexion.php');

$num_accion=$_POST['num_accion'];
$fecha_noti=$_POST['fecha_noti'];

$fecha_venci_notidate("Y-m-d"strtotime("$fecha_noti + 10 days"));

$sql="update tbldias set 

dc_fecha_noti='"
.$fecha_noti."',
dc_fecha_venci_noti='"
.$fecha_venci_noti."' 

where dc_num_accion="
.$num_accion;

$res=mysql_query($sql,$cnx);

?>


Mod: Obligatorio el uso de etiquetas GeSHi.

gAb1

Por favor favor usa las etiquetas de código GeSHi (tienes una lista para elegir el tipo de lenguaje). Modifica para ponerlas.

Tu lo que quieres es obtener, en php, solo los dias de trabajo o dias normales.

También te diré que no necesitas usar tantas comillas... Las comillas dobles ( " " ) solo son necesarias para que php interprete las barras invertidas ( \ ) y puedas imprimir códigos ASCII y otros carácteres especiales como nuevas lineas ( \n ), etc. Para simple texto con las normales es suficiente, tal solo cierralas y pones la variable.

Código (php) [Seleccionar]
$sql='UPDATE tbldias
      SET    dc_fecha_noti       = ' . $fecha_noti . ',
             dc_fecha_venci_noti = ' . $fecha_venci_noti . '
      WHERE  dc_num_accion       = ' . $num_accion;


PHP no puede saber que dias son festivos (solo puede saber cual es Sabado y cual Domingo). Necesitarás crear una función con un array que contenga todos los dias festivos y que devuelva solo los que estén entre la fecha indicada y la fecha final (aunque si no son muchos no hace falta filtrarlos). No necesitas poner el año:

Código (php) [Seleccionar]
// $startDate sería $fecha_noti y $days los dias a sumar (por si los pides en el formulario)
function getWorkingDays($startDate, $days) {
    // aquí tendrías que poner todos los dias festivos menos los sabados y domingos.
    // o si son muchos crear una funcion que devuelva solo los necesarios...
    // (por ejemplo 10 dias festivos a partir de la fecha indicada, dependiendo de $days)
    $holidays  = array(
        'New Year\'s Day'   => '01-01'
        'Trivia Day'        => '01-04'
        'National Bird Day' => '01-05'
    );
    $weekend   = array('Sun' => '','Sat' => '');
    $date      = new DateTime($startDate); // recuerda solo mes y dia
    $nextDay   = clone $date;
    $i         = 0;
    $nextDates = array();

    while ($i < $days) {
        $nextDay->add('P1D');
        if (isset($holidays[$nextDay->format('m-d')])) continue;
        if (isset($weekend[$nextDay->format('D')])) continue;
        $nextDates[] = $nextDay->format('Y-m-d');
        $i++;
    }

    return $nextDates;
}


Así lo harías en la página PHP:

Código (php) [Seleccionar]
require_once('conexion.php');
require_once('functions.php'); // si tienes un archivo para las funciones pon la función de arriba, o crealo

// si el formulario no está en esta página quita el isset() dejando solo el filter_input();
$num_accion = isset ( $_POST['num_accion'] ) ? filter_input ( INPUT_POST , 'num_accion' , FILTER_SANITIZE_STRING) : NULL;
$fecha_noti = isset ( $_POST['fecha_noti'] ) ? filter_input ( INPUT_POST , 'fecha_noti' , FILTER_SANITIZE_STRING) : NULL;
$days       = isset( $_POST['days'] ) ? (int) $_POST['days'] : 10; // los que quieras poner por defecto

$fecha_venci_noti = getWorkingDays($fecha_noti, $days);

?>
// Aqui puede ir el formulario HTML
<form></form>

tomasvreal28


Amigo he probado el codigo pero no funciona

Bueno aquí es donde se guarda 
el formulario esta en otro archivo
lo que pasa es que una vez que se registra
    --> fecha_noti_comu
la   --> fecha_venci_not_comu     
  se guarda sumando 10 días pero quiero que sean días hábiles de los Luneas a Viernes y sin contar los feriados
por ejemplo estos son algunos feriado
-2015-12-08   
-2015-12-25   
-2016-01-01   
 

edita_comunica.php

Código (php) [Seleccionar]
<?php

require_once('conexion.php');

$num_accion=$_POST['num_accion'];
$fecha_comunicacion=$_POST['fecha_comunicacion'];
$num_comunicacion=$_POST['num_comunicacion'];
$fecha_noti_comu=$_POST['fecha_noti_comu'];
$estado=$_POST['estado'];

$fecha_venci_not_comudate("Y-m-d"strtotime("$fecha_noti_comu + 10 days"));

$dependencia=$_POST['dependencia'];
$traslado=$_POST['traslado'];

$sql="update tbldocumentosicr set icr_dependencia='".$dependencia."',icr_fecha_comunicacion='".$fecha_comunicacion."',icr_num_comunicacion='".$num_comunicacion."',
icr_fecha_noti_comu='"
.$fecha_noti_comu."',icr_estado='".$estado."',icr_fecha_venci_not_comu='".$fecha_venci_not_comu."',
icr_dependencia='"
.$dependencia."',icr_traslado='".$traslado."'
where icr_num_accion="
.$num_accion;
$res=mysql_query($sql,$cnx);

?>


El código del formulario esta en otro archivo y con este no hay problemas

registro_comun.php


Código (php) [Seleccionar]

<?php

require_once("conexion.php");

$buscar=$_GET["num_accion"];

$query="SELECT * FROM tbldocumentosicr WHERE  icr_num_accion = '$buscar'";

$result=mysql_query($query,$cnx) or die("Error: ".mysql_error());

if(
mysql_num_rows($result) > 0){

while(
$Rs=mysql_fetch_array($result)){

?>


<form action="edita_comunica.php"   method="post" enctype="multipart/form-data" onSubmit = "return verifica(this);">

<TABLE BGCOLOR="F9FBFC" BORDERCOLOR="EAEAEB"  WIDTH=77%" BORDER=5 CellPadding=10 CellSpacing=1 align="center">

<TR>

<TD colspan=2 align='center' BGCOLOR="C1D4D6" style="color:#000000"><B><h3>Comunicación</h3></B></TD>

</TR>

<TR>

<TD align=left><B>Acci&oacute;n Inductiva:</B></TD>

<TD align=left>

<INPUT TYPE="text" NAME="num_accion" readonly="readonly" onMouseOver="this.style.backgroundColor='#FDFDF8'" style="background-color:#FBF9D5" onMouseOut="this.style.backgroundColor='#FBF9D5'"  value="<?=$Rs["icr_num_accion"]?>"/>

<INPUT  type="hidden" NAME="num_accion2" value="<?=$Rs["icr_num_accion"]?>"/></TD></TR>

<TR>

<TD align=left><B>RUC:</B></TD>

<TD align=left>
<input type="text" name="ruc" readonly="readonly" onmouseover="this.style.backgroundColor='#FDFDF8'" style="background-color:#FBF9D5" onMouseOut="this.style.backgroundColor='#FBF9D5'"  event.returnValue = false;" value="<?=$Rs["icr_ruc"]?>"/></TD>

</TR>
<TR>
<TD align=left><B>Nombre o Raz&oacute;n Social:</B> </TD>

<TD align=left> <INPUT TYPE="text" NAME="contribuyente" readonly="readonly" SIZE=135 onMouseOver="this.style.backgroundColor='#FDFDF8'" style="background-color:#FBF9D5" onMouseOut="this.style.backgroundColor='#FBF9D5'" value="<?=$Rs["icr_contribuyente"]?>"/></TD>

</TR>

<TR>

<TD align=left><B>Domicilio Fiscal:</B> </TD>

<TD align=left><input type="text" name="domicilio" readonly="readonly" size=135 onMouseOver="this.style.backgroundColor='#FDFDF8'" style="background-color:#FBF9D5" onMouseOut="this.style.backgroundColor='#FBF9D5'" value="<?=$Rs["icr_domicilio"]?>"/></TD>

</TR>

<TR>

<TD align=left><B>Infracci&oacute;n Cometida:</B></TD>

<TD align=left>
<SELECT NAME="infraccion" style="background-color:#FBF9D5">
<?php if($Rs["icr_infraccion"]==1){?>
<option value="1" selected>1. Inciso b) numeral 9.3: Condici&oacute;n de domicilio fiscal NO HABIDO</option>
<?php }elseif($Rs["icr_infraccion"]==2){?>
<option value="2" selected>2. Inciso c) numeral 9.3: No comparecer o comparecer fuera del plazo establecido.</option>
<?php }elseif($Rs["icr_infraccion"]==3){?>
<option value="3" selected>3. Inciso d) numeral 9.3: No emitir y/o no otorgar CDP, distintos a gu&iacute;as de remisi&oacute;n (num.1, art.174&deg; CT)</option>
<?php }elseif($Rs["icr_infraccion"]==4){?>
<option value="4" selected>4. Inciso d) numeral 9.3: Omitir llevar libros y/o registros y/o otros medios de control (num.1, art.175&deg; CT)</option>
<?php }elseif($Rs["icr_infraccion"]==5){?>
<option value="5" selected>5. Inciso d) numeral 9.3: No presentar declaraciones determinativas dentro de los plazos (num.1, art.176&deg; CT)</option>
<?php }elseif($Rs["icr_infraccion"]==6){?>
<option value="6" selected>6. Inciso d) numeral 9.3: No exhibir libros, registros u otros documentos solicitados (num.1, art.177&deg; CT)</option>
<?php }elseif($Rs["icr_infraccion"]==7){?>
<option value="1" selected>7. Inciso d) numeral 9.3: No declarar ingresos, rentas, patrimonio, tributos retenidos, o declarar datos falsos</option>

<?php }?>

</SELECT>  

</TD>

</TR>

<TR>

   <TD align=left><B>Fecha<br>Registro:</B></TD>

   <TD align=left> <input type="text" name="fecha_registro" readonly="readonly" style="background-color:#FBF9D5" value="<?=$Rs["icr_fecha_registro"]?>"/></TD>

</TR>

<TR>

   <TD align=left><B>Fecha de Emision de la<br>Comunicación:</B></TD>

   <TD align=left> <input type="text" name="fecha_comunicacion" id="fecha_comunicacion" style="background-color:#FBF9D5" value="<?=$Rs["icr_fecha_comunicacion"]?>"/>

<button type="submit" id="button1">...</button>
<script type="text/javascript">
            Calendar.setup({
              inputField    : "fecha_comunicacion",
              button        : "button1",
              align         : "center"

            });

                </script>
</TD>

</TR>

<TR>

  <TD align=left><B>Número de Comunicación</B></TD>

  <TD colspan=3 align=left><INPUT TYPE='text' NAME="num_comunicacion" size=40 style="background-color:#FBF9D5" value="<?=$Rs["icr_num_comunicacion"]?>"/></TD>

</TR>

<TR>

   <TD align=left><B>Fecha Notificación <br> Comunicación:</B></TD>

   <TD align=left> <input type="text" name="fecha_noti_comu" id="fecha_noti_comu" style="background-color:#FBF9D5" value="<?=$Rs["icr_fecha_noti_comu"]?>"/>

<button type="submit" id="button2">...</button>
<script type="text/javascript">
            Calendar.setup({
              inputField    : "fecha_noti_comu",
              button        : "button2",
              align         : "center"

            });
                </script>
</TD>

</TR>

<TR>

   <TD align=left><B>Estado:</B></TD>

   <TD colspan=3 align=left> <SELECT NAME="estado" style="background-color:#FBF9D5">

<?php if($Rs["icr_estado"]==1){?>
<option value="1" selected>Registrado</option>
<option value="2">Con Comunicaci&oacute;n</option>
<option value="3">Notificaci&#243n Comunicaci&#243n</option>
<option value="4">Con Resoluci&oacute;n</option>
<option value="5">Notificado con RI</option>
<option value="6">Reportado</option>

<?php }elseif($Rs["icr_estado"]==2){?>
<option value="1" >Registrado</option>
<option value="2"selected>Con Comunicaci&oacute;n</option>
<option value="3">Notificaci&#243n Comunicaci&#243n</option>
<option value="4">Con Resoluci&oacute;n</option>
<option value="5">Notificado con RI</option>
<option value="6">Reportado</option>

<?php }elseif($Rs["icr_estado"]==3){?>
<option value="1">Registrado</option>
<option value="2">Con Comunicaci&oacute;n</option>
<option value="3" selected>Notificaci&#243n Comunicaci&#243n</option>
<option value="4">Con Resoluci&oacute;n</option>
<option value="5">Notificado con RI</option>
<option value="6">Reportado</option>

<?php }elseif($Rs["icr_estado"]==4){?>
<option value="1">Registrado</option>
<option value="2">Con Comunicaci&oacute;n</option>
<option value="3">Notificaci&#243n Comunicaci&#243n</option>
<option value="4" selected>Con Resoluci&oacute;n</option>
<option value="5">Notificado con RI</option>
<option value="6">Reportado</option>

<?php }elseif($Rs["icr_estado"]==5){?>
<option value="1">Registrado</option>
<option value="2">Con Comunicaci&oacute;n</option>
<option value="3">Notificaci&#243n Comunicaci&#243n</option>
<option value="4">Con Resoluci&oacute;n</option>
<option value="5" selected>Notificado con RI</option>
<option value="6">Reportado</option>

<?php }elseif($Rs["icr_estado"]==6){?>
<option value="1">Registrado</option>
<option value="2">Con Comunicaci&oacute;n</option>
<option value="3">Notificaci&#243n Comunicaci&#243n</option>
<option value="4">Con Resoluci&oacute;n</option>
<option value="5">Notificado con RI</option>
<option value="6" selected>Reportado</option>

<?php }?>

</SELECT></TD>

</TR>

</TABLE>

<center>   

<input type="hidden" name="dependencia"  value="3"/>
<input type="hidden" name="traslado"  value="3"/>

</br>
<input type="submit" name="gua" value="Guardar" style='width:100px; height:35px'>

<input type="button" name="reg" value="Regresar" style='width:100px; height:35px' onClick="history.back()">

</center>

</form>

<?php

}


}else{

echo 
"<center>No se hallaron registros que coincidan con el criterio de búsqueda</center>";

}

mysql_close($cnx);
?>


</body>

</html>