public static function getFavorecidosTitularesByCodLancamentoFinanceiro()
 {
     $dao = new FavorecidoTitularLancamentoFinanceiroDao();
     $items = $dao->getFavorecidosTitularesByCodLancamentoFinanceiro($_GET);
     if ($items) {
         Flight::json($items);
     } else {
         Flight::halt(404, 'Nenhum lançamento encontrado.');
     }
 }
 private static function processSaveLancamentoFinanceiro($lanFinTO, $cod_lancamento_pai = null, $num_parcela_processar = 0, $statusCode = 200, $successMessage = "Lançamento registrado com sucesso!")
 {
     if (!$lanFinTO->flg_lancamento_recorrente || $lanFinTO->flg_lancamento_recorrente && $num_parcela_processar < (int) $lanFinTO->qtd_parcelas) {
         $lanFinDao = new LancamentoFinanceiroDao();
         /*if(!$lanFinTO->cod_lancamento_financeiro && $lanFinTO->flg_lancamento_recorrente) { // É novo lançamento recorrente?
         			if($num_parcela_processar == 0) { // É a primeira parcela?
         				$lanFinTO->dsc_lancamento = $lanFinTO->dsc_lancamento ." (1/". $lanFinTO->qtd_parcelas .")";
         			}
         			else if($num_parcela_processar > 0) {
         				$lanFinTO->dsc_lancamento = substr($lanFinTO->dsc_lancamento, 0, strlen($lanFinTO->dsc_lancamento)-6)	." (". ($num_parcela_processar+1) ."/". $lanFinTO->qtd_parcelas .")";
         			}
         		}*/
         if (!$lanFinTO->cod_lancamento_financeiro) {
             $statusCode = 201;
             $successMessage = 'Lançamento registrado com sucesso!';
             // Grava o lançamento financeiro
             $lanFinTO->cod_lancamento_financeiro = $lanFinDao->saveLancamentoFinanceiro($lanFinTO);
             if (!$lanFinTO->cod_lancamento_financeiro != '') {
                 Flight::halt(500, 'Erro ao registrar lançamento.');
             }
         } else {
             $statusCode = 200;
             $successMessage = 'Lançamento atualizado com sucesso!';
             if (!$lanFinDao->updateLancamentoFinanceiro($lanFinTO)) {
                 Flight::halt(500, 'Erro ao atualizar lançamento.');
             }
         }
         if ($lanFinTO->cod_lancamento_financeiro) {
             // Só se já tiver gravado o lançamento financeiro
             // Grava os favorecidos/titulares do movimento
             if ($_POST['flg_lancamento_aberto'] === "true") {
                 // Se o lançamento for rateado...
                 $favorecidos = $_POST['favorecidos'];
                 foreach ($favorecidos as $key => $favorecidoItem) {
                     $favTitLanFinTO = new FavorecidoTitularLancamentoFinanceiroTO();
                     $favTitLanFinTO->cod_favorecido_lancamento_financeiro = isset($favorecidoItem['cod_favorecido_lancamento_financeiro']) ? $favorecidoItem['cod_favorecido_lancamento_financeiro'] : null;
                     $favTitLanFinTO->cod_lancamento_financeiro = $lanFinTO->cod_lancamento_financeiro;
                     $favTitLanFinTO->vlr_correspondente = $favorecidoItem['vlr_correspondente'];
                     $favTitLanFinTO->dsc_observacao_adicional = isset($favorecidoItem['dsc_observacao_adicional']) ? $favorecidoItem['dsc_observacao_adicional'] : "";
                     $favTitLanFinTO->cod_origem_correspondente = isset($favorecidoItem['cod_origem_correspondente']) ? $favorecidoItem['cod_origem_correspondente'] : "";
                     switch ($favorecidoItem['favorecido']['type']) {
                         case 'empresas':
                             $favTitLanFinTO->cod_favorecido_fornecedor = $favorecidoItem['favorecido']['data']['cod_empresa'];
                             break;
                         case 'colaboradores':
                             $favTitLanFinTO->cod_favorecido_colaborador = $favorecidoItem['favorecido']['data']['cod_colaborador'];
                             break;
                         case 'terceiros':
                             $favTitLanFinTO->cod_favorecido_terceiro = $favorecidoItem['favorecido']['data']['cod_terceiro'];
                             break;
                     }
                     switch ($favorecidoItem['titularMovimento']['type']) {
                         case 'empresas':
                             $favTitLanFinTO->cod_titular_fornecedor = $favorecidoItem['titularMovimento']['data']['cod_empresa'];
                             break;
                         case 'colaboradores':
                             $favTitLanFinTO->cod_titular_colaborador = $favorecidoItem['titularMovimento']['data']['cod_colaborador'];
                             break;
                         case 'terceiros':
                             $favTitLanFinTO->cod_titular_terceiro = $favorecidoItem['titularMovimento']['data']['cod_terceiro'];
                             break;
                     }
                     $favTitLanFinDAO = new FavorecidoTitularLancamentoFinanceiroDao();
                     if (!$favTitLanFinTO->cod_favorecido_lancamento_financeiro) {
                         // insert
                         if (!$favTitLanFinDAO->saveFavorecidoTitularLancamentoFinanceiro($favTitLanFinTO)) {
                             Flight::halt(500, 'Erro ao associar Favorecido/Titular do Movimento ao Lançamento');
                         }
                     } else {
                         if ($favTitLanFinTO->cod_favorecido_lancamento_financeiro && $favorecidoItem['flg_removido'] == "false") {
                             // update
                             if (!$favTitLanFinDAO->updateFavorecidoTitularLancamentoFinanceiro($favTitLanFinTO)) {
                                 Flight::halt(500, 'Erro ao atualizar Favorecido/Titular do Movimento');
                             }
                         } else {
                             if ($favTitLanFinTO->cod_favorecido_lancamento_financeiro && $favorecidoItem['flg_removido'] == "true") {
                                 // delete
                                 if (!$favTitLanFinDAO->deleteFavorecidoTitularLancamentoFinanceiro($favTitLanFinTO)) {
                                     Flight::halt(500, 'Erro ao excluir Favorecido/Titular do Movimento!');
                                 }
                             }
                         }
                     }
                 }
             } else {
                 // Se não...
                 $favTitLanFinTO = new FavorecidoTitularLancamentoFinanceiroTO();
                 $favTitLanFinTO->cod_lancamento_financeiro = $lanFinTO->cod_lancamento_financeiro;
                 $favTitLanFinTO->vlr_correspondente = $lanFinTO->vlr_realizado != "" ? $lanFinTO->vlr_realizado : $lanFinTO->vlr_previsto;
                 $favTitLanFinTO->dsc_observacao_adicional = $lanFinTO->dsc_observacao;
                 $favTitLanFinTO->cod_origem_correspondente = $lanFinTO->cod_origem_despesa;
                 if (isset($_POST['favorecido'])) {
                     switch ($_POST['favorecido']['type']) {
                         case 'empresas':
                             $favTitLanFinTO->cod_favorecido_fornecedor = $_POST['favorecido']['data']['cod_empresa'];
                             break;
                         case 'colaboradores':
                             $favTitLanFinTO->cod_favorecido_colaborador = $_POST['favorecido']['data']['cod_colaborador'];
                             break;
                         case 'terceiros':
                             $favTitLanFinTO->cod_favorecido_terceiro = $_POST['favorecido']['data']['cod_terceiro'];
                             break;
                     }
                 }
                 if (isset($_POST['titularMovimento'])) {
                     switch ($_POST['titularMovimento']['type']) {
                         case 'empresas':
                             $favTitLanFinTO->cod_titular_fornecedor = $_POST['titularMovimento']['data']['cod_empresa'];
                             break;
                         case 'colaboradores':
                             $favTitLanFinTO->cod_titular_colaborador = $_POST['titularMovimento']['data']['cod_colaborador'];
                             break;
                         case 'terceiros':
                             $favTitLanFinTO->cod_titular_terceiro = $_POST['titularMovimento']['data']['cod_terceiro'];
                             break;
                     }
                 }
                 $favTitLanFinDAO = new FavorecidoTitularLancamentoFinanceiroDao();
                 if ($statusCode == 201) {
                     // insert
                     if (!$favTitLanFinDAO->saveFavorecidoTitularLancamentoFinanceiro($favTitLanFinTO)) {
                         Flight::halt(500, 'Erro ao associar Favorecido/Titular do Movimento ao Lançamento');
                     }
                 } else {
                     if ($statusCode == 200) {
                         // update
                         if (!$favTitLanFinDAO->updateFavorecidoTitularLancamentoFinanceiro($favTitLanFinTO)) {
                             Flight::halt(500, 'Erro ao atualizar Favorecido/Titular do Movimento');
                         }
                     }
                 }
             }
             if ($_POST['flg_lancamento_recorrente'] === "true" || $_POST['flg_lancamento_recorrente'] === "1") {
                 // Se o lançamento for parcelado...
                 $addMoreItems = true;
                 if ($statusCode == 201 && $cod_lancamento_pai == null && ($lanFinTO->cod_lancamento_pai == "" || $lanFinTO->cod_lancamento_pai == null || $lanFinTO->cod_lancamento_pai == "NULL")) {
                     // é um novo registro
                     $cod_lancamento_pai = $lanFinTO->cod_lancamento_financeiro;
                 } else {
                     if ($statusCode == 200) {
                         // esta atualizando
                         $addMoreItems = false;
                         /*$cod_lancamento_pai = $lanFinTO->cod_lancamento_pai;
                         						if(!$cod_lancamento_pai)
                         							$cod_lancamento_pai = $lanFinTO->cod_lancamento_financeiro;
                         
                         						$filtro = array('nolimit'=>'1', 'cod_lancamento_financeiro' => array('exp' => "=". $lanFinTO->cod_lancamento_financeiro ." OR cod_lancamento_pai=". $cod_lancamento_pai ." OR cod_lancamento_financeiro=". $cod_lancamento_pai));
                         						$itensAssociados = $lanFinDao->getLancamentosFinanceiros($filtro)['rows'];
                         
                         						if((int)$lanFinTO->qtd_parcelas > count($itensAssociados)) { // se aumentou a quantidade de parcelas...
                         							foreach ($itensAssociados as $index => $value) {
                         								$lanFinDao->atualizaQtdParcelasLancamentoFinanceiro(
                         										$lanFinTO->qtd_parcelas, 
                         										$lanFinTO->vlr_orcado, 
                         										$lanFinTO->vlr_previsto, 
                         										$lanFinTO->vlr_realizado, 
                         										$value['cod_lancamento_financeiro']);
                         							}
                         
                         							$lanFinTO->dta_vencimento = $itensAssociados[count($itensAssociados)-1]['dta_vencimento']; // pego a data de vencimento do último lançamento
                         							$num_parcela_processar = count($itensAssociados)-1;
                         						}
                         						else if((int)$lanFinTO->qtd_parcelas < count($itensAssociados)) { // se diminuiu a quantidade de parcelas
                         							$addMoreItems = false;
                         							
                         							foreach ($itensAssociados as $index => $value) {
                         								$lanFinDao->atualizaQtdParcelasLancamentoFinanceiro(
                         										$lanFinTO->qtd_parcelas, 
                         										$lanFinTO->vlr_orcado, 
                         										$lanFinTO->vlr_previsto, 
                         										$lanFinTO->vlr_realizado, 
                         										$value['cod_lancamento_financeiro']);
                         							}
                         
                         							$countItemsToDelete = count($itensAssociados) - (int)$lanFinTO->qtd_parcelas;
                         							$countDelete = 0;
                         							for ($i=count($itensAssociados); $i > 0; $i--) { 
                         								if($countDelete < $countItemsToDelete) {
                         									$lanFinDao->deleteLancamentoFinanceiro($itensAssociados[$i-1]['cod_lancamento_financeiro'], null, 'NULL', false);
                         									$countDelete++;
                         								}
                         								else
                         									break;
                         							}
                         						}*/
                     }
                 }
                 if ($addMoreItems) {
                     $lanFinTO->cod_lancamento_financeiro = null;
                     $lanFinTO->cod_lancamento_pai = $cod_lancamento_pai;
                     if ((int) $lanFinTO->qtd_dias_recorrencia != 30) {
                         $date = new DateTime(str_replace("'", "", $lanFinTO->dta_vencimento));
                         $date->add(new DateInterval('P' . $lanFinTO->qtd_dias_recorrencia . 'D'));
                         $lanFinTO->dta_vencimento = $date->format('Y-m-d');
                     } else {
                         $lanFinTO->dta_vencimento = geraDataProximoMes(str_replace("'", "", $lanFinTO->dta_vencimento));
                     }
                     $lanFinTO->dta_competencia = "";
                     $lanFinTO->dta_emissao = "";
                     $lanFinTO->dta_pagamento = "";
                     $lanFinTO->num_nota_fatura = "";
                     $lanFinTO->num_documento_banco = "";
                     $lanFinTO->num_lancamento_contabil = "";
                     $lanFinTO->vlr_realizado = null;
                     $lanFinTO->vlr_previsto = null;
                     $lanFinTO->vlr_juros = null;
                     $lanFinTO->vlr_desconto = null;
                     $num_parcela_processar++;
                     LancamentoFinanceiroController::processSaveLancamentoFinanceiro($lanFinTO, $cod_lancamento_pai, $num_parcela_processar, $statusCode, $successMessage);
                 }
             }
         }
     } else {
         Flight::halt($statusCode, $successMessage);
     }
 }