Função com código SQL na tabela de feriados

Boa tarde, com esta função consigo calcular a data final, levando em consideração a 'DtInicial + Prazo = Data Final’:

[code]<?php

echo "<br>---------------------------------------------------------<br>";

$DtInicial = '30/04/2016';
$Prazo=1;

echo "Data Final:  $DtInicial<br>";
echo "Prazo:  $Prazo<br>"; 
echo " Nova Data Final dia Util: ", somar_dias_uteis($DtInicial,$Prazo,'');

echo "<br>---------------------------------------------------------<br>";

/*
formas diferentes de usar a funcao

1- qdt de dias uteis a contar apartir de uma data especifica ou fixa você pode passar a data direto nos paremetros da funcao
function somar_dias_uteis($str_data,$int_qtd_dias_somar = 7,$feriados)

chamando a funcao
somar_dias_uteis(‘09/04/2009’,’’,’’);
ou
$data = date(‘Y-m-d’);
somar_dias_uteis(’$data’,’’,’’);

2- nao precisa passar os dias como parametro da funcao tipo function somar_dias_uteis($str_data,$int_qtd_dias_somar,$feriados)
para chamar a funcao fica
somar_dias_uteis(‘09/04/2009’,‘4’,’’);
ou
$data = date(‘Y-m-d’);
somar_dias_uteis(’$data’,‘4’,’’);
*/

function somar_dias_uteis($str_data,$int_qtd_dias_somar,$feriados) {

// Caso seja informado uma data do MySQL do tipo DATETIME - aaaa-mm-dd 00:00:00
// Transforma para DATE - aaaa-mm-dd

$str_data = substr($str_data,0,10);

// Se a data estiver no formato brasileiro: dd/mm/aaaa
// Converte-a para o padrão americano: aaaa-mm-dd

if ( preg_match("@/@",$str_data) == 1 ) {

	$str_data = implode("-", array_reverse(explode("/",$str_data)));

}
	
// chama a funcao que calcula a pascoa	
$pascoa_dt = dataPascoa(date('Y'));
$aux_p = explode("/", $pascoa_dt);
$aux_dia_pas = $aux_p[0];
$aux_mes_pas = $aux_p[1];
$pascoa = "$aux_mes_pas"."-"."$aux_dia_pas"; // crio uma data somente como mes e dia


// chama a funcao que calcula o carnaval	
$carnaval_dt = dataCarnaval(date('Y'));
$aux_carna = explode("/", $carnaval_dt);
$aux_dia_carna = $aux_carna[0];
$aux_mes_carna = $aux_carna[1];
$carnaval = "$aux_mes_carna"."-"."$aux_dia_carna"; 


// chama a funcao que calcula corpus christi	
$CorpusChristi_dt = dataCorpusChristi(date('Y'));
$aux_cc = explode("/", $CorpusChristi_dt);
$aux_cc_dia = $aux_cc[0];
$aux_cc_mes = $aux_cc[1];
$Corpus_Christi = "$aux_cc_mes"."-"."$aux_cc_dia"; 


// chama a funcao que calcula a sexta feira santa	
$sexta_santa_dt = dataSextaSanta(date('Y'));
$aux = explode("/", $sexta_santa_dt);
$aux_dia = $aux[0];
$aux_mes = $aux[1];
$sexta_santa = "$aux_mes"."-"."$aux_dia"; 

$feriados = array(
// Janeiro
“01-01”, //Formato dos feriados mm-dd
“01-02”,
“01-03”,
“01-04”,
“01-05”,
“01-06”,
“01-07”,
“01-08”,
“01-09”,
“01-10”,
“01-11”,
“01-12”,
“01-13”,
“01-14”,
“01-15”,
“01-16”,
“01-17”,
“01-18”,
“01-19”,
“01-20”,

				//Fevereiro
				
				
				//Março
				"03-24",
				
				//Feriados 
				$carnaval, 
				$sexta_santa,
				$pascoa, 
				$Corpus_Christi,
				
				//Abril
				"04-21", 
				
				//Maio
				"05-01", 
				
				//Junho
				"06-12",
				"06-24",
				
				//Julho
				"07-09", 
				"07-16", 
				
				//Agosto
				
				//Setembro
				"09-07",
				
				//Outubro
				"10-12",
				
				//Novembro
				"11-02", 
				"11-15", 
				
				//Dezembro
				"12-20",
				"12-21",
				"12-22",
				"12-23",
				"12-24",
				"12-25", 
				"12-27",
				"12-26",
				"12-28",
				"12-29",
				"12-30",
				"12-31");


$array_data = explode('-', $str_data);
$count_days = 0;
$int_qtd_dias_uteis = 0;

while ($int_qtd_dias_uteis < $int_qtd_dias_somar) {

	$count_days++;
	$day = date('m-d',strtotime('+'.$count_days.'day',strtotime($str_data))); 
	
	if(($dias_da_semana = gmdate('w', strtotime('+'.$count_days.' day', gmmktime(0, 0, 0, $array_data[1], $array_data[2], $array_data[0]))) ) != '0' && $dias_da_semana != '6' && !in_array($day,$feriados))
	{
		$int_qtd_dias_uteis++;
	}
}
 return gmdate('d/m/Y',strtotime('+'.$count_days.' day',strtotime($str_data)));

}

