Incrementar um mês numa data e salvar no banco de dados. Boa tarde. Estou desenvolvendo um sistema para emissão de boletos, mas infelizmente não estou conseguindo incrementar um mês na data de vencimento de um boleto para outro. Já tentei utilizar o método pelo exemplo aqui no fórum mas infelizmente não consegui enviar a data para o banco. Segue o código. ...
LC
Incrementar um mês numa data e salvar no banco de dados.  
Boa tarde.
Estou desenvolvendo um sistema para emissão de boletos, mas infelizmente não estou conseguindo incrementar um mês na data de vencimento de um boleto para outro. Já tentei utilizar o método pelo exemplo aqui no fórum mas infelizmente não consegui enviar a data para o banco. Segue o código.

 
  1. <?php
  2. /**
  3. * CadastroBoletos Form
  4. * @author Leildon S Carvalho
  5. */
  6. class CadastroBoletos extends TPage
  7. {
  8. protected $form; // form
  9. private $datagrid;
  10. /**
  11. * Form constructor
  12. * @param $param Request
  13. */
  14. public function __construct( $param )
  15. {
  16. parent::__construct();
  17. // creates the form
  18. $this->form = new TQuickForm('form_BoletosHonorarios');
  19. $this->form->class = 'tform'; // change CSS class
  20. $this->form->style = 'display: table;width:100%'; // change style
  21. // define the form title
  22. $this->form->setFormTitle('BoletosHonorarios');
  23. // create the form fields
  24. $id = new TEntry('id');
  25. //$idclienteboleto = new TEntry('idclienteboleto');
  26. $idclienteboleto = new ">TDBSeekButton('idclienteboleto','conexao','form_BoletosHonorarios','Clientes','NomeRazao','idclienteboleto','nomecliente');
  27. $nomecliente = new TEntry('nomecliente');
  28. $valor = new TEntry('valor');
  29. //$tipo = new TEntry('tipo');
  30. $dataemissao = new TDate('dataemissao');
  31. $datavencimento = new TDate('datavencimento');
  32. $numdocumento = new TEntry('numdocumento');
  33. $observacao = new TText('observacao');
  34. // add the fields
  35. $this->form->addQuickField('Id', $id, 100 );
  36. $this->form->addQuickFields('Cliente', array ($idclienteboleto, $nomecliente ));
  37. $this->form->addQuickField('Valor', $valor, 100 );
  38. //$this->form->addQuickField('Tipo', $tipo, 200 );
  39. $this->form->addQuickField('Emissão', $dataemissao, 80 );
  40. $this->form->addQuickField('Vencimento', $datavencimento, 80 );
  41. $this->form->addQuickField('Nº Documento', $numdocumento, 80 );
  42. $this->form->addQuickField('Observação', $observacao, 200);
  43. $nomecliente->setEditable(FALSE);
  44. $idclienteboleto->setSize(50);
  45. $nomecliente->setSize(400);
  46. if (!empty($id))
  47. {
  48. $id->setEditable(FALSE);
  49. }
  50. /** samples
  51. $this->form->addQuickFields('Date', array($date1, new TLabel('to'), $date2)); // side by side fields
  52. $fieldX->addValidation( 'Field X', new TRequiredValidator ); // add validation
  53. $fieldX->setSize( 100, 40 ); // set size
  54. **/
  55. // create the form actions
  56. $this->form->addQuickAction(_t('Save'), new TAction(array($this, 'onSave')), 'fa:floppy-o');
  57. $this->form->addQuickAction(_t('New'), new TAction(array($this, 'onClear')), 'bs:plus-sign green');
  58. //CRIA O DATAGRID QUE IRÁ MOSTRAR OS BOLETOS GERADOS
  59. $this->datagrid = new TQuickGrid;
  60. $this->datagrid->addQuickColumn('ID', 'id', 'center', 50);
  61. $this->datagrid->addQuickColumn('Nº Parcela', 'parcela', 'center', 100);
  62. $this->datagrid->addQuickColumn('Referência', 'referencia', 'right', 80);
  63. $this->datagrid->addQuickColumn('Vencimento', 'vencimento','center', 80);
  64. $this->datagrid->addQuickColumn('Valor', 'valor','rigth', 80);
  65. $this->datagrid->createModel();
  66. // vertical box container
  67. $container = new TVBox;
  68. $container->style = 'width: 90%';
  69. // $container->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
  70. $container->add($this->form);
  71. $container->add($this->datagrid);
  72. parent::add($container);
  73. }
  74. /**
  75. * Save form data
  76. * @param $param Request
  77. */
  78. public function onSave( $param )
  79. {
  80. try
  81. {
  82. TTransaction::open('conexao'); // open a transaction
  83. /**
  84. // Enable Debug logger for SQL operations inside the transaction
  85. TTransaction::setLogger(new TLoggerSTD); // standard output
  86. TTransaction::setLogger(new TLoggerTXT('log.txt')); // file
  87. **/
  88. //$this->form->validate(); // validate form data
  89. //$object = new BoletosHonorarios; // create an empty object
  90. //$data = $this->form->getData(); // get form data as array
  91. //$object->fromArray( (array) $data); // load the object with data
  92. //$object->store(); // save the object
  93. // get the generated id
  94. //$data->id = $object->id;
  95. //$this->form->setData($data); // fill form data
  96. //GERAÇÃO DE VÁRIOS BOLETOS
  97. $boleto = new BoletosHonorarios;
  98. $data = $this->form->getData(); // get form data as array
  99. $date = TDate::date2us(date($data->datavencimento));
  100. $date = new DateTime( $data );
  101. //$date = new TDate ('date');
  102. //$date->$data->datavencimento;
  103. $date->format('Y-m-d');
  104. for ($i=1;$i<=12;$i++){
  105. $boleto = new BoletosHonorarios;
  106. $boleto->idclienteboleto = $data->idclienteboleto;
  107. $boleto->valor = $data->valor;
  108. $boleto->tipo = 'C';
  109. $boleto->dataemissao = $data->dataemissao;
  110. $boleto->datavencimento = $date;
  111. $boleto->numdocumento = $data->numdocumento;
  112. $boleto->numparcela = $i.'/12';
  113. $boleto->status = 'A';
  114. $boleto->observacao = $data->observacao;
  115. $boleto->store();//salva o registro
  116. //INCREMENTA UM MÊS AO VENCIMENTO
  117. $date->add(new DateInterval('P1M'));
  118. }
  119. TTransaction::close(); // close the transaction
  120. //LIBERA AS VARIÁVEIS DA MEMÓRIA
  121. unset($date);
  122. new TMessage('info', TAdiantiCoreTranslator::translate('Record saved'));
  123. }
  124. catch (Exception $e) // in case of exception
  125. {
  126. new TMessage('error', $e->getMessage()); // shows the exception error message
  127. $this->form->setData( $this->form->getData() ); // keep form data
  128. TTransaction::rollback(); // undo all pending operations
  129. }
  130. }
  131. /**
  132. * Clear form data
  133. * @param $param Request
  134. */
  135. public function onClear( $param )
  136. {
  137. $this->form->clear(TRUE);
  138. }
  139. /**
  140. * Load object to form data
  141. * @param $param Request
  142. */
  143. public function onEdit( $param )
  144. {
  145. try
  146. {
  147. if (isset($param['key']))
  148. {
  149. $key = $param['key']; // get the parameter $key
  150. TTransaction::open('conexao'); // open a transaction
  151. $object = new BoletosHonorarios($key); // instantiates the Active Record
  152. $this->form->setData($object); // fill the form
  153. TTransaction::close(); // close the transaction
  154. }
  155. else
  156. {
  157. $this->form->clear(TRUE);
  158. }
  159. }
  160. catch (Exception $e) // in case of exception
  161. {
  162. new TMessage('error', $e->getMessage()); // shows the exception error message
  163. TTransaction::rollback(); // undo all pending operations
  164. }
  165. }
  166. }
  167. ?>

