Vencimentos com dias mantidos

O codigo abaixo criei para usar em um contas a pagar onde se for mais de uma parcela ele lançara as outras paracelas altomaticamente mantendo o dia do vencimento.

Gostaria de saber de todos uma forma mais simples.

$datatime = date(‘Y-m-d h:i:s’); //pega data hora

if({quantidade_parcelas} >= 2){ // verifica se quantidade de parcelas é maior que 1
$data = {data_competencia}; // data da emissão do boleto ou documento
$calc = 0; // inicializando variavel CALC
$j = 1; // inicializando variavel J
sc_lookup(Dataset, “SELECT forma FROM forma_pagamento WHERE id = {forma_parcelamento}”); /* buncando id da forma de pagamento ex: parcelado 30 dias id 1, parcelado 30,60 dias id 2 …

 $qt_parcela = explode(",", {Dataset[0][0]}); explode dataset para pegar mês

foreach($qt_parcela as $key => $val){
if($key == 0){
$calc = $val;
}else{
$calc = $val - $qt_parcela[$key-1];
}
function calculaData($calcula, $qtd_dias, $dtd){// função verifica e calcula data
if($calcula < 30){
$dtd = sc_date($dtd, “aaaa-mm-dd”, "+ ", $calcula, 0, 0);
}else{
$dtd = sc_date($dtd, “aaaa-mm-dd”, "+ ", $qtd_dias, 0, 0);
}
return $dtd;
}

$dt = explode("-", $data);

switch ($dt[1]) {
//mes janeiro 31 dias
case 1:
$data = calculaData($calc, 31,$data);
break ;
//mes fevereiro 29 ou 28 dias
case 2:
// ano 366
if($dt[0]%4){
$data = calculaData($calc, 28,$data);
}//ano 365
else{
$data = calculaData($calc, 29,$data);

}

break ;
// mes março 31 dias
case 3:
$data = calculaData($calc, 31,$data);

break ;
// mes abril 30 dias
case 4:
$data = calculaData($calc, 30,$data);
break ;
// mes maio 31 dias
case 5:
$data = calculaData($calc, 31,$data);
break ;
// mes junho 30 dias
case 6:
$data = calculaData($calc, 30,$data);
break ;
// mes julho 31 dias
case 7:
$data = calculaData($calc, 31,$data);
break ;
// mes agosto 31 dias
case 8:
$data = calculaData($calc, 31,$data);
break ;
//mes setembro 30 dias
case 9:
$data = calculaData($calc, 30,$data);
break ;
//mes outubro 31 dias
case 10:
$data = calculaData($calc, 31,$data);
break ;
//mes novembro 30 dias
case 11:
$data = calculaData($calc, 30,$data);
break ;
//mes dezembro 31 dias
case 12:
$data = calculaData($calc, 31,$data);
break ;

}
if($key != 0){//função calcula data para arredondar
//---------------------------------------------------------------------
$j = $j + 1;
$parcela = $j.’/’.{quantidade_parcelas};
sc_exec_sql(“INSERT INTO contas(
data_criacao,
data_atualizacao,
user,
cod_parcelamento,
movimento,
tipo_ffc,
fornecedor_cliente,
documento,
data_competencia,
total_pagar,
forma_pagamento,
quantidade_parcelas,
forma_parcelamento,
categoria,
parcela,
data_vencimento,
valor_pagar,
conta,
manter_vencimento,
obs,
cheque
)VALUES (
‘$datatime’,
‘$datatime’,
‘[usr_login]’,
{id},
2,
1,
{fornecedor_cliente},
‘{documento}’,
‘{data_competencia}’,
{total_pagar},
{forma_pagamento},
{quantidade_parcelas},
{forma_parcelamento},
{categoria},
‘$parcela’,
‘$data’,
{valor_pagar},
{conta},
{manter_vencimento},
‘{obs}’,
{cheque})”);
}
}

	}

A maneira mais simples é usar a função mktime():

Eu particularmente uso e abuso dessa função.
Retorna parcelas com dias fixos, eu posso fixar um dia, meses, calcula anos bissextos etc.

$var_vencimento = date(‘Ymd’, mktime(0, 0, 0, $mes+$parc, $dia, $ano));

Att,
Paulo.

Pra quem sabe de TRIGGERs, Procedures , Functions no Banco de Dados fica ainda mais facil

//onafterinsert
if ({ParcelaNroTotal}>1){
  $_exec="CALL parcelas_contas_pagar ({id_fornecedor},'{numero_documento}')";	
  sc_exec_sql($_exec);
}

stored_proceure;

BEGIN
DECLARE var_aux INT(11);
DECLARE var_id_contas_pagar INT(11);
DECLARE var_data_conta DATE;
DECLARE var_descricao VARCHAR(255);
DECLARE var_id_conta_caixa VARCHAR(32); 
DECLARE var_id_centro_custo VARCHAR(16);
DECLARE var_id_job VARCHAR(15);
DECLARE var_sem_duplicata CHAR(1);
DECLARE var_previsao CHAR(1);
DECLARE var_data_vencimento DATE; 
DECLARE var_multa_percentual DECIMAL(8,4);
DECLARE var_juros_diarios_valor DECIMAL(14,2);
DECLARE var_juros_diarios_perc DECIMAL (8,4);
DECLARE var_valor DECIMAL(14,2);
DECLARE var_desconto_valor DECIMAL(14,2);
DECLARE var_desconto_ate_data DATE;
DECLARE var_portador INT(11);
DECLARE var_data_pgto DATE;
DECLARE var_caixa_pgto VARCHAR(32);
DECLARE var_banco_pgto INT(11);
DECLARE var_agencia_pgto VARCHAR(16);
DECLARE var_notas TEXT;
DECLARE var_cheque_pgto VARCHAR(10);
DECLARE var_valor_pgto DECIMAL (14,4);
DECLARE var_juros_pagos_pgto DECIMAL (14,2);
DECLARE var_multa_pgto DECIMAL(8,4);
DECLARE var_desconto_pgto DECIMAL (14,2);
DECLARE var_conta_bancaria_pgto VARCHAR(32);
DECLARE var_NegocioId INT(10);
DECLARE var_EmpresaId INT(10);
DECLARE var_ParcelaNro INT(11);
DECLARE var_ParcelaNroTotal INT(11);
DECLARE var_ParcelaPeriodicidade VARCHAR(1);
DECLARE var_mes INT(2);
DECLARE cursor1 CURSOR FOR SELECT 
  id_contas_pagar, data_conta, descricao, id_conta_caixa, id_centro_custo, id_job, sem_duplicata, previsao, data_vencimento, 
  multa_percentual, juros_diarios_valor, juros_diarios_perc, valor, desconto_valor, desconto_ate_data, portador, data_pgto, 
  caixa_pgto, banco_pgto, agencia_pgto, notas, cheque_pgto, valor_pgto, juros_pagos_pgto, multa_pgto, desconto_pgto, 
  conta_bancaria_pgto, NegocioId, EmpresaId, ParcelaNro, ParcelaNroTotal, ParcelaPeriodicidade
  FROM nm_contas_pagar WHERE id_fornecedor = var_idfornec and numero_documento = var_documento ORDER BY id_contas_pagar DESC LIMIT 1;
  
OPEN cursor1;
  FETCH cursor1 INTO var_id_contas_pagar, var_data_conta, var_descricao, var_id_conta_caixa, 
  var_id_centro_custo, var_id_job, var_sem_duplicata, var_previsao, var_data_vencimento, 
  var_multa_percentual, var_juros_diarios_valor, var_juros_diarios_perc, var_valor, 
  var_desconto_valor, var_desconto_ate_data, var_portador, var_data_pgto, var_caixa_pgto, 
  var_banco_pgto, var_agencia_pgto, var_notas, var_cheque_pgto, var_valor_pgto, 
  var_juros_pagos_pgto, var_multa_pgto, var_desconto_pgto, var_conta_bancaria_pgto, 
  var_NegocioId, var_EmpresaId, var_ParcelaNro, var_ParcelaNroTotal, 
  var_ParcelaPeriodicidade;
CLOSE cursor1;
  
  SET var_aux = var_ParcelaNro + 1;
  IF (var_ParcelaNroTotal > 0) THEN
     SET var_mes = 1;
     WHILE var_aux <= var_ParcelaNroTotal DO
	     INSERT INTO  nm_contas_pagar
         (data_conta, descricao, id_conta_caixa, id_centro_custo, id_fornecedor, id_job, numero_documento,
         sem_duplicata, previsao, data_vencimento, multa_percentual, juros_diarios_valor, juros_diarios_perc, valor, desconto_valor, 
         desconto_ate_data, portador, data_pgto, caixa_pgto, banco_pgto, agencia_pgto, notas, cheque_pgto, valor_pgto, juros_pagos_pgto, 
          multa_pgto, desconto_pgto, conta_bancaria_pgto, NegocioId, EmpresaId, ParcelaNro, ParcelaNroTotal, ParcelaPeriodicidade) 
         VALUES (var_data_conta, var_descricao, var_id_conta_caixa, 
          var_id_centro_custo, var_idfornec, var_id_job, CONCAT(var_documento,'/',var_aux), var_sem_duplicata, var_previsao, (SELECT INTERVAL var_mes MONTH + var_data_vencimento), 
         var_multa_percentual, var_juros_diarios_valor, var_juros_diarios_perc, var_valor, 
         var_desconto_valor, var_desconto_ate_data, var_portador, var_data_pgto, var_caixa_pgto, 
         var_banco_pgto, var_agencia_pgto, var_notas, var_cheque_pgto, var_valor_pgto, 
         var_juros_pagos_pgto, var_multa_pgto, var_desconto_pgto, var_conta_bancaria_pgto, 
         var_NegocioId, var_EmpresaId, var_aux, var_ParcelaNroTotal, 
         var_ParcelaPeriodicidade);
         SET var_aux = var_aux + 1;
	       SET var_mes = var_mes + 1;
     END WHILE;
	   UPDATE nm_contas_pagar SET numero_documento = CONCAT(numero_documento,'/',ParcelaNro) WHERE id_contas_pagar = var_id_contas_pagar;
  END IF;
 


END

No formulário é inserido a primeira parcela.
Após sua inserção se for mais de uma parcela, é chamada a SP passando com chave o id do fornecedor é número do documento
A SP localiza o registro já inserido no contas a pagar e insere a parcelas restantes.
A SP altera a parcela inicial para o docimento/'número da parcela inicial.

Parece grande por ter muitos campos a tabela, mas a lógica é muito simples.