// dataPascoa(ano, formato);
// Autor: Yuri Vecchi
//
// Funcao para o calculo da Pascoa
// Retorna o dia da pascoa no formato desejado ou false.
//
// ######################ATENCAO###########################
// Esta funcao sofre das limitacoes de data de mktime()!!!
// ########################################################
//
// Possui dois parametros, ambos opcionais
// ano = ano com quatro digitos
// Padrao: ano atual
// formato = formatacao da funcao date() http://br.php.net/date
// Padrao: d/m/Y

function dataPascoa($ano=false, $form=“d/m/Y”) {
$ano=$ano?$ano:date(“Y”);
if ($ano<1583) {
$A = ($ano % 4);
$B = ($ano % 7);
$C = ($ano % 19);
$D = ((19 * $C + 15) % 30);
$E = ((2 * $A + 4 * $B - $D + 34) % 7);
$F = (int)(($D + $E + 114) / 31);
$G = (($D + $E + 114) % 31) + 1;
return date($form, mktime(0,0,0,$F,$G,$ano));
}
else {
$A = ($ano % 19);
$B = (int)($ano / 100);
$C = ($ano % 100);
$D = (int)($B / 4);
$E = ($B % 4);
$F = (int)(($B + 8) / 25);
$G = (int)(($B - $F + 1) / 3);
$H = ((19 * $A + $B - $D - $G + 15) % 30);
$I = (int)($C / 4);
$K = ($C % 4);
$L = ((32 + 2 * $E + 2 * $I - $H - $K) % 7);
$M = (int)(($A + 11 * $H + 22 * $L) / 451);
$P = (int)(($H + $L - 7 * $M + 114) / 31);
$Q = (($H + $L - 7 * $M + 114) % 31) + 1;
return date($form, mktime(0,0,0,$P,$Q,$ano));
}
}

// dataCarnaval(ano, formato);
// Autor: Yuri Vecchi
//
// Funcao para o calculo do Carnaval
// Retorna o dia do Carnaval no formato desejado ou false.
//
// ######################ATENCAO###########################
// Esta funcao sofre das limitacoes de data de mktime()!!!
// ########################################################
//
// Possui dois parametros, ambos opcionais
// ano = ano com quatro digitos
// Padrao: ano atual
// formato = formatacao da funcao date() http://br.php.net/date
// Padrao: d/m/Y

function dataCarnaval($ano=false, $form=“d/m/Y”) {
$ano=$ano?$ano:date(“Y”);
$a=explode("/", dataPascoa($ano));
return date($form, mktime(0,0,0,$a[1],$a[0]-47,$a[2]));
}