Curso Dominando o Adianti Framework

O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado!


Dominando o Adianti Framework Quero me inscrever agora!

Comentários (9)


LC

Com esse código está dando este erro: DateTime::__construct() expects parameter 1 to be string, object given
AC


Se for data da emissão +30 +60 +120... até completar um ano, tenta algo assim dentro do for:

$boleto->datavencimento = date('Y-m-d', strtotime( $data->dataemissao . '+'.$i.' months'));

Não li muito teu código, mas acho que tem que comentar a linha 124 porque já estava convertendo a data ali.
LC

Ainda está dando o erro DateTime::__construct() expects parameter 1 to be string, object given
NR

Ao criar o DateTime você deve passar a data em formato americano e não o objeto $data(contém todos os dados do formulário):
 
  1. <?php
  2. $date = TDate::date2us(date($data->datavencimento));
  3. //$date = new DateTime( $data );
  4. $date = new DateTime( $date );
  5. ?>

E dentro do loop, como $date é um objeto, precisa alterar o seguinte:
 
  1. <?php
  2. for ($i=1;$i<=12;$i++){
  3. ....
  4. //$boleto->datavencimento = $date;
  5. $boleto->datavencimento = $date->format('Y-m-d');
  6. $date->add(new DateInterval('P1M'));
  7. }
  8. ?>
LC

Fiz as alterações conforme abaixo:
<php
$data = $this->form->getData(); // get form data as array
$date = TDate::date2us(date($data->datavencimento));
$date = new DateTime( $date );
//$date = new TDate ($date);


for ($i=1;$i<=12;$i++){
$boleto = new BoletosHonorarios;
$boleto->idclienteboleto = $data->idclienteboleto;
$boleto->valor = $data->valor;
$boleto->tipo = 'C';
$boleto->dataemissao = $data->dataemissao;
$boleto->datavencimento = $date->format('Y-m-d');;
$boleto->numdocumento = $data->numdocumento;
$boleto->numparcela = $i.'/12';
$boleto->status = 'A';
$boleto->observacao = $data->observacao;
$boleto->store();//salva o registro

//INCREMENTA UM MÊS AO VENCIMENTO
$datev->add(new DateInterval('P1M'));
}
?>

Mas agora está aparecendo essa mensagem de erro: DateTime::__construct(): Failed to parse time string (1-31-7--20) at position 0 (1): Unexpected character
LC

Desculpe o código não ficou colorido

 
  1. <?php
  2. $data = $this->form->getData(); // get form data as array
  3. $date = TDate::date2us(date($data->datavencimento));
  4. $date = new DateTime( $date );
  5. //$date = new TDate ($date);
  6. for ($i=1;$i<=12;$i++){
  7. $boleto = new BoletosHonorarios;
  8. $boleto->idclienteboleto = $data->idclienteboleto;
  9. $boleto->valor = $data->valor;
  10. $boleto->tipo = 'C';
  11. $boleto->dataemissao = $data->dataemissao;
  12. $boleto->datavencimento = $date->format('Y-m-d');;
  13. $boleto->numdocumento = $data->numdocumento;
  14. $boleto->numparcela = $i.'/12';
  15. $boleto->status = 'A';
  16. $boleto->observacao = $data->observacao;
  17. $boleto->store();//salva o registro
  18. //INCREMENTA UM MÊS AO VENCIMENTO
  19. $datev->add(new DateInterval('P1M'));
  20. }
  21. ?>

ES