// dataCorpusChristi(ano, formato);
// Autor: Yuri Vecchi
//
// Funcao para o calculo do Corpus Christi
// Retorna o dia do Corpus Christi no formato desejado ou false.
//
// ######################ATENCAO###########################
// Esta funcao sofre das limitacoes de data de mktime()!!!
// ########################################################
//
// Possui dois parametros, ambos opcionais
// ano = ano com quatro digitos
// Padrao: ano atual
// formato = formatacao da funcao date() http://br.php.net/date
// Padrao: d/m/Y

function dataCorpusChristi($ano=false, $form=“d/m/Y”) {
$ano=$ano?$ano:date(“Y”);
$a=explode("/", dataPascoa($ano));
return date($form, mktime(0,0,0,$a[1],$a[0]+60,$a[2]));
}

// dataSextaSanta(ano, formato);
// Autor: Yuri Vecchi
//
// Funcao para o calculo da Sexta-feira santa ou da Paixao.
// Retorna o dia da Sexta-feira santa ou da Paixao no formato desejado ou false.
//
// ######################ATENCAO###########################
// Esta funcao sofre das limitacoes de data de mktime()!!!
// ########################################################
//
// Possui dois parametros, ambos opcionais
// ano = ano com quatro digitos
// Padrao: ano atual
// formato = formatacao da funcao date() http://br.php.net/date
// Padrao: d/m/Y

function dataSextaSanta($ano=false, $form=“d/m/Y”) {
$ano=$ano?$ano:date(“Y”);
$a=explode("/", dataPascoa($ano));
return date($form, mktime(0,0,0,$a[1],$a[0]-2,$a[2]));
}

?>

[/code]

Ocorre que tenho uma tabela na base de dados com o nome de feriados, onde gostaria de passar os valores constantes da variável $feriados ao invés de passar diretamente dentro da array() na função.

Passando os valores na tabela feriados ficaria mais fácil para o usuário final informar quais o feriado de seu município para, então, função fazer o cálculo.

Contudo, não tenho conhecimento suficiente para fazer este comando dentro da função php, acho que seria através de um select em sql??? alguém poderia ajudar.

Desde já agradeço pela atenção dos colegas.

[b]Att.

Gilson[/b]

Você vai usar a macro: sc_select(dataset, “Comando SQL”, “Conexão”):
http://127.0.0.1:8081/scriptcase/doc/manual_mp/manual_mp.htm?item=28-Macros/00-macros_sc.htm

Para pegar os dias de feriados cadastrados por seu usuário, ai é só coloca-los dentro do array desta função que você já tem que vai dar tudo certo.

Bom dia, estou usando este comando:

include “conexao.inc”;

$sql="SELECT dia, mes FROM feriados WHERE ativo=1";
$res=mysqli_query($con,$sql);
while($vreg=mysqli_fetch_row($res)){
$DiaFer=$vreg[0];
$MesFer=$vreg[1];  
$feriado_tabela= "$MesFer"."-"."$DiaFer";
echo  "$feriado_tabela<br>";

Mas não estar dado certo, pois na função as datas é passada com string no seguinte format: “25-01” mes-dia.

Pelo que entendi o comando fetch_row retorna uma matriz númerica, quando deveria retornar uma matriz em string, então a função não lê corretamente os dados.

Alguém poderia ajudar.

Abra um tópico novo para um assunto novo.

Porque não usa as macros do scriptcase?

Você esta usando a ferramenta Scriptcase?

Se tiver basta ler e usar esta macro para fazer a carga dos dados:
Você vai usar a macro: sc_select(dataset, “Comando SQL”, “Conexão”):
http://127.0.0.1:8081/scriptcase/doc/manual_mp/manual_mp.htm?item=28-Macros/00-macros_sc.htm

Pelo código dele parece que nem esta usando Scriptcase, parece que esta usando o fórum para tirar uma dúvida de PHP usando em outra ferramenta.

Então esta no forum errado.

Bom dia.

Na verdade estou usando o scritpcase, mas como esta função foi gerado fora do scritpcase prefiro testar antes de colocar dentro do sistema.

Mas de qualquer forma muito obrigado pela ajuda Jailton, vou testar da maneira como sugeriu.

Desde já agradeço.

Gilson