Como precisamos utilizar muito esse tipo de método sempre procuro criar fora do código principal para poder utilizar em separado.
Criei uma classe onde coloco todos os métodos que preciso para uso geral. Não vou passar todas mas segue as que vc precisa:
 
  1. <?php
  2. /**
  3. * general_functions:
  4. * Classe desenvolvida para abrigar todas as funções necessárias ao desenvolvimento de sistemas
  5. * que não são contempladas em outras classes
  6. * @version 1.0
  7. * @package widget_web
  8. * @subpackage form
  9. * @author Eliezer de Morais Silva
  10. */
  11. class general_functions
  12. {
  13. /**
  14. * SOMA N dias a uma determinada data e retorna a data já formatada no formato dd/mm/yyyy
  15. * informar data no formato americano
  16. */
  17. public static function SomaNdias($dataIni,$nDias){
  18. return date('d/m/Y', strtotime("+{$nDias} days",strtotime($dataIni)));
  19. }
  20. public static function somar_dias_uteis($str_data,$int_qtd_dias_somar=5) {
  21. // Caso seja informado uma data do MySQL do tipo DATETIME - aaaa-mm-dd 00:00:00
  22. // Transforma para DATE - aaaa-mm-dd
  23. $str_data = substr($str_data,0,10);
  24. // Se a data estiver no formato brasileiro: dd/mm/aaaa
  25. // Converte-a para o padrão americano: aaaa-mm-dd
  26. if ( preg_match("@/@",$str_data) == 1 ) {
  27. $str_data = implode("-", array_reverse(explode("/",$str_data)));
  28. }
  29. // chama a funcao que calcula a pascoa
  30. $pascoa_dt =general_functions::dataPascoa(date('Y'));
  31. $aux_p = explode("/", $pascoa_dt);
  32. $aux_dia_pas = $aux_p[0];
  33. $aux_mes_pas = $aux_p[1];
  34. $pascoa = "$aux_mes_pas"."-"."$aux_dia_pas"; // crio uma data somente como mes e dia
  35. // chama a funcao que calcula o carnaval
  36. $carnaval_dt =general_functions::dataCarnaval(date('Y'));
  37. $aux_carna = explode("/", $carnaval_dt);
  38. $aux_dia_carna = $aux_carna[0];
  39. $aux_mes_carna = $aux_carna[1];
  40. $carnaval = "$aux_mes_carna"."-"."$aux_dia_carna";
  41. // chama a funcao que calcula corpus christi
  42. $CorpusChristi_dt =general_functions::dataCorpusChristi(date('Y'));
  43. $aux_cc = explode("/", $CorpusChristi_dt);
  44. $aux_cc_dia = $aux_cc[0];
  45. $aux_cc_mes = $aux_cc[1];
  46. $Corpus_Christi = "$aux_cc_mes"."-"."$aux_cc_dia";
  47. // chama a funcao que calcula a sexta feira santa
  48. $sexta_santa_dt =general_functions::dataSextaSanta(date('Y'));
  49. $aux = explode("/", $sexta_santa_dt);
  50. $aux_dia = $aux[0];
  51. $aux_mes = $aux[1];
  52. $sexta_santa = "$aux_mes"."-"."$aux_dia";
  53. $feriados = array("01-01", $carnaval, $sexta_santa, $pascoa, $Corpus_Christi, "04-21", "05-01", "06-12" ,"07-09", "07-16", "09-07", "10-12", "11-02", "11-15","11-30", "12-24", "12-25", "12-31");
  54. $array_data = explode('-', $str_data);
  55. $count_days = 0;
  56. $int_qtd_dias_uteis = 0;
  57. while ( $int_qtd_dias_uteis < $int_qtd_dias_somar ) {
  58. $count_days++;
  59. $day = date('m-d',strtotime('+'.$count_days.'day',strtotime($str_data)));
  60. 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)) {
  61. $int_qtd_dias_uteis++;
  62. }
  63. }
  64. return gmdate('d/m/Y',strtotime('+'.$count_days.' day',strtotime($str_data)));
  65. }
  66. // dataPascoa(ano, formato);
  67. // Autor: Yuri Vecchi
  68. //
  69. // Funcao para o calculo da Pascoa
  70. // Retorna o dia da pascoa no formato desejado ou false.
  71. //
  72. // ######################ATENCAO###########################
  73. // Esta funcao sofre das limitacoes de data de mktime()!!!
  74. // ########################################################
  75. //
  76. // Possui dois parametros, ambos opcionais
  77. // ano = ano com quatro digitos
  78. // Padrao: ano atual
  79. // formato = formatacao da funcao date() http://br.php.net/date
  80. // Padrao: d/m/Y
  81. public static function dataPascoa($ano=false, $form="d/m/Y") {
  82. $ano=$ano?$ano:date("Y");
  83. if ($ano<1583) {
  84. $A = ($ano % 4);
  85. $B = ($ano % 7);
  86. $C = ($ano % 19);
  87. $D = ((19 * $C + 15) % 30);
  88. $E = ((2 * $A + 4 * $B - $D + 34) % 7);
  89. $F = (int)(($D + $E + 114) / 31);
  90. $G = (($D + $E + 114) % 31) + 1;
  91. return date($form, mktime(0,0,0,$F,$G,$ano));
  92. }
  93. else {
  94. $A = ($ano % 19);
  95. $B = (int)($ano / 100);
  96. $C = ($ano % 100);
  97. $D = (int)($B / 4);
  98. $E = ($B % 4);
  99. $F = (int)(($B + 8) / 25);
  100. $G = (int)(($B - $F + 1) / 3);
  101. $H = ((19 * $A + $B - $D - $G + 15) % 30);
  102. $I = (int)($C / 4);
  103. $K = ($C % 4);
  104. $L = ((32 + 2 * $E + 2 * $I - $H - $K) % 7);
  105. $M = (int)(($A + 11 * $H + 22 * $L) / 451);
  106. $P = (int)(($H + $L - 7 * $M + 114) / 31);
  107. $Q = (($H + $L - 7 * $M + 114) % 31) + 1;
  108. return date($form, mktime(0,0,0,$P,$Q,$ano));
  109. }
  110. }
  111. // dataCarnaval(ano, formato);
  112. // Autor: Yuri Vecchi
  113. //
  114. // Funcao para o calculo do Carnaval
  115. // Retorna o dia do Carnaval no formato desejado ou false.
  116. //
  117. // ######################ATENCAO###########################
  118. // Esta funcao sofre das limitacoes de data de mktime()!!!
  119. // ########################################################
  120. //
  121. // Possui dois parametros, ambos opcionais
  122. // ano = ano com quatro digitos
  123. // Padrao: ano atual
  124. // formato = formatacao da funcao date() http://br.php.net/date
  125. // Padrao: d/m/Y
  126. public static function dataCarnaval($ano=false, $form="d/m/Y") {
  127. $ano=$ano?$ano:date("Y");
  128. $a=explode("/",general_functions::dataPascoa($ano));
  129. return date($form, mktime(0,0,0,$a[1],$a[0]-47,$a[2]));
  130. }
  131. // dataCorpusChristi(ano, formato);
  132. // Autor: Yuri Vecchi
  133. //
  134. // Funcao para o calculo do Corpus Christi
  135. // Retorna o dia do Corpus Christi no formato desejado ou false.
  136. //
  137. // ######################ATENCAO###########################
  138. // Esta funcao sofre das limitacoes de data de mktime()!!!
  139. // ########################################################
  140. //
  141. // Possui dois parametros, ambos opcionais
  142. // ano = ano com quatro digitos
  143. // Padrao: ano atual
  144. // formato = formatacao da funcao date() http://br.php.net/date
  145. // Padrao: d/m/Y
  146. public static function dataCorpusChristi($ano=false, $form="d/m/Y") {
  147. $ano=$ano?$ano:date("Y");
  148. $a=explode("/",general_functions::dataPascoa($ano));
  149. return date($form, mktime(0,0,0,$a[1],$a[0]+60,$a[2]));
  150. }
  151. // dataSextaSanta(ano, formato);
  152. // Autor: Yuri Vecchi
  153. //
  154. // Funcao para o calculo da Sexta-feira santa ou da Paixao.
  155. // Retorna o dia da Sexta-feira santa ou da Paixao no formato desejado ou false.
  156. //
  157. // ######################ATENCAO###########################
  158. // Esta funcao sofre das limitacoes de data de mktime()!!!
  159. // ########################################################
  160. //
  161. // Possui dois parametros, ambos opcionais
  162. // ano = ano com quatro digitos
  163. // Padrao: ano atual
  164. // formato = formatacao da funcao date() http://br.php.net/date
  165. // Padrao: d/m/Y
  166. public static function dataSextaSanta($ano=false, $form="d/m/Y") {
  167. $ano=$ano?$ano:date("Y");
  168. $a=explode("/",general_functions::dataPascoa($ano));
  169. return date($form, mktime(0,0,0,$a[1],$a[0]-2,$a[2]));
  170. }
  171. }
  172. ?>
JA

Aproveitando... qual biblioteca está utilizado para gerar os boletos ?
Já está atualizada para funcionar com o registro dos boletos emitidos?
Qual biblioteca utiliza para tratar os retornos ?
LC

Consegui resolver usando o código
 
  1. <?php
  2. for ($i=0;$i<=11;$i++){
  3. $boleto = new BoletosHonorarios;
  4. $boleto->idclienteboleto = $data->idclienteboleto;
  5. $boleto->valor = $data->valor;
  6. $boleto->tipo = 'C';
  7. $boleto->dataemissao = $data->dataemissao;
  8. $boleto->datavencimento = date('Y-m-d', strtotime("+{$i} months",strtotime($data->datavencimento)));
  9. //$boleto->datavencimento = SomaNmeses($data->datavencimento, $i);
  10. $boleto->numdocumento = $data->numdocumento;
  11. $boleto->numparcela = ($i+1).'/12';
  12. $boleto->status = 'A';
  13. $boleto->observacao = $data->observacao;
  14. $boleto->store();//salva o registro
  15. //INCREMENTA UM MÊS AO VENCIMENTO
  16. //$datev->add(new DateInterval('P1M'));
  17. }
  18. ?>

Obrigado a todos.
Júnior, por enquanto ele só gera boletos estilo carnê. Ainda não utilizo o boleto bancário mas futuramente vou implantar. O pessoal usa muito essa biblioteca boletophp.com.